Skip to content

Запуск и конфигурация

Leonid Kozarin edited this page Apr 13, 2023 · 2 revisions

Запуск

Локально (для разработки)

Docker

Самый простой способ запустить проект на локальном компьютере — это использовать конфигурацию, описанную в docker-compose.yaml, чтобы собрать приложение и запустить его вместе со всей инфраструктурой в виде Docker-контейнеров, связанных одной сетью. Разумеется, для этого требуется, чтобы на машине были установлены Docker и Docker Compose. Из консоли запускается проще простого:

docker-compose up --build -d

Для GoLand необходимо создать конфигурацию, в которой указать файл с переменными окружения — .env (Modify options → Environment variables file).

Для разработки очень удобно, чтобы к PostgreSQL и Redis можно было подключаться не только из других контейнеров, но и извне, через локальную сеть (localhost). Так что полезно будет задать не только основной Compose-файл, но и docker-compose.override.yaml:

docker-compose -f docker-compose.yaml -f docker-compose.override.yaml up --build -d

При этом в .env-файле нужно сменить хосты на localhost.

При наличии утилиты Make можно использовать сокращённые команды:

  • make start — для запуска проекта;
  • make dev-env — чтобы автоматически заменить хосты на localhost (требуется утилита sed).

Тем не менее, чтобы всё заработало, всё равно придётся открыть файл .env и указать валидный токен Вашего бота в Telegram.

Сборка исполняемого файла

Тем не менее, для отладки удобнее работать с бинарным исполняемым файлом, к которому можно легко прицепиться дебаггером, запуская в контейнерах только инфраструктуру. Сделать это можно и используя обычную команду go build, однако для запуска приложению требуется достаточно большой набор заполненных переменных окружения, так что удобнее положиться в этом вопросе на GoLand с установленным плагином EnvFile:

go build configuration

Инфраструктуру можно запустить с помощью следующей конфигурации:

run infrastructure only configuration

Либо явно указать сервисы в конце команды:

docker-compose -f docker-compose.yaml -f docker-compose.override.yaml up -d postgres redis

Тесты

Тут всё просто: go test -v ./....

Или make test при наличии утилиты Make.

На сервере (промышленная эксплуатация)

На сервере приложение вместе со всей инфраструктурой развёрнуто в виде контейнеров через Docker Compose, но есть ряд нюансов. Как следует из диаграммы развёртывания, на сервере имеются два дополнительных компонента:

  • nginx-proxy — специальная сборка веб-сервера nginx, которая автоматически регистрирует виртуальные хосты для сервисов, у которых определена переменная окружения VIRTUAL_HOST.
  • acme-companion — скрипт, который автоматически выпускает и обновляет сертификаты для сервисов, у которых определена переменная окружения LETSENCRYPT_HOST.

Эти компоненты являются общими для всех сервисов на сервере и позволяют не париться о сертификатах безопасности на уровне приложений, а также выставляют два стандартных порта (80 и 443), осуществляя дальнейшую маршрутизацию либо по доменному имени, либо по пути (которые задаются через переменную VIRTUAL_PATH, а VIRTUAL_DEST=/ позволяет обрезать этот префикс для конечного получателя).

Конфигурация

Приложение конфигурируется с помощью переменных окружения, которые можно поделить на несколько групп.

Параметры приложения

Основные

  • API_TOKEN — токен Вашего бота в Telegram, единственный обязательный параметр без какого-либо значения по умолчанию в файле .env.
  • DEBUG — режим работы бота: отладочный, когда true, или промышленная эксплуатация, когда false; по умолчанию включён. В режиме отладки используется режим получения обновлений от Telegram через long polling, а также печатается больше сообщений логирования. В режиме промышленной эксплуатации ожидается наличие прокси-сервера и используется WebHook.
  • APP_PORT — порт, который будет использоваться приложением для поднятия для внутреннего сервера, через который выставляются наружу как веб-хук, так и метрики.
  • COMMAND_STATE_TTL — время, на которое состояние формы текущей команды сохраняется в Redis.
  • INLINE_CACHE_TIME — время, на которое Telegram кэширует результаты, полученные через режим встроенных запросов.

WebHook

  • APP_PATH — несмотря на схожесть названия с APP_PORT, это специфичный параметр, который задаёт путь приложения для веб-хука, и только для него: внутренний сервер поднимает адреса без учёта этого пути! Он позволяет развернуть на одном домене несколько ботов и маршрутизировать запросы между ними. Подробнее рассказано в разделе про запуск бота на сервере.
  • WEBHOOK_HOST — доменный адрес сервера, на который будут приходить запросы от Telegram.
  • WEBHOOK_PORT — порт сервера, открытый наружу.
  • WEBHOOK_PATH — любой путь, кроме metrics.

Другие специфичные

  • PHOTO_INLINE_EXAMPLE — ссылка или file_id картинки-примера из справочных сообщений, объясняющая, как работает inline-режим.

Параметры Redis

  • REDIS_HOST — доменный адрес Redis. Обычно либо localhost, если он проброшен в сеть хост-системы или установлен нативно, либо redis в отдельной сети Docker-контейнеров.
  • REDIS_PORT — порт Redis.
  • REDIS_PASSWORD — пароль.

Параметры PostgreSQL

  • POSTGRES_HOST — доменный адрес СУБД. Обычно либо localhost, если она проброшена в сеть хост-системы или установлена нативно, либо postgres в отдельной сети Docker-контейнеров.
  • POSTGRES_PORT — порт СУБД.
  • POSTGRES_DB — название самой базы данных.
  • POSTGRES_USER — пользователь, которому принадлежит база данных.
  • POSTGRES_PASSWORD — пароль пользователя.
  • MIGRATIONS_REPO — GitHub-репозиторий, который будет использоваться в качестве источника миграций, если они не лежат рядом в файловой системе.