Docker for Production ERP Deployment: A Complete Operations Guide

Deploy ERP systems with Docker in production. Covers multi-stage builds, Docker Compose orchestration, volume management, networking, and scaling strategies.

E
ECOSIRE Research and Development Team
|16 مارچ، 202610 منٹ پڑھیں2.2k الفاظ|

ڈوکر برائے پیداوار ERP تعیناتی: ایک مکمل آپریشن گائیڈ

**Docker کنٹینرز میں ERP سسٹم چلانے والی تنظیمیں روایتی ننگی دھات کی تعیناتیوں کے مقابلے میں 73% تیز تعیناتی سائیکل اور 45% کم ماحولیات سے متعلق واقعات کی اطلاع دیتی ہیں۔ ** Docker ERP کی تعیناتی کو ایک کثیر روزہ، غلطی کے شکار عمل سے دوبارہ قابل، ورژن کے زیر کنٹرول آپریشن میں تبدیل کرتا ہے جسے ٹیم کا کوئی بھی سابق رکن کر سکتا ہے۔

یہ گائیڈ انٹرپرائز ERP سسٹمز چلانے کے مکمل لائف سائیکل کا احاطہ کرتی ہے --- بشمول Odoo، کسٹم NestJS بیک اینڈز، اور Next.js فرنٹ اینڈز --- پروڈکشن ڈوکر ماحول میں۔

اہم ٹیک ویز

  • ملٹی اسٹیج ڈوکر نے ERP کنٹینر کی تصویر کے سائز کو 60-80% تک کم کیا، تعیناتی کی رفتار کو بہتر بنایا
  • ڈوکر کمپوز آرکیسٹریٹس ERP، ڈیٹا بیس، ریورس پراکسی، اور کیش سروسز کو ایک قابل تعینات یونٹ کے طور پر
  • نامزد والیوم اور بائنڈ ماؤنٹس کنٹینر کے ری اسٹارٹ اور اپ گریڈ میں ڈیٹا کی برقراری کو یقینی بناتے ہیں
  • صحت کی جانچ اور دوبارہ شروع کرنے کی پالیسیاں عارضی ناکامیوں سے خودکار بحالی فراہم کرتی ہیں۔

ایک ڈاکرائزڈ ERP اسٹیک کا فن تعمیر

ایک پروڈکشن ERP تعیناتی میں عام طور پر پانچ یا اس سے زیادہ باہم منسلک خدمات شامل ہوتی ہیں۔ ڈوکر کمپوز ان خدمات کو اعلانیہ طور پر بیان کرتا ہے، ماحول میں مسلسل تعیناتی کو یقینی بناتا ہے۔

سروس ٹوپولوجی

معیاری ڈاکرائزڈ ERP اسٹیک:

  1. ایپلیکیشن سرور: ERP رن ٹائم (اوڈو، نیسٹ جے ایس، یا اس سے ملتا جلتا)
  2. ڈیٹا بیس: مسلسل والیوم اسٹوریج کے ساتھ PostgreSQL
  3. ریورس پراکسی: Nginx ہینڈلنگ SSL ختم کرنا، جامد فائلیں، اور روٹنگ کی درخواست
  4. کیشے کی پرت: سیشن اسٹوریج، جاب کی قطاروں، اور ایپلیکیشن کیشنگ کے لیے ریڈیس
  5. بیک گراؤنڈ ورکرز: ای میلز، رپورٹس اور انضمام کے لیے Async جاب پروسیسرز

اختیاری خدمات میں بیک اپ کنٹینرز (pg_dump on cron)، مانیٹرنگ سائڈ کارز (Prometheus Exporters)، اور لاگ شپرز (Fluent Bit) شامل ہیں۔


ERP ایپلیکیشنز کے لیے ملٹی اسٹیج بناتا ہے۔

ڈوکر امیجز پروڈکشن کے لیے ملٹی اسٹیج بلڈز ضروری ہیں۔ وہ بلٹ ٹائم انحصار کو رن ٹائم سے الگ کرتے ہیں، دبلی پتلی، محفوظ تصاویر تیار کرتے ہیں۔

