انتقل إلى المحتوى

نشر تطبيق

حزّم خادم 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.

هل كانت هذه الصفحة مفيدة؟