Üretim ERP Dağıtımı için Docker: Eksiksiz Bir Operasyon Kılavuzu

Üretimde Docker ile ERP sistemlerini devreye alın. Çok aşamalı yapıları, Docker Compose orkestrasyonunu, birim yönetimini, ağ oluşturmayı ve ölçeklendirme stratejilerini kapsar.

E
ECOSIRE Research and Development Team
|16 Mart 20268 dk okuma1.8k Kelime|

Üretim ERP Dağıtımı için Docker: Eksiksiz Bir Operasyon Kılavuzu

Docker konteynerlerinde ERP sistemleri çalıştıran kuruluşlar, geleneksel çıplak donanım dağıtımlarıyla karşılaştırıldığında %73 daha hızlı dağıtım döngüleri ve %45 daha az çevreyle ilgili olay bildiriyor. Docker, ERP dağıtımını çok günlü, hataya açık bir süreçten herhangi bir ekip üyesinin yürütebileceği tekrarlanabilir, sürüm kontrollü bir işleme dönüştürür.

Bu kılavuz, üretim Docker ortamlarında Odoo, özel NestJS arka uçları ve Next.js ön uçları dahil olmak üzere kurumsal ERP sistemlerini çalıştırmanın tüm yaşam döngüsünü kapsar.

Önemli Çıkarımlar

  • Çok aşamalı Docker yapıları, ERP kapsayıcı görüntü boyutlarını %60-80 oranında azaltarak dağıtım hızını artırır
  • Docker Compose, ERP, veritabanı, ters proxy ve önbellek hizmetlerini tek bir konuşlandırılabilir birim olarak düzenler
  • Adlandırılmış birimler ve bağlama bağlantıları, kapsayıcının yeniden başlatılması ve yükseltilmesi sırasında veri kalıcılığını sağlar
  • Durum denetimleri ve yeniden başlatma politikaları, geçici arızalardan otomatik kurtarma sağlar

Docker'lı ERP Yığını Mimarisi

Bir üretim ERP dağıtımı genellikle beş veya daha fazla birbirine bağlı hizmeti içerir. Docker Compose, bu hizmetleri bildirimsel olarak tanımlayarak ortamlar arasında tutarlı dağıtım sağlar.

Hizmet Topolojisi

Standart Dockerized ERP yığını:

  1. Uygulama sunucusu: ERP çalışma zamanı (Odoo, NestJS veya benzeri)
  2. Veritabanı: Kalıcı birim depolamaya sahip PostgreSQL
  3. Ters proxy: Nginx, SSL sonlandırmasını, statik dosyaları ve istek yönlendirmeyi yönetir
  4. Önbellek katmanı: Oturum depolama, iş kuyrukları ve uygulamayı önbelleğe alma için Redis
  5. Arka plan çalışanları: E-postalar, raporlar ve entegrasyonlar için eşzamansız iş işlemcileri

İsteğe bağlı hizmetler arasında yedekleme kapları (cron'da pg_dump), sepetlerin izlenmesi (Prometheus ihracatçıları) ve günlük göndericileri (Fluent Bit) bulunur.


ERP Uygulamaları için Çok Aşamalı Yapılar

Çok aşamalı yapılar, Docker görüntülerinin üretimi için gereklidir. Derleme zamanı bağımlılıklarını çalışma zamanından ayırarak yalın, güvenli görüntüler üretirler.

NestJS Arka Uç Derlemesi

# 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 Ön Uç Derlemesi

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"]

Görüntü Boyutu Karşılaştırması

Yapı TürüResim BoyutuOluşturma Zamanı
Tek aşamalı (tam düğüm görüntüsü)1,8GB4 dakika
Tek kademeli (Alp)650 MB3,5 dakika
Çok Aşamalı (Alp)180MB5 dakika
Çok aşamalı + budanmış derinlikler120MB5,5 dakika

5,5 dakikalık derleme süresi kabul edilebilir çünkü bu, geliştirici makinelerinde değil CI'da gerçekleşiyor.


Docker Üretim için Oluşturma

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:

Ağ İzolasyonu

Yukarıdaki yapılandırma iki ağ kullanır:

  • ön uç: Nginx, web ve API (her ikisinin de Nginx proxy'leri)
  • arka uç: API, veritabanı ve Redis

Veritabanına ve Redis'e Nginx kapsayıcısından veya harici ağdan erişilemez. Bu ağ bölümlendirmesi kritik bir güvenlik uygulamasıdır.


Birim Yönetimi ve Veri Kalıcılığı

Birimler Dockerlı ERP dağıtımının en kritik parçasıdır. Birimlerinizi kaybederseniz verilerinizi kaybedersiniz.

Birim Türleri

TürKullanım ÖrneğiKalıcılıkPerformans
Adlandırılmış ciltlerVeritabanı, RedisKonteynerin kaldırılmasından sağ kurtulduYerel dosya sistemi hızı
Bağlama bağlantılarıYapılandırma dosyaları, günlüklerAna dosya sistemine bağlıYerel dosya sistemi hızı
tmpfs montaj parçalarıGeçici dosyalar, sırlarYalnızca bellek, yeniden başlatma sırasında kaybolduBellek hızı

Docker Birimleri için Yedekleme Stratejisi

#!/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

Durum Denetimleri ve Yeniden Başlatma Politikaları

Üretim konteynerlerinin durumlarını kendi kendine raporlaması ve arızalardan otomatik olarak kurtulması gerekir.

Uygulama Durumu Denetimi Uç Noktası

// 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;
    }
  }
}

