Kodax

نشر تطبيقات Backend — نشر المواقع والدومينات

نشر تطبيقات Backend

للتطبيقات التي تحتاج سيرفر وقاعدة بيانات.

خيارات الاستضافة

1. Railway (الأسهل)

# تثبيت CLI
npm install -g @railway/cli

# تسجيل الدخول
railway login

# إنشاء مشروع
railway init

# النشر
railway up

# إضافة قاعدة بيانات
railway add postgres

2. Render

- ربط GitHub

- اختيار Web Service

- تحديد Build Command

- تلقائي!

3. Fly.io

# تثبيت
curl -L https://fly.io/install.sh | sh

# تسجيل
fly auth signup

# نشر
fly launch
fly deploy

Dockerfile للنشر

# Node.js
FROM node:20-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]
# Python
FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["python", "app.py"]

إعدادات شائعة

package.json

{
  "scripts": {
    "start": "node server.js",
    "build": "npm run compile"
  },
  "engines": {
    "node": ">=18"
  }
}

Procfile (Heroku/Railway)

web: node server.js
worker: node worker.js

المنافذ

// استخدم PORT من البيئة
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server on port ${PORT}`);
});

قواعد البيانات

PostgreSQL

// الاتصال
const { Pool } = require('pg');

const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: { rejectUnauthorized: false }
});

MongoDB

const mongoose = require('mongoose');

mongoose.connect(process.env.MONGODB_URI);

خدمات قواعد بيانات

- Supabase - PostgreSQL مجاني

- PlanetScale - MySQL serverless

- MongoDB Atlas - MongoDB مجاني

- Neon - PostgreSQL serverless

- Upstash - Redis serverless

متغيرات البيئة

# .env (محلياً فقط!)
DATABASE_URL=postgres://...
JWT_SECRET=your-secret
API_KEY=xxx

# في الـ deployment
# أضفها من لوحة التحكم أو CLI

CI/CD مع GitHub Actions

name: Deploy Backend

on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Deploy to Railway
        uses: bervProject/railway-deploy@main
        with:
          railway_token: ${{ secrets.RAILWAY_TOKEN }}
          service: backend

نصائح للـ Production

1. استخدم HTTPS دائماً

2. لا تُخزن secrets في الكود

3. فعّل Rate Limiting

4. استخدم Health Checks

5. راقب الـ Logs

6. أضف Error Tracking (Sentry)

7. استخدم CDN للـ static assets

// ملف: server.js - Express App جاهز للنشر
const express = require('express');
const cors = require('cors');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');

const app = express();

// Security
app.use(helmet());
app.use(cors({
  origin: process.env.ALLOWED_ORIGINS?.split(',') || '*'
}));

// Rate limiting
const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 100 // limit each IP to 100 requests
});
app.use('/api', limiter);

// Body parsing
app.use(express.json());

// Health check (مهم للاستضافة!)
app.get('/health', (req, res) => {
  res.status(200).json({ status: 'ok' });
});

// Routes
app.get('/api/hello', (req, res) => {
  res.json({ message: 'Hello World!' });
});

// Error handling
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: 'Something broke!' });
});

// Start
const PORT = process.env.PORT || 3000;
app.listen(PORT, '0.0.0.0', () => {
  console.log(`Server running on port ${PORT}`);
});
اختبر فهمك