Hosting Gо. Обзор вариантов и пример деплоя Golang приложения
Рассмотрим варианты хостинга Golang приложения и развернем код с помощью команды git push в привязанный Git-репозиторий.
Хостинг Go
Amvera Cloud - российский сервис c функционалом Heroku. Поддерживает развертывание и обновление через push в привязанный Git-репозиторий. Если вы не работали с Git, можно воспользоваться загрузкой через интерфейс. Есть нативная поддержка как Golang, так и других окружений, достаточно в интерфейсе выбрать нужную конфигурацию. Стоимость начинается от 170 руб. в месяц, и есть стартовый баланс для бесплатного начала использования. Можно оплачивать РФ картой.
Heroku - иностранный сервис c нативной поддержкой Golang-окружения. Сделайте git push в привязанный Git-репозиторий, и сервис развернет ваш Go проект автоматически на сервере. Стоимость сервиса начинается от 5$ (от 25$, если вы хотите получить гарантии непрерывной работы и выделенного ресурса).
Сервис приложений от Digital Ocean. Позволяет легко развернуть ваше go - приложение в инфраструктуре данного провайдера.
Деплой приложения на Go c SQLite3
В статье мы рассмотрим способ развертывания приложения на Golang с использованием встроенной БД SQLite3. Точнее, мы развернем эхо телеграм-бота и подключим БД для сохранения данных в облаке.
Мы будем использовать:
● Git
● Visual Studio Code (подойдет любой другой IDE)
● Telego
● SQLite3
Видеопример развертывания Go проекта на сервере
Подробная инструкция по деплою
Сначала создадим проект в Amvera
Для этого нам нужно предварительно зарегистрироваться или войти в существующий аккаунт.
Находясь в главном меню, нажимаем кнопку "Cоздать".
Далее вводим любое название проекта, выбираем тип сервиса "Приложение" и выбираем удобный для вас тарифный план.
Нажимаем «Далее» и переходим к загрузке данных проекта.
Существует два варианта загрузить проект: непосредственно командами git или через интерфейс сервиса. Мы рассмотрим оба варианта загрузки проекта.
Подключение к репозиторию через Git
1. Вызываем терминал в IDE, где открыто приложение, или открываем папку проекта в терминале
2. Инициализируем локальный гит репозиторий командой
git init
3. Добавляем удаленный репозиторий нашего проекта (url вашего репозитория будет отличаться. Во избежание синтаксических ошибок, скопируйте ссылку на втором шаге создания проекта)
git remote add amvera https://git.amvera.ru/имя_пользователя/имя_проекта
4. Добавляем файлы и делаем первый коммит
git add .
git commit -m "init"
5. Пушим наш код в репозиторий проекта
git push amvera master
Инициализация через интерфейс
Для добавления файлов этим способом нам потребуется просто перетащить файлы проекта в область на сайте
После добавления файлов создаем конфигурационный файл
Для этого переходим по ссылке и генерируем файл
Среди окружений выбираем Go. Остальные конфигурации оставляем по умолчанию (изменяйте, если вам это требуется)
После этого нажимаем кнопку "Generate YAML", после чего сохраняется конфигурационный файл amvera.yml
Этот файл мы загружаем в репозиторий проекта.
Важно: Файл amvera.yml появился в удаленном репозитории, но локально его у нас пока нет. Добавьте yml файл в репозиторий, чтобы при будущих обновлениях нашего приложения Git не выдавал ошибку.
Перейдите в терминал IDE.
Введите:
git pull amvera master
Подключаем SQLite
Так как SQLite - встроенная база данных, много изменений делать нам не придется.
Заходим в код приложения. Создание БД будет выглядеть примерно так:
package main
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// Открываем соединение с базой данных
db, err := sql.Open("sqlite3", "example.db")
if err != nil {
fmt.Println("Ошибка при открытии базы данных:", err)
return
}
defer db.Close()
// Проверяем, что соединение действительно открыто
err = db.Ping()
if err != nil {
fmt.Println("Ошибка при проверке соединения с базой данных:", err)
return
}
fmt.Println("Соединение с базой данных установлено успешно")
}
Меняем путь сохранения файла БД. Для этого пишем вместо (на моем примере) "example.db" - "/data/example.db".
Теперь наша БД будет сохраняться в /data.
Проверяем работоспособность проекта
Для этого переходим в проект, нажимаем на кнопку "Пересобрать проект" в панели кнопок.
Панель кнопок
Далее нажимаем "Перезапустить проект".
После того, как мы перезапустили проект, какое-то время мы будем видеть статус "Выполняется запуск", после чего, если все выполнено верно, покажется статус "Успешно развернуто".
Возможные проблемы
● Бесконечный статус "Выполняется запуск"
Если вы наблюдаете неизменяемый статус, значит, у вас проблема с конфигурационным файлом (amvera.yml). Попробуйте пересоздать файл по предложенному ранее способу. Также вы можете создать конфигурационный файл через вкладку "Конфигурация".
Также данная ошибка может быть вызвана тем, что вы загружаете большой проект или выбрали недостаточный тариф для своего проекта. Чтобы исправить, выберите тариф выше текущего во вкладе "Настройки".
● "Ошибка работы приложения"
Данная ошибка может появиться перед статусом "Приложение запущено", в этом нет ничего страшного. Когда код только запустился, облако еще не может определить статус работы проекта.
Также, если данная ошибка не исчезает, возможно, вы допустили ошибку в коде проекта или неправильно настроили конфигурационный файл.
Важно: все статические файлы и файлы баз данных (SQLite) нужно загружать в постоянное хранилище /data. Это поможет сохранить их при пересборке и успешно запустить проект.
Описание других возможных ошибок вы можете прочитать в документации по ссылке.
Код проекта из примера
package main
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
)
func main() {
// Открываем соединение с базой данных
db, err := sql.Open("sqlite3", "example.db")
if err != nil {
fmt.Println("Ошибка при открытии базы данных:", err)
return
}
defer db.Close()
// Проверяем, что соединение действительно открыто
err = db.Ping()
if err != nil {
fmt.Println("Ошибка при проверке соединения с базой данных:", err)
return
}
fmt.Println("Соединение с базой данных установлено успешно")
}
Результат: мы успешно развернули на сервере Go приложение с SQLite, таким образом, что обновлять его можно простой командой в терминале - git push.