## 1) Создаем юзера под которым будет работать приложение, задаем пароль и переключаемся на него: ```bash useradd -s /bin/bash <имя_пользователя> passwd <имя_пользователя> su <имя_пользователя> ``` ## 2) Генерируем новый ключ для деплоя ```bash ssh-keygen -t rsa -C "<имя_пользователя>@<домен_сервиса>" cat ~/.ssh/id_rsa.pub ``` Например, в gitlab добавляем этот ключ Project>Settings>Deploy Key ## 3) Клонируем приложение и собираем приложение ```bash cd ~ git clone ssh://______.git app # здесь не буду расписывать, можно устанавливать через go get и т.д. способы отличаются # для go get нужно прописать $GOPATH в .bash_profile ``` ## 4) Создаем systemd service ```bash exit #выходим из-под юзера nano /usr/lib/systemd/system/<имя_сервиса>.service ``` Вписываем: ```bash [Unit] Description=<Описание> [Service] Restart=always RestartSec=10 EnvironmentFile=-/home/<имя_пользователя>/env WorkingDirectory=/home/<имя_пользователя>/app ExecStart=/home/<имя_пользователя>/app/appName LimitNOFILE=524576 LimitNPROC=524576 User=<имя_пользователя> Group=<имя_пользователя> StandardOutput=syslog StandardError=syslog SyslogIdentifier=<имя_сервиса> [Install] WantedBy=multi-user.target ``` ## 5) Запускаем сервис и ставим в автозагрузку: ```bash systemctl start <имя_сервиса> systemctl enable <имя_сервиса> ``` Посмотреть статус: ```bash systemctl status <имя_сервиса> ``` ## 6) Разрешаем просмотр логов и перезапуск сервиса под созданным пользователем Добавляем в `/etc/sudoers` строчки: ```bash Defaults:<имя_пользователя> !authenticate <имя_пользователя> ALL=/usr/bin/systemctl restart <имя_сервиса>, /usr/bin/systemctl stop <имя_сервиса>, /usr/bin/systemctl start <имя_сервиса>, /usr/bin/journalctl ``` Теперь эти операции не будут требовать пароля: ```bash sudo journalctl -f -u <имя_сервиса> sudo systemctl stop <имя_сервиса> sudo systemctl start <имя_сервиса> sudo systemctl restart <имя_сервиса> ``` ## 7) настраиваем виртуальный хост nginx для проксирования на порт приложения, если требуется: ```bash 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; } } ```