From 66d436b7aac32300086d1f093c1193e5266d16fc Mon Sep 17 00:00:00 2001 From: dv Date: Wed, 18 Mar 2026 14:56:19 +0300 Subject: [PATCH] fix 2 --- .env.example | 2 +- .woodpecker.yml | 8 +-- README.md | 149 +++++++++++++++++++++++++++++++++++++++--------- 3 files changed, 127 insertions(+), 32 deletions(-) diff --git a/.env.example b/.env.example index d6e859f..201acb3 100644 --- a/.env.example +++ b/.env.example @@ -8,7 +8,7 @@ ADMIN_SECRET=мой_секрет_для_создания_юзеров APP_PORT=3000 # Имя production-образа для docker compose deploy -IMAGE_NAME=registry.example.com/team/intradesk-monitor +IMAGE_NAME=git.ihateamerica.ru/dv/intra_monitor # Порт сервера (по умолчанию 3000) PORT=3000 diff --git a/.woodpecker.yml b/.woodpecker.yml index c2f0798..d67e2c1 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -22,7 +22,7 @@ steps: registry: from_secret: forgejo_host repo: - from_secret: forgejo_image + from_secret: forgejo_image_2 username: from_secret: forgejo_username password: @@ -46,7 +46,7 @@ steps: registry: from_secret: forgejo_host repo: - from_secret: forgejo_image + from_secret: forgejo_image_2 username: from_secret: forgejo_username password: @@ -71,14 +71,14 @@ steps: image: docker:cli volumes: - /var/run/docker.sock:/var/run/docker.sock - - /opt/intradesk-monitor:/deploy + - /opt/intra_monitor:/deploy commands: - | set -e cd /deploy # Проверяем наличие .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 текущего образа (для отката) CONTAINER=$(docker compose ps -q intradesk-monitor 2>/dev/null | head -1) diff --git a/README.md b/README.md index 4f37d13..d2b0082 100644 --- a/README.md +++ b/README.md @@ -1,61 +1,156 @@ -# Монитор заявок - CleverParking +# Монитор заявок — CleverParking 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 cp .env.example .env +# Отредактировать .env под себя docker compose up -d --build ``` -Локальный compose собирает образ из текущего каталога и хранит SQLite в `./data`. +Compose собирает образ из текущего каталога, данные SQLite хранятся в `./data`. -## Production deploy +--- -На сервере должен существовать каталог `/opt/intradesk-monitor` с файлом `.env`. +## Первоначальная настройка сервера -Минимальный пример `/opt/intradesk-monitor/.env`: +Выполняется **один раз** вручную перед первым деплоем через CI. -```dotenv -JWT_SECRET=long_random_secret -ADMIN_SECRET=another_long_secret -APP_PORT=3000 -IMAGE_NAME=git.example.com/user/intradesk-monitor +### 1. Установить Docker + +```bash +curl -fsSL https://get.docker.com | sh ``` -Во время 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 -Нужны секреты репозитория: +Добавить в Settings → Secrets репозитория: -- `forgejo_host` -- `forgejo_image` -- `forgejo_username` -- `forgejo_token` +| Секрет | Значение | +|--------------------|---------------------------------------------------| +| `forgejo_host` | хост registry, например `git.example.com` | +| `forgejo_image` | полный путь образа, например `git.example.com/user/intradesk-monitor` | +| `forgejo_username` | логин пользователя Forgejo | +| `forgejo_token` | токен с правом `package:write` | -`forgejo_image` должен совпадать с `IMAGE_NAME` в серверном `.env`. +--- ## Что делает pipeline -[.woodpecker.yml](c:/Users/Professional/Documents/VSCode/intra_git/intradesk-monitor/.woodpecker.yml) содержит три шага: +`.woodpecker.yml` содержит три шага: -- `docker-build` — сборка и push `latest` и `sha-` при push в `main`; -- `docker-build-tag` — сборка и push git tag, `latest` и `sha-` при событии tag; -- `deploy` — deploy на прод-сервере через Docker socket на агенте `role=work_woodpecker`. +- `docker-build` — сборка и push тегов `latest` и `sha-` при push в `main` +- `docker-build-tag` — сборка и push git-тега, `latest` и `sha-` при событии `tag` +- `deploy` — на сервере делает `docker compose pull` + `up -d` через Docker socket; агент с меткой `role=work_woodpecker` + +--- ## Полезные команды на сервере ```bash cd /opt/intradesk-monitor + +# Статус и логи docker compose ps 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 +``` \ No newline at end of file