Sandbox изоляция приложений
Impress изолирует каждое приложение в отдельном V8-контексте через модуль
vm. Утечки лечатся пересозданием sandbox без рестарта процесса.
Зачем
В голом Node.js все require'ы попадают в один глобальный неймспейс. Если одно приложение упало или потекло — рушится весь процесс. Сложно хостить несколько приложений в одном Node-сервере безопасно.
Sandbox в Metarhia
- На каждое приложение — свой V8 context.
- В sandbox-конфиге явно перечислены доступные модули.
- Утечка в одном приложении → удаляем sandbox, создаём новый. Соседи не страдают.
sandbox-fs
«Sandbox-fs — это файловая система, обёрнутая так, чтобы из песочницы приложение не могло выйти выше. Не хотелось бы, чтобы одно приложение ходило в папку к другому.»
- Виртуальная корневая папка для каждого app.
- Попытка
fs.readFile('../other-app/...')упирается в стену.
Sandbox-конфиг
sandbox: {
modules: ['fs', 'crypto', 'lodash'], // явный whitelist
globals: { /* доп. глобалки */ },
}
Если у двух приложений в whitelist одна и та же библиотека — у каждого своя копия в своём sandbox.
Hot reload через sandbox
- Изменили файл
applications/foo/api/get.js. - Impress подгружает новый код в sandbox без рестарта.
- Старые соединения дорабатывают на старом коде, новые — на новом.
Контейнеризация без Docker
автор: Impress сам контейнеризирует. Внутри одного процесса — N приложений. Внутри одного приложения — M процессов. Many-to-many так в Docker не сделать.
Сравнение
| Docker | Impress sandbox | |
|---|---|---|
| Гранулярность | контейнер = процесс | один процесс — N apps |
| Изоляция | OS-level (cgroups, namespaces) | V8 vm |
| Файловая система | контейнер | sandbox-fs |
| Перезапуск | рестарт контейнера | пересоздание sandbox |
| Накладные расходы | высокие | минимальные |
| Безопасность | сильная | средняя (sandbox JS пробивается) |
Sandbox JS — не полная замена Docker. Это эффективная изоляция «дружественных» приложений в одном процессе.
🎓 Источники
- 🎓 Impress Application Server · 2019-12-28
- Цитата: «sandbox-fs запирает приложение в каталоге… Импресс сам делает контейнера.»
- 🎓 Архив 2018 — Песочницы V8 sandbox в Node.js · 2020-01-17