Опишу свой способ, который перекликается со способом
Алексей . Все это делается одним bash-скриптом, но распишу примерный алгоритм.
1) Создаем юзера под которым будет работать приложение и переключаемся на него:
useradd -s /bin/bash <имя_пользователя>
su <имя_пользователя>
2) Генерируем новый ключ для деплоя
ssh-keygen -t rsa -C "<имя_пользователя>@<домен_сервиса>"
cat ~/.ssh/id_rsa.pub
Например, в gitlab добавляем этот ключ Project>Settings>Deploy Key
3) Клонируем приложение и собираем приложение
cd ~
git clone ssh://______.git app
# здесь не буду расписывать, можно устанавливать через go get и т.д. способы отличаются
# для go get нужно прописать $GOPATH в .bash_profile
4) Создаем systemd service
exit #выходим из-под юзера
nano /etc/systemd/system/<service_name>.service
Вписываем:
[Unit]
Description=<description>
[Service]
Restart=always
RestartSec=10
EnvironmentFile=-/<service_path>/env
WorkingDirectory=/<service_path>/appDir
ExecStart=/<service_path>/appDir/appName
LimitNOFILE=524576
LimitNPROC=524576
User=<user>
Group=<userGroup>
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=<service_name>
[Install]
WantedBy=multi-user.target
5) Запускаем сервис и ставим в автозагрузку:
systemctl start <имя_сервиса>
systemctl enable <имя_сервиса>
Посмотреть статус:
systemctl status <имя_сервиса>
6) Разрешаем просмотр логов и перезапуск сервиса под созданным пользователем
Добавляем в
/etc/sudoers строчки:
Defaults:<имя_пользователя> !authenticate
<имя_пользователя> ALL=/usr/bin/systemctl restart <имя_сервиса>, /usr/bin/systemctl stop <имя_сервиса>, /usr/bin/systemctl start <имя_сервиса>, /usr/bin/journalctl
Теперь эти операции не будут требовать пароля:
sudo journalctl -f -u <имя_сервиса>
sudo systemctl stop <имя_сервиса>
sudo systemctl start <имя_сервиса>
sudo systemctl restart <имя_сервиса>
7) настраиваем виртуальный хост nginx для проксирования на порт приложения, если требуется:
server {
listen 80;
server_name site.ru;
client_max_body_size 256m;
access_log /var/log/nginx-site-acc;
error_log /var/log/nginx-site-err;
log_not_found off;
location ^~ / {
proxy_pass http://localhost:<порт_приложения>;
proxy_set_header Host $host:$server_port;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_buffer_size 16k;
proxy_buffers 32 16k;
proxy_connect_timeout 300;
proxy_send_timeout 300;
proxy_read_timeout 300;
}
location ^~ /files {
alias /home/<имя_пользователя>/app/some_files;
}
}