Skip to content

Резервное копирование и восстановление

Резервное копирование PostgreSQL

pg_dump

Базовое резервное копирование через pg_dump:

bash
# Полный дамп БД
pg_dump -h localhost -U slozy_user -d slozy_dev \
  --no-owner --no-acl \
  -F c -f backup_$(date +%Y%m%d_%H%M%S).dump

# Восстановление из дампа
pg_restore -h localhost -U slozy_user -d slozy_dev \
  --no-owner --no-acl \
  -c backup.dump

Автоматическое резервное копирование

Для продакшена используйте скрипты из scripts/backup.sh:

bash
#!/bin/bash
BACKUP_DIR="/var/backups/slozy"
DB_NAME="slozy"
DB_USER="slozy"
RETENTION_DAYS=30

pg_dump -U "$DB_USER" "$DB_NAME" \
  -F c \
  -f "$BACKUP_DIR/slozy_$(date +%Y%m%d).dump"

# Удаление старых копий
find "$BACKUP_DIR" -name "slozy_*.dump" -mtime +$RETENTION_DAYS -delete

Миграции

SLOzy использует golang-migrate/migrate/v4 для управления схемой БД. Миграции расположены в migrations/.

Применение миграций

bash
# Up — применить все pending миграции
go run ./cmd/slozy-web -migrate up

# Down — откатить одну миграцию
go run ./cmd/slozy-web -migrate down 1

# До конкретной версии
go run ./cmd/slozy-web -migrate goto 000010

Структура файлов миграций

migrations/
├── 000001_organizations.up.sql
├── 000001_organizations.down.sql
├── 000002_teams.up.sql
├── 000002_teams.down.sql
...
├── 000018_query_cache.up.sql
└── 000018_query_cache.down.sql

Каждая миграция имеет up (применение) и down (откат). При запуске сервера миграции выполняются автоматически.

Важные миграции

МиграцияНазначение
000012_slo_recommendationsРекомендации SLO
000013_oauth2_persistenceOAuth2 токены
000014_password_resetСброс пароля
000015_rbac_systemRBAC и роли
000016_prometheus_integrationИнтеграция Prometheus
000018_query_cacheКэширование запросов

Kubernetes CronJob

Для автоматического бэкапа в Kubernetes:

yaml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: slozy-db-backup
  namespace: slozy
spec:
  schedule: "0 2 * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: pg-dump
            image: postgres:16-alpine
            command:
            - /bin/sh
            - -c
            - |
              pg_dump postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@postgres-service:5432/slozy \
                -F c -f /backup/slozy_$(date +%Y%m%d).dump
            envFrom:
              - secretRef:
                  name: slozy-secrets
            volumeMounts:
            - name: backup-volume
              mountPath: /backup
          restartPolicy: OnFailure
          volumes:
          - name: backup-volume
            persistentVolumeClaim:
              claimName: backup-pvc

Рекомендации

  • Храните дампы минимум 30 дней
  • Шифруйте резервные копии при хранении вне инфраструктуры
  • Тестируйте восстановление из бэкапа ежемесячно
  • Используйте pg_dump -F c (custom format) для сжатия и гибкости
  • При миграциях в production предварительно делайте дамп схемы