Деплой 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»

Продолжение: tehnojam.pro/category/development/proksifikacija-api-s-nginx.html
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.