İlke Seçimini Yeniden Başlat

PolitikaDavranışKullanım Örneği
KOD0Asla yeniden başlatmaGeliştirme, tek seferlik görevler
KOD0Yalnızca sıfır olmayan çıkışta yeniden başlatİşçiler, toplu işler
KOD0Her zaman yeniden başlat (liman işçisi arka plan programının yeniden başlatılması dahil)Üretim hizmetleri
KOD0always gibi ama manuel durdurmalara saygı duyuyorÇoğu prodüksiyon hizmeti

Üretim hizmetleri için unless-stopped kullanın. Bu, sunucu yeniden başlatıldıktan veya Docker arka plan programı yeniden başlatıldıktan sonra kapsayıcıların yeniden başlatılmasını sağlar, ancak bakım sırasında manuel docker compose stop komutlarına uyulur.


Dağıtım İş Akışı

Docker Compose ile Güncellemeler Devam Ediyor

#!/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

Veritabanı Taşıma Güvenliği

Geçişleri hiçbir zaman uygulama başlangıcında çalıştırmayın. Bunun yerine bunları ayrı bir adım olarak çalıştırın:

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

# Then deploy the new version
docker compose up -d

Bu model, geçişin başarısız olması durumunda eski sürümün etkilenmeden çalışmaya devam etmesini sağlar.


Günlüğe Kaydetme ve Hata Ayıklama

Merkezi Günlük Kaydı

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

Yaygın Hata Ayıklama Komutları

# 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

Sıkça Sorulan Sorular

Docker'da veritabanı geçişlerini nasıl hallederiz?

Yeni uygulama kapsayıcılarını dağıtmadan önce geçişleri ayrı bir adım olarak çalıştırın. Dağıtım öncesi adım olarak docker compose run --rm api npx drizzle-kit push (veya ORM'nizin geçiş komutunu) kullanın. Taşıma işlemini hiçbir zaman kapsayıcı başlatma komutuna eklemeyin; başarısız bir geçiş, geçerli sürümün çalışmaya devam etmesini engellememelidir.

Docker'ın performans yükü nedir?

Linux'ta Docker'ın performans ek yükü ihmal edilebilir düzeydedir; CPU'ya bağlı iş yükleri için genellikle %2'den azdır ve G/Ç'ye bağlı iş yükleri için ölçülebilir bir fark yoktur. MacOS ve Windows'ta Docker bir sanal makinenin içinde çalışır ve %5-15 oranında ek yük ekler. Üretim için (Linux olmalıdır), Docker anlamlı bir performans kaygısı değildir.

Docker'da gizli dizileri nasıl yönetiriz?

Gizli bilgileri asla Dockerfiles veya docker-compose.yml dosyalarına koymayın. Sürüm kontrolünden hariç tutulan ortam değişkeni dosyalarını (.env), Docker sırlarını (Swarm modu için) veya harici gizli dizi yöneticilerini (AWS Secrets Manager, HashiCorp Vault) kullanın. Docker Compose için proje kökündeki .env dosyası en basit yaklaşımdır.

Docker Swarm'ı mı yoksa Kubernetes'i mi kullanmalıyız?

Çoğu KOBİ ERP dağıtımı için Docker Compose yeterlidir. Docker Swarm, minimum karmaşıklık ek yüküyle çoklu ana bilgisayar orkestrasyonu ekler. Otomatik ölçeklendirmeye, karmaşık ağ politikalarına veya hizmet ağı özelliklerine ihtiyaç duyduğunuzda Kubernetes uygundur. Karar çerçeveleri için Kubernetes ölçeklendirme kılavuzumuza ve mikro hizmet mimarisi kılavuzumuza bakın.

Odoo özel modüllerini Docker'da nasıl kullanırız?

Özel modülleri, eklentiler dizininize işaret eden bir bağlama bağlama birimi olarak bağlayın. Dockerfile'da eklenti yolunun odoo.conf'da yapılandırıldığından emin olun. CI/CD için modüllerinizde yer alan ve sürüm tutarlılığı sağlayan özel bir Docker görüntüsü oluşturun. Odoo'ya özgü yapılandırma için mevcut Docker Odoo dağıtım kılavuzumuza bakın.


Sırada Ne Var?

Docker, modern ERP dağıtımının temelidir. Konteynerli yığınınız kararlı hale geldikten sonra, tam otomatik bir işlem hattı oluşturmak için sıfır kesinti süreli dağıtım stratejilerini, üretim izlemeyi ve kod olarak altyapıyı keşfedin.

Docker dağıtım danışmanlığı için ECOSIRE ile iletişime geçin veya tam olarak yönetilen kapsayıcılı ERP dağıtımı için Odoo uygulama hizmetlerimizi keşfedin.


ECOSIRE tarafından yayınlanmıştır - işletmelerin kurumsal yazılımları güvenle dağıtmasına yardımcı olur.

E

Yazan

ECOSIRE Research and Development Team

ECOSIRE'da kurumsal düzeyde dijital ürünler geliştiriyor. Odoo entegrasyonları, e-ticaret otomasyonu ve yapay zeka destekli iş çözümleri hakkında içgörüler paylaşıyor.

WhatsApp'ta Sohbet Et