Деплой
Варианты деплоя
- Docker Compose
- Kubernetes
- GitLab CI/CD
Docker Compose
docker-compose.yml
version: '3.8'
services:
web:
image: ${CI_REGISTRY_IMAGE}/web:${CI_COMMIT_SHA}
ports:
- "5001:443"
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__DefaultConnection=${DB_CONNECTION}
- RabbitMQ__Host=rabbitmq
depends_on:
- postgres
- rabbitmq
api:
image: ${CI_REGISTRY_IMAGE}/api:${CI_COMMIT_SHA}
ports:
- "5002:443"
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__DefaultConnection=${DB_CONNECTION}
- RabbitMQ__Host=rabbitmq
depends_on:
- postgres
- rabbitmq
transaction-handler:
image: ${CI_REGISTRY_IMAGE}/transaction-handler:${CI_COMMIT_SHA}
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__DefaultConnection=${DB_CONNECTION}
depends_on:
- postgres
- rabbitmq
report-handler:
image: ${CI_REGISTRY_IMAGE}/report-handler:${CI_COMMIT_SHA}
ports:
- "5004:80"
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ConnectionStrings__DefaultConnection=${DB_CONNECTION}
- RabbitMQ__Host=rabbitmq
depends_on:
- postgres
- rabbitmq
postgres:
image: postgres:14-alpine
environment:
- POSTGRES_DB=fuelprocessing
- POSTGRES_USER=${DB_USER}
- POSTGRES_PASSWORD=${DB_PASSWORD}
volumes:
- postgres_data:/var/lib/postgresql/data
rabbitmq:
image: rabbitmq:3.12-management
environment:
- RABBITMQ_DEFAULT_USER=${RABBITMQ_USER}
- RABBITMQ_DEFAULT_PASS=${RABBITMQ_PASSWORD}
ports:
- "15672:15672" # Management UI
- "5672:5672"
volumes:
- rabbitmq_data:/var/lib/rabbitmq
volumes:
postgres_data:
rabbitmq_data:
Kubernetes
Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: fuelprocessing-web
spec:
replicas: 3
selector:
matchLabels:
app: fuelprocessing-web
template:
metadata:
labels:
app: fuelprocessing-web
spec:
containers:
- name: web
image: registry.example.com/fuelprocessing/web:latest
ports:
- containerPort: 80
env:
- name: ConnectionStrings__DefaultConnection
valueFrom:
secretKeyRef:
name: db-secret
key: connection-string
- name: RabbitMQ__Host
value: "rabbitmq-service"
Service
apiVersion: v1
kind: Service
metadata:
name: fuelprocessing-web-service
spec:
selector:
app: fuelprocessing-web
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
GitLab CI/CD
.gitlab-ci.yml
stages:
- build
- test
- deploy
variables:
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: "/certs"
build:
stage: build
image: docker:24
services:
- docker:24-dind
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE/web:$CI_COMMIT_SHA ./FuelProcessing.Web
- docker push $CI_REGISTRY_IMAGE/web:$CI_COMMIT_SHA
- docker build -t $CI_REGISTRY_IMAGE/api:$CI_COMMIT_SHA ./FuelProcessing.ClientApi
- docker push $CI_REGISTRY_IMAGE/api:$CI_COMMIT_SHA
test:
stage: test
image: mcr.microsoft.com/dotnet/sdk:8.0
script:
- dotnet test --collect:"XPlat Code Coverage"
deploy:staging:
stage: deploy
image: alpine/helm:3.12
script:
- helm upgrade --install fuelprocessing ./helm-chart --namespace staging
environment:
name: staging
url: https://staging.example.com
only:
- main
deploy:production:
stage: deploy
image: alpine/helm:3.12
script:
- helm upgrade --install fuelprocessing ./helm-chart --namespace production
environment:
name: production
url: https://example.com
when: manual
only:
- tags
Мониторинг
Health Checks
# Web
curl https://example.com/health
# ClientApi
curl https://api.example.com/health
# TransactionHandler
curl http://transaction-handler:5003/health
# ReportHandler
curl http://report-handler:5004/health
Prometheus + Grafana
# prometheus.yml
scrape_configs:
- job_name: 'fuelprocessing'
static_configs:
- targets: ['web:5001', 'api:5002']
Резервное копирование
PostgreSQL Backup
# Backup
pg_dump -h postgres -U fuelprocessing fuelprocessing > backup_$(date +%Y%m%d).sql
# Restore
psql -h postgres -U fuelprocessing fuelprocessing < backup_20250105.sql
Cron job
# /etc/cron.daily/fuelprocessing-backup
0 2 * * * pg_dump -h postgres -U fuelprocessing fuelprocessing > /backups/fuelprocessing_$(date +\%Y\%m\%d).sql
Rollback
# Docker Compose
docker-compose down
docker pull registry.example.com/fuelprocessing/web:previous-tag
docker-compose up -d
# Kubernetes
kubectl rollout undo deployment/fuelprocessing-web
Связанная документация