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

Деплой и повседневный workflow

Эта страница — единственный актуальный источник правды по деплою. Старые версии (DEPLOY.md, ruls_new.md) описывали либо устаревшую bare-metal-архитектуру (systemd-сервисы в /opt, отдельные deploy/install.sh), либо устаревшую схему с отдельными git-репозиториями и разными ветками для modulauth/dixu_proxy — оба архивированы в history/ с пометкой, актуальную информацию искать только здесь.

Текущая модель: один монорепо, одна ветка, Docker Compose

  • Репозиторий: gitlab.com:dixsu/infra, ветка prod — единственная, для всего (включая вложенные modulauth/ и dixu_proxy/, которые раньше были отдельными репозиториями с ветками prod_update/master — это больше не так).
  • VPS: ssh -p 1022 root@217.114.43.49, рабочий каталог /root/dixsu/.
  • Все сервисы — контейнеры Docker Compose, одна сеть dixsu-net.
  • Нет CI/CD — изменения коммитятся локально, пушатся, затем деплоятся вручную по SSH.

Рабочий цикл

1. Правка кода — локально

Через обычные средства редактирования (не трогать файлы напрямую на VPS, только через git pull после пуша).

2. Коммит и пуш

git add <файлы>
git commit -m "..."
git push origin prod

Один репозиторий — один git add/commit/push, независимо от того, в каком подкаталоге (modulauth/, dixu_proxy/, nginx/, корень) были изменения.

3. Деплой на VPS

ssh -p 1022 root@217.114.43.49 "cd /root/dixsu && git pull"

Дальше — пересборка только изменившегося сервиса:

# modulauth (Java/Spring Boot)
ssh -p 1022 root@217.114.43.49 \
  "cd /root/dixsu && docker compose build modulauth --no-cache && docker compose up -d modulauth"

# dixu_proxy (Elixir/Phoenix)
ssh -p 1022 root@217.114.43.49 \
  "cd /root/dixsu && docker compose build dixu_proxy --no-cache && docker compose up -d dixu_proxy"

# nginx / screenshotter / только конфиг (docker-compose.yml, .env)
ssh -p 1022 root@217.114.43.49 \
  "cd /root/dixsu && docker compose up -d --build"

--no-cache важен для modulauth (Docker иначе кеширует Maven-слои, новый JAR может не попасть в образ) и для dixu_proxy (prod.exs — compile-time конфиг, компилируется на этапе сборки образа). Для конфиг-только изменений (nginx, docker-compose.yml, .env) --no-cache не нужен.

Готовые скрипты на VPS (rebuild_modulauth.sh, rebuild_dixu_proxy.sh и т.д.) делают git pull + build + up в одну команду — но проверьте, что скрипт тянет git pull без указания старой ветки (origin prod_update/origin master) прежде чем им пользоваться, если он не обновлён под текущую модель одной ветки prod.

Экстренный hotfix прямо на VPS

Если правка сделана напрямую на сервере (не рекомендуется, но бывает):

ssh -p 1022 root@217.114.43.49 "cd /root/dixsu && git add -p && git commit -m 'hotfix: ...' && git push origin prod"
git pull origin prod   # локально — синхронизация

Не допускать дивергенции — всегда git pull перед следующей правкой.

Первичный запуск на новом VPS

1. DNS

dix.su.     A   <IP VPS>
*.dix.su.   A   <IP VPS>

Wildcard-запись обязательна — каждый туннель работает на своём поддомене.

2. Docker

curl -fsSL https://get.docker.com | sh

3. Клонирование

git clone git@gitlab.com:dixsu/infra.git /root/dixsu
cd /root/dixsu

4. .env

Скопировать .env.example.env, заполнить как минимум:

BASE_DOMAIN=dix.su
POSTGRES_PASSWORD=...
SECRET_KEY_BASE=...         # mix phx.gen.secret
MAIL_HOST=...               # SMTP для одноразовых паролей
MAIL_USERNAME=...
MAIL_PASSWORD=...
SSL_MODE=letsencrypt
SSL_CERT_PATH=/etc/letsencrypt/live/dix.su/fullchain.pem
SSL_KEY_PATH=/etc/letsencrypt/live/dix.su/privkey.pem

Полный список переменных — .env.example в корне репозитория (секции по OAuth-провайдерам, платёжному провайдеру и т.д., много опциональных).

5. SSL (Let's Encrypt wildcard)

make certbot

6. Запуск

make up

Первая сборка — ~10 минут. Все сервисы должны стать healthy (make ps).

Полезные команды (Makefile)

make up            # запустить / пересобрать изменившиеся образы
make start         # запустить без пересборки
make down           # остановить всё
make restart        # перезапустить все сервисы
make logs            # логи всех сервисов
make logs-proxy      # логи dixu_proxy
make logs-auth       # логи modulauth
make logs-nginx      # логи nginx
make ps              # статус контейнеров
make db-shell         # psql внутри postgres
make redis-shell      # redis-cli
make backup-db        # дамп БД → backup_YYYYMMDD_HHMMSS.sql
make build            # пересобрать образы (с кешем)

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

make backup-db
# создаёт backup_YYYYMMDD_HHMMSS.sql

# восстановление:
docker compose exec -T postgres psql -U dixsu dixsu < backup_....sql

Секреты — что куда

Файл В git Описание
.env Все реальные секреты, только на VPS в /root/dixsu/.env
.env.example Шаблон с плейсхолдерами
modulauth/src/main/resources/application.properties Конфиг для локальной разработки, секреты — через ${VAR:} плейсхолдеры, реальных паролей не содержит
dixu_proxy/priv/cert/* SSL-материалы генерируются на сервере

docker-entrypoint.sh modulauth при старте контейнера полностью перегенерирует /app/application.properties из переменных окружения — файл из репозитория игнорируется в продакшне.

Локальная разработка modulauth

export MAIL_PASSWORD=your_smtp_pass
export DB_PASSWORD=yourLocalDbPass
./gradlew bootRun

Либо создать modulauth/src/main/resources/application-local.properties.gitignore).

Структура репозитория

/root/dixsu/
├── docker-compose.yml
├── Makefile
├── .env                        ← секреты (не в git)
├── .env.example
├── docs/                       ← документация (эта папка)
├── INCIDENT/logs/              ← журнал банов, volume на dixu_proxy
├── nginx/
│   ├── dixu.conf.template
│   ├── stream.conf.template
│   └── docker-entrypoint.sh
├── certs/                      ← SSL (selfsigned) или пусто при Let's Encrypt
├── modulauth/                  ← Java/Spring Boot
├── dixu_proxy/                 ← Elixir/Phoenix
└── screenshotter/              ← Node/Playwright