Перейти к содержимому

Развёртывание приложения

Упакуйте сервер на JavaScript или TypeScript в образ контейнера на основе elide.dev/elide, с окружением, флагами песочницы, журналами и проверкой работоспособности.

На этой странице

На этой странице сервер на TypeScript упаковывается в образ контейнера на основе elide.dev/elide.

Написание приложения

// server.ts
import { Hono } from "hono";

const app = new Hono();

app.use(async (c, next) => {
  await next();
  console.log(JSON.stringify({ method: c.req.method, path: c.req.path, status: c.res.status }));
});

app.get("/healthz", (c) => c.text("ok"));
app.get("/", (c) => c.json({ greeting: process.env.GREETING ?? "hello" }));

export default app;
// healthcheck.mjs
const res = await fetch("http://127.0.0.1:8080/healthz");
process.exit(res.ok ? 0 : 1);
{
  "name": "deploy-app",
  "type": "module",
  "dependencies": {
    "hono": "^4.7.0"
  }
}

Один раз выполните elide install --ecosystems=npm, чтобы записать aube-lock.yaml.

Написание Dockerfile

FROM elide.dev/elide:1.6.0
WORKDIR /app
COPY package.json aube-lock.yaml ./
RUN elide install --ecosystems=npm
COPY . .
EXPOSE 8080
HEALTHCHECK --interval=10s --timeout=3s CMD ["elide", "healthcheck.mjs"]
CMD ["--allow-read=/app,/root/.cache/aube", "--allow-net=api.example.com", "serve", "--no-tui", "--host", "0.0.0.0", "--port", "8080", "server.ts"]
# .dockerignore
node_modules
.env
СтрокаЗачем
FROM elide.dev/elide:1.6.0Точка входа образа — elide, поэтому CMD содержит только её аргументы. Теги: Образы контейнеров.
RUN elide install --ecosystems=npmУстанавливает зависимости внутри образа. node_modules ссылается на /root/.cache/aube, поэтому node_modules с хоста не заработает.
--host 0.0.0.0Обработчик из экспорта по умолчанию привязывается к 127.0.0.1, который недоступен извне контейнера.
--no-tuiБез этого флага docker run -t запускает терминальный интерфейс, и вывод приложения не попадает в docker logs.
HEALTHCHECKВ образе нет curl и wget; проверку выполняет короткий скрипт Elide.
docker build -t my-app .
docker run -d --name my-app -p 8080:8080 -e GREETING=hi my-app
curl http://127.0.0.1:8080/
{"greeting":"hi"}

docker inspect --format '{{.State.Health.Status}}' my-app выводит healthy, как только проходит первая проверка. docker stop останавливает сервер меньше чем за секунду с кодом выхода 143.

Передача переменных окружения

process.env содержит переменные контейнера; передавайте их через docker run -e NAME=value или --env-file .env. Elide не читает файлы .env и не задаёт NODE_ENV. Для локальных запусков загрузите файл в коде:

import { existsSync } from "node:fs";

if (existsSync(".env")) process.loadEnvFile();

Без проверки process.loadEnvFile() выбрасывает ENOENT: no such file or directory, open '.env', если файла нет. См. Переменные окружения.

Ограничение сервера

Программы работают без ограничений, пока не задан флаг песочницы. Дайте серверу то, что ему нужно, и ничего больше:

ФлагВ Dockerfile выше
--allow-read=PATHS/app и хранилище npm /root/.cache/aube.
--allow-net=HOSTSИсходящие хосты. Для прослушивания порта разрешение не нужно.
--allow-run=CMDSНе задан: подпроцессы остаются разрешены. Укажите список, чтобы ограничить их.
--deny-net=HOSTSХосты, заблокированные даже при разрешении, например --deny-net=169.254.169.254.
--max-mem=SIZE, --timeout=DURATIONРазмер кучи и общее время работы.

Глобальные флаги указываются перед командой (serve, run). --deny-net и --deny-run требуют формы с =. Если хранилища npm нет в --allow-read, сервер останавливается при запуске:

Error: Filesystem read denied by policy: /app/node_modules/hono

Заблокированный исходящий вызов называет флаг:

fetch to '169.254.169.254:80' denied by --deny-net

Все флаги: Песочница и ограничения.

Чтение журналов

console.log пишет в stdout, а console.error — в stderr; docker logs показывает оба потока:

{"method":"GET","path":"/healthz","status":200}
{"method":"GET","path":"/","status":200}

elide serve --no-tui не выводит журнал доступа, а обработчик, выбросивший исключение, отвечает 500, не выводя ошибку. Записывайте запросы и ошибки в журнал из приложения или экспортируйте спаны запросов, метрики и ошибки через OpenTelemetry.

Развёртывание приложения JVM

  • Соберите образ JVM из elide.pkl с артефактом ContainerImage: JVM-контейнеры.
  • Скомпилируйте нативный исполняемый файл: Native Image.

Была ли эта страница полезной?