Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
234 changes: 114 additions & 120 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,51 +1,134 @@
DOCKER_NETWORK := public-gateway-network
DOMAIN := writehub.space
EMAIL := admin@writehub.space
NGINX_COMPOSE := docker-compose.nginx.yml
FRONTEND_DIR := ../kotyari-bots_frontend

defalut: help

# Автоматический поиск сервисов для Ogen
SERVICES := $(shell find ./docs -mindepth 2 -maxdepth 3 -type f -name 'openapi.yaml' -print \
| sed -e 's|^./docs/||' -e 's|/openapi.yaml$$||' | sort -u)

export PATH := $(shell go env GOPATH)/bin:$(PATH)

.PHONY: help up down reboot test
.PHONY: help up down bots-up profiles-up posts-up gateway-up ssl-install frontend-build

default: help

help:
@echo ''
@echo 'usage: make [target]'
@echo ''
@echo 'targets:'
@echo ' download-lint - Downloading linter binary'
@echo ' check-lint - Verify linter version (>= 2)'
@echo ' verify-lint-config - Verifies linter config'
@echo ' lint - running linter'
@echo ' download-gci - Downloading import formatter'
@echo ' install - Download all dev tools (linter, formatter)'
@echo ' format - Format go import statements'
@echo ' format-check - Check go import statements formatting'
@echo ' check - Run all checks (lint, format-check)'
@echo "api - Сгенерировать Go-код из всех openapi.yml файлов."
@echo "install-ogen - Установить или обновить генератор кода ogen."

# --- Вспомогательные и внутренние команды ---

.PHONY: setup-network teardown-network copy-env
@echo 'MAIN TARGETS:'
@echo ' up - Поднять весь бэкенд (БД, Kafka, Go-сервисы) без Nginx'
@echo ' down - Остановить весь бэкенд'
@echo ' gateway-up - Поднять Nginx (Gateway) + Certbot'
@echo ' ssl-install - Полная настройка HTTPS (с генерацией сертификатов)'
@echo ' frontend-build - Собрать статику Nuxt и исправить права доступа'
@echo ''
@echo 'DEV TOOLS:'
@echo ' lint - Запустить линтер'
@echo ' format - Отформатировать импорты'
@echo ' api - Сгенерировать Go-код (Ogen) из OpenAPI'
@echo ' proto-build - Сгенерировать gRPC код из .proto'

# --- СЕТЬ И ОКРУЖЕНИЕ ---

setup-network:
@docker network inspect $(DOCKER_NETWORK) >/dev/null 2>&1 || \
(echo "Создаю общую Docker-сеть: $(DOCKER_NETWORK)..." && docker network create $(DOCKER_NETWORK))

# Удаляет общую сеть
teardown-network:
@docker network rm $(DOCKER_NETWORK) >/dev/null 2>&1 || true

copy-env:
@if [ ! -f .env ]; then \
echo "Создаю .env файл из .env.example..."; \
cp .env.example .env; \
fi

# --- Кодогенерация и статический анализ ---
# --- БЭКЕНД (Docker Compose) ---

# Параллельный запуск основных сервисов
up: copy-env setup-network
@echo "Starting backend services..."
@$(MAKE) bots-up & \
$(MAKE) profiles-up & \
$(MAKE) posts-up & \
wait
@echo "Backend services are up."

down:
@echo "Stopping backend services..."
@$(MAKE) bots-down & \
$(MAKE) profiles-down & \
$(MAKE) posts-down & \
wait
@echo "Backend services stopped."

bots-up: setup-network
docker compose -f docker-compose.bots.yml up -d --build

bots-down:
docker compose -f docker-compose.bots.yml down

profiles-up: setup-network
docker compose -f docker-compose.profiles.yml up -d --build

profiles-down:
docker compose -f docker-compose.profiles.yml down

posts-up: setup-network
docker compose -f docker-compose.posts.yml up -d --build

posts-down:
docker compose -f docker-compose.posts.yml down

# --- FRONTEND ---

frontend-build:
@echo "Building Frontend Static Site..."
cd $(FRONTEND_DIR) && npm run generate
@echo "Fixing permissions for Nginx..."
chmod -R 755 $(FRONTEND_DIR)/.output/public
@echo "Frontend built successfully."

# --- GATEWAY & SSL (NGINX) ---

gateway-up: setup-network
docker compose -f $(NGINX_COMPOSE) up -d

gateway-down:
docker compose -f $(NGINX_COMPOSE) down

gateway-restart:
docker compose -f $(NGINX_COMPOSE) restart gateway

gateway-logs:
docker compose -f $(NGINX_COMPOSE) logs -f

ssl-install:
@if [ ! -f nginx.conf.http ] || [ ! -f nginx.conf.https ]; then \
echo "Ошибка: Файлы nginx.conf.http и nginx.conf.https должны существовать."; \
exit 1; \
fi
@echo ">>> [1/4] Применяем HTTP конфигурацию (для валидации)..."
cp nginx.conf.http nginx.conf
$(MAKE) gateway-up
@echo ">>> Ожидание запуска Nginx..."
@sleep 5
@echo ">>> [2/4] Генерация сертификатов через Let's Encrypt..."
docker compose -f $(NGINX_COMPOSE) run --rm --entrypoint certbot certbot certonly --webroot --webroot-path /var/www/certbot \
-d $(DOMAIN) -d www.$(DOMAIN) \
--email $(EMAIL) \
--agree-tos --no-eff-email --force-renewal
@echo ">>> [3/4] Применяем HTTPS конфигурацию (боевую)..."
cp nginx.conf.https nginx.conf
@echo ">>> [4/4] Перезагрузка Nginx..."
docker compose -f $(NGINX_COMPOSE) exec gateway nginx -s reload
@echo ">>> Готово. HTTPS настроен."

cert-renew:
docker compose -f $(NGINX_COMPOSE) run --rm --entrypoint certbot certbot renew
docker compose -f $(NGINX_COMPOSE) exec gateway nginx -s reload

# --- CODE GEN & LINTING ---

PROTO_DIR := ./api/protos
GEN_DIR := gen
Expand All @@ -64,34 +147,27 @@ $(ENTITIES):
--go-grpc_out=$(PROTO_DIR)/$@/$(GEN_DIR) \
--go-grpc_opt=paths=source_relative \
$(PROTO_DIR)/$@/proto/*.proto
@echo "Генерация для $@ завершена."

install-ogen:
go install github.com/ogen-go/ogen/cmd/ogen@v1.16.0

api: install-ogen
@echo "Начинаю генерацию кода для сервисов: $(SERVICES)"
$(foreach service,$(SERVICES),$(call generate-service,$(service)))
@echo "Генерация кода успешно завершена."

install-ogen:
go install github.com/ogen-go/ogen/cmd/ogen@v1.16.0

define generate-service
@echo "--- Генерирую код для сервиса: $(1) ---"
$(eval INPUT_FILE := ./docs/$(1)/openapi.yaml)
$(eval OUTPUT_DIR := ./internal/gen/$(1))
$(eval PKG := $(notdir $(1))) # e.g., posts_1
$(eval PKG := $(notdir $(1)))
$(eval OGEN_CFG := ./docs/ogen-config.yaml)
@if [ ! -f "$(INPUT_FILE)" ]; then \
echo "Ошибка: Файл спецификации $(INPUT_FILE) не найден!"; \
exit 1; \
fi

@mkdir -p "$(OUTPUT_DIR)"
ogen --config "$(OGEN_CFG)" --target "$(OUTPUT_DIR)" --package "$(PKG)" -clean "$(INPUT_FILE)"
endef


download-lint:
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(go env GOPATH)/bin v2.3.1
curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/HEAD/install.sh | sh -s -- -b $(shell go env GOPATH)/bin v1.61.0

download-gci:
go install github.com/daixiang0/gci@v0.13.4
Expand All @@ -109,79 +185,7 @@ format-check:

check: lint format-check

# параллельно
up: copy-env setup-network
@echo "Starting services in parallel..."
@$(MAKE) bots-up & \
$(MAKE) profiles-up & \
$(MAKE) posts-up & \
wait
@echo "All services are up and running."

# параллельно
down:
@echo "Shutdown services in parallel..."
@$(MAKE) bots-down & \
$(MAKE) profiles-down & \
$(MAKE) posts-down & \
wait
@echo "All services are up and stopped."

bots-up: setup-network
@echo "Starting bots service and dependencies..."
@docker compose -f docker-compose.bots.yml up -d --build

bots-down:
@echo "Stopping bots service and dependencies..."
@docker compose -f docker-compose.bots.yml down

bots-reboot:
@echo "Rebooting bots service and dependencies..."
$(MAKE) bots-down
$(MAKE) bots-up

profiles-up: setup-network
@echo "Starting profiles service and dependencies..."
docker compose -f docker-compose.profiles.yml up -d --build

profiles-down:
@echo "Stopping profiles service and dependencies..."
@docker compose -f docker-compose.profiles.yml down

profiles-reboot:
@echo "Rebooting profiles service and dependencies..."
$(MAKE) profiles-down
$(MAKE) profiles-up

posts-up: setup-network
@echo "Starting posts service and dependencies..."
docker compose -f docker-compose.posts.yml up -d --build

posts-down:
@echo "Stopping posts service and dependencies..."
@docker compose -f docker-compose.posts.yml down

posts-reboot:
@echo "Rebooting posts service and dependencies..."
$(MAKE) posts-down
$(MAKE) posts-up


example-run:
@go run cmd/example/main.go
example-run-local: ## Запустить в local режиме
@go run cmd/example/main.go --env=local --config="./configs/local-config.yaml"

example-run-prod:
@go run cmd/example/main.go --env=prod

install-migrate:
@if ! command -v migrate &> /dev/null; then \
echo "migrate CLI not found. Installing..."; \
go install -tags 'pgx5' github.com/golang-migrate/migrate/v4/cmd/migrate@latest; \
fi

.PHONY: download-lint download-gci lint format format-check check help api
# --- INTRANET (Parsers) ---

INTRANET_DIR := ./intranet

Expand All @@ -191,18 +195,8 @@ intranet-up-dev:
intranet-down-dev:
$(MAKE) -C $(INTRANET_DIR) down-dev


intranet-up-prod:
$(MAKE) -C $(INTRANET_DIR) up-prod

intranet-down-prod:
$(MAKE) -C $(INTRANET_DIR) down-prod

intranet-deps:
$(MAKE) -C $(INTRANET_DIR) deps

intranet-test:
$(MAKE) -C $(INTRANET_DIR) test-detection-compose

dzen-url-start:
curl -X POST http://localhost:8090/trigger-parsing
$(MAKE) -C $(INTRANET_DIR) down-prod
2 changes: 1 addition & 1 deletion api/protos/bot_profile/gen/get_profiles.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 4 additions & 4 deletions api/protos/bot_profile/gen/get_profiles_grpc.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

28 changes: 19 additions & 9 deletions api/protos/bots/gen/get_bot.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading