name: Deploy Mnemo Cards on: workflow_dispatch: push: branches: - master jobs: deploy-backend: name: Deploy Backend runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v3 - name: Setup SSH run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts - name: Sync Source Code run: | # Sync common packages rsync -avz --delete --exclude '.*' --exclude 'build' --exclude 'doc' \ mnemo_cards_common \ mnemo_cards_common_backend \ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:~/ # Sync backend project rsync -avz --delete --exclude '.*' --exclude 'build' --exclude 'server.exe' \ mnemo_cards_backend \ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:~/ - name: Build and Deploy Backend run: | ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} << 'ENDSSH' set -e -v cd ~/mnemo_cards_backend # Get dependencies and compile echo "📦 Getting dependencies..." dart pub get echo "🔨 Compiling server..." dart compile exe --verbose lib/main.dart -o server_build.exe # Stop service echo "🛑 Stopping service..." sudo systemctl stop mnemo_cards_server || true # Update service file echo "⚙️ Updating service configuration..." sudo chmod 777 mnemo_cards_server.service sudo cp mnemo_cards_server.service /etc/systemd/system/ # Update executable echo "🔄 Replacing executable..." sudo cp server_build.exe server.exe rm server_build.exe # Check certificates and configure mode if [ -d "/etc/letsencrypt/live/api.mnemo-cards.online" ]; then echo "✅ Let's Encrypt certificates found. Configuring dual mode..." sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe --dual --certs /etc/letsencrypt/live/api.mnemo-cards.online -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service else echo "⚠️ No certificates found. Configuring HTTP mode..." sudo sed -i 's|ExecStart=/root/mnemo_cards_backend/server.exe.*|ExecStart=/root/mnemo_cards_backend/server.exe -a 0.0.0.0 -p 8081|' /etc/systemd/system/mnemo_cards_server.service fi # Reload and restart echo "🚀 Restarting service..." sudo systemctl daemon-reload sudo systemctl start mnemo_cards_server # Check status sleep 2 systemctl status mnemo_cards_server --no-pager # Гарантируем, что nginx запущен (важно для работы code.mnemo-cards.online) echo "🔍 Проверяем статус nginx..." if sudo systemctl is-active --quiet nginx; then echo "✅ nginx уже запущен" # Перезагружаем конфигурацию на всякий случай if sudo nginx -t 2>/dev/null; then sudo systemctl reload nginx echo "✅ Конфигурация nginx перезагружена" fi else echo "⚠️ nginx не запущен, запускаем..." if sudo nginx -t 2>/dev/null; then sudo systemctl start nginx sleep 2 if sudo systemctl is-active --quiet nginx; then echo "✅ nginx успешно запущен" else echo "❌ Ошибка: не удалось запустить nginx!" sudo systemctl status nginx --no-pager || true fi else echo "❌ Ошибка в конфигурации nginx!" sudo nginx -t || true fi fi ENDSSH deploy-web: name: Deploy Web App runs-on: ubuntu-latest needs: deploy-backend if: always() # Run even if backend fails (optional, but usually good to separate) steps: - name: Checkout code uses: actions/checkout@v3 - name: Setup Flutter uses: subosito/flutter-action@v2 with: flutter-version: '3.35.5' # Adjust version as needed channel: 'stable' - name: Setup SSH run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa ssh-keyscan -H ${{ secrets.SSH_HOST }} >> ~/.ssh/known_hosts - name: Build Web App run: | cd mnemo_cards_web_v2 flutter pub get flutter build web --release --dart-define=API_BASE_URL=https://api.mnemo-cards.online --dart2js-optimization=O4 - name: Deploy Web App run: | # Sync build artifacts rsync -avz --delete build/web/ ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }}:/var/www/mnemo_cards/ - name: Fix Permissions run: | ssh ${{ secrets.SSH_USER }}@${{ secrets.SSH_HOST }} "chown -R www-data:www-data /var/www/mnemo_cards && chmod -R 755 /var/www/mnemo_cards"