update docker-compose.yml and makefile
Some checks failed
Build and Push Docker Images / build-backend (push) Has been cancelled
Build and Push Docker Images / build-frontend (push) Has been cancelled

This commit is contained in:
Egor Pozharov
2026-04-16 23:19:54 +06:00
parent 357a395cbb
commit 11122c7919
4 changed files with 256 additions and 1 deletions

168
DEPLOY.md Normal file
View File

@@ -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`