neyrogovnarik 23ca2b6378 fix: Secure flag куки по протоколу, а не APP_ENV 1 개월 전
..
Caddyfile 23ca2b6378 fix: Secure flag куки по протоколу, а не APP_ENV 1 개월 전
README.md 8ac67d5043 P0: Security & production readiness 2 달 전
deploy-remote.sh 8b3eb4ad8e fix: /auth/me returns full user; bg #060606; logout button style; version+copyright footer; deploy improvements 1 개월 전
deploy.sh 8b3eb4ad8e fix: /auth/me returns full user; bg #060606; logout button style; version+copyright footer; deploy improvements 1 개월 전
docker-compose.prod.yml c38d225bb0 fix: code audit 2026-06-30 — 14 багов исправлено 1 개월 전
env.prod.example c38d225bb0 fix: code audit 2026-06-30 — 14 багов исправлено 1 개월 전
setup.sh 375ea1940b Initial commit: PhotoPlaces MVP 2 달 전

README.md

Deploy — Secrets Management

Быстрый старт (local / single server)

# 1. Скопируйте шаблон
cp deploy/env.prod.example deploy/env.prod

# 2. Отредактируйте (или запустите deploy.sh — он предложит сгенерировать секреты)
vim deploy/env.prod

# 3. Деплой
bash deploy/deploy.sh

deploy/env.prod не коммитится в git.gitignore).


Production: External Secrets Sources

Поддерживаются 4 способа загрузки секретов (в порядке приоритета):

1. 1Password CLI (op)

export OP_VAULT="Production"
export OP_ITEM="PhotoPlaces Secrets"
bash deploy/deploy.sh

Требует: op CLI, авторизованный (op signin).

2. HashiCorp Vault

export VAULT_ADDR="https://vault.example.com"
export VAULT_TOKEN="hvs.xxxxx"
export VAULT_PATH="secret/photoplaces"
bash deploy/deploy.sh

Требует: vault CLI, jq.

3. AWS Secrets Manager

export AWS_SECRETS_NAME="prod/photoplaces"
bash deploy/deploy.sh

Требует: aws CLI, jq, IAM права на secretsmanager:GetSecretValue.

4. Local file (fallback)

Если ни один из выше не настроен — используется deploy/env.prod.


Docker Swarm Mode (Secrets в Swarm)

Если кластер в Swarm mode (docker info | grep Swarm), deploy.sh автоматически создаёт Docker secrets:

# Секреты создаются из переменных окружения (загруженных из любого источника выше)
docker secret create db_password -
docker secret create redis_password -
docker secret create jwt_secret -
docker secret create jwt_refresh_secret -
docker secret create s3_secret_key -

В docker-compose.prod.yml сервисы читают секреты из /run/secrets/<name>.

Backend config (internal/config/config.go) поддерживает _FILE суффикс:

// JWT_SECRET_FILE=/run/secrets/jwt_secret → читает из файла
// JWT_SECRET=fallback → если файл не найден

Required Secrets

Переменная Описание Где используется
DB_PASSWORD Пароль PostgreSQL postgres, backend
REDIS_PASSWORD Пароль Redis redis, backend
JWT_SECRET Подпись access токенов backend
JWT_REFRESH_SECRET Подпись refresh токенов backend
S3_SECRET_KEY Пароль MinIO minio, backend
S3_PUBLIC_ENDPOINT Публичный URL MinIO (для прямых загрузок) frontend, backend
NEXT_PUBLIC_API_URL Публичный URL API frontend
ALLOWED_ORIGINS CORS origins (через запятую) backend

Генерация секретов вручную

# 32 байта = 64 hex chars
openssl rand -hex 32

# Для паролей БД/Redis можно короче
openssl rand -base64 24

Безопасность

  • deploy/env.prod в .gitignore
  • ✅ Docker secrets в Swarm (не в env vars, не в логах)
  • ✅ Поддержка внешних vaults (1Password, Vault, AWS)
  • ✅ Fallback на local файл для разработки
  • ✅ Валидация обязательных переменных перед деплоем

Пример для CI/CD (GitHub Actions)

- name: Deploy to production
  env:
    OP_VAULT: ${{ secrets.OP_VAULT }}
    OP_ITEM: ${{ secrets.OP_ITEM }}
    OP_SERVICE_ACCOUNT_TOKEN: ${{ secrets.OP_SERVICE_ACCOUNT_TOKEN }}
  run: |
    op signin --account ${{ secrets.OP_ACCOUNT }} --token $OP_SERVICE_ACCOUNT_TOKEN
    bash deploy/deploy.sh