This commit is contained in:
dv 2026-03-18 14:56:19 +03:00
parent 2cb2b3f53e
commit 66d436b7aa
3 changed files with 127 additions and 32 deletions

View file

@ -8,7 +8,7 @@ ADMIN_SECRET=мой_секрет_для_создания_юзеров
APP_PORT=3000 APP_PORT=3000
# Имя production-образа для docker compose deploy # Имя production-образа для docker compose deploy
IMAGE_NAME=registry.example.com/team/intradesk-monitor IMAGE_NAME=git.ihateamerica.ru/dv/intra_monitor
# Порт сервера (по умолчанию 3000) # Порт сервера (по умолчанию 3000)
PORT=3000 PORT=3000

View file

@ -22,7 +22,7 @@ steps:
registry: registry:
from_secret: forgejo_host from_secret: forgejo_host
repo: repo:
from_secret: forgejo_image from_secret: forgejo_image_2
username: username:
from_secret: forgejo_username from_secret: forgejo_username
password: password:
@ -46,7 +46,7 @@ steps:
registry: registry:
from_secret: forgejo_host from_secret: forgejo_host
repo: repo:
from_secret: forgejo_image from_secret: forgejo_image_2
username: username:
from_secret: forgejo_username from_secret: forgejo_username
password: password:
@ -71,14 +71,14 @@ steps:
image: docker:cli image: docker:cli
volumes: volumes:
- /var/run/docker.sock:/var/run/docker.sock - /var/run/docker.sock:/var/run/docker.sock
- /opt/intradesk-monitor:/deploy - /opt/intra_monitor:/deploy
commands: commands:
- | - |
set -e set -e
cd /deploy cd /deploy
# Проверяем наличие .env на сервере # Проверяем наличие .env на сервере
test -f .env || (echo "Missing /opt/intradesk-monitor/.env on deploy host" && exit 1) test -f .env || (echo "Missing /opt/intra_monitor/.env on deploy host" && exit 1)
# Сохраняем ID текущего образа (для отката) # Сохраняем ID текущего образа (для отката)
CONTAINER=$(docker compose ps -q intradesk-monitor 2>/dev/null | head -1) CONTAINER=$(docker compose ps -q intradesk-monitor 2>/dev/null | head -1)

147
README.md
View file

@ -1,61 +1,156 @@
# Монитор заявок - CleverParking # Монитор заявок CleverParking
Node/Express приложение со встроенным фронтендом и SQLite. Node/Express приложение со встроенным фронтендом и SQLite.
Проект теперь настроен по той же схеме, что и другой рабочий сервис на этом сервере: Образ собирается в Woodpecker CI, публикуется в Forgejo registry и деплоится на сервер через Docker socket на агенте с меткой `role=work_woodpecker`.
- образ собирается в Woodpecker и публикуется в registry; ---
- deploy выполняется на агенте с label `role=work_woodpecker`;
- на сервере запускается `docker compose pull && docker compose up -d`.
## Локальный запуск ## Локальный запуск
```bash ```bash
cp .env.example .env cp .env.example .env
# Отредактировать .env под себя
docker compose up -d --build docker compose up -d --build
``` ```
Локальный compose собирает образ из текущего каталога и хранит SQLite в `./data`. Compose собирает образ из текущего каталога, данные SQLite хранятся в `./data`.
## Production deploy ---
На сервере должен существовать каталог `/opt/intradesk-monitor` с файлом `.env`. ## Первоначальная настройка сервера
Минимальный пример `/opt/intradesk-monitor/.env`: Выполняется **один раз** вручную перед первым деплоем через CI.
```dotenv ### 1. Установить Docker
JWT_SECRET=long_random_secret
ADMIN_SECRET=another_long_secret ```bash
APP_PORT=3000 curl -fsSL https://get.docker.com | sh
IMAGE_NAME=git.example.com/user/intradesk-monitor
``` ```
Во время deploy pipeline копирует [docker-compose.deploy.yml](c:/Users/Professional/Documents/VSCode/intra_git/intradesk-monitor/docker-compose.deploy.yml) в `/opt/intradesk-monitor/docker-compose.yml`, затем выполняет стандартный `docker compose pull` и `docker compose up -d`. Проверить:
```bash
docker version
docker compose version
```
### 2. Создать рабочий каталог и файлы
```bash
mkdir -p /opt/intradesk-monitor/data
cd /opt/intradesk-monitor
```
Создать `docker-compose.yml`:
```bash
cat > docker-compose.yml << 'EOF'
services:
intradesk-monitor:
image: git.example.com/user/intradesk-monitor:latest
container_name: intradesk-monitor
restart: always
env_file: .env
ports:
- "${APP_PORT:-3000}:3000"
volumes:
- ./data:/data
environment:
NODE_ENV: production
PORT: 3000
DB_PATH: /data/intradesk.db
healthcheck:
test: ["CMD", "node", "-e", "const http=require('http');const req=http.get('http://127.0.0.1:3000/healthz',res=>process.exit(res.statusCode===200?0:1));req.on('error',()=>process.exit(1));"]
interval: 30s
timeout: 5s
retries: 3
start_period: 15s
EOF
```
> Заменить `git.example.com/user/intradesk-monitor` на актуальный путь образа.
### 3. Создать .env
```bash
# Сгенерировать секреты
JWT_SECRET=$(openssl rand -hex 32)
ADMIN_SECRET=$(openssl rand -hex 32)
cat > /opt/intradesk-monitor/.env << EOF
JWT_SECRET=${JWT_SECRET}
ADMIN_SECRET=${ADMIN_SECRET}
APP_PORT=3000
EOF
```
Проверить:
```bash
cat /opt/intradesk-monitor/.env
```
### 4. Авторизоваться в Forgejo registry
Чтобы сервер мог скачать образ при `docker compose pull`:
```bash
docker login git.example.com
```
Ввести логин и токен с правом `package:read`.
Учётные данные сохраняются в `~/.docker/config.json` и используются автоматически при каждом `pull`.
### 5. Проверить вручную до первого CI-деплоя
```bash
cd /opt/intradesk-monitor
docker compose pull
docker compose up -d
docker compose ps
docker compose logs -f
```
Если контейнер поднялся и healthcheck зелёный — сервер готов принимать деплои от CI.
---
## Секреты Woodpecker ## Секреты Woodpecker
Нужны секреты репозитория: Добавить в Settings → Secrets репозитория:
- `forgejo_host` | Секрет | Значение |
- `forgejo_image` |--------------------|---------------------------------------------------|
- `forgejo_username` | `forgejo_host` | хост registry, например `git.example.com` |
- `forgejo_token` | `forgejo_image` | полный путь образа, например `git.example.com/user/intradesk-monitor` |
| `forgejo_username` | логин пользователя Forgejo |
| `forgejo_token` | токен с правом `package:write` |
`forgejo_image` должен совпадать с `IMAGE_NAME` в серверном `.env`. ---
## Что делает pipeline ## Что делает pipeline
[.woodpecker.yml](c:/Users/Professional/Documents/VSCode/intra_git/intradesk-monitor/.woodpecker.yml) содержит три шага: `.woodpecker.yml` содержит три шага:
- `docker-build` — сборка и push `latest` и `sha-<shortsha>` при push в `main`; - `docker-build` — сборка и push тегов `latest` и `sha-<shortsha>` при push в `main`
- `docker-build-tag` — сборка и push git tag, `latest` и `sha-<shortsha>` при событии tag; - `docker-build-tag` — сборка и push git-тега, `latest` и `sha-<shortsha>` при событии `tag`
- `deploy` — deploy на прод-сервере через Docker socket на агенте `role=work_woodpecker`. - `deploy` — на сервере делает `docker compose pull` + `up -d` через Docker socket; агент с меткой `role=work_woodpecker`
---
## Полезные команды на сервере ## Полезные команды на сервере
```bash ```bash
cd /opt/intradesk-monitor cd /opt/intradesk-monitor
# Статус и логи
docker compose ps docker compose ps
docker compose logs -f docker compose logs -f
cat .previous_image
# Откат на предыдущий образ
docker compose stop
docker compose run --rm intradesk-monitor docker tag $(cat .previous_image) intradesk-monitor:rollback
docker compose up -d
``` ```