Деплой и повседневный 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/commit/push, независимо от того, в каком
подкаталоге (modulauth/, dixu_proxy/, nginx/, корень) были изменения.
3. Деплой на VPS¶
Дальше — пересборка только изменившегося сервиса:
# 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¶
Wildcard-запись обязательна — каждый туннель работает на своём поддомене.
2. Docker¶
3. Клонирование¶
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)¶
6. Запуск¶
Первая сборка — ~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¶
Либо создать 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