NestJS بیک اینڈ بلڈ

# Stage 1: Install dependencies and build
FROM node:20-alpine AS builder
WORKDIR /app

# Install pnpm
RUN corepack enable

# Copy workspace configuration
COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
COPY packages/ ./packages/
COPY apps/api/package.json ./apps/api/

# Install dependencies
RUN pnpm install --frozen-lockfile

# Copy source and build
COPY apps/api/ ./apps/api/
RUN pnpm --filter @ecosire/db build
RUN pnpm --filter @ecosire/types build
RUN pnpm --filter @ecosire/validators build
RUN pnpm --filter @ecosire/api build

# Stage 2: Production runtime
FROM node:20-alpine AS runner
WORKDIR /app

RUN addgroup -g 1001 -S appgroup && \
    adduser -S appuser -u 1001 -G appgroup

COPY --from=builder --chown=appuser:appgroup /app/apps/api/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/apps/api/package.json ./

USER appuser
EXPOSE 3001

HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3001/health || exit 1

CMD ["node", "dist/main.js"]

Next.js فرنٹ اینڈ بلڈ

FROM node:20-alpine AS builder
WORKDIR /app
RUN corepack enable

COPY pnpm-lock.yaml pnpm-workspace.yaml package.json ./
COPY packages/ ./packages/
COPY apps/web/package.json ./apps/web/

RUN pnpm install --frozen-lockfile

COPY apps/web/ ./apps/web/
RUN pnpm --filter @ecosire/web build

FROM node:20-alpine AS runner
WORKDIR /app

RUN addgroup -g 1001 -S appgroup && \
    adduser -S appuser -u 1001 -G appgroup

COPY --from=builder --chown=appuser:appgroup /app/apps/web/.next/standalone ./
COPY --from=builder --chown=appuser:appgroup /app/apps/web/.next/static ./.next/static
COPY --from=builder --chown=appuser:appgroup /app/apps/web/public ./public

USER appuser
EXPOSE 3000
ENV NODE_ENV=production
CMD ["node", "server.js"]

تصویری سائز کا موازنہ

تعمیر کی قسمتصویر کا سائزوقت کی تعمیر
سنگل سٹیج (مکمل نوڈ امیج)1.8 جی بی4 منٹ
سنگل سٹیج (الپائن)650 MB3.5 منٹ
ملٹی اسٹیج (الپائن)180 MB5 منٹ
ملٹی اسٹیج + کٹائی ہوئی ڈیپس120 MB5.5 منٹ

5.5 منٹ کی تعمیر کا وقت قابل قبول ہے کیونکہ یہ CI میں ہوتا ہے، ڈویلپر مشینوں پر نہیں۔


پیداوار کے لیے ڈوکر کمپوز

version: "3.8"

services:
  api:
    build:
      context: .
      dockerfile: apps/api/Dockerfile
    environment:
      - DATABASE_URL=postgresql://app:${DB_PASSWORD}@db:5432/ecosire
      - REDIS_URL=redis://redis:6379
      - NODE_ENV=production
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_healthy
    restart: unless-stopped
    networks:
      - backend
      - frontend

  web:
    build:
      context: .
      dockerfile: apps/web/Dockerfile
    environment:
      - API_URL=http://api:3001
      - NODE_ENV=production
    depends_on:
      - api
    restart: unless-stopped
    networks:
      - frontend

  db:
    image: postgres:17-alpine
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_DB: ecosire
    volumes:
      - postgres-data:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app -d ecosire"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped
    networks:
      - backend

  redis:
    image: redis:7-alpine
    command: redis-server --requirepass ${REDIS_PASSWORD} --maxmemory 256mb --maxmemory-policy allkeys-lru
    volumes:
      - redis-data:/data
    healthcheck:
      test: ["CMD", "redis-cli", "-a", "${REDIS_PASSWORD}", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5
    restart: unless-stopped
    networks:
      - backend

  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./infrastructure/nginx/production.conf:/etc/nginx/conf.d/default.conf:ro
      - ./certbot/conf:/etc/letsencrypt:ro
      - ./certbot/www:/var/www/certbot:ro
    depends_on:
      - web
      - api
    restart: unless-stopped
    networks:
      - frontend

volumes:
  postgres-data:
  redis-data:

networks:
  frontend:
  backend:

نیٹ ورک آئسولیشن

مندرجہ بالا ترتیب دو نیٹ ورکس کا استعمال کرتی ہے:

  • فرنٹ اینڈ: Nginx، ویب، اور API (دونوں کے لیے Nginx پراکسی)
  • بیک اینڈ: API، ڈیٹا بیس، اور Redis

ڈیٹا بیس اور Redis Nginx کنٹینر یا بیرونی نیٹ ورک سے قابل رسائی نہیں ہیں۔ یہ نیٹ ورک سیگمنٹیشن ایک اہم حفاظتی عمل ہے۔


والیوم مینجمنٹ اور ڈیٹا پرسٹینس

حجم ایک ڈاکرائزڈ ERP تعیناتی کا سب سے اہم حصہ ہیں۔ اپنا حجم کھو دیں اور آپ اپنا ڈیٹا کھو دیں۔

حجم کی اقسام

قسمکیس استعمال کریںاستقامتکارکردگی
نامزد جلدیںڈیٹا بیس، Redisکنٹینر ہٹانے سے بچ گیامقامی فائل سسٹم کی رفتار
بائنڈ ماؤنٹسکنفگ فائلز، لاگزمیزبان فائل سسٹم سے منسلکمقامی فائل سسٹم کی رفتار
tmpfs mountsعارضی فائلیں، رازصرف میموری، دوبارہ شروع کرنے پر ضائعمیموری کی رفتار

ڈاکر والیوم کے لیے بیک اپ کی حکمت عملی

#!/bin/bash
# backup-volumes.sh - Run via cron every 6 hours

TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="/opt/backups"

# Stop the application briefly for consistent backup
docker compose stop api web

# Backup PostgreSQL
docker compose exec -T db pg_dump -U app ecosire | gzip > "$BACKUP_DIR/db_$TIMESTAMP.sql.gz"

# Backup Redis
docker compose exec -T redis redis-cli -a "$REDIS_PASSWORD" BGSAVE
sleep 5
docker cp $(docker compose ps -q redis):/data/dump.rdb "$BACKUP_DIR/redis_$TIMESTAMP.rdb"

# Restart services
docker compose start api web

# Upload to S3
aws s3 sync "$BACKUP_DIR" "s3://company-backups/docker-volumes/" --exclude "*.tmp"

# Retain 30 days locally
find "$BACKUP_DIR" -name "*.gz" -mtime +30 -delete
find "$BACKUP_DIR" -name "*.rdb" -mtime +30 -delete

صحت کی جانچ اور پالیسیاں دوبارہ شروع کریں۔

پیداواری کنٹینرز کو اپنی صحت کی خود اطلاع دینی چاہیے اور ناکامیوں سے خود بخود ٹھیک ہونا چاہیے۔

ایپلیکیشن ہیلتھ چیک اینڈ پوائنٹ

// health.controller.ts
@Controller('health')
export class HealthController {
  constructor(
    private readonly db: DatabaseService,
    private readonly redis: RedisService,
  ) {}

  @Get()
  @Public()
  async check() {
    const checks = {
      database: await this.checkDatabase(),
      redis: await this.checkRedis(),
      uptime: process.uptime(),
      memory: process.memoryUsage(),
    };

    const healthy = checks.database && checks.redis;
    return { status: healthy ? 'ok' : 'degraded', checks };
  }

  private async checkDatabase(): Promise<boolean> {
    try {
      await this.db.execute('SELECT 1');
      return true;
    } catch {
      return false;
    }
  }

  private async checkRedis(): Promise<boolean> {
    try {
      await this.redis.ping();
      return true;
    } catch {
      return false;
    }
  }
}

پالیسی سلیکشن کو دوبارہ شروع کریں۔

پالیسیسلوککیس استعمال کریں
noکبھی دوبارہ شروع نہ کریںترقی، یک طرفہ کام
on-failureصرف غیر صفر باہر نکلنے پر دوبارہ شروع کریںورکرز، بیچ کی نوکریاں
alwaysہمیشہ دوبارہ شروع کریں (بشمول ڈوکر ڈیمون ری اسٹارٹ پر)پیداواری خدمات
unless-stoppedجیسے always لیکن دستی اسٹاپس کا احترام کرتا ہےزیادہ تر پیداواری خدمات

پیداواری خدمات کے لیے unless-stopped استعمال کریں۔ یہ سرور کے دوبارہ شروع ہونے یا ڈوکر ڈیمون کے دوبارہ شروع ہونے کے بعد کنٹینرز کو دوبارہ شروع کرنے کو یقینی بناتا ہے، لیکن دیکھ بھال کے دوران دستی docker compose stop کمانڈ کا احترام کرتا ہے۔


تعیناتی ورک فلو

ڈوکر کمپوز کے ساتھ رولنگ اپ ڈیٹس

#!/bin/bash
# deploy.sh - Zero-downtime deployment

set -e

echo "Pulling latest code..."
git pull origin main

echo "Building new images..."
docker compose build --no-cache api web

echo "Rolling update - API first..."
docker compose up -d --no-deps api
sleep 10

# Verify API health
if ! curl -sf http://localhost:3001/health > /dev/null; then
  echo "API health check failed, rolling back..."
  docker compose up -d --no-deps api
  exit 1
fi

echo "Rolling update - Web..."
docker compose up -d --no-deps web
sleep 5

# Verify Web health
if ! curl -sf http://localhost:3000 > /dev/null; then
  echo "Web health check failed, rolling back..."
  docker compose up -d --no-deps web
  exit 1
fi

echo "Deployment complete!"
docker compose ps

ڈیٹا بیس کی منتقلی کی حفاظت

ایپلیکیشن اسٹارٹ اپ کے اندر کبھی بھی ہجرت نہ کریں۔ اس کے بجائے، انہیں ایک الگ قدم کے طور پر چلائیں:

# Run migrations before deploying new containers
docker compose run --rm api npx drizzle-kit push

# Then deploy the new version
docker compose up -d

یہ پیٹرن اس بات کو یقینی بناتا ہے کہ اگر کوئی منتقلی ناکام ہو جاتی ہے، تو پرانا ورژن بغیر کسی اثر کے چلتا رہے گا۔


لاگنگ اور ڈیبگنگ

سنٹرلائزڈ لاگنگ

# Add to docker-compose.yml
services:
  api:
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "5"
        labels: "service"
    labels:
      service: "ecosire-api"

عام ڈیبگنگ کمانڈز

# View logs for a specific service
docker compose logs -f api --tail 100

# Execute a shell inside a running container
docker compose exec api sh

# View resource usage
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.NetIO}}"

