نشر TypeScript على Kubernetes: دليل أساسي
تتطلب تطوير الويب الحديث بشكل متزايد ليس فقط كتابة كود عالي الجودة، ولكن أيضًا نشر التطبيقات بشكل صحيح. أصبح TypeScript، بفضل الكتابة الصارمة (strict typing) والأدوات القوية، خيارًا شائعًا لخدمات الخلفية (backend services) على Node.js. ومع ذلك، بدون نشر صحيح، سيبقى الكود المثالي على الجهاز المحلي. Kubernetes — معيار تنسيق الحاويات (container orchestration) — يسمح بأتمتة النشر والتوسع وإدارة التطبيقات. في هذا الدليل، سنشرح عملية نشر تطبيق TypeScript على Kubernetes خطوة بخطوة.
1. تحضير تطبيق TypeScript للحاويات (Containerization)
قبل إرسال الكود إلى الكتلة (cluster)، يجب التأكد من أن التطبيق جاهز للعمل داخل حاوية. لننظر في مشروع نموذجي على Express.js مع TypeScript.
هيكل المشروع
my-ts-app/├── src/│ ├── index.ts│ └── routes/├── dist/├── package.json├── tsconfig.json└── Dockerfileإعداد tsconfig.json
تأكد من أن مترجم TypeScript يقوم ببناء المشروع في مجلد dist:
{ "compilerOptions": { "target": "ES2020", "module": "commonjs", "outDir": "./dist", "rootDir": "./src", "strict": true, "esModuleInterop": true }, "include": ["src/**/*"]}خادم بسيط (src/index.ts)
import express, { Request, Response } from 'express';
const app = express();const PORT = process.env.PORT || 3000;
app.get('/health', (_req: Request, res: Response) => { res.json({ status: 'ok', timestamp: new Date().toISOString() });});
app.listen(PORT, () => { console.log(`Server running on port ${PORT}`);});أضف السكريبتات (scripts) في package.json:
"scripts": { "build": "tsc", "start": "node dist/index.js", "dev": "ts-node src/index.ts"}2. بناء صورة Docker لتطبيق TypeScript
الحاويات (Containerization) هي خطوة أساسية قبل النشر على Kubernetes. سنستخدم البناء متعدد المراحل (multi-stage build) لتقليل حجم الصورة.
Dockerfile
# Stage 1: BuildFROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY tsconfig.json ./COPY src/ ./src/RUN npm run build
# Stage 2: ProductionFROM node:18-alpine AS productionWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/package*.json ./RUN npm ci --only=productionEXPOSE 3000CMD ["node", "dist/index.js"]قم ببناء الصورة وإرسالها إلى السجل (registry) (مثل Docker Hub):
docker build -t yourusername/my-ts-app:v1 .docker push yourusername/my-ts-app:v13. كتابة ملفات Kubernetes (Manifests)
للنشر على Kubernetes، ستحتاج إلى موردين على الأقل: Deployment (إدارة البودات) و Service (الوصول إلى التطبيق).
deployment.yaml
apiVersion: apps/v1kind: Deploymentmetadata: name: my-ts-app labels: app: my-ts-appspec: replicas: 2 selector: matchLabels: app: my-ts-app template: metadata: labels: app: my-ts-app spec: containers: - name: app image: yourusername/my-ts-app:v1 ports: - containerPort: 3000 env: - name: PORT value: "3000" livenessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 5 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 3000 initialDelaySeconds: 3 periodSeconds: 5service.yaml
apiVersion: v1kind: Servicemetadata: name: my-ts-app-servicespec: selector: app: my-ts-app ports: - protocol: T