Как деплоил сервис

Всё началось с простого запуска ./bingo. Приложение со мной поздоровалось.

Тогда запустил его флагом -h, чтобы получить какую-то помощь.

Из предложенных команд попробовал запустить команду с конфигом по умолчанию и текущим. Команда /bingo print_current_config выдала ошибку.

По итогам 3-й лекции решил воспользоваться командой strace. Она уже показала местоположение конфига

openat(AT_FDCWD, "/opt/bingo/config.yaml", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

После создания директории и конфига со своим email я попробовал запустить сервер ./bingo run_server. Но получил ошибку: panic: failed to build logger

goroutine 1 [running]: bingo/internal/logger.New({0xc000132780, 0x23}, {0xd34748, 0xd})

Видимо что-то с логами. Поэтому тут пошел ещё раз за помощью к strace. openat(AT_FDCWD, "/opt/bongo/logs/1fd892b4a8/main.log", O_WRONLY|O_CREAT|O_APPEND|O_CLOEXEC, 0666) = -1 ENOENT (No such file or directory)

Нужно было создать директорию /opt/bongo/logs/1fd892b4a8/.

После создания директории сервер стал запускаться, но свалился с подключением к БД.

Тогда я локально поставил postgresql. Пользователю присвоил пароль и попробовал подготовить БД с помощью ./bingo prepare_db.

Как только БД была подготовлена, сервер запустился ./bingo run_server.

My congratulations. You were able to start the server. Here's a secret code that confirms that you did it.

code: yoohoo_server_launched

Но было не понятно на каком порту. Тогда на помощь пришла утилита ss, а полная команда ss -lt4. И в выводе стал виден прослушиваемый порт LISTEN 0 4096 *:4925 :

Подключение к которому подарило ещё один ключ

Hi. Accept my congratulations. You were able to launch this app. In the text of the task, you were given a list of urls and requirements for their work. Get on with it. You can do it, you'll do it.

code: index_page_is_awesome

Далее для кэширования одной страницы был настроен nginx на 80 порту с редиректом на 4925. Страницу long_dummy кэширую локально, а все остальные запросы отправляются на 4925. Позже был настроен балансировщий из облака, который проверяет здоровье по :4925/ping, но балансирует по 80.

Было замечено, что через некоторое время приложение перестает корректно работать. Просто останавливается, чуть позже заметил ещё одну особенность - приложение начинает плохо себя чувствовать, но не прерывается.

Для решения первой проблемы запуск приложения превратил в сервис, который всегда перезапускается.

Для решения второй проблемы написал скрипт check-health.sh, который делает с помощью curl запрос на localhost/ping и проверяет код возврата. Если не 200, то перезапускает приложение. Приложение bingo запускается за +-30 секунд, проверка его здоровья с помощью скрипта запускается каждые 10 секунд, а после «лечения» ждет 30 секунд для запуска приложения.

Ещё была проблема с ротацией логов /opt/bongo/logs/1fd892b4a8/main.log. Они не очищались, и приложение всегда писало в этот файл. Эту проблему можно было решить с помощью logrotate, но уже не успел описать в виде конфигурации для деплоя.

Конфигурация для деплоя описана в виде одного файла для terraform. Хотя кажется, что можно было для настройки использовать ansible, но мне хотелось деплоить этот сервис по нажатию одной кнопки.