# Inspect container networking
docker compose exec api ping db

# View container environment variables
docker compose exec api env | sort

اکثر پوچھے گئے سوالات

ہم ڈوکر میں ڈیٹا بیس کی منتقلی کو کیسے ہینڈل کرتے ہیں؟

نئے ایپلیکیشن کنٹینرز کو تعینات کرنے سے پہلے منتقلی کو ایک الگ مرحلہ کے طور پر چلائیں۔ docker compose run --rm api npx drizzle-kit push (یا آپ کے ORM کی مائیگریشن کمانڈ) کو پہلے سے تعیناتی کے مرحلے کے طور پر استعمال کریں۔ کنٹینر اسٹارٹ اپ کمانڈ میں مائیگریشن ایگزیکیوشن کو کبھی بھی ایمبیڈ نہ کریں --- ایک ناکام ہجرت کو موجودہ ورژن کو چلنے سے نہیں روکنا چاہیے۔

Docker کی کارکردگی اوور ہیڈ کیا ہے؟

لینکس پر، ڈوکر کی کارکردگی اوور ہیڈ نہ ہونے کے برابر ہے --- عام طور پر CPU کے پابند کام کے بوجھ کے لیے 2% سے کم اور I/O- پابند کام کے بوجھ کے لیے کوئی قابل پیمائش فرق نہیں ہے۔ macOS اور Windows پر، Docker ایک ورچوئل مشین کے اندر چلتا ہے، جس میں 5-15% اوور ہیڈ شامل ہوتا ہے۔ پروڈکشن کے لیے (جو لینکس ہونا چاہیے)، Docker ایک معنی خیز کارکردگی کی تشویش نہیں ہے۔

