-
Notifications
You must be signed in to change notification settings - Fork 0
Запуск и конфигурация
Самый простой способ запустить проект на локальном компьютере — это использовать конфигурацию, описанную в 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:
Инфраструктуру можно запустить с помощью следующей конфигурации:
Либо явно указать сервисы в конце команды:
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 кэширует результаты, полученные через режим встроенных запросов.
- APP_PATH — несмотря на схожесть названия с APP_PORT, это специфичный параметр, который задаёт путь приложения для веб-хука, и только для него: внутренний сервер поднимает адреса без учёта этого пути! Он позволяет развернуть на одном домене несколько ботов и маршрутизировать запросы между ними. Подробнее рассказано в разделе про запуск бота на сервере.
- WEBHOOK_HOST — доменный адрес сервера, на который будут приходить запросы от Telegram.
- WEBHOOK_PORT — порт сервера, открытый наружу.
-
WEBHOOK_PATH — любой путь, кроме
metrics
.
-
PHOTO_INLINE_EXAMPLE — ссылка или
file_id
картинки-примера из справочных сообщений, объясняющая, как работает inline-режим.
-
REDIS_HOST — доменный адрес Redis. Обычно либо
localhost
, если он проброшен в сеть хост-системы или установлен нативно, либоredis
в отдельной сети Docker-контейнеров. - REDIS_PORT — порт Redis.
- REDIS_PASSWORD — пароль.
-
POSTGRES_HOST — доменный адрес СУБД. Обычно либо
localhost
, если она проброшена в сеть хост-системы или установлена нативно, либоpostgres
в отдельной сети Docker-контейнеров. - POSTGRES_PORT — порт СУБД.
- POSTGRES_DB — название самой базы данных.
- POSTGRES_USER — пользователь, которому принадлежит база данных.
- POSTGRES_PASSWORD — пароль пользователя.
- MIGRATIONS_REPO — GitHub-репозиторий, который будет использоваться в качестве источника миграций, если они не лежат рядом в файловой системе.