---
# System prepended metadata

title: Создание окружения для liquid-bot

---

# Создание окружения для 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"'
```
Воркфлоу будет запускаться при каждом коммите.