From 11122c7919b1bfd22c2375d3d3dfc0053db69a4d Mon Sep 17 00:00:00 2001 From: Egor Pozharov Date: Thu, 16 Apr 2026 23:19:54 +0600 Subject: [PATCH] update docker-compose.yml and makefile --- .gitea/workflows/deploy.yml | 48 +++++++++++ DEPLOY.md | 168 ++++++++++++++++++++++++++++++++++++ Makefile | 40 +++++++++ docker-compose.prod.yml | 1 - 4 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 .gitea/workflows/deploy.yml create mode 100644 DEPLOY.md create mode 100644 Makefile diff --git a/.gitea/workflows/deploy.yml b/.gitea/workflows/deploy.yml new file mode 100644 index 0000000..15be4e7 --- /dev/null +++ b/.gitea/workflows/deploy.yml @@ -0,0 +1,48 @@ +name: Build and Push Docker Images + +on: + push: + branches: [main, master] + +jobs: + build-backend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Login to Gitea Registry + uses: docker/login-action@v3 + with: + registry: gitea.chedius.ru + username: ${{ gitea.actor }} + password: ${{ secrets.GITEA_TOKEN }} + + - name: Build and push backend + uses: docker/build-push-action@v5 + with: + context: ./backend + push: true + tags: | + gitea.gitea.chedius.ru/${{ gitea.repository_owner }}/delivery-tracker/backend:latest + gitea.gitea.chedius.ru/${{ gitea.repository_owner }}/delivery-tracker/backend:${{ gitea.sha }} + + build-frontend: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Login to Gitea Registry + uses: docker/login-action@v3 + with: + registry: gitea.chedius.ru + username: ${{ gitea.actor }} + password: ${{ secrets.GITEA_TOKEN }} + + - name: Build and push frontend + uses: docker/build-push-action@v5 + with: + context: ./frontend + push: true + tags: | + gitea.gitea.chedius.ru/${{ gitea.repository_owner }}/delivery-tracker/frontend:latest + gitea.gitea.chedius.ru/${{ gitea.repository_owner }}/delivery-tracker/frontend:${{ gitea.sha }} diff --git a/DEPLOY.md b/DEPLOY.md new file mode 100644 index 0000000..21fce0e --- /dev/null +++ b/DEPLOY.md @@ -0,0 +1,168 @@ +# Автоматический деплой на LXC + Docker + Nginx Proxy Manager + +## Схема работы + +``` +[Git Push] → [Gitea Actions] → [Build Images] → [Gitea Registry] + ↓ +[LXC Server] ← [Watchtower] ← [Poll every 60s] + ↓ +[Nginx Proxy Manager] → [HTTPS] → [frontend:80] + ↓ + /api/* → [backend:8080] (внутри сети) +``` + +## Пошаговая настройка + +### 1. Настройка Gitea + +В конфиге Gitea (`app.ini`) включи registry: + +```ini +[packages] +ENABLED = true +``` + +Перезапусти Gitea. + +### 2. Обнови workflow файл + +Открой `.gitea/workflows/deploy.yml` и замени: +- `gitea.your-domain.com` → на твой домен Gitea +- Убедись что путь `${{ gitea.repository_owner }}/delivery-tracker` корректен + +### 3. Создай токен в Gitea + +- Gitea → Settings → Applications → Generate Token +- Сохрани токен (понадобится для Watchtower) + +### 4. Настройка LXC сервера (если еще не настроен Docker) + +```bash +curl -fsSL https://get.docker.com | sh +sudo usermod -aG docker $USER +newgrp docker +``` + +### 5. Клонируй репозиторий на сервер + +```bash +cd /opt +sudo git clone https://gitea.your-domain.com/yourusername/delivery-tracker.git +sudo chown -R $USER:$USER delivery-tracker +``` + +### 6. Настрой переменные окружения + +```bash +cd delivery-tracker +cp .env.production.example .env +nano .env +``` + +Заполни: +- Пароли для PostgreSQL +- JWT секрет: `openssl rand -hex 32` +- Gitea credentials для Watchtower +- `GITEA_REGISTRY` — твой registry (например: `gitea.example.com/yourusername`) + +### 7. Логин в Gitea Registry на сервере + +```bash +docker login gitea.your-domain.com +# Введи username и токен/password +``` + +### 8. Первый запуск + +```bash +docker-compose -f docker-compose.prod.yml pull +docker-compose -f docker-compose.prod.yml up -d +``` + +### 9. Настройка Nginx Proxy Manager + +Открой веб-интерфейс NPM (обычно `http://server-ip:81` или через твой домен). + +#### Добавь Proxy Host для приложения: + +- **Domain Names**: `delivery.yourdomain.com` (замени на свой поддомен) +- **Scheme**: `http` +- **Forward Hostname/IP**: `frontend` (имя сервиса в docker-compose) +- **Forward Port**: `80` +- **Cache Assets**: Включи +- **Block Common Exploits**: Включи + +**SSL Tab:** +- SSL Certificate: Request a new SSL Certificate +- Force SSL: Включи +- HTTP/2 Support: Включи + +**Как это работает:** +- NPM проксирует все запросы на frontend контейнер +- Frontend nginx сам проксирует `/api/*` запросы на backend через docker network +- Backend вообще не доступен извне — только через frontend + +**Важно**: Контейнеры используют `expose` порты (не `ports`). NPM достучится до `frontend` через docker network если NPM в той же сети, или по IP сервера. + +#### Подключение NPM к сети контейнеров: + +Если NPM запущен в другом compose, подключи его к сети delivery-tracker: + +```bash +docker network connect delivery-tracker_delivery-network npm-app-1 +``` + +Или используй IP адрес сервера (`172.17.0.1` или `host.docker.internal`) в поле Forward Hostname. + +### 10. Проверь автоматическое обновление + +Watchtower будет каждые 60 секунд проверять новые образы: + +```bash +docker-compose -f docker-compose.prod.yml logs -f watchtower +``` + +## Как работает автодеплой + +1. `git push` в main/master +2. Gitea Actions собирает образы → push в Registry +3. Watchtower (60s poll) → проверяет registry → pull новых образов → перезапускает контейнеры +4. NPM продолжает проксировать трафик на обновленные контейнеры + +## Ручной деплой + +```bash +cd /opt/delivery-tracker +docker-compose -f docker-compose.prod.yml pull +docker-compose -f docker-compose.prod.yml up -d +``` + +## Обновление SSL через NPM + +NPM автоматически обновляет SSL сертификаты Let's Encrypt. Ничего делать не нужно. + +## Траблшутинг + +**Образы не обновляются:** +```bash +docker-compose -f docker-compose.prod.yml logs watchtower +docker login gitea.your-domain.com +``` + +**NPM не видит контейнеры:** +- Проверь что NPM и delivery-tracker в одной docker-сети +- Или используй IP сервера вместо имен сервисов +- Проверь `docker network ls` и `docker network inspect delivery-tracker_delivery-network` + +**Контейнеры не запускаются:** +```bash +docker-compose -f docker-compose.prod.yml logs backend +docker-compose -f docker-compose.prod.yml logs frontend +docker-compose -f docker-compose.prod.yml logs postgres +``` + +**Frontend не подключается к backend:** +- Проверь что frontend nginx проксирует `/api/` на `backend:8080` +- Проверь логи frontend: `docker-compose -f docker-compose.prod.yml logs frontend` +- Убедись что backend работает: `docker-compose -f docker-compose.prod.yml logs backend` diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ed697ec --- /dev/null +++ b/Makefile @@ -0,0 +1,40 @@ +# Delivery Tracker - Local Build & Deploy +REGISTRY = gitea.chedius.ru/chedius +PLATFORM = linux/amd64 + +# Build and push both services +.PHONY: all build push deploy + +all: build push + +build: + docker build --platform $(PLATFORM) -t $(REGISTRY)/delivery-tracker/backend:latest ./backend + docker build --platform $(PLATFORM) -t $(REGISTRY)/delivery-tracker/frontend:latest ./frontend + +push: + docker push $(REGISTRY)/delivery-tracker/backend:latest + docker push $(REGISTRY)/delivery-tracker/frontend:latest + +# Quick deploy - build, push and trigger watchtower check +deploy: build push + @echo "Build and push complete. Watchtower will auto-update within 60 seconds." + @echo "Or run 'make watchtower-now' to force immediate update" + +# Force watchtower to check now (run from server) +watchtower-now: + docker exec delivery-tracker-watchtower-1 /watchtower --run-once delivery-tracker-backend-1 delivery-tracker-frontend-1 + +# Update specific containers on server (if watchtower fails) +update-server: + docker pull $(REGISTRY)/delivery-tracker/backend:latest + docker pull $(REGISTRY)/delivery-tracker/frontend:latest + docker-compose up -d --force-recreate backend frontend + +# Full workflow: commit, build, push +release: + @if [ -z "$(MSG)" ]; then echo "Usage: make release MSG='commit message'"; exit 1; fi + git add -A + git commit -m "$(MSG)" || true + git push + $(MAKE) build push + @echo "Released! Watchtower will deploy within 60 seconds." diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 0f3bc1e..92d366b 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -52,7 +52,6 @@ services: - WATCHTOWER_POLL_INTERVAL=60 - WATCHTOWER_INCLUDE_STOPPED=true - WATCHTOWER_REVIVE_STOPPED=false - - WATCHTOWER_LABEL_ENABLE=true # или укажите имена точнее volumes: - /var/run/docker.sock:/var/run/docker.sock # Уберите или исправьте config.json если registry не требует auth