Compare commits

...

2 Commits

Author SHA1 Message Date
Egor Pozharov
11122c7919 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
2026-04-16 23:19:54 +06:00
Egor Pozharov
357a395cbb update Watchtower to monitor specific containers and enable label-based filtering 2026-04-16 23:04:14 +06:00
4 changed files with 259 additions and 2 deletions

View File

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

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`

40
Makefile Normal file
View File

@@ -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."

View File

@@ -54,8 +54,9 @@ services:
- WATCHTOWER_REVIVE_STOPPED=false - WATCHTOWER_REVIVE_STOPPED=false
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /root/.docker/config.json:/config.json # Уберите или исправьте config.json если registry не требует auth
command: backend frontend --interval 60 # - /root/.docker/config.json:/config.json:ro
command: delivery-tracker-backend-1 delivery-tracker-frontend-1 --interval 60
networks: networks:
- delivery-network - delivery-network