Используй её при деплое на тестовый VPS. Без CI/CD — всё вручную через SSH.
Подключение
ssh root@185.152.93.77cd ~/erp/erp-infrastructure
Docker Hub Rate Limit
Неавторизованные pull’ы ограничены. На сервере выполнен docker login — если образы перестают скачиваться, повторить:
docker login -u ilyakapitonovspad20@gmail.com
Disk hygiene
VPS имеет 77GB и уже один раз переполнялся (2026-04-25). Действуют две страховки: лимит логов в compose (50m × 3) и ежедневный docker-cleanup.sh в cron. Подробности: Disk Hygiene.
Обновить конкретный сервис
# 1. Pull новый кодcd ~/erp/erp-{service-repo}git pull origin main --ff-only# 2. Rebuild и restartcd ~/erp/erp-infrastructuredocker compose build {service-name}docker compose up -d {service-name}# 3. Проверитьdocker compose logs --tail=50 {service-name}docker inspect --format '{{.State.Health.Status}}' erp-{service-name}
Или одной командой:
./scripts/deploy.sh {service-name}
Маппинг имён
Деплоится сейчас
Сервис в compose
Репозиторий
Порт
auth-service
erp-auth-service
3001
user-service
erp-user-service
3002
store-service
erp-store-service
3003
catalog-service
erp-catalog-service
3004
order-service
erp-order-service
3005
warehouse-service
erp-warehouse-service
3008
aggregator-service
erp-aggregator-service
3013
admin-bff
erp-admin (target=bff)
3020
admin-frontend
erp-admin (target=frontend, nginx со статикой web/dist)
80 (внутренний)
pos-bff
erp-pos (monorepo — только bff/)
3022
pos-frontend
erp-pos-desktop (target=frontend, web-сборка SPA через Vite)
80 (внутренний)
Admin split (2026-04-30)
До этой даты admin-bff был один контейнер: Fastify + раздача React SPA через @fastify/static. Теперь Dockerfile — multi-stage с двумя targets:
target=bff — Fastify-only API сервис
target=frontend — nginx:alpine с собранным web/dist, ходит на admin-bff:3020 за /api/
В compose заводится два сервиса из одного Dockerfile. Внешний erp-nginx проксит /admin/* → admin-frontend:80, /api/v1/admin/* → admin-bff:3020. Подробнее см. PR erp-admin#3.
POS monorepo
erp-pos содержит bff/ (деплоится в compose) и mobile/ (собирается как APK через gradlew assembleRelease, не часть docker compose). Деплой касается только bff/.
Web POS (2026-04-30)
erp-pos-desktop теперь поддерживает два пути сборки из одной кодовой базы:
Tauri Windows .msi — pnpm --filter desktop tauri build локально, base=/. Для кассы на терминале с принтером.
Web SPA — Dockerfile target=frontend, Vite с VITE_BASE_PATH=/pos/ и VITE_POS_BFF_URL=/pos. Деплоится в compose как pos-frontend. Без печати ESC/POS — для менеджера/официанта со смартфона/планшета. Доступно: https://erp-test.nirbi.ru/pos/.
Внешний erp-nginx роутит /pos/api/* → pos-bff:3022, /pos/* → pos-frontend:80. Параметризация base через env позволяет билдить оба варианта без форка кодовой базы.
Запланировано (Phase 2+)
Сервис в compose
Репозиторий
Порт
payment-service
erp-payment-service
3006
loyalty-service
erp-loyalty-service
3007
finance-service
erp-finance-service
3009
notification-service
erp-notification-service
3010
report-service
erp-report-service
3011
integration-service
erp-integration-service
3012
customer-bff
erp-customer
3021
При добавлении сервиса
Обновить обе таблицы + [[деплой-all|/deploy-all]] skill (.claude/skills/deploy-all/SKILL.md).
Обновить все запущенные сервисы
./scripts/deploy.sh
Перезапустить инфраструктуру
./scripts/deploy.sh --infra
Перезапуск PostgreSQL/Kafka
Перезапуск инфры кратковременно роняет все сервисы. Данные сохраняются в volumes.
Добавить новый сервис
1. Клонировать репозиторий
cd ~/erpgit clone <url>/erp-{service}.git
2. Создать .env файл
cd ~/erp/erp-infrastructure# Для Java-сервиса:cat > envs/{service-name}.env << 'EOF'SERVER_PORT={port}SPRING_PROFILES_ACTIVE=testSPRING_DATASOURCE_URL=jdbc:postgresql://postgres:5432/{db_name}SPRING_DATASOURCE_USERNAME=erpSPRING_DATASOURCE_PASSWORD=<пароль из .env>SPRING_REDIS_HOST=redisSPRING_REDIS_PORT=6379SPRING_REDIS_PASSWORD=<пароль из .env>KAFKA_BOOTSTRAP_SERVERS=kafka:9092JWT_SECRET=<секрет из .env>JAVA_OPTS=-Xmx256m -Xms128mEOF# Для BFF:cat > envs/{bff-name}.env << 'EOF'PORT={port}NODE_ENV=testAUTH_SERVICE_URL=http://erp-auth-service:3001USER_SERVICE_URL=http://erp-user-service:3002STORE_SERVICE_URL=http://erp-store-service:3003CATALOG_SERVICE_URL=http://erp-catalog-service:3004WAREHOUSE_SERVICE_URL=http://erp-warehouse-service:3008JWT_SECRET=<секрет из .env>EOF
3. Раскомментировать в docker-compose.yml
Найти закомментированный блок сервиса или добавить новый по шаблону.
4. Раскомментировать в nginx/conf.d/default.conf
Найти закомментированный location блок для сервиса.
TCP проверка порта подтверждает что процесс жив и слушает, но не проверяет готовность приложения. Spring Security блокирует /actuator/health с 403 без токена. Для полноценного healthcheck нужно открыть actuator в SecurityConfig.
Fastify — binding на 0.0.0.0
Fastify 5.x в callback-стиле app.listen({ host: "0.0.0.0" }, cb) может игнорировать host. Использовать promise-стиль:
После получения — docker compose exec nginx nginx -s reload.
Авто-обновление работает через контейнер certbot (renew каждые 12 часов).
Spring Boot start_period
Java-сервисы стартуют 8-15 секунд (скачивание зависимостей, Liquibase миграции). В compose задан start_period: 90s — healthcheck не считается failed первые 90 секунд. Если после 90s сервис всё ещё starting — смотреть логи.
Типичные проблемы
Сервис не стартует — OOM
docker compose logs {service} | grep -i "killed\|oom\|memory"# Решение: уменьшить Xmx в envs/{service}.env или остановить ненужные сервисы