name: Deploy Development on: push: branches: - dev workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest container: image: catthehacker/ubuntu:act-latest steps: # 1️⃣ Checkout code - name: Checkout code shell: sh run: | git clone $GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git /workspace/repo cd /workspace/repo git checkout $GITHUB_REF_NAME # 2️⃣ Build image - name: Build Docker image shell: sh run: | cd /workspace/repo docker build -t merchbay_admin:dev . docker save merchbay_admin:dev | gzip > merchbay_admin_dev.tar.gz # 3️⃣ Setup SSH - name: Setup SSH shell: sh env: DEPLOY_SSH_KEY: ${{ secrets.DEPLOY_SSH_KEY }} DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} run: | mkdir -p ~/.ssh chmod 700 ~/.ssh echo "$DEPLOY_SSH_KEY" > ~/.ssh/id_ed25519 chmod 600 ~/.ssh/id_ed25519 ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts # 4️⃣ Upload artifacts - name: Upload image and compose shell: sh env: DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} run: | scp -i ~/.ssh/id_ed25519 \ /workspace/repo/merchbay_admin_dev.tar.gz \ /workspace/repo/docker-compose.yml \ ${DEPLOY_USER}@${DEPLOY_HOST}:/tmp/ # 5️⃣ Deploy on server - name: Deploy on server shell: sh env: DEPLOY_USER: ${{ secrets.DEPLOY_USER }} DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }} run: | ssh -i ~/.ssh/id_ed25519 $DEPLOY_USER@$DEPLOY_HOST << 'EOF' set -e DEPLOY_DIR="/var/www/apps/merchbay_admin_dev" mkdir -p "$DEPLOY_DIR" echo "📦 Loading image" docker load < /tmp/merchbay_admin_dev.tar.gz echo "📄 Updating compose file" cp /tmp/docker-compose.yml "$DEPLOY_DIR/" cd "$DEPLOY_DIR" echo "🌐 Ensure Traefik network" docker network inspect traefik-public >/dev/null 2>&1 || \ docker network create traefik-public echo "🚀 Starting containers" export DOMAIN=dev-admin.merchbay.app export APP_URL=https://dev-admin.merchbay.app docker compose up -d echo "⏳ Waiting for app container" sleep 15 if docker ps --format '{{.Names}}' | grep -q merchbay_admin_app; then docker compose exec -T app php artisan migrate --force docker compose exec -T app php artisan config:clear docker compose exec -T app php artisan config:cache docker compose exec -T app php artisan route:cache docker compose exec -T app php artisan view:cache else echo "❌ App container not running" docker compose logs exit 1 fi echo "🧹 Cleanup" rm -f /tmp/merchbay_admin_dev.tar.gz /tmp/docker-compose.yml docker image prune -f echo "✅ Deployment completed" EOF # 6️⃣ Health check - name: Health check shell: sh run: | sleep 10 curl -f https://dev-admin.merchbay.app