Skip to content
gretmn102 edited this page Dec 30, 2023 · 3 revisions

Deploy

Эта инструкция предполагает, что:

  • запуск происходит на системе Ubuntu (на других просто-напросто не проверялось)
  • проект компилируется GitHub'ом через Actions и оставляет за собой единственный артефакт, неважно с каким именем

Конечная структура файлов и папок

/
├─ usr/lib/systemd/system
│   └─ $proj_name.service
└─ home/$user_name
    ├─ .scripts
    │   └─ $proj_app.sh
    └─ $proj_path
        ├─ .env
        ├─ deploy
        │   ├─ .env # скопированный .env
        │   └─ ...
        ├─ nohup.err
        └─ nohup.out

Во время исполнения

Программа работает через сервис, состояние которого можно проверить так:

systemctl status $proj_name.service

Лог программы пишется в $proj_path/nohup.out и /$proj_path/nohup.err, которые можно глянуть локально:

tail -n 100 ~/$proj_path/nohup.out
tail -n 100 ~/$proj_path/nohup.err

Либо достучаться через scp:

scp $user_name@example.com:/home/$user_name/$proj_path/deploy/nohup.out program.log

Начальная установка и запуск

  • Удаленно подключиться к хостингу через ssh

  • Установить пакеты jq и libarchive:

    sudo apt install jq
    sudo apt install libarchive-tools
  • заполнить и установить переменные окружения для текущей сессии:

    user_name=$(whoami)
    proj_path=agent-discord-bot # путь к папке проекта
    proj_app=agent-discord-bot # имя исполняемого файла проекта
    github_proj_name=agent-discord-bot # название проекта на GitHub'е (`https://api.github.com/repos/gretmn102/$github_proj_name/actions/artifacts`)
    proj_name=agent-discord-bot # название запускающего скрипта (`~/.scripts/$proj_name.sh`) и скрипт для сервиса (`/usr/lib/systemd/system/$proj_name.service`)
    github_workflow_token=$TODO # токен GitHub'а с правами чтения артефактов
  • создать папку проекта

    mkdir $proj_path
    cd $proj_path
  • Создать папку deploy:

    mkdir deploy
    cd deploy
  • скачать артефакт и распаковать:

    curl \
      -H "Accept: application/vnd.github+json" \
      -H "X-GitHub-Api-Version: 2022-11-28" \
      https://api.github.com/repos/gretmn102/$github_proj_name/actions/artifacts | \
    jq -r '.artifacts[0].archive_download_url' | \
    curl \
      -H "Accept: application/vnd.github+json" \
      -H "Authorization: token $github_workflow_token" \
      -H "X-GitHub-Api-Version: 2022-11-28" \
      -L \
      --url "$(</dev/stdin)" |\
    bsdtar -xf-
  • разрешить запуска исполняемого файла для текущего пользователя:

    chmod u+x $proj_app
  • cd ..

  • создать и заполнить .env:

    AHTUNG: заполни BotToken и DbConnection!

    cat > .env << EOF
    DiscordCommandBotToken=todo
    
    AblyToken=todo
    
    DataBaseName=todo
    
    DbConnection=todo
    EOF
  • скопировать .env в папку deploy:

    cp .env deploy/.env
  • создать запускающий скрипт для сервиса:

    mkdir -p ~/.scripts
    
    cat > ~/.scripts/$proj_name.sh << EOF
    #!/usr/bin/env bash
    
    cd /home/$user_name/$proj_path/deploy
    ./$proj_app >>../nohup.out 2>>../nohup.err
    EOF
  • разрешить запуск скрипта для текущего пользователя

    chmod u+x ~/.scripts/$proj_name.sh
  • создать конфиг сервиса:

    sudo bash -c "cat > /usr/lib/systemd/system/$proj_name.service << EOF
    [Unit]
    Description=Run $proj_name
    After=default.target
    
    [Service]
    ExecStart=/usr/bin/bash /home/$user_name/.scripts/$proj_name.sh
    Restart=on-failure
    RestartSec=1s
    Type=simple
    
    [Install]
    WantedBy=default.target
    EOF"
  • запустить сервис

    systemctl daemon-reload
    systemctl enable $proj_name.service
    systemctl start $proj_name.service
    

Обновление

mkdir -p ~/$proj_path/temp_deploy
cd ~/$proj_path/temp_deploy

curl \
  -H "Accept: application/vnd.github+json" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  https://api.github.com/repos/gretmn102/$github_proj_name/actions/artifacts | \
jq -r '.artifacts[0].archive_download_url' | \
curl \
  -H "Accept: application/vnd.github+json" \
  -H "Authorization: token $github_workflow_token" \
  -H "X-GitHub-Api-Version: 2022-11-28" \
  -L \
  --url "$(</dev/stdin)" |\
bsdtar -xf-

systemctl stop $proj_name.service

# cp -r ~/$proj_path/deploy ~/$proj_path/stable_deploy
rm -r -f ~/$proj_path/deploy

mkdir -p ~/$proj_path/deploy

cp -r ~/$proj_path/temp_deploy/* ~/$proj_path/deploy

rm -r ~/$proj_path/temp_deploy

cp ~/$proj_path/.env ~/$proj_path/deploy/.env

chmod u+x ~/$proj_path/deploy/$proj_name

systemctl start $proj_name.service