Деплой Golang приложения без использования Docker

Деплой Golang приложения без использования Docker
Как задеплоить приложение на Go? Это один из вопросов, возникших у меня после того, как вдоволь наигрался с Go.

Если вы просто хотите чтобы оно где-то работало, вы навряд ли захотите изучать контейнерные системы, вот об этом как раз и поговорим.

Внимание: мы не обсуждаем здесь лучшие способы деплоя, а просто описываем самый лёгкий способ показать вашим друзьям то, что вы сделали на Go, без изучения таких сервисов как Hyper, Heroku или систем типа Docker.

Этот пост — продолжение серии о том, как мы делали photographerexcuses.com.

Настройка Linux VPS

Для меня самый простой способ деплоя веб-приложения — настроить VPS. Он как мой компьютер, только всегда включен.
На сервере нам нужно создать директорию для проекта и создать пользователя для доступа в неё. В принципе, можно использовать домашнюю директорию.

mkdir project_name

Выкладываем бинарник

Если вы настроили ключи ssh, то можно воспользоваться Rsync для копирования бинарника с локальной машины на сервер:

#!/bin/bash
go build main.go
rsync -avz -e ssh main user@SERVER_IP:/home/jonathan/project_name

Затем соединимся с VPS, сменим директорию и запустим наше приложение (оно собрано для этой архитектуры):

ssh user@remote_ip
cd project_name
./main

Деплой с использованием screen

У нас пока есть проблема — как только закроется окно терминал, программа будет завершена. Чтобы предотвратить это, можно использовать screen. Установите её если необходимо (воспользуйтесь своим менеджером пакетов если apt недоступен):

sudo apt-get install screen
Теперь можно запустить новую сессию screen набрав команду screen.

Если мы повторно введём

cd project_name
./main

и нажмём комбинацию CTRL+A+D, сессия screen будет отсоединена. Набрав команду screen -ls, можно увидеть список отсоединённых сессий.

user@tempest:~# screen -ls
There are screens on:
2851.pts-0.tempest (04/01/2017 04:01:56 PM) (Detached)
2459.pts-0.tempest (04/01/2017 03:56:38 PM) (Detached)

Запустив pstree , можно наглядно увидеть концепцию screen:

user@tempest:~# pstree
systemd─┬─accounts-daemon─┬─{gdbus}
│ └─{gmain}
├─acpid
├─agetty
├─atd
├─cron
├─screen───bash
├─screen───bash───top
├─snapd───5*[{snapd}]
├─sshd───sshd───bash───pstree

Здесь одна из сессий screen не делает ничего, а в другой запущена top.

Можно создать любое количество сессий screen и заново подключаться к ним командой screen -r, например так:

screen -r 2851.pts-0.tempest.

Супер! Теперь мы знаем как сделать так, чтобы программа работала при закрытии сессии SSH, осталось сделать так, чтобы при перезапуске VPS наша программа автоматически запустилась.

Создание Init скрипта для нашего приложения

cd /etc/init.d/
touch my-service.sh
vim my-service.sh
chmod +x my-service.sh

#!/bin/sh
### BEGIN INIT INFO
# Provides: main_go
# Required-Start: $network $syslog
# Required-Stop: $network $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start go server at boot time
# Description: your cool web app
### END INIT INFO

case "$1" in
start)
exec /var/www/project_name/main &
;;
stop)
kill $(lsof -t -i:4000)
;;
*)
echo $"Usage: $0 {start|stop}"
exit 1
esac
exit 0

Протестируем:

root@tempest:/etc/init.d# ./my-service.sh start
server running

Откроем другое ssh соединение к серверу и запустим:

cd /etc/init.d
./my-service.sh stop

В первой сессии будет выведено Terminated. Так мы проверили работу команд start и stop.

Теперь запустим эту службу без вывода в открытую консоль:

/etc/init.d/my-service.sh start
Чтобы он запускался при загрузке сервера выполните команду:

update-rc.d my-service.sh defaults
Проверить создание корректных симлинков можно командой

ls -r /etc/rc* | grep my-service
В моём случае вывод такой:

K01my-service.sh
S01my-service.sh
S01my-service.sh
S01my-service.sh
S01my-service.sh
K01my-service.sh
K01my-service.sh

Чтобы проверить, воспользуйтесь init 6 и дождитесь, чтобы сервер вернулся онлайн. Но не делайте этого, если на сервере запущены другие важные приложения.

Источник: «Deploying your Golang App without Docker»

Продолжение: http://tehnojam.ru/category/development/proksifikacija-api-s-nginx.html

Leave a Comment