From ef083ce14ea01a895de466a348d59ce5e0a74a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Guillaume?= Date: Tue, 16 Jan 2024 11:53:50 +0100 Subject: [PATCH] feat: add backup database and deploy api ci --- .github/workflows/backup-ftp-database.yml | 40 +++++++++++ .github/workflows/deploy-api.yml | 85 ++++++++++++++++++----- api/.env.production | 26 +++++++ 3 files changed, 133 insertions(+), 18 deletions(-) create mode 100644 .github/workflows/backup-ftp-database.yml create mode 100644 api/.env.production diff --git a/.github/workflows/backup-ftp-database.yml b/.github/workflows/backup-ftp-database.yml new file mode 100644 index 0000000..0ca4cdd --- /dev/null +++ b/.github/workflows/backup-ftp-database.yml @@ -0,0 +1,40 @@ +name: Backup MariaDB Database FTP +on: + schedule: + - cron: '0 */12 * * *' # Run every 12 hours, backup at 00:00 and 12:00 each day + workflow_dispatch: + +jobs: + backup_database: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install MariaDB Client and Gzip + run: sudo apt-get update && sudo apt-get install -y gzip mariadb-client + + - name: MySQLDump - Connect Database and Backup MariaDB Database FTP + run: | + mkdir backup_databases && cd backup_databases + FILENAME="database_${{ secrets.DATABASE_DB_NAME }}_backup-$(date +%d-%m-%Y-%H-%M-%S).sql.gz" + mysqldump \ + --host='${{ secrets.DATABASE_HOST }}' \ + --user='${{ secrets.DATABASE_USERNAME }}' \ + --password='${{ secrets.DATABASE_PASSWORD }}' \ + --databases ${{ secrets.DATABASE_DB_NAME }} | gzip > $FILENAME + + - name: Set the current date and time + run: echo "CURRENT_DATETIME=$(date +%d-%m-%Y-%H-%M-%S)" >> $GITHUB_ENV + + - name: Deploy backup .sql to FTP + uses: SamKirkland/FTP-Deploy-Action@v4.3.4 + with: + server: ${{ secrets.SERVER_FTP_HOST }} + username: ${{ secrets.SERVER_FTP_USERNAME }} + password: ${{ secrets.SERVER_FTP_PASSWORD }} + port: ${{ secrets.SERVER_FTP_PORT }} + protocol: ftp + local-dir: ./backup_databases/ + server-dir: backup_databases/ + state-name: .ftp-deploy-sync-state-${{ secrets.DATABASE_DB_NAME }}-${{ env.CURRENT_DATETIME }}.json diff --git a/.github/workflows/deploy-api.yml b/.github/workflows/deploy-api.yml index 1667bff..d78a244 100644 --- a/.github/workflows/deploy-api.yml +++ b/.github/workflows/deploy-api.yml @@ -1,41 +1,90 @@ -name: 🚀 Deploy api to o2switch +name: 🚀 Deploy API to OVH VPS on: push: branches: [ 'main' ] + paths: + - 'api/**' pull_request: branches: [ 'main' ] + paths: + - 'api/**' workflow_dispatch: jobs: deploy: runs-on: ubuntu-latest - + env: + APP_DIR: /var/www/aparteasy.api.dibodev.com steps: - name: 🚚 Get latest code - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: 🚀 Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: '16.x' + node-version: 18 - name: 🔍 Install dependencies - run: cd api && npm install + run: cd api && npm install + + - name: 📝 Setup Production .env File + run: cd api && cp .env.production .env + + - name: 📝 Update .env with Secrets + run: | + sed -i "s/APP_KEY=.*/APP_KEY=${{ secrets.APP_KEY }}/" .env + sed -i "s/MYSQL_DATABASE=.*/MYSQL_DATABASE=${{ secrets.DATABASE_DB_NAME }}/" .env + sed -i "s/MYSQL_HOST=.*/MYSQL_HOST=${{ secrets.DATABASE_HOST }}/" .env + sed -i "s/MYSQL_USER=.*/MYSQL_USER=${{ secrets.DATABASE_USERNAME }}/" .env + sed -i "s/MYSQL_PASSWORD=.*/MYSQL_PASSWORD=${{ secrets.DATABASE_PASSWORD }}/" .env + sed -i "s/SMTP_HOST=.*/SMTP_HOST=${{ secrets.SMTP_HOST }}/" .env + sed -i "s/SMTP_PORT=.*/SMTP_PORT=${{ secrets.SMTP_PORT }}/" .env + sed -i "s/SMTP_USERNAME=.*/SMTP_USERNAME=${{ secrets.SMTP_USERNAME }}/" .env + sed -i "s/SMTP_PASSWORD=.*/SMTP_PASSWORD=${{ secrets.SMTP_PASSWORD }}/" .env + sed -i "s/GOOGLE_API_KEY=.*/GOOGLE_API_KEY=${{ secrets.GOOGLE_API_KEY }}/" .env + sed -i "s/GOOGLE_CLIENT_ID=.*/GOOGLE_CLIENT_ID=${{ secrets.GOOGLE_CLIENT_ID }}/" .env + sed -i "s/GOOGLE_CLIENT_SECRET=.*/GOOGLE_CLIENT_SECRET=${{ secrets.GOOGLE_CLIENT_SECRET }}/" .env + sed -i "s/GOOGLE_CALLBACK_URL=.*/GOOGLE_CALLBACK_URL=${{ secrets.GOOGLE_CALLBACK_URL }}/" .env - name: 🧱 Build application - run: cd api && npm run build + run: | + cd api + npm run build + cp .env build/.env - - name: 🛁 Clean install a project - run: cd api/build && npm ci --production + - name: 🛁 Clean install for production + run: cd api/build && npm ci --production --ignore-scripts - - name: 📂 Sync files - uses: SamKirkland/FTP-Deploy-Action@v4.3.4 + - name: 📤 Deploy to VPS + uses: easingthemes/ssh-deploy@main with: - server: ${{ secrets.FTP_SERVER }} - username: ${{ secrets.FTP_USERNAME }} - password: ${{ secrets.FTP_PASSWORD }} - port: 21 - protocol: ftp - local-dir: ./api/build/ - server-dir: aparteasy.api.dibodev.com/app/ + SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} + ARGS: "-azrut --delete" + SOURCE: "api/build/" + REMOTE_HOST: ${{ secrets.SSH_HOST }} + REMOTE_USER: ${{ secrets.SSH_USERNAME }} + REMOTE_PORT: ${{ secrets.SSH_PORT }} + TARGET: ${{ env.APP_DIR }}/html + SCRIPT_BEFORE: | + if ! command -v rsync &> /dev/null + then + echo "rsync could not be found, installing..." + sudo apt-get update + sudo apt-get install -y rsync + else + echo "rsync is already installed." + fi + echo "Starting deployment..." + SCRIPT_AFTER: | + cd ${{ env.APP_DIR }}/html + echo "Restarting API with PM2..." + pm2 restart aparteasy.api.dibodev.com || pm2 start server.js --name aparteasy.api.dibodev.com + pm2 save + echo "Restarting Nginx..." + sudo systemctl restart nginx + echo "Running Migrations..." + node ace migration:run --force + echo "Running Seeders..." + node ace db:seed + echo "Deployment completed successfully!" diff --git a/api/.env.production b/api/.env.production new file mode 100644 index 0000000..d4b4c83 --- /dev/null +++ b/api/.env.production @@ -0,0 +1,26 @@ +PORT=5555 +HOST=0.0.0.0 +NODE_ENV=production +APP_KEY= +CACHE_VIEWS=false +DRIVE_DISK=local +APP_DOMAIN=aparteasy.dibodev.com +APP_EMAIL_NO_REPLY=no-reply@aparteasy.dibodev.com +APP_EMAIL_SUPPORT=support@aparteasy.dibodev.com +APP_LOGO=https://i.ibb.co/qRDCDjm/apart-easy.png +APP_NAME=ApartEasy +APP_PRIMARY_COLOR="#ff2560" +APP_URL=https://aparteasy.dibodev.com +DB_CONNECTION=mysql +MYSQL_DATABASE= +MYSQL_HOST= +MYSQL_PASSWORD= +MYSQL_USER= +SMTP_HOST= +SMTP_PASSWORD= +SMTP_PORT= +SMTP_USERNAME= +GOOGLE_API_KEY= +GOOGLE_CALLBACK_URL= +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET=