Ü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ı:
- Uygulama sunucusu: ERP çalışma zamanı (Odoo, NestJS veya benzeri)
- Veritabanı: Kalıcı birim depolamaya sahip PostgreSQL
- Ters proxy: Nginx, SSL sonlandırmasını, statik dosyaları ve istek yönlendirmeyi yönetir
- Önbellek katmanı: Oturum depolama, iş kuyrukları ve uygulamayı önbelleğe alma için Redis
- 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 Boyutu | Oluşturma Zamanı |
|---|---|---|
| Tek aşamalı (tam düğüm görüntüsü) | 1,8GB | 4 dakika |
| Tek kademeli (Alp) | 650 MB | 3,5 dakika |
| Çok Aşamalı (Alp) | 180MB | 5 dakika |
| Çok aşamalı + budanmış derinlikler | 120MB | 5,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ür | Kullanım Örneği | Kalıcılık | Performans |
|---|---|---|---|
| Adlandırılmış ciltler | Veritabanı, Redis | Konteynerin kaldırılmasından sağ kurtuldu | Yerel dosya sistemi hızı |
| Bağlama bağlantıları | Yapılandırma dosyaları, günlükler | Ana dosya sistemine bağlı | Yerel dosya sistemi hızı |
| tmpfs montaj parçaları | Geçici dosyalar, sırlar | Yalnızca bellek, yeniden başlatma sırasında kayboldu | Bellek 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
| Politika | Davranış | Kullanım Örneği |
|---|---|---|
| KOD0 | Asla yeniden başlatma | Geliştirme, tek seferlik görevler |
| KOD0 | Yalnızca sıfır olmayan çıkışta yeniden başlat | İşçiler, toplu işler |
| KOD0 | Her zaman yeniden başlat (liman işçisi arka plan programının yeniden başlatılması dahil) | Üretim hizmetleri |
| KOD0 | always 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.
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.
İlgili Makaleler
Power BI Uygulaması: 2026 İçin En İyi Kurumsal Uygulamalar
Çalışma alanı mimarisini, ağ geçidi kurulumunu, lisans planlamayı, dağıtım işlem hatlarını, yönetimi ve benimsemeyi kapsayan Kurumsal Power BI uygulama kılavuzu.
Borç Hesapları Otomasyonu: İşleme Maliyetlerini Yüzde 80 Oranında Azaltın
OCR, üç yönlü eşleştirme ve ERP iş akışlarıyla fatura işleme maliyetlerini fatura başına 15 ABD dolarından 3 ABD dolarına düşürmek için borç hesapları otomasyonunu uygulayın.
Muhasebe ve Defter Tutma Otomasyonunda Yapay Zeka: CFO Uygulama Kılavuzu
Fatura işleme, banka mutabakatı, gider yönetimi ve finansal raporlama için muhasebeyi yapay zeka ile otomatikleştirin. %85 daha hızlı kapatma döngüleri.