الوثائقالأمن والنشر
نشر
أمران: nx build ينتج المصنوعات، nx start يخدمها.
قبل أن تبدأ: مشروع يتم إنشاؤه محليًا باستخدام nx build، و- بالنسبة لصفحات العميل - سلسلة أدوات الواجهة الأمامية التي تم تثبيتها nx new.
nx buildnx start --host 0.0.0.0 --port 8000
يحتاج وقت التشغيل إلى Python فقط. Uvicorn يخدم التطبيق المترجم والأصول الثابتة؛ لا توجد عملية عقدة ولا توجد عملية Vite متضمنة.
ما ينتج البناء
__nexy__/ يحتوي على وحدات المسار المترجمة، وحزمة العميل ضمن __nexy__/client/، وHTML المعروض مسبقًا لمسارات إطار العمل. انسخ المشروع - المصدر بالإضافة إلى __nexy__/ - أو أنشئ داخل الصورة.
Docker
تحتاج مرحلة البناء إلى العقدة (لـ Vite) و Python (للمترجم). تحتاج مرحلة التشغيل إلى Python فقط.
FROM node:22-bookworm-slim AS buildWORKDIR /app COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uvCOPY pyproject.toml uv.lock ./RUN uv sync --frozen --no-install-project COPY . .RUN uv sync --frozen && uv run nx build FROM python:3.13-slimWORKDIR /appCOPY --from=build /app /appENV PATH="/app/.venv/bin:$PATH" EXPOSE 8000CMD ["nx", "start", "--host", "0.0.0.0", "--port", "8000"]uv يجلب Python مُدارًا عندما لا تحتوي الصورة الأساسية على أي شيء، ولهذا السبب يمكن أن تبدأ مرحلة البناء من صورة العقدة.
خلف وكيل عكسي
قم بتشغيل nx start على المضيف المحلي واترك Nginx أو Caddy أو وكيل النظام الأساسي ينهي TLS:
nx start --host 127.0.0.1 --port 8000
تأكد من أن الوكيل يعيد توجيه ترقيات WebSocket إذا كنت تستخدم معالجات SOCKET، وأنه يعيد توجيه المضيف الأصلي - FastAPI ينشئ عناوين URL مطلقة منه.
فحص الصحة
قم بإضافة ملف معالج، src/routes/api/health.py، ومسبار /api/health - بدلاً من الصفحة التي قد يتم عرضها ببطء:
async def GET(): return {"status": "ok"}أضف وحدة تحكم، واختبر /health/ - بدلاً من العرض الذي قد يتم عرضه ببطء:
from nexy.decorators import Controller @Controller("/health")class HealthController: async def get(self): return {"status": "ok"}أدرجها في controllers من الوحدة الجذرية.
نقاط النهاية المضمنة
يطرح موازن التحميل أو Kubernetes سؤالين: هل العملية حية، وهل يمكنها تلقي حركة المرور؟ اضبط useHealth ويجيب Nexy على كليهما، بدون ملف معالج ولا وحدة تحكم:
from nexy.core.models import NexyConfigModel class NexyConfig(NexyConfigModel): useHealth = True| نقطة النهاية | الإجابات 200 | الإجابات 503 |
|---|---|---|
GET /health/live |
بينما تجيب العملية | أبدا |
GET /health/ready |
بمجرد بدء التطبيق | أثناء بدء التشغيل، وبمجرد أن يطلب الخادم منه التوقف |
يضمن Nexy أن /health/ready يتبع بدء تشغيل الخادم وإيقاف تشغيله.
يضمن Nexy بقاء نقطتي النهاية خارج سجل الوصول وخارج مخطط OpenAPI.
يضمن Nexy أن كلا نقطتي النهاية تجيبان قبل useTrustedHost و useHTTPSRedirect، لذلك لا يتم رفض التحقيق الذي يتم إرساله عبر HTTP إلى عنوان الكبسولة.
وفقًا للاتفاقية، يمكنك إبقاء المسارات الخاصة بك خارج /health/live و /health/ready أثناء تشغيل useHealth: نقاط نهاية Nexy تجيب أولاً. useHealth هو False افتراضيًا، لذا فإن المشروع الذي لم يتم تعيينه يحتفظ بكلا المسارين.
تطبيقك مسؤول عن التحقق مما يعتمد عليه: /health/ready يُبلغ عن دورة حياة الخادم، وليس حالة قاعدة البيانات.
قم بتوجيه مجسات Kubernetes Deployment إليهم:
apiVersion: apps/v1kind: Deploymentmetadata: name: appspec: replicas: 2 selector: matchLabels: app: app template: metadata: labels: app: app spec: containers: - name: app image: registry.example.com/app:1.0 ports: - containerPort: 8000 livenessProbe: httpGet: path: /health/live port: 8000 periodSeconds: 10 readinessProbe: httpGet: path: /health/ready port: 8000 periodSeconds: 5استضافة ثابتة
كل صفحة هي HTML، ولكن Nexy يفترض وجود خادم للتوجيه ومعالجات API.
قائمة التحقق
-
nx buildفي CI، لا توجد تحذيرات للمسارات التي تتوقع عرضها على الخادم -
nx startيخرج بالرمز 1، ولا يبدأ بأي شيء، عندما لا يمكن تحميل ملف المسار -
NEXY_ACTION_SECRETمجموعة، أو__nexy__/action.keyمحفوظة مع البناء -
useDocs = Falseفي الإنتاج إذا لم يكن مخطط API عامًا -
useTrustedHostوuseHTTPSRedirectتم ضبطهما للنشر العام -
useHealth = Trueعندما يقوم موازن التحميل أو Kubernetes بالتحقق من التطبيق -
__nexy__/غير ملتزم