Skip to content

Быстрая разработка микросервисов без пересборки Docker

Для быстрой разработки с hot reload рекомендуется запускать только БД и Redis в Docker, а микросервисы локально.

Источник: ранее файл Инструкции/DEV_QUICK_START.md (перенесён и стандартизирован).

🚀 Быстрый старт

1. Остановите старые контейнеры (если есть):

Если у вас запущены старые контейнеры из монолита, остановите их:

bash
# Остановить старый Redis (если запущен)
docker stop nimbus-redis-1 2>/dev/null || true
docker rm nimbus-redis-1 2>/dev/null || true

# Или остановить все старые контейнеры
docker-compose down 2>/dev/null || true

2. Запустите только БД и Redis в Docker:

bash
# Используйте docker-compose для микросервисов:
docker-compose -f docker-compose.microservices.yml up -d postgres-auth postgres-core postgres-billing redis-auth redis-core redis-billing

# Или запустите все сервисы (включая сами микросервисы в Docker):
docker-compose -f docker-compose.microservices.yml up -d

Базы данных:

  • postgres-auth на порту 5433 (БД: nimbus_auth)
  • postgres-core на порту 5434 (БД: nimbus_core)
  • postgres-billing на порту 5435 (БД: nimbus_billing)
  • redis-auth на порту 6379 (для auth-service)
  • redis-core на порту 6380 (для core-service)
  • redis-billing на порту 6381 (для billing-service)

2. Запустите микросервисы локально (в отдельных терминалах):

Auth Service (порт 8001)

Файл .env уже создан с настройками по умолчанию. При необходимости можно отредактировать services/auth-service/.env.

Запустите:

bash
cd services/auth-service
go mod download  # Если еще не установлены зависимости
go mod tidy

# Вариант 1: Простой запуск (поля версии будут "unknown")
go run cmd/server/main.go

# Вариант 2: Запуск с версией через Makefile (рекомендуется)
make run

# Вариант 3: Запуск с версией вручную
go run -ldflags "-X nimbus/auth-service/internal/version.BuildTime=$(date -u '+%Y-%m-%dT%H:%M:%SZ') -X nimbus/auth-service/internal/version.GitCommit=$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown') -X nimbus/auth-service/internal/version.GitBranch=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo 'unknown')" ./cmd/server

Если получаете ошибку address already in use на порту 8001:

bash
# Найти и остановить процесс на порту 8001
lsof -ti :8001 | xargs kill -9 2>/dev/null || echo "Port is free"

Auth Service будет доступен на http://localhost:8001

Core Service (порт 8002)

Файл .env уже создан с настройками по умолчанию. При необходимости можно отредактировать services/core-service/.env.

Запустите:

bash
cd services/core-service
go mod download  # Если еще не установлены зависимости
go mod tidy
go run cmd/server/main.go

Если получаете ошибку address already in use на порту 8002:

bash
# Найти и остановить процесс на порту 8002
lsof -ti :8002 | xargs kill -9 2>/dev/null || echo "Port is free"

Core Service будет доступен на http://localhost:8002

Billing Service (порт 8003)

Файл .env уже создан с настройками по умолчанию. При необходимости можно отредактировать services/billing-service/.env.

Запустите:

bash
cd services/billing-service
go mod download  # Если еще не установлены зависимости
go mod tidy
go run cmd/server/main.go

Если получаете ошибку address already in use на порту 8003:

bash
# Найти и остановить процесс на порту 8003
lsof -ti :8003 | xargs kill -9 2>/dev/null || echo "Port is free"

Billing Service будет доступен на http://localhost:8003

3. Запустите Frontend локально (в отдельном терминале):

bash
cd frontend
npm run dev

Frontend будет доступен на http://localhost:5173 с автоматическим hot reload при изменении файлов.

⚠️ Важно: Обновите frontend/src/api.ts для работы с микросервисами:

  • Auth endpoints: http://localhost:8001/api
  • Core endpoints: http://localhost:8002/api
  • Billing endpoints: http://localhost:8003/api

4. (Опционально) Запустите сервисы мониторинга в Docker:

Для мониторинга приложения можно запустить Prometheus, Grafana и Alertmanager:

bash
# Запустить все сервисы мониторинга
docker-compose up -d prometheus grafana alertmanager

# Или запустить только нужные сервисы
docker-compose up -d prometheus      # Только Prometheus
docker-compose up -d grafana         # Только Grafana
docker-compose up -d alertmanager    # Только Alertmanager

Доступ к сервисам мониторинга:

Остановка сервисов мониторинга:

bash
# Остановить все сервисы мониторинга
docker-compose stop prometheus grafana alertmanager

# Или остановить конкретный сервис
docker-compose stop prometheus

Просмотр логов:

bash
# Логи Prometheus
docker-compose logs -f prometheus

# Логи Grafana
docker-compose logs -f grafana

# Логи Alertmanager
docker-compose logs -f alertmanager

⚠️ Решение проблем

Предупреждения Docker Compose

1. Предупреждение об устаревшем атрибуте version

Проблема:

WARN[0000] the attribute `version` is obsolete, it will be ignored

Решение:Исправлено - атрибут version удалён из всех docker-compose файлов.

2. Предупреждение об orphan контейнерах

Проблема:

WARN[0000] Found orphan containers ([grafana alertmanager prometheus nimbus-backend-1 nimbus-postgres-1])

Причина: Эти контейнеры были созданы из других docker-compose файлов и не определены в текущем файле.

Решения:

Вариант 1 (рекомендуется): Использовать флаг --remove-orphans при запуске:

bash
docker-compose -f docker-compose.microservices.yml up -d --remove-orphans

Вариант 2: Удалить orphan контейнеры вручную:

bash
# Просмотреть orphan контейнеры
docker ps -a --filter "name=grafana|alertmanager|prometheus nimbus-backend-1 nimbus-postgres-1"

# Удалить их
docker rm -f grafana alertmanager prometheus nimbus-backend-1 nimbus-postgres-1

Вариант 3: Использовать скрипт очистки:

bash
./scripts/docker-cleanup.sh

Примечание: Контейнеры grafana, prometheus, alertmanager определены в docker-compose.yml (система мониторинга). Если вы не используете мониторинг, их можно безопасно удалить.

Ошибка "role 'postgres' does not exist"

Если вы видите ошибку FATAL: role "postgres" does not exist, это означает, что:

  1. У вас запущена локальная PostgreSQL (не из Docker), которая перехватывает подключения
  2. Или база данных не создана

Решение:

Вариант 1 (рекомендуется): Остановите локальную PostgreSQL и используйте только Docker:

bash
# Проверьте, запущена ли локальная PostgreSQL
ps aux | grep postgres | grep -v docker

# Остановите локальную PostgreSQL (macOS с Homebrew)
brew services stop postgresql@17
# или
brew services stop postgresql

# Затем запустите PostgreSQL из Docker
docker-compose -f docker-compose.microservices.yml up -d postgres-auth postgres-core postgres-billing redis

# Проверьте подключение
PGPASSWORD=postgres psql -h localhost -p 5433 -U postgres -d nimbus_auth -c "SELECT current_database();"
PGPASSWORD=postgres psql -h localhost -p 5434 -U postgres -d nimbus_core -c "SELECT current_database();"
PGPASSWORD=postgres psql -h localhost -p 5435 -U postgres -d nimbus_billing -c "SELECT current_database();"

Вариант 2: Используйте локальную PostgreSQL (если нужно):

Создайте три базы данных:

bash
psql -U ваш_пользователь -d postgres

CREATE DATABASE nimbus_auth;
CREATE DATABASE nimbus_core;
CREATE DATABASE nimbus_billing;
\q

И обновите DATABASE_URL в .env файлах каждого сервиса.

Проверка подключения к БД

Проверка контейнеров Docker:

bash
# Проверьте, что контейнеры запущены
docker ps | grep postgres

# Проверьте подключение к auth БД
docker exec -it $(docker ps -q -f name=postgres-auth) psql -U postgres -d nimbus_auth -c "SELECT current_database();"

# Проверьте подключение к core БД
docker exec -it $(docker ps -q -f name=postgres-core) psql -U postgres -d nimbus_core -c "SELECT current_database();"

# Проверьте подключение к billing БД
docker exec -it $(docker ps -q -f name=postgres-billing) psql -U postgres -d nimbus_billing -c "SELECT current_database();"

Проверка работоспособности сервисов

bash
# Проверка auth-service
curl http://localhost:8001/health

# Проверка core-service
curl http://localhost:8002/health

# Проверка billing-service
curl http://localhost:8003/health

Ошибка "connection refused" при запуске сервиса

  1. Убедитесь, что соответствующий PostgreSQL контейнер запущен
  2. Проверьте DATABASE_URL в .env файле
  3. Проверьте, что порт БД правильный (5433 для auth, 5434 для core, 5435 для billing)

Ошибка "JWT secret mismatch"

Убедитесь, что JWT_SECRET одинаковый во всех .env файлах сервисов.

✅ Преимущества этого подхода:

  • Мгновенный hot reload для frontend (Vite)
  • 🔄 Быстрая перезагрузка для каждого микросервиса (go run)
  • 🐛 Легкая отладка - можно использовать debugger для каждого сервиса
  • 📝 Быстрые изменения - не нужно пересобирать Docker образы
  • 💾 Экономия ресурсов - не запускаются лишние контейнеры
  • 📊 Мониторинг опционален - можно запускать только при необходимости
  • 🔧 Независимая разработка - можно работать только с нужным сервисом

🛠️ Полезные команды:

Управление БД через docker-compose:

bash
# Запустить все БД и Redis
docker-compose -f docker-compose.microservices.yml up -d postgres-auth postgres-core postgres-billing redis-auth redis-core redis-billing

# Остановить БД и Redis (без удаления данных)
docker-compose -f docker-compose.microservices.yml stop postgres-auth postgres-core postgres-billing redis-auth redis-core redis-billing

# Остановить и удалить контейнеры БД и Redis
docker-compose -f docker-compose.microservices.yml down postgres-auth postgres-core postgres-billing redis-auth redis-core redis-billing

# Просмотр логов БД
docker-compose -f docker-compose.microservices.yml logs -f postgres-auth
docker-compose -f docker-compose.microservices.yml logs -f postgres-core
docker-compose -f docker-compose.microservices.yml logs -f postgres-billing

# Просмотр логов Redis
docker-compose -f docker-compose.microservices.yml logs -f redis-auth
docker-compose -f docker-compose.microservices.yml logs -f redis-core
docker-compose -f docker-compose.microservices.yml logs -f redis-billing

Перезапуск микросервисов:

Просто остановите процесс (Ctrl+C) и запустите снова:

bash
# Auth Service
cd services/auth-service
go run cmd/server/main.go

# Core Service
cd services/core-service
go run cmd/server/main.go

# Billing Service
cd services/billing-service
go run cmd/server/main.go

Перезапуск frontend:

Просто остановите процесс (Ctrl+C) и запустите снова:

bash
npm run dev

Установка зависимостей для всех сервисов:

bash
# Auth Service
cd services/auth-service && go mod download && go mod tidy

# Core Service
cd services/core-service && go mod download && go mod tidy

# Billing Service
cd services/billing-service && go mod download && go mod tidy

📋 Порядок запуска сервисов

Рекомендуемый порядок запуска:

  1. БД и Redis (Docker)
  2. Auth Service (локально) — должен запуститься первым, так как другие сервисы проверяют JWT токены
  3. Core Service (локально) — зависит от Auth Service
  4. Billing Service (локально) — зависит от Auth Service и Core Service
  5. Frontend (локально)

🔧 Работа с конкретным сервисом

Если вы работаете только с одним сервисом, можно запустить только его БД:

bash
# Только для работы с auth-service
docker-compose -f docker-compose.microservices.yml up -d postgres-auth redis-auth

# Только для работы с core-service
docker-compose -f docker-compose.microservices.yml up -d postgres-core redis-core

# Только для работы с billing-service
docker-compose -f docker-compose.microservices.yml up -d postgres-billing redis-billing

Примечание: Core Service и Billing Service требуют, чтобы Auth Service был запущен для проверки JWT токенов.

📚 Дополнительная документация