Как деплоил сервис
Всё началось с простого запуска ./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.
Но было не понятно на каком порту. Тогда на помощь пришла утилита 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.
Далее для кэширования одной страницы был настроен 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, но мне хотелось деплоить этот сервис по нажатию одной кнопки.