Налаштування Hot Reload та міграцій для Go проєкту в Docker

При розробці на Go часто виникає потреба швидко тестувати зміни без перезбірки Docker контейнера. У цій статті розглянемо як налаштувати гаряче перезавантаження (hot reload) за допомогою Air та додати систему міграцій для PostgreSQL.

Що ми будемо робити

  • Налаштуємо окреме dev-середовище з Air для автоматичного перезапуску
  • Додамо систему міграцій бази даних
  • Налаштуємо збереження результатів парсингу в PostgreSQL
  • Організуємо структуру проєкту для зручної розробки

Крок 1: Створення Dockerfile.dev

Спочатку створимо окремий Dockerfile для розробки:

Крок 2: Конфігурація Air

Створюємо файл .air.toml для налаштування hot reload:

Важливі параметри:

  • cmd – команда збірки з -buildvcs=false для уникнення помилок Git в Docker
  • exclude_dir – директорії які не треба відслідковувати
  • stop_on_error = true – зупиняти при помилках компіляції

Крок 3: Docker Compose з профілями

Додаємо dev-сервіс в docker-compose.yml:

Використання профілів дозволяє запускати:

Крок 4: Система міграцій

Створення пакету database

internal/database/database.go:

Система міграцій

internal/database/migrate.go:

Крок 5: Створення першої міграції

migrations/000001_create_parse_results.up.sql:

Крок 6: Інтеграція в main.go

Крок 7: Storage для роботи з БД

internal/storage/postgres.go:

Тестування

Запуск dev-версії

Парсинг URL

Перевірка в БД

Очікуваний результат:

Типові проблеми та рішення

SSL помилка PostgreSQL

Проблема: pq: SSL is not enabled on the server

Рішення: Додати ?sslmode=disable до DATABASE_URL або обробити це в коді:

VCS помилка при збірці

Проблема: error obtaining VCS status: exit status 128

Рішення: Додати -buildvcs=false до команди збірки в .air.toml:

Дані не зберігаються

Проблема: Парсинг працює, але записів в БД немає

Рішення: Перевірити:

  1. Чи ініціалізовано storage: додати логи
  2. Чи викликається SaveParseResult
  3. Чи є помилки при збереженні

Висновки

Ми налаштували повноцінне dev-середовище з:

  • Автоматичним перезапуском при зміні коду
  • Системою міграцій бази даних
  • Збереженням результатів у PostgreSQL
  • Роздільними конфігураціями для dev/prod

Тепер розробка стала набагато швидшою – не потрібно перезбирати Docker контейнер після кожної зміни коду.

Корисні команди

Опубліковано в Golang

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *