Appearance
Быстрая разработка микросервисов без пересборки 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 || true2. Запустите только БД и 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 devFrontend будет доступен на 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Доступ к сервисам мониторинга:
- Prometheus: http://localhost:9090
- Grafana: http://localhost:3000 (логин:
admin, пароль:admin) - Alertmanager: http://localhost:9093
- Auth Service Metrics: http://localhost:8001/metrics
- Core Service Metrics: http://localhost:8002/metrics
- Billing Service Metrics: http://localhost:8003/metrics
Остановка сервисов мониторинга:
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, это означает, что:
- У вас запущена локальная PostgreSQL (не из Docker), которая перехватывает подключения
- Или база данных не создана
Решение:
Вариант 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" при запуске сервиса
- Убедитесь, что соответствующий PostgreSQL контейнер запущен
- Проверьте
DATABASE_URLв.envфайле - Проверьте, что порт БД правильный (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📋 Порядок запуска сервисов
Рекомендуемый порядок запуска:
- БД и Redis (Docker)
- Auth Service (локально) — должен запуститься первым, так как другие сервисы проверяют JWT токены
- Core Service (локально) — зависит от Auth Service
- Billing Service (локально) — зависит от Auth Service и Core Service
- 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 токенов.
📚 Дополнительная документация
- services/QUICK_START.md — Быстрый старт микросервисов
- startup-guide.md — Подробное руководство по запуску
- migration-guide.md — Руководство по миграциям
- services/STATUS.md — Текущий статус миграции