ہم Docker میں رازوں کا انتظام کیسے کرتے ہیں؟

Dockerfiles یا docker-compose.yml فائلوں میں کبھی بھی راز نہ رکھیں۔ انوائرنمنٹ ویری ایبل فائلز (.env) کو ورژن کنٹرول، Docker راز (Swarm mode کے لیے) یا بیرونی خفیہ مینیجرز (AWS Secrets Manager, HashiCorp Vault) سے خارج کر دیں۔ ڈوکر کمپوز کے لیے، پروجیکٹ کی جڑ میں ایک .env فائل سب سے آسان طریقہ ہے۔

کیا ہمیں Docker Swarm یا Kubernetes استعمال کرنا چاہیے؟

زیادہ تر SMB ERP تعیناتیوں کے لیے، Docker Compose کافی ہے۔ Docker Swarm کم سے کم پیچیدگی کے ساتھ ملٹی ہوسٹ آرکیسٹریشن کا اضافہ کرتا ہے۔ جب آپ کو آٹو اسکیلنگ، پیچیدہ نیٹ ورکنگ پالیسیوں، یا سروس میش صلاحیتوں کی ضرورت ہو تو Kubernetes مناسب ہے۔ فیصلے کے فریم ورک کے لیے ہماری Kubernetes اسکیلنگ گائیڈ اور microservices architecture guide دیکھیں۔

ہم Docker میں Odoo کے کسٹم ماڈیولز کو کیسے ہینڈل کرتے ہیں؟

اپنی ایڈون ڈائرکٹری کی طرف اشارہ کرتے ہوئے بائنڈ ماؤنٹ والیوم کے طور پر اپنی مرضی کے ماڈیولز کو ماؤنٹ کریں۔ Dockerfile میں، یقینی بنائیں کہ ایڈونز کا راستہ odoo.conf میں کنفیگر ہے۔ CI/CD کے لیے، ایک حسب ضرورت ڈوکر امیج بنائیں جو آپ کے ماڈیولز میں بیک کرے، ورژن کی مستقل مزاجی کو یقینی بنائے۔ Odoo کی مخصوص ترتیب کے لیے ہماری موجودہ Docker Odoo تعیناتی گائیڈ دیکھیں۔


آگے کیا آتا ہے۔

ڈوکر جدید ERP تعیناتی کی بنیاد ہے۔ ایک بار جب آپ کا کنٹینرائزڈ اسٹیک مستحکم ہو جائے تو، مکمل طور پر خودکار آپریشنز پائپ لائن بنانے کے لیے صفر-ڈاؤن ٹائم تعیناتی کی حکمت عملی، پروڈکشن مانیٹرنگ، اور انفراسٹرکچر بطور کوڈ دریافت کریں۔

ڈوکر کی تعیناتی سے متعلق مشاورت کے لیے ECOSIRE سے رابطہ کریں، یا مکمل طور پر کنٹینرائزڈ ERP تعیناتی کے لیے ہماری Odoo نفاذ کی خدمات کو دریافت کریں۔


ECOSIRE کے ذریعہ شائع کیا گیا -- کاروباری اداروں کو اعتماد کے ساتھ انٹرپرائز سافٹ ویئر تعینات کرنے میں مدد کرنا۔

E

تحریر

ECOSIRE Research and Development Team

ECOSIRE میں انٹرپرائز گریڈ ڈیجیٹل مصنوعات بنانا۔ Odoo انٹیگریشنز، ای کامرس آٹومیشن، اور AI سے چلنے والے کاروباری حل پر بصیرت شیئر کرنا۔

Chat on WhatsApp