From 2cb2b3f53e8f7ea781ea09d9680eec6dd68f79fd Mon Sep 17 00:00:00 2001 From: dv Date: Wed, 18 Mar 2026 14:41:05 +0300 Subject: [PATCH] fix2 --- .woodpecker.yml | 44 ++++++++++++++++++++++++++------------- Dockerfile | 6 +++++- docker-compose.deploy.yml | 14 ------------- docker-compose.yml | 9 ++++++-- 4 files changed, 41 insertions(+), 32 deletions(-) delete mode 100644 docker-compose.deploy.yml diff --git a/.woodpecker.yml b/.woodpecker.yml index 1891db4..c2f0798 100644 --- a/.woodpecker.yml +++ b/.woodpecker.yml @@ -2,18 +2,20 @@ # Woodpecker CI Pipeline # # Шаги: -# 1. docker-build — сборка и push образа при push в main -# 2. docker-build-tag — сборка и push образа при git tag -# 3. deploy — деплой на сервер на агенте role=work_woodpecker +# 1. docker-build — сборка и пуш образа (push в main) +# 2. docker-build-tag — сборка и пуш образа с semver-тегом (git tag v*) +# 3. deploy — деплой на сервер (выполняется на агенте role=work_woodpecker) # -# Секреты (Settings -> Secrets): -# forgejo_host — хост registry -# forgejo_image — полный путь образа -# forgejo_username — пользователь registry -# forgejo_token — токен для push +# Секреты (Settings → Secrets репозитория): +# forgejo_host — хост реестра, например git.example.com +# forgejo_image — полный путь образа, например git.example.com/user/intradesk-monitor +# forgejo_username — логин (обычно = gitea.actor) +# forgejo_token — токен с правом package:write # ───────────────────────────────────────────────────────────────────────────── steps: + + # ── 1а. Сборка при push в main ───────────────────────────────────────────── - name: docker-build image: woodpeckerci/plugin-docker-buildx settings: @@ -28,12 +30,16 @@ steps: tags: - latest - "sha-${CI_COMMIT_SHA:0:8}" + cache_from: + from_secret: forgejo_image_cache # значение: git.example.com/user/intradesk-monitor:latest build_args: + - "GIT_COMMIT=${CI_COMMIT_SHA:0:8}" - "BUILDKIT_INLINE_CACHE=1" when: - event: push branch: main + # ── 1б. Сборка при git tag v* (semver) ──────────────────────────────────── - name: docker-build-tag image: woodpeckerci/plugin-docker-buildx settings: @@ -46,14 +52,21 @@ steps: password: from_secret: forgejo_token tags: - - "${CI_COMMIT_TAG}" + - "${CI_COMMIT_TAG}" # v1.2.3 - latest - - "sha-${CI_COMMIT_SHA:0:8}" + - "sha-${CI_COMMIT_SHA:0:8}" # всегда — нужно для отката + cache_from: + from_secret: forgejo_image_cache # значение: git.example.com/user/intradesk-monitor:latest build_args: + - "GIT_COMMIT=${CI_COMMIT_SHA:0:8}" - "BUILDKIT_INLINE_CACHE=1" when: - event: tag + # ── 2. Деплой на продакшн-сервер ────────────────────────────────────────── + # Выполняется на Woodpecker-агенте с меткой role=work_woodpecker. + # Требует: репозиторий помечен «trusted» в настройках Woodpecker-сервера + # (иначе монтирование volumes запрещено). - name: deploy image: docker:cli volumes: @@ -62,12 +75,12 @@ steps: commands: - | set -e - - cp docker-compose.deploy.yml /deploy/docker-compose.yml - test -f /deploy/.env || (echo "Missing /opt/intradesk-monitor/.env on deploy host" && exit 1) - cd /deploy + # Проверяем наличие .env на сервере + test -f .env || (echo "Missing /opt/intradesk-monitor/.env on deploy host" && exit 1) + + # Сохраняем ID текущего образа (для отката) CONTAINER=$(docker compose ps -q intradesk-monitor 2>/dev/null | head -1) if [ -n "$CONTAINER" ]; then OLD_IMAGE=$(docker inspect --format='{{.Image}}' "$CONTAINER") @@ -75,6 +88,7 @@ steps: echo "Snapshot for rollback: $OLD_IMAGE" fi + # Обновляем образ и перезапускаем docker compose pull docker compose up -d --remove-orphans @@ -84,4 +98,4 @@ steps: when: - event: push branch: main - - event: tag + - event: tag \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 07a08f3..aa6fa97 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,6 +6,10 @@ ENV NODE_ENV=production ENV LANG=C.UTF-8 ENV LC_ALL=C.UTF-8 +# Build-аргумент для трассировки коммита (используется при сборке образа) +ARG GIT_COMMIT=unknown +ENV GIT_COMMIT=${GIT_COMMIT} + # Зависимости для better-sqlite3 (нужна компиляция) RUN apk add --no-cache python3 make g++ @@ -27,4 +31,4 @@ ENV DB_PATH=/data/intradesk.db HEALTHCHECK --interval=30s --timeout=5s --start-period=15s --retries=3 \ 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));" -CMD ["node", "server.js"] +CMD ["node", "server.js"] \ No newline at end of file diff --git a/docker-compose.deploy.yml b/docker-compose.deploy.yml deleted file mode 100644 index 5007162..0000000 --- a/docker-compose.deploy.yml +++ /dev/null @@ -1,14 +0,0 @@ -services: - intradesk-monitor: - image: ${IMAGE_NAME}: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 diff --git a/docker-compose.yml b/docker-compose.yml index 704198d..9095b4a 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,8 +1,7 @@ services: intradesk-monitor: + image: ${IMAGE_NAME}:latest container_name: intradesk-monitor - build: - context: . restart: always env_file: .env ports: @@ -13,3 +12,9 @@ services: 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 \ No newline at end of file