Публикация Golang web-приложения на NetAngels. Инструкция для чайников.

Если вы написали свое первое приложение на golang и оно делает чуть больше чем “Hello, World!” (используете СУБД, JS, генерируете HTML) и теперь ищите способ как его опубликовать на просторах интернета, то данная статья для вас.

Статья для людей, которым очевидные вещи могут не казаться таковыми (я из таких), поэтому в ней все будет по порядку, с объяснениями и с примерами. Мы будем рассматривать простейший способ публикации готового web-приложения на примере одного из крупнейших хостинг провайдеров России NetAngels. Под готовым подразумевается, что ваш сайт/приложение уже написано и без ошибок отрабатывает на локальном сервере.

Подготовка к первой публикации

Регистрация, создание сайта и БД на хостинге

Прежде чем приступить к публикации необходимо:

  1. Зарегистрироваться на NetAngels;
  2. Приобрести/перенести домен;
  3. Создать сайт на облачном хостинге. Важно указать, что сайт работает на Python AsyncIO (это не ошибка, данная конфигурация подходит для работы с golang).
  4. В качестве БД выбрать MySQL. Можете выбрать и другую БД, но тонкости подключения к ней на облачном сервере вам придется выяснять отдельно.
  5. После того как сайт будет создан, проведите все необходимые работы с БД (создайте таблицы и убедитесь, что их структура совпадает, с той, которую вы использовали при локальной работе).

Подробно эти шаги не имеет смысла описывать, так как у провайдера есть набор своих инструкций, а цель данной статьи осветить вопрос публикации.

Модификация приложения для работы на облачном сервере под управлением linux

Так как наш сайт будет работать на облачном сервере под управлением ОС Linux, то для его работы потребуется предусмотреть следующие особенности:

  • Все пути к файлам, например при рендеринге страниц должны генерироваться через функцию filepath.Join(). Это позволит избежать ошибок с доступом к файлам, если вы разрабатывали приложение на windows, но публиковать и использовать его будете на linux. Например:
pathOk := filepath.Join("public", "templates", "index.html")//ок
pathBad := "public/templates/index.html"//не используйте
t, err := template.ParseFiles(pathOk)
if err != nil {
    log.Fatal(err)
}
  • Подключение к БД облачного сервера будет отличаться от локального. В частности, MySQL доступен только через сокет /run/mysqld/mysqld.sock и недоступен по сети. Это значит, что если вы локально подключались к БД, используя строку в формате "login:password@tcp(host:port)/db_name", то после публикации и попытки открыть сайт, у вас будет ошибка 502 и запись в логах “dial tcp 127.0.0.1:3306: connect: connection refused”. Проблема решается использованием формата: "user:password@unix(/run/mysqld/mysqld.sock)/db_name?charset=utf8", где нужно заменить только user, password и db_name.
  • Размещая приложение на облачном хостинге, мы не можем прикрепляться к порту 80, т.к он уже занят веб-сервером nginx.Поэтому приложению потребуется прикрепиться на IP и порт, указанные в переменных окружения APP_IP и APP_PORT. Эти переменные мы можем узнать в личном кабинете хостинга, а можем получить при помощи стандартного пакета os. Пример:
APP_IP := os.Getenv("APP_IP")
APP_PORT := os.Getenv("APP_PORT")
fmt.Println(APP_IP+":"+APP_PORT)
_ = http.ListenAndServe(config.APP_IP+":"+config.APP_PORT, nil)

Примечание: Если вы используете julienschmidt/httprouter, то вторым параметром ListenAndServe() передаем r *Router.

Компиляция

Для работы приложения на сервере хостинга, он должен быть скомпилирован под соответствующую платформу (Linuх). Компилятор Go при компиляции исходного кода в ОС Windows называет исполняемый файл с расширением .exe. В ОС Linux он создает файл без расширения. Чтобы при компиляции с ОС Windows получить файл для работы на ОС Linux, необходимо в консоли вашей машины установить нужные переменные:

  1. вызываем консоль (“Win+R”, в поле “Открыть” пишите “cmd” и жмите “ОК”);
  2. перемещаемся в папку с исходным кодом вашего проекта
    cd C:\Users\username\go\src\projectname
  3. устанавливаем нужные переменные, через следующие команды:
    set GOOS=linux
    set GOARCH=amd64
  4. Теперь компилируем, используя команду: go build main.go (название файла может отличаться).
    go build main.go
    В результате получаем скомпилированные исполняемый файл (бинарник) “main”.

Публикация проекта

Подключаемся по FTP к серверу и в папку “app” закидываем скомпилированный бинарник “main” и (важно!) папку со скриптами, стилями и html шаблонами.

При загрузке на сервер на файл были установлены стандартные права, которые не подразумевают возможность его исполнения (запуска). Чтобы установить права на исполнение, мы должны подключиться к консоли нашего сервера (см. “Открыть терминал” на скриншоте ниже).

В командной строке заходим в директорию проекта (команда “cd app”) где лежит наш бинарник и используем следующую команду: chmod +x main

Далее в переменных окружения для APP_PATH устанавливаем путь открываемого приложения и перезапускаем приложение.

На этом все. Ваш проект должен работать! 

Примечание: Если вы работаете через IDE “Goland”, то там поддерживаются возможности, работы с консолью, подключения к хостингу по FTP и установки/изменения прав файлов на хостинге. Описанный процесс публикации там становится в разы легче.