156 lines
No EOL
4.4 KiB
Markdown
156 lines
No EOL
4.4 KiB
Markdown
# Монитор заявок — CleverParking
|
||
|
||
Node/Express приложение со встроенным фронтендом и SQLite.
|
||
|
||
Образ собирается в Woodpecker CI, публикуется в Forgejo registry и деплоится на сервер через Docker socket на агенте с меткой `role=work_woodpecker`.
|
||
|
||
---
|
||
|
||
## Локальный запуск
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
# Отредактировать .env под себя
|
||
docker compose up -d --build
|
||
```
|
||
|
||
Compose собирает образ из текущего каталога, данные SQLite хранятся в `./data`.
|
||
|
||
---
|
||
|
||
## Первоначальная настройка сервера
|
||
|
||
Выполняется **один раз** вручную перед первым деплоем через CI.
|
||
|
||
### 1. Установить Docker
|
||
|
||
```bash
|
||
curl -fsSL https://get.docker.com | sh
|
||
```
|
||
|
||
Проверить:
|
||
|
||
```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
|
||
|
||
Добавить в Settings → Secrets репозитория:
|
||
|
||
| Секрет | Значение |
|
||
|--------------------|---------------------------------------------------|
|
||
| `forgejo_host` | хост registry, например `git.example.com` |
|
||
| `forgejo_image` | полный путь образа, например `git.example.com/user/intradesk-monitor` |
|
||
| `forgejo_username` | логин пользователя Forgejo |
|
||
| `forgejo_token` | токен с правом `package:write` |
|
||
|
||
---
|
||
|
||
## Что делает pipeline
|
||
|
||
`.woodpecker.yml` содержит три шага:
|
||
|
||
- `docker-build` — сборка и push тегов `latest` и `sha-<shortsha>` при push в `main`
|
||
- `docker-build-tag` — сборка и push git-тега, `latest` и `sha-<shortsha>` при событии `tag`
|
||
- `deploy` — на сервере делает `docker compose pull` + `up -d` через Docker socket; агент с меткой `role=work_woodpecker`
|
||
|
||
---
|
||
|
||
## Полезные команды на сервере
|
||
|
||
```bash
|
||
cd /opt/intradesk-monitor
|
||
|
||
# Статус и логи
|
||
docker compose ps
|
||
docker compose logs -f
|
||
|
||
# Откат на предыдущий образ
|
||
docker compose stop
|
||
docker compose run --rm intradesk-monitor docker tag $(cat .previous_image) intradesk-monitor:rollback
|
||
docker compose up -d
|
||
``` |