name: Build and Deploy Backend on: push: tags: - '*' workflow_dispatch: jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 1. Клонируем код - name: Checkout code uses: actions/checkout@v4 # 2. Настраиваем Docker Buildx - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 # 3. Логинимся в Container Registry Gitea - name: Login to Gitea Container Registry uses: docker/login-action@v3 with: registry: git.uvpn.shop username: ${{ gitea.repository_owner }} password: ${{ secrets.ACCESS_TOKEN }} # 4. Собираем и пушим образ - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: . push: true tags: | git.uvpn.shop/uvpn/backend:latest git.uvpn.shop/uvpn/backend:${{ gitea.sha }} - name: Create Gitea Release uses: actions/gitea-release-action@v1 with: release_name: ${{ gitea.ref_name }} release_notes: | ## Релиз ${{ gitea.ref_name }} ${{ (github.event.head_commit.message != '' && format('📝 {0}', github.event.head_commit.message)) || '' }} ### 📦 Что изменилось ${{ github.event.head_commit.message || 'Автоматический релиз через CI/CD' }} --- ### 🔧 Технические детали - **Docker образ:** `${{ env.REGISTRY }}/${{ gitea.repository }}:${{ gitea.sha }}` - **Тег:** `${{ gitea.ref_name }}` - **Ветка:** `${{ gitea.ref }}` - **Автор:** ${{ gitea.actor }} ### 🚀 Деплой - ✅ Образ собран и отправлен в Container Registry - ✅ Сервер обновлён автоматически --- > Релиз создан автоматически через Gitea Actions draft: false prerelease: false env: GITEA_API_KEY: ${{ secrets.ACCESS_TOKEN }} # 5. Устанавливаем SSH-ключ для деплоя - name: Install SSH key uses: webfactory/ssh-agent@v0.9.0 with: ssh-private-key: ${{ secrets.DEPLOY_SSH_KEY }} # 6. Деплой на сервер - name: Deploy on server run: | ssh -o StrictHostKeyChecking=no ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }} << 'EOF' # Переходим в папку с проектом (где лежит docker-compose.yml) cd /opt/uvpn.shop/backend # Логинимся в реестр Gitea (чтобы docker pull мог скачать образ) echo "${{ secrets.ACCESS_TOKEN }}" | docker login git.uvpn.shop -u ${{ gitea.repository_owner }} --password-stdin # Скачиваем свежий образ docker compose pull # Перезапускаем контейнер с новым образом docker compose down || true # Если контейнер не запущен — игнорируем ошибку docker compose up -d # Очищаем неиспользуемые образы docker image prune -f EOF