# Создание окружения для liquid-bot
## Запуск инстанса в aws
В aws необходимо создать необходимый инстанс и в процессе создания либо использовать существующие приватный и публичный ключи, либо сгенерировать новую пару
## Базовая установка
### Создание пользователя для деплоя
Можно воспользоваться данной командой (из под пользователя root):
```
useradd deploy; mkdir /home/deploy/.ssh; touch /home/deploy/.ssh/authorized_keys; chown -R deploy: /home/deploy/.ssh/; chmod 0755 /home/deploy/.ssh; chmod 0600 /home/deploy/.ssh/authorized_keys
```
Мы создаем юзера которого будем использовать для деплоя и добавляем папку для публичных ключей и создаем пустой файл публичных ключей.
### Установка nodejs, yarn и pm2
#### CentOS / Amazon Linux 2 AMI
```
curl -sL https://rpm.nodesource.com/setup_14.x | sudo bash -
yum install nodejs
npm install --global yarn
yarn global add pm2
```
#### Ubuntu
```
curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
apt install nodejs
npm install --global yarn
yarn global add pm2
```
## Настройка воркфлоу для github ci
### Secrets
Для того, чтобы воркфлоу работал, необходимо добавить следующие секреты:
**REPO_PATH** - путь до репозитория в контейнере который используется для ci
**KEY_PATH** - путь до ключа, который будет использоваться для авторизации при заливке кода и выполнения команд
**SSH_DIR** - папка где хранится приватный ключ использующийся для авторизации из контейнера ci
**REMOTE_HOST** - адрес инстанса
**REMOTE_USER** - пользователь под который будет заливаться и запускаться приложение
**REMOTE_TARGET** - папка в инстансе, где хранится код
**PRIVATE_KEY** - приватный ключ приложения
**LOGS_PATH** - путь до папки с логами
**SSH_PRIVATE_KEY** - приватный ключ инстанса, используется контейнером CI
### Pm2
Дефолтный конфиг для pm2, должен храниться в корне репозитория.
**pm2.json**:
```
{
"apps": [
{
"name": "liquid-bot",
"script": "./src/app.ts",
"args": ['https://bsc-dataseed2.binance.org','0x67464d0947CfCA965A1ac2dded97b8C3c9921865','0x1Ee38d535d541c55C9dae27B12edf090C608E6Fb','1000'],
"watch": ['src'],
"interpreter": 'node_modules/.bin/ts-node',
"max_memory_restart": "1G",
"max_restarts": 10,
"error_file": "/home/deploy/logs/pm2_liquid-bot_error.log",
"out_file": "/home/deploy/logs/pm2_liquid-bot_out.log",
"pid_file": "/var/run/liquid-bot.pid",
"merge_logs": true,
"node_args" : "--require=tsconfig-paths/register",
"env": {
"NODE_ENV": "production"
}
}
]
}
```
Pm2 используется для управления приложением, без этого конфига воркфлоу работать не будет
### Workflow
**liquid-bot.yml**:
```
name: Deploy app
on: [push]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install rsync
run: sudo apt install -y rsync git
- name: Create ssh folder
run: mkdir ${{ secrets.SSH_DIR }}
- name: Writing private key
run: echo '${{ secrets.SSH_PRIVATE_KEY }}' > ${{ secrets.KEY_PATH }}
- name: Set permissions
run: 'chown -R runner: ${{ secrets.SSH_DIR }}; chmod 755 ${{ secrets.SSH_DIR }}; chmod 0600 ${{ secrets.KEY_PATH }}'
- name: Check logs dir
run: 'ssh -i ${{ secrets.KEY_PATH }} -o StrictHostKeyChecking=no ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }} "if [ ! -d ${{ secrets.LOGS_DIR }} ]; then mkdir ${{ secrets.LOGS_DIR }}; fi"'
- name: Transfering files by rsync
run: 'rsync ${{ secrets.REPO_PATH }} ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }}:${{ secrets.REMOTE_TARGET }} --rsh "ssh -p 22 -i ${{ secrets.KEY_PATH }} -o StrictHostKeyChecking=no" --recursive -rltgoDzvO --delete'
- name: Build deps
run: 'ssh -i ${{ secrets.KEY_PATH }} -o StrictHostKeyChecking=no ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }} "cd ${{ secrets.REMOTE_TARGET }} && yarn"'
- name: Restart app
run: 'ssh -i ${{ secrets.KEY_PATH }} -o StrictHostKeyChecking=no ${{ secrets.REMOTE_USER }}@${{ secrets.REMOTE_HOST }} "export PRIVATE_KEY=${{ secrets.PRIVATE_KEY }}; pm2 stop ${{ secrets.REMOTE_TARGET }}pm2.json; yarn add --dev tsconfig-paths; pm2 start ${{ secrets.REMOTE_TARGET }}pm2.json"'
```
Воркфлоу будет запускаться при каждом коммите.