Пост

Деплой приложения из Github на виртуальный хостинг

img-description Photo by ainr on Unsplash

Так сложилось, что мои пет-проекты хранятся на гитхабе, а разворачиваю я их на арендованном виртуальном сервере (VPS).

В этом посте хочу вкратце описать то, как я делаю настройку деплоя и запуска/перезапуска приложения.

Настройки на стороне сервера

Как правило, для каждого приложения я создаю отдельного пользователя. Для этого нужно подключится к серверу от рута и запустить следующую команду.

1
$ adduser botbek

Для управления приложением я использую стандартный линуксовый менеджер служб systemd, поскольку через него можно достаточно быстро и гибко настроить запуск/перезапуск/контроль приложения.

Для добавления нового сервиса нужно создать файл, в моем случае /etc/systemd/system/botbek.service, с примерно следующим содержимым.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Description=botbek
# Указываем набор зависимостей сервиса
Requires=postgresql.service

[Service]
Type=simple
User=botbek
Group=botbek
# Команда для запуска
ExecStart=scala /home/botbek/builds/botbek.jar
ExecStop=/bin/kill -HUP $MAINPID
Restart=on-abort
# Набор переменных окружений
Environment=TELEGRAM_TOKEN=Foo

TimeoutSec=300
Restart=always

Видно, что я указал необходимые зависимости, переменные для запуска приложения, а также команды для запуска и остановки.

И последний штрих - нужно дать возможность нашему пользователю вызывать systemctl . Для этого нужно выдать права поправив файлик sudoers. Это делается через команду visudo

1
$ visudo

Где нужно добавить строку

1
botbek ALL=NOPASSWD: /usr/bin/systemctl status botbek.service, /usr/bin/systemctl start botbek.service, /usr/bin/systemctl restart botbek.service

Где говорим, что пользователь botbek может вызывать systemctl для проверки статуса и старта/рестарта приложения.

Настройки на стороне GitHub

В репозитории проекта, для настройки/запуска пайплайнов существует Github Actions. В зависимости от того на каком языке вы пишете настройка может отличаться, но суть одна - нужно собрать проект, (опционально) прогнать тесты, загрузить сборку на сервер и при необходимости запустить/перезапустить приложение. В моем случае для проекта написанного на языке Scala у меня будет создан файл .github/workflows/scala.yml в который добавляю следующие правила.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
name: Scala CI  
  
on:  
  push:  
    branches: [ master ]  
  pull_request:  
    branches: [ master ]  
  
jobs:  
  build:  
  
    runs-on: ubuntu-latest  
  
    steps:  
      - uses: actions/checkout@v3  
  
      - name: Set up JDK 17  
        uses: actions/setup-java@v2  
        with:  
          java-version: '17'  
          distribution: 'temurin'  
  
      - name: Assembly  
        run: sbt assembly  
  
      - name: Deploy to remote  
        uses: garygrossgarten/github-action-scp@release  
        with:  
          local: target/scala-2.13/botbek.jar  
          remote: /home/botbek/builds/botbek.jar  
          host: $  
          username: $  
          password: $

По содержимому видно, что пайплайн запускается в ветке master при каждом пуше в него. Джоба состоит из трех шагов:

  • сначала настраивается java с требуемой версией
  • далее выполняется сборка
  • и, собственно, деплой на виртуальный сервер по scp

Так же видим, что для подключения к серверу используются секреты - хост (SSH_HOST), пользователь (SSH_USER) и пароль (SSH_PASSWORD). Их можно добавить в настройках репозитория в следующей вкладке Settings -> Security -> Secrets -> Actions.

Проверка

После успешного завершения пайплайна, подключимся на сервер по ssh.

1
$ ssh botbek@host.com

И проверим, что файл был успешно загружен.

1
2
botbek@host:~$ ls builds/
  botbek.jar

Запускаем и проверяем, что служба активна

1
2
3
4
5
6
7
8
9
10
$ systemctl start botbek.service
$ systemctl status botbek.service
* botbek.service - botbek
     Loaded: loaded (/etc/systemd/system/botbek.service; static; vendor preset: enabled)
     Active: active (running) since ...; 2 weeks 5 days ago
   Main PID: 126095 (bash)
      Tasks: 22 (limit: 1108)
     Memory: 256.7M
     CGroup: /system.slice/botbek.service
             |-126095 bash /usr/bin/scala /home/botbek/builds/botbek.jar
Авторский пост защищен лицензией CC BY 4.0 .