name: star-cloud-deploy-production on: push: branches: - main jobs: deploy-production: runs-on: ubuntu-latest steps: - name: Checkout Code uses: actions/checkout@v3 - name: Step 1 - Setup SSH and Sync Code run: | export DEBIAN_FRONTEND=noninteractive echo "Waiting for apt lock..." while fuser /var/lib/dpkg/lock-frontend >/dev/null 2>&1 ; do echo "Apt is busy, waiting 5 seconds..." sleep 5 done if ! command -v rsync >/dev/null 2>&1 || ! command -v ssh >/dev/null 2>&1; then apt-get update && apt-get install -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" rsync openssh-client fi mkdir -p ~/.ssh echo "${{ secrets.PROD_SSH_PRIVATE_KEY }}" > ~/.ssh/id_rsa_prod chmod 600 ~/.ssh/id_rsa_prod echo "${{ secrets.PROD_KNOWN_HOSTS }}" >> ~/.ssh/known_hosts echo "🚀 Syncing code via rsync..." rsync -avz --delete \ --exclude='/.git' \ --exclude='/node_modules' \ --exclude='/vendor' \ --exclude='/storage' \ --exclude='/.env' \ --exclude='/public/build' \ -e "ssh -i ~/.ssh/id_rsa_prod -o StrictHostKeyChecking=no" \ ./ twsystem1003@34.84.169.132:~/star-cloud/ - name: Step 2 - Container Up & Health Check run: | ssh -i ~/.ssh/id_rsa_prod -o StrictHostKeyChecking=no twsystem1003@34.84.169.132 << 'EOF' cd ~/star-cloud test -f .env || cp .env.example .env chown -R twsystem1003:twsystem1003 ~/star-cloud if git diff --name-only HEAD~1 HEAD 2>/dev/null | grep -qE '(Dockerfile|compose\.yaml|docker-compose\.yaml)'; then echo "🔄 偵測到 Docker 檔案變更,執行完整重建..." WWWGROUP=1001 WWWUSER=1001 docker-compose up -d --build else if ! docker ps --format '{{.Names}}' | grep -q 'star-cloud-laravel'; then echo "容器未運行,正在啟動..." WWWGROUP=1001 WWWUSER=1001 docker-compose up -d fi fi docker ps --filter "name=star-cloud" EOF - name: Step 3 - Composer & NPM & Initialization run: | ssh -i ~/.ssh/id_rsa_prod -o StrictHostKeyChecking=no twsystem1003@34.84.169.132 << 'EOF' docker exec star-cloud-laravel sh -c " chown -R 1001:1001 /var/www/html && mkdir -p /.npm && chown -R 1001:1001 /.npm && rm -rf /var/www/html/node_modules " docker exec -u 1001:1001 -w /var/www/html star-cloud-laravel sh -c " composer install --no-dev --optimize-autoloader --no-interaction && npm install && npm run build && php artisan migrate --force && php artisan storage:link && php artisan optimize:clear && php artisan optimize && php artisan view:cache && php artisan queue:restart && php artisan db:seed --class=RoleSeeder --force && php artisan db:seed --class=AdminUserSeeder --force " docker exec star-cloud-laravel chmod -R 775 /var/www/html/storage /var/www/html/bootstrap/cache EOF - name: Step 4 - Restart Long-running Workers run: | ssh -i ~/.ssh/id_rsa_prod -o StrictHostKeyChecking=no twsystem1003@34.84.169.132 "docker restart star-cloud-mqtt-worker" echo "✅ MQTT Worker 已重啟" - name: Step 5 - Cleanup and Key Removal run: | ssh -i ~/.ssh/id_rsa_prod -o StrictHostKeyChecking=no twsystem1003@34.84.169.132 "docker image prune -f" rm ~/.ssh/id_rsa_prod echo "✅ Cleanup complete"