Skip to content

Commit

Permalink
feat: add backup database and deploy api ci
Browse files Browse the repository at this point in the history
  • Loading branch information
Leoglme committed Jan 16, 2024
1 parent 00b3826 commit ef083ce
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 18 deletions.
40 changes: 40 additions & 0 deletions .github/workflows/backup-ftp-database.yml
Original file line number Diff line number Diff line change
@@ -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
85 changes: 67 additions & 18 deletions .github/workflows/deploy-api.yml
Original file line number Diff line number Diff line change
@@ -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!"
26 changes: 26 additions & 0 deletions api/.env.production
Original file line number Diff line number Diff line change
@@ -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=

0 comments on commit ef083ce

Please sign in to comment.