Перейти к содержанию

Деплой

Варианты деплоя

  • 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

Связанная документация