From d89d7bb804e20e53289693594bd070da6b871e33 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 6 Feb 2024 20:10:02 +0000 Subject: [PATCH 1/2] Add terraform --- .dev.env => .env.example | 17 +++---- .github/workflows/production.yml | 71 ++++++++++++++++++++++++++++++ .github/workflows/stage.yml | 71 ++++++++++++++++++++++++++++++ .github/workflows/testing.yml | 26 +++++++++++ .gitignore | 5 ++- .prod.env | 24 ---------- .stage.env | 24 ---------- docker-compose.prod.yml | 31 ------------- docker-compose.stage.yml | 31 ------------- docker-compose.yml | 28 +++--------- infrastructure/.terraform.lock.hcl | 26 +++++++++++ infrastructure/cloud-config.yml | 35 +++++++++++++++ infrastructure/main.tf | 62 ++++++++++++++++++++++++++ 13 files changed, 311 insertions(+), 140 deletions(-) rename .dev.env => .env.example (79%) create mode 100644 .github/workflows/production.yml create mode 100644 .github/workflows/stage.yml create mode 100644 .github/workflows/testing.yml delete mode 100644 .prod.env delete mode 100644 .stage.env delete mode 100644 docker-compose.prod.yml delete mode 100644 docker-compose.stage.yml create mode 100644 infrastructure/.terraform.lock.hcl create mode 100644 infrastructure/cloud-config.yml create mode 100644 infrastructure/main.tf diff --git a/.dev.env b/.env.example similarity index 79% rename from .dev.env rename to .env.example index a0df6c9..5da5117 100644 --- a/.dev.env +++ b/.env.example @@ -7,7 +7,7 @@ # any secret values. BOT_TOKEN= -BOT_VER=3.2 DEV +BOT_VER=3.2 BOT_AUTHOR=Vylpes BOT_OWNERID=147392775707426816 BOT_CLIENTID=682942374040961060 @@ -15,10 +15,11 @@ BOT_CLIENTID=682942374040961060 ABOUT_FUNDING=https://ko-fi.com/vylpes ABOUT_REPO=https://gitea.vylpes.xyz/RabbitLabs/vylbot-app -DB_HOST=127.0.0.1 -DB_PORT=3101 -DB_NAME=vylbot -DB_AUTH_USER=dev -DB_AUTH_PASS=dev -DB_SYNC=true -DB_LOGGING=true \ No newline at end of file +DB_HOST= +DB_PORT= +DB_NAME= +DB_AUTH_USER= +DB_AUTH_PASS= +DB_SYNC= +DB_LOGGING= +DB_DATA_LOCATION=~/.docker \ No newline at end of file diff --git a/.github/workflows/production.yml b/.github/workflows/production.yml new file mode 100644 index 0000000..b4ec152 --- /dev/null +++ b/.github/workflows/production.yml @@ -0,0 +1,71 @@ +name: Deploy To Production + +on: + push: + branches: + - main + +jobs: + build: + environment: prod + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js + uses: actions/setup-node@v1 + with: + node-version: 18.x + - run: yarn install --frozen-lockfile + - run: yarn build + - run: yarn test + + - name: RSync to Stage Server + uses: D3rHase/rsync-deploy-action@v0.2 + with: + HOST: ${{ secrets.SSH_HOST }} + PORT: ${{ secrets.SSH_PORT }} + USER: ${{ secrets.SSH_USER }} + PRIVATE_SSH_KEY: ${{ secrets.SSH_KEY }} + REPOSITORY_PATH: ${{ secrets.SSH_REPO_PATH }} + SERVER_PATH: ${{ secrets.SSH_SERVER_PATH }} + + deploy: + environment: prod + needs: build + runs-on: ubuntu-latest + steps: + - uses: appleboy/ssh-action@v1.0.0 + env: + DB_NAME: ${{ secrets.DB_NAME }} + DB_AUTH_USER: ${{ secrets.DB_AUTH_USER }} + DB_AUTH_PASS: ${{ secrets.DB_AUTH_PASS }} + DB_HOST: ${{ secrets.DB_HOST }} + DB_PORT: ${{ secrets.DB_PORT }} + DB_ROOT_HOST: ${{ secrets.DB_ROOT_HOST }} + DB_SYNC: ${{ secrets.DB_SYNC }} + DB_LOGGING: ${{ secrets.DB_LOGGING }} + DB_DATA_LOCATION: ${{ secrets.DB_DATA_LOCATION }} + BOT_TOKEN: ${{ secrets.BOT_TOKEN }} + BOT_VER: ${{ vars.BOT_VER }} + BOT_AUTHOR: ${{ vars.BOT_AUTHOR }} + BOT_OWNERID: ${{ vars.BOT_OWNERID }} + BOT_CLIENTID: ${{ vars.BOT_CLIENTID }} + ABOUT_FUNDING: ${{ vars.ABOUT_FUNDING }} + ABOUT_REPO: ${{ vars.ABOUT_FUNDING }} + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USER }} + key: ${{ secrets.SSH_KEY }} + port: ${{ secrets.SSH_PORT }} + envs: DB_NAME,DB_AUTH_USER,DB_AUTH_PASS,DB_HOST,DB_PORT,DB_ROOT_HOST,DB_SYNC,DB_LOGGING,DB_DATA_LOCATION,BOT_TOKEN,BOT_VER,BOT_AUTHOR,BOT_OWNERID,BOT_CLIENTID,ABOUT_FUNDING,ABOUT_REPO + script: | + cd ~/app \ + && docker compose down \ + && (pm2 stop vylbot || true) \ + && (pm2 delete vylbot || true) \ + && docker compose up -d \ + && sleep 10 \ + && yarn run db:up \ + && pm2 start --name vylbot dist/vylbot.js \ No newline at end of file diff --git a/.github/workflows/stage.yml b/.github/workflows/stage.yml new file mode 100644 index 0000000..7349c31 --- /dev/null +++ b/.github/workflows/stage.yml @@ -0,0 +1,71 @@ +name: Deploy To Stage + +on: + push: + branches: + - develop + +jobs: + build: + environment: stage + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js + uses: actions/setup-node@v1 + with: + node-version: 18.x + - run: yarn install --frozen-lockfile + - run: yarn build + - run: yarn test + + - name: RSync to Stage Server + uses: D3rHase/rsync-deploy-action@v0.2 + with: + HOST: ${{ secrets.SSH_HOST }} + PORT: ${{ secrets.SSH_PORT }} + USER: ${{ secrets.SSH_USER }} + PRIVATE_SSH_KEY: ${{ secrets.SSH_KEY }} + REPOSITORY_PATH: ${{ secrets.SSH_REPO_PATH }} + SERVER_PATH: ${{ secrets.SSH_SERVER_PATH }} + + deploy: + environment: stage + needs: build + runs-on: ubuntu-latest + steps: + - uses: appleboy/ssh-action@v1.0.0 + env: + DB_NAME: ${{ secrets.DB_NAME }} + DB_AUTH_USER: ${{ secrets.DB_AUTH_USER }} + DB_AUTH_PASS: ${{ secrets.DB_AUTH_PASS }} + DB_HOST: ${{ secrets.DB_HOST }} + DB_PORT: ${{ secrets.DB_PORT }} + DB_ROOT_HOST: ${{ secrets.DB_ROOT_HOST }} + DB_SYNC: ${{ secrets.DB_SYNC }} + DB_LOGGING: ${{ secrets.DB_LOGGING }} + DB_DATA_LOCATION: ${{ secrets.DB_DATA_LOCATION }} + BOT_TOKEN: ${{ secrets.BOT_TOKEN }} + BOT_VER: ${{ vars.BOT_VER }} + BOT_AUTHOR: ${{ vars.BOT_AUTHOR }} + BOT_OWNERID: ${{ vars.BOT_OWNERID }} + BOT_CLIENTID: ${{ vars.BOT_CLIENTID }} + ABOUT_FUNDING: ${{ vars.ABOUT_FUNDING }} + ABOUT_REPO: ${{ vars.ABOUT_FUNDING }} + with: + host: ${{ secrets.SSH_HOST }} + username: ${{ secrets.SSH_USER }} + key: ${{ secrets.SSH_KEY }} + port: ${{ secrets.SSH_PORT }} + envs: DB_NAME,DB_AUTH_USER,DB_AUTH_PASS,DB_HOST,DB_PORT,DB_ROOT_HOST,DB_SYNC,DB_LOGGING,DB_DATA_LOCATION,BOT_TOKEN,BOT_VER,BOT_AUTHOR,BOT_OWNERID,BOT_CLIENTID,ABOUT_FUNDING,ABOUT_REPO + script: | + cd ~/app \ + && docker compose down \ + && (pm2 stop vylbot || true) \ + && (pm2 delete vylbot || true) \ + && docker compose up -d \ + && sleep 10 \ + && yarn run db:up \ + && pm2 start --name vylbot dist/vylbot.js \ No newline at end of file diff --git a/.github/workflows/testing.yml b/.github/workflows/testing.yml new file mode 100644 index 0000000..b6cf270 --- /dev/null +++ b/.github/workflows/testing.yml @@ -0,0 +1,26 @@ +name: Testing + +on: + push: + branches: + - feature/* + - hotfix/* + +jobs: + build: + + runs-on: ubuntu-latest + + strategy: + matrix: + node-version: [18.x, 20.x] + + steps: + - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: yarn install + - run: yarn build + - run: yarn test \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1707d85..e143359 100644 --- a/.gitignore +++ b/.gitignore @@ -105,4 +105,7 @@ dist config.json .DS_Store -ormconfig.json \ No newline at end of file +ormconfig.json +.terraform +*.tfvars +*.tfstate \ No newline at end of file diff --git a/.prod.env b/.prod.env deleted file mode 100644 index 6c9b8c9..0000000 --- a/.prod.env +++ /dev/null @@ -1,24 +0,0 @@ -# Security Warning! Do not commit this file to any VCS! -# This is a local file to speed up development process, -# so you don't have to change your environment variables. -# -# This is not applied to `.env.template`! -# Template files must be committed to the VCS, but must not contain -# any secret values. - -BOT_TOKEN= -BOT_VER=3.2 -BOT_AUTHOR=Vylpes -BOT_OWNERID=147392775707426816 -BOT_CLIENTID=680083120896081954 - -ABOUT_FUNDING=https://ko-fi.com/vylpes -ABOUT_REPO=https://gitea.vylpes.xyz/RabbitLabs/vylbot-app - -DB_HOST=127.0.0.1 -DB_PORT=3121 -DB_NAME=vylbot -DB_AUTH_USER=prod -DB_AUTH_PASS=prod -DB_SYNC=false -DB_LOGGING=false \ No newline at end of file diff --git a/.stage.env b/.stage.env deleted file mode 100644 index 6e29629..0000000 --- a/.stage.env +++ /dev/null @@ -1,24 +0,0 @@ -# Security Warning! Do not commit this file to any VCS! -# This is a local file to speed up development process, -# so you don't have to change your environment variables. -# -# This is not applied to `.env.template`! -# Template files must be committed to the VCS, but must not contain -# any secret values. - -BOT_TOKEN= -BOT_VER=3.2 BETA -BOT_AUTHOR=Vylpes -BOT_OWNERID=147392775707426816 -BOT_CLIENTID=1016767908740857949 - -ABOUT_FUNDING=https://ko-fi.com/vylpes -ABOUT_REPO=https://gitea.vylpes.xyz/RabbitLabs/vylbot-app - -DB_HOST=127.0.0.1 -DB_PORT=3111 -DB_NAME=vylbot -DB_AUTH_USER=stage -DB_AUTH_PASS=stage -DB_SYNC=false -DB_LOGGING=false \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml deleted file mode 100644 index ae37fc5..0000000 --- a/docker-compose.prod.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: "3.9" - -volumes: - prod_database_data: - -services: - # discord: - # build: . - - database: - image: mysql/mysql-server - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - - MYSQL_DATABASE=vylbot - - MYSQL_USER=prod - - MYSQL_PASSWORD=prod - - MYSQL_ROOT_PASSWORD=root - - MYSQL_ROOT_HOST=0.0.0.0 - ports: - - "3121:3306" - volumes: - - prod_database_data:/var/lib/mysql - - phpmyadmin: - image: phpmyadmin - restart: always - ports: - - "3122:80" - environment: - - PMA_ARBITRARY=1 \ No newline at end of file diff --git a/docker-compose.stage.yml b/docker-compose.stage.yml deleted file mode 100644 index e25a6f1..0000000 --- a/docker-compose.stage.yml +++ /dev/null @@ -1,31 +0,0 @@ -version: "3.9" - -volumes: - stage_database_data: - -services: - # discord: - # build: . - - database: - image: mysql/mysql-server - command: --default-authentication-plugin=mysql_native_password - restart: always - environment: - - MYSQL_DATABASE=vylbot - - MYSQL_USER=stage - - MYSQL_PASSWORD=stage - - MYSQL_ROOT_PASSWORD=root - - MYSQL_ROOT_HOST=0.0.0.0 - ports: - - "3111:3306" - volumes: - - stage_database_data:/var/lib/mysql - - phpmyadmin: - image: phpmyadmin - restart: always - ports: - - "3112:80" - environment: - - PMA_ARBITRARY=1 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 92ce70a..b4bf975 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,31 +1,17 @@ version: "3.9" -volumes: - dev_database_data: - services: - # discord: - # build: . - database: image: mysql/mysql-server command: --default-authentication-plugin=mysql_native_password restart: always environment: - - MYSQL_DATABASE=vylbot - - MYSQL_USER=dev - - MYSQL_PASSWORD=dev - - MYSQL_ROOT_PASSWORD=root - - MYSQL_ROOT_HOST=0.0.0.0 + - MYSQL_DATABASE=$DB_NAME + - MYSQL_USER=$DB_AUTH_USER + - MYSQL_PASSWORD=$DB_AUTH_PASS + - MYSQL_ROOT_PASSWORD=$DB_AUTH_PASS + - MYSQL_ROOT_HOST=$DB_ROOT_HOST ports: - - "3101:3306" + - "3306:3306" volumes: - - dev_database_data:/var/lib/mysql - - phpmyadmin: - image: phpmyadmin - restart: always - ports: - - "3102:80" - environment: - - PMA_ARBITRARY=1 \ No newline at end of file + - $DB_DATA_LOCATION:/var/lib/mysql \ No newline at end of file diff --git a/infrastructure/.terraform.lock.hcl b/infrastructure/.terraform.lock.hcl new file mode 100644 index 0000000..cef5196 --- /dev/null +++ b/infrastructure/.terraform.lock.hcl @@ -0,0 +1,26 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/vultr/vultr" { + version = "2.16.1" + constraints = "2.16.1" + hashes = [ + "h1:qd1tyNxmbcaju1/hqqYcc2RabUYNmI0zt9uL0RD/prg=", + "zh:12bc50f3ffbec94bbd8b29de5ef0d3b6e5407aefa5dac4f96c460a0930e5c052", + "zh:15a8a7825ad5934811a04c4864b0059cdf5fcb24f7f1424ab50f47b192769857", + "zh:508c8580f6844fbd3629a712f080298636c32d94645d8c115a8afac37c09b74a", + "zh:70e2d5ffbaf680a79e2808bec7cbfce8cc648d867309959bdfe7cccfac3b11a0", + "zh:7c559bc1c3b8566a0d49929720a94b57c54e58e6fe6a37afbb61eb846b7f366f", + "zh:810562af419bb89dafc556e50c162656c495654496ffb99d5816e2f975ada2a3", + "zh:997ba870f92870daec5fc632ed706d86e3df01d02d70b713e983cd8833d8700c", + "zh:9f189d81f1dbd584498ecfc6ae847fc7bf2267630688d24d6a7314689297acaf", + "zh:9fb0dda2f0ad392cd8354978eafb5b77b577634054717b69a6f0fee447f00801", + "zh:a9efbce3fe4435fad5fda98aeab1bf024327965ffaa74bffbddced5be91bf50b", + "zh:c099f640a1c4c2cf588ef7e3c85b61853424ccafff8e035c82af1d0f9130aad7", + "zh:c2b76ea52cc72325c115985573f68f57dccf382ba532ed12645fa8c958049d70", + "zh:c8171de3b5ebae7d51975cd6a9fbc4d6d3ed3e591719d11d2d83a14edbd0d56e", + "zh:d4636f27dbe3df3e4db3998063a9b5eb064911b1950e6874d28887d35e02700f", + "zh:e09e2ae4232a69d9a1edabc6d4e600107563c2909e009e5e6d6dde2acdd786c5", + "zh:e670e2b5060ec3ac67f234be52d8c85149556ab6601899564a8db45c4c4e02ef", + ] +} diff --git a/infrastructure/cloud-config.yml b/infrastructure/cloud-config.yml new file mode 100644 index 0000000..c8d27d9 --- /dev/null +++ b/infrastructure/cloud-config.yml @@ -0,0 +1,35 @@ +#cloud-config + +users: + - default + - name: vylpes + primary-group: vylpes + shell: /bin/bash + groups: users, docker, sudo + ssh-authorized-keys: + - ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC/EDwCD5t3/WpyqDwpGAJMHTfbpPT9W5ffQfVqlMFl4TA8eVzPS+H/czy3PQOMUAgVKtO1Xup8GdFovN6dMVEk4IPNNS8w8OheSUKOCsRq1A1r2vDHZ/h393l4A9jWGq2HRBdUdQhy7SDXC/VBY2Yo5IQuAhI6gaXz/AENQ0Qf5PpMevfGs2jVu+0Ic5J1ccjX+8FWXZtRi0VF84WIixUfdyNgsi0RkywlRKyas7bDAWRtfB556qrxaQd0iTdyL0sCR+XAIx5cGbf5knFUXXeQvsASczgzn6X4Jzzgnv/MB0K/nALZeETxI9IXki4yQuGSomiR9WRYSIRLZsjrWxUTwk5RPMuAofW8hr20HL5QqBLVRzFVf7RipmCug8JAx8EE1uk8SLFOJCQBwzYTTbp1KAsJtVkUL+0YEIsgFuhPcXXIN1DbHCeKu5WHKnPxx9kwW/bx9q+Id1crYFWMm/a+MJPBNhIGmv9+HAWOeSZDeROCYd9Nx3yEdT15+hn5L/GZaMyk5AbCwjFWVwUVIAt5Pcn/AkBngRc5DuA+JE7TbbeWsYyN379gwswl/IYBP6fO13V80iDwwkQdizvBCtnmD3Q200aI1unpydR4lZlpPyP0ug0t7jJSEAn9nzQmsMSw7sI9BJ3uf49Y8Qf7LPd9llQeJl+qFXpvDBcji/qHYQ== vylpes@Ethans-MacBook-Pro.local + sudo: ['ALL=(ALL) NOPASSWD:ALL'] + +apt: + sources: + docker.list: + source: deb [arch=amd64] https://download.docker.com/linux/debian $RELEASE stable + keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88 + nodejs.list: + source: deb [signed-by=$KEY_FILE] https://deb.nodesource.com/node_18.x $RELEASE main + keyid: 9FD3B784BC1C6FC31A8A0A1C1655A0AB68576280 + +packages: + - git + - rsync + - docker-ce + - docker-ce-cli + - containerd.io + - docker-buildx-plugin + - docker-compose-plugin + - nodejs + +runcmd: + - ufw limit ssh + - ufw enable + - npm install -g yarn pm2 \ No newline at end of file diff --git a/infrastructure/main.tf b/infrastructure/main.tf new file mode 100644 index 0000000..b3a0c90 --- /dev/null +++ b/infrastructure/main.tf @@ -0,0 +1,62 @@ +# Variables +variable "VULTR_API_KEY" { + description = "The Vultr API Key" +} + +variable "INSTANCE_NAME" { + description = "The name of the project this instance is for" +} + +variable "INSTANCE_ENV" { + description = "The environment this project will be running" + default = "prod" +} + +variable "INSTANCE_LOCATION" { + description = "The location all instances will be generated in" + default = "lhr" +} + +# Providers +terraform { + required_providers { + vultr = { + source = "vultr/vultr" + version = "2.16.1" + } + } +} + +provider "vultr" { + api_key = var.VULTR_API_KEY + rate_limit = 100 + retry_limit = 3 +} + +# Resources +resource "vultr_instance" "vps-app" { + label = "vps-${var.INSTANCE_NAME}-${var.INSTANCE_ENV}-${var.INSTANCE_LOCATION}-app" + hostname = "vps-${var.INSTANCE_NAME}-${var.INSTANCE_ENV}-${var.INSTANCE_LOCATION}-app" + plan = "vc2-1c-1gb" + region = var.INSTANCE_LOCATION + os_id = "2136" + enable_ipv6 = false + user_data = file("./cloud-config.yml") + backups = "enabled" + backups_schedule { + type = "daily" + hour = 1 + } + activation_email = false +} + +resource "vultr_reserved_ip" "ip-app" { + region = var.INSTANCE_LOCATION + ip_type = "v4" + instance_id = "${vultr_instance.vps-app.id}" +} + +# Outputs +output "instance_ip" { + value = vultr_instance.vps-app.main_ip +} \ No newline at end of file From c3ae232951aa7fde566ea475ee261ec6c89ff3e3 Mon Sep 17 00:00:00 2001 From: Ethan Lane Date: Tue, 6 Feb 2024 20:17:03 +0000 Subject: [PATCH 2/2] Install npm on cloudinit --- infrastructure/cloud-config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/infrastructure/cloud-config.yml b/infrastructure/cloud-config.yml index c8d27d9..1ae60b7 100644 --- a/infrastructure/cloud-config.yml +++ b/infrastructure/cloud-config.yml @@ -28,6 +28,7 @@ packages: - docker-buildx-plugin - docker-compose-plugin - nodejs + - npm runcmd: - ufw limit ssh