مقدمة: لماذا TypeScript و Kubernetes زوج مثالي
\nتتطلب تطوير الويب الحديث ليس فقط كودًا عالي الجودة، ولكن أيضًا بنية تحتية موثوقة. TypeScript، كطبقة علوية ثابتة الكتابة فوق JavaScript، يسمح بإنشاء تطبيقات خادم قابلة للتوسع مع الحد الأدنى من الأخطاء في مرحلة التجميع. Kubernetes (K8s) هو المعيار الفعلي لتنسيق الحاويات، مما يوفر النشر التلقائي والتوسع وإدارة التطبيقات.
\nفي هذا الدليل، سنشرح عمليًا كيفية إنشاء تطبيق TypeScript بسيط (Express API)، وتعبئته في صورة Docker ونشره في كتلة Kubernetes. ستحصل على أوامر جاهزة وملفات تكوين وشرح لكل خطوة. المادة موجهة للمطورين الذين هم على دراية بأساسيات TypeScript ويريدون إتقان عمليات devops.
\nبنهاية المقال، ستكون قادرًا على نشر مشاريع TypeScript بنفسك في بيئة إنتاج باستخدام Kubernetes.
\n\n1. تحضير تطبيق TypeScript للحاويات
\n1.1. إنشاء خادم Express أساسي على TypeScript
\nللتظاهر، سننشئ API بسيطًا على TypeScript. تأكد من تثبيت Node.js و npm لديك.
\nmkdir ts-k8s-app\ncd ts-k8s-app\nnpm init -y\nnpm install express\nnpm install -D typescript @types/node @types/express ts-node nodemon\nأنشئ tsconfig.json:
{\n "compilerOptions": {\n "target": "ES2020",\n "module": "commonjs",\n "outDir": "./dist",\n "rootDir": "./src",\n "strict": true,\n "esModuleInterop": true\n },\n "include": ["src/**/*"]\n}\nالآن لنكتب الخادم نفسه. أنشئ ملف src/index.ts:
import express, { Request, Response } from 'express';\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\napp.get('/health', (_req: Request, res: Response) => {\n res.json({ status: 'ok', timestamp: new Date().toISOString() });\n});\n\napp.get('/', (_req: Request, res: Response) => {\n res.send('Hello from TypeScript on Kubernetes!');\n});\n\napp.listen(PORT, () => {\n console.log(`Server running on port ${PORT}`);\n});\nأضف السكربتات في package.json:
"scripts": {\n "build": "tsc",\n "start": "node dist/index.js",\n "dev": "nodemon src/index.ts"\n}\nتحقق من البناء: npm run build && npm start. يجب أن يبدأ الخادم على المنفذ 3000.
1.2. التحسين للإنتاج
\nللإنتاج، من المهم تقليل حجم الصورة. أضف .dockerignore:
node_modules\ndist\n.git\n*.md\n.env\nتأكد من أن جميع التبعيات مدرجة في dependencies (وليس في devDependencies) إذا كانت مطلوبة في وقت التشغيل.
2. بناء صورة Docker لتطبيق TypeScript
\n2.1. كتابة Dockerfile
\nنستخدم البناء متعدد المراحل (multi-stage build) لتقليل حجم الصورة النهائية.
\n# Stage 1: Build\nFROM node:18-alpine AS builder\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci --only=production\nCOPY . .\nRUN npm run build\n\n# Stage 2: Production\nFROM node:18-alpine\nWORKDIR /app\nCOPY --from=builder /app/dist ./dist\nCOPY --from=builder /app/node_modules ./node_modules\nCOPY --from=builder /app/package.json ./\nEXPOSE 3000\nCMD ["node", "dist/index.js"]\nالنقاط الرئيسية:
\n- \n
npm ci— تثبيت سريع وحتمي للتبعيات. \n - الطبقة الثانية تحتوي فقط على JS المترجم والوحدات الضرورية. \n
- الصورة الأساسية
node:18-alpineتزن حوالي 120 ميجابايت فقط. \n
2.2. بناء الصورة والتحقق منها
\ndocker build -t ts-k8s-app:latest .\ndocker run -p 3000:3000 ts-k8s-app:latest\nافتح http://localhost:3000/health — يجب أن ترى استجابة JSON. إذا كان في