name: Deploy XFlow (AVTEX/Projects) on: push: branches: - master workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest container: image: node:22-alpine options: --network bridge defaults: run: shell: sh steps: - name: Checkout shell: sh env: TOKEN: ${{ secrets.GIT_TOKEN }} run: | if ! command -v git >/dev/null 2>&1; then if command -v apk >/dev/null 2>&1; then apk add --no-cache git elif command -v apt-get >/dev/null 2>&1; then apt-get update && apt-get install -y git else echo "Git not found and no package manager detected" exit 1 fi fi CLEAN_TOKEN=$(printf '%s' "${TOKEN}" | tr -d '\r\n') git clone "http://oauth2:${CLEAN_TOKEN}@git.a-crm.controlsystem.kz/AVTEX/XFlow.git" . - name: Install dependencies run: | npm install --include=dev ls -la node_modules/prisma || echo "Prisma not found in node_modules" - name: Build Nuxt run: | npx prisma generate npm run build mkdir -p .output/server/node_modules/@prisma cp -r node_modules/.prisma .output/server/node_modules/ cp -r node_modules/@prisma/* .output/server/node_modules/@prisma/ cp -r node_modules/pg .output/server/node_modules/ env: DATABASE_URL: "postgresql://admin:dummy@dummy:5432/dummy" # Нужна заглушка для билда призмы NUXT_PUBLIC_FIREBASE_API_KEY: ${{ secrets.FIREBASE_API_KEY }} NUXT_PUBLIC_FIREBASE_AUTH_DOMAIN: ${{ secrets.FIREBASE_AUTH_DOMAIN }} NUXT_PUBLIC_FIREBASE_PROJECT_ID: ${{ secrets.FIREBASE_PROJECT_ID }} NUXT_PUBLIC_FIREBASE_APP_ID: ${{ secrets.FIREBASE_APP_ID }} NUXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID: ${{ secrets.FIREBASE_MESSAGING_SENDER_ID }} - name: Deploy to server run: | if ! command -v docker >/dev/null 2>&1; then if command -v apk >/dev/null 2>&1; then apk add --no-cache docker-cli elif command -v apt-get >/dev/null 2>&1; then apt-get update && apt-get install -y docker.io else echo "Docker not found and no package manager detected" exit 1 fi fi echo "🌉 Создаем мост к серверу через временный контейнер..." docker stop bridge 2>/dev/null || true docker rm bridge 2>/dev/null || true docker run -d --name bridge -v /root/projects:/server alpine sleep 300 echo "🧹 Очистка старых файлов на сервере..." docker exec bridge sh -c "rm -rf /server/xflow/.output/*" docker exec bridge sh -c "rm -rf /server/xflow/prisma/*" echo "🚀 Копирование билда и файлов на сервер..." docker exec bridge mkdir -p /server/xflow/.output docker exec bridge mkdir -p /server/xflow/prisma docker exec bridge mkdir -p /server/xflow/node_modules docker cp .output/. bridge:/server/xflow/.output/ docker cp prisma/. bridge:/server/xflow/prisma/ docker cp node_modules/. bridge:/server/xflow/node_modules/ docker cp package.json bridge:/server/xflow/package.json docker cp prisma.config.ts bridge:/server/xflow/prisma.config.ts docker rm -f bridge echo "🔄 Перезапуск приложения через единый docker-compose.yml на хосте..." docker run --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /root/projects:/root/projects \ -w /root/projects \ docker:cli \ sh -c "docker compose stop xflow_crm 2>/dev/null || true; docker compose rm -f xflow_crm 2>/dev/null || true; docker compose up -d --force-recreate --no-deps xflow_crm" echo "⏳ Waiting for container to start..." sleep 5 # Миграции с использованием новой БД xflow_crm_db docker exec xflow_crm npx prisma migrate deploy docker exec xflow_crm npx prisma db seed echo "✅ XFlow CRM deployed at $(date)"