Some checks are pending
Deploy DummyBot / Build & Deploy to ${{ env.DEPLOY_HOST }} (push) Waiting to run
Frontend: - Layout base con design system (Inter+JetBrains Mono, glass, mesh, animaciones) - Landing con hero, mockup OLED, 6 features, 3 pasos - Auth unificado (login+register) con split-screen - App con sidebar fijo, filtros con contadores, stats, modal rediseñado - Settings con 4 tabs (devices/projects/tags/API) - Iconos SVG inline (sin emojis excepto el logo) - Skeletons, pulse-dot, toggle switch, toasts - Unificada vista auth.blade.php (elimina login/register separados) Deploy: - Workflow de Gitea Actions: build + push a /root/dummybot en 157.180.77.232 - Trigger: push a main (también workflow_dispatch) - SSH key dedicada ed25519 dummybot_deploy - /root/dummybot.env preserva .env real (no se commitea) - Healthcheck en /up tras migrar - Rollback state en .last_deploy Backend: - LoginController usa nueva vista auth con mode=login|register
131 lines
4.0 KiB
YAML
131 lines
4.0 KiB
YAML
name: Deploy DummyBot
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
workflow_dispatch:
|
|
|
|
env:
|
|
DEPLOY_HOST: 157.180.77.232
|
|
DEPLOY_USER: root
|
|
DEPLOY_PATH: /root/dummybot
|
|
APP_PORT: 18080
|
|
|
|
jobs:
|
|
deploy:
|
|
name: Build & Deploy to ${{ env.DEPLOY_HOST }}
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup PHP
|
|
uses: shivammathur/setup-php@v2
|
|
with:
|
|
php-version: '8.4'
|
|
extensions: mbstring, pdo, pdo_mysql, bcmath, curl, zip, intl
|
|
coverage: none
|
|
|
|
- name: Validate composer.json
|
|
working-directory: .
|
|
run: composer validate --strict --no-check-publish
|
|
|
|
- name: Cache Composer
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.composer/cache
|
|
key: ${{ runner.os }}-php-${{ hashFiles('**/composer.json') }}
|
|
restore-keys: ${{ runner.os }}-php-
|
|
|
|
- name: Install Composer dependencies (no-dev)
|
|
run: composer install --no-dev --no-interaction --no-progress --optimize-autoloader
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: '20'
|
|
|
|
- name: Install npm dependencies
|
|
run: npm ci --no-audit --no-fund || npm install --no-audit --no-fund
|
|
|
|
- name: Build frontend assets
|
|
run: npm run build
|
|
|
|
- name: Setup SSH
|
|
uses: webfactory/ssh-agent@v0.9.0
|
|
with:
|
|
ssh-private-key: ${{ secrets.DEPLOY_SSH_KEY }}
|
|
|
|
- name: Setup known_hosts
|
|
run: |
|
|
mkdir -p ~/.ssh
|
|
ssh-keyscan -p 22 -H ${{ env.DEPLOY_HOST }} >> ~/.ssh/known_hosts 2>/dev/null
|
|
|
|
- name: Deploy to server
|
|
run: |
|
|
ssh -A ${{ env.DEPLOY_USER }}@${{ env.DEPLOY_HOST }} << 'ENDSSH'
|
|
set -e
|
|
cd ${{ env.DEPLOY_PATH }}
|
|
|
|
echo "→ Fetching latest code"
|
|
git fetch origin main
|
|
git reset --hard origin/main
|
|
git clean -fd
|
|
|
|
echo "→ Pulling env file (preserves local config)"
|
|
cp -n .env.example .env 2>/dev/null || true
|
|
if [ -f /root/dummybot.env ]; then
|
|
cp /root/dummybot.env .env
|
|
fi
|
|
|
|
echo "→ Installing composer dependencies"
|
|
composer install --no-dev --no-interaction --no-progress --optimize-autoloader
|
|
|
|
echo "→ Installing npm dependencies and building assets"
|
|
npm ci --no-audit --no-fund || npm install --no-audit --no-fund
|
|
npm run build
|
|
|
|
echo "→ Caching build state for rollback"
|
|
DEPLOY_TS=$(date -u +%Y%m%d%H%M%S)
|
|
echo "$DEPLOY_TS" > .last_deploy
|
|
|
|
echo "→ Running migrations"
|
|
docker compose exec -T app php artisan migrate --force
|
|
|
|
echo "→ Clearing caches"
|
|
docker compose exec -T app php artisan config:clear
|
|
docker compose exec -T app php artisan route:clear
|
|
docker compose exec -T app php artisan view:clear
|
|
docker compose exec -T app php artisan event:clear
|
|
docker compose exec -T app php artisan optimize
|
|
|
|
echo "→ Restarting services"
|
|
docker compose up -d --remove-orphans
|
|
|
|
echo "→ Healthcheck"
|
|
sleep 5
|
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:${{ env.APP_PORT }}/up --max-time 10 || echo "fail")
|
|
if [ "$HTTP_CODE" != "200" ]; then
|
|
echo "HEALTHCHECK FAILED: $HTTP_CODE"
|
|
exit 1
|
|
fi
|
|
echo "✓ Healthcheck OK ($HTTP_CODE)"
|
|
|
|
echo "→ Cleaning up old images"
|
|
docker image prune -f >/dev/null 2>&1 || true
|
|
ENDSSH
|
|
|
|
- name: Notify success
|
|
if: success()
|
|
run: |
|
|
echo "✅ Deploy successful"
|
|
echo "🌐 https://${{ env.DEPLOY_HOST }}:${{ env.APP_PORT }}"
|
|
|
|
- name: Notify failure
|
|
if: failure()
|
|
run: |
|
|
echo "❌ Deploy failed"
|
|
echo "Check the logs above for details"
|