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