Простая телефонная книга на Scala с Http4s, Cats IO и Doobie.
Мной предусмотрено несколько вариантов запуска.
Готовый образ находится в репозитории Docker Hub: denisnovac/scala-phonebook. Проще всего запустить его, используя docker-compose и конфиг application.conf
из данного репозитория.
Сборка толстого JAR со всеми зависимостями осуществляется командой sbt assembly
. Полученный JAR готов к запуску. Для его конфигурации необходим файл application.conf
, без него не получится подсоединиться к БД.
Собрать контейнер можно последовательностью команд sbt assembly
и docker build -t phonebook ./
. После этого контейнер можно запускать через docker run
или docker-compose up -d
. В репозитории приложен конфиг docker-compose.yml
с готовыми настройками для поднятия вместе с БД. Для конфигурации программы все ещё необходим application.conf
, его можно "прокинуть" в контейнер (в файле compose он уже прокинут).
Приложение ищет файл application.conf
в месте своего запуска. Если его нет, то оно будет запущено на localhost:9000
с хранением в памяти.
Формат файла:
persistent = true
app-host = "172.18.1.2"
app-port = "9000"
db-host = "172.18.1.10"
db-port = "5432"
db = "postgres"
db-user = "postgres"
db-password = "P@ssw0rd"
Поля файла:
- persistent: Boolean -
true
чтобы использовать БД,false
, чтобы хранить в памяти в коллекции List; - app-host: String - адрес приложения;
- app-port: String - порт приложения;
- db-host: String - адрес удалённой БД;
- db-port: String - порт удалённой БД;
- db: String - имя базы данных, в которой приложение будет работать;
- db-user: String - имя пользователя БД, у которого есть доступ к этой БД;
- db-password: String - пароль пользователя БД.
Если persistent = true
, то ещё до запуска Blaze сервера и бинда на порт приложение начнёт ждать БД. Если соединение не будет получено - будет брошен эксепшен SQLTimeoutException
.
Если и БД, и приложение в контейнере - настройки app-host
и db-host
должны соответствовать внутренней сети Docker. Но можно поступать и иначе. Например, запустить БД в контейнере, а приложение - на хосте. Тогда app-host
и db-host
должны быть localhost
. Если БД находится на удалённом хосте, то приложение должно быть запущено с сетью, из которой есть доступ к сети БД.
Если пользоваться контейнером, то файл можно прокинуть откуда угодно через композ или соответствующий параметр в файл /opt/app/application.conf
:
./application.conf:/opt/app/application.conf