Перейти к содержанию

Development Tooling

Инструменты разработки AqStream.

Обязательные инструменты

Инструмент Версия Назначение
Docker 24+ Контейнеризация
Docker Compose 2.x Локальная оркестрация
JDK 25 Java runtime
Node.js 20 LTS Frontend runtime
pnpm 9+ Package manager
Git 2.40+ Version control

IDE

IntelliJ IDEA (Backend)

Рекомендуемые плагины: - Lombok - MapStruct Support - Spring Boot Assistant - Database Tools

VS Code (Frontend)

Рекомендуемые расширения: - ESLint - Prettier - Tailwind CSS IntelliSense - TypeScript Hero

Makefile

# Основные команды
.PHONY: up down restart status logs

up:
 docker compose up -d

down:
 docker compose down

restart:
 docker compose restart

status:
 docker compose ps

logs:
 docker compose logs -f

# Инфраструктура
.PHONY: infra-up infra-down

infra-up:
 docker compose up -d postgres-shared postgres-user postgres-payment redis rabbitmq minio

infra-down:
 docker compose down postgres-shared postgres-user postgres-payment redis rabbitmq minio

# Backend
.PHONY: backend-build backend-test

backend-build:
 ./gradlew build -x test

backend-test:
 ./gradlew test

# Frontend
.PHONY: frontend-install frontend-dev frontend-build frontend-test

frontend-install:
 cd frontend && pnpm install

frontend-dev:
 cd frontend && pnpm dev

frontend-build:
 cd frontend && pnpm build

frontend-test:
 cd frontend && pnpm test

# Quality
.PHONY: lint format

lint:
 ./gradlew checkstyleMain
 cd frontend && pnpm lint

format:
 cd frontend && pnpm format

# Database
.PHONY: db-migrate db-rollback

db-migrate:
 ./gradlew liquibaseUpdate

db-rollback:
 ./gradlew liquibaseRollbackCount -PliquibaseCommandValue=1

Code Quality

Checkstyle (Backend)

<!-- config/checkstyle/checkstyle.xml -->
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
    "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
    "https://checkstyle.org/dtds/configuration_1_3.dtd">
<module name="Checker">
    <module name="TreeWalker">
        <module name="Indentation">
            <property name="basicOffset" value="4"/>
        </module>
        <module name="LineLength">
            <property name="max" value="120"/>
        </module>
        <module name="MethodLength">
            <property name="max" value="50"/>
        </module>
    </module>
</module>

ESLint (Frontend)

// .eslintrc.json
{
  "extends": [
    "next/core-web-vitals",
    "prettier"
  ],
  "rules": {
    "@typescript-eslint/no-explicit-any": "error",
    "@typescript-eslint/explicit-function-return-type": "off",
    "react/jsx-no-literals": "off"
  }
}

Prettier (Frontend)

// .prettierrc
{
  "semi": true,
  "singleQuote": true,
  "tabWidth": 2,
  "trailingComma": "es5",
  "printWidth": 100
}

Git Hooks (Husky)

# .husky/pre-commit
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

# Frontend lint
cd frontend && pnpm lint-staged

# Backend checkstyle
./gradlew checkstyleMain --daemon
// frontend/package.json
{
  "lint-staged": {
    "*.{ts,tsx}": ["eslint --fix", "prettier --write"],
    "*.{json,md}": ["prettier --write"]
  }
}

Environment Variables

.env.example

# Database
DATABASE_HOST=localhost
DATABASE_PORT=5432
DATABASE_USERNAME=aqstream
DATABASE_PASSWORD=aqstream

# Redis
REDIS_HOST=localhost
REDIS_PORT=6379

# RabbitMQ
RABBITMQ_HOST=localhost
RABBITMQ_PORT=5672
RABBITMQ_USERNAME=guest
RABBITMQ_PASSWORD=guest

# MinIO
MINIO_ENDPOINT=http://localhost:9000
MINIO_ACCESS_KEY=minioadmin
MINIO_SECRET_KEY=minioadmin

# JWT
JWT_SECRET=your-super-secret-key-change-in-production

# Frontend
NEXT_PUBLIC_API_URL=http://localhost:8080

Docker Compose

# docker-compose.yml
services:
  # Databases
  postgres-shared:
    image: postgres:16
    environment:
      POSTGRES_USER: aqstream
      POSTGRES_PASSWORD: aqstream
      POSTGRES_DB: shared_services_db
    ports:
      - "5432:5432"
    volumes:
      - postgres-shared-data:/var/lib/postgresql/data

  postgres-user:
    image: postgres:16
    environment:
      POSTGRES_USER: aqstream
      POSTGRES_PASSWORD: aqstream
      POSTGRES_DB: user_service_db
    ports:
      - "5433:5432"
    volumes:
      - postgres-user-data:/var/lib/postgresql/data

  postgres-payment:
    image: postgres:16
    environment:
      POSTGRES_USER: aqstream
      POSTGRES_PASSWORD: aqstream
      POSTGRES_DB: payment_service_db
    ports:
      - "5434:5432"
    volumes:
      - postgres-payment-data:/var/lib/postgresql/data

  postgres-analytics:
    image: timescale/timescaledb:latest-pg16
    environment:
      POSTGRES_USER: aqstream
      POSTGRES_PASSWORD: aqstream
      POSTGRES_DB: analytics_service_db
    ports:
      - "5435:5432"
    volumes:
      - postgres-analytics-data:/var/lib/postgresql/data

  # Cache
  redis:
    image: redis:7
    ports:
      - "6379:6379"

  # Messaging
  rabbitmq:
    image: rabbitmq:3.12-management
    ports:
      - "5672:5672"
      - "15672:15672"

  # Storage
  minio:
    image: minio/minio
    command: server /data --console-address ":9001"
    environment:
      MINIO_ROOT_USER: minioadmin
      MINIO_ROOT_PASSWORD: minioadmin
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - minio-data:/data

volumes:
  postgres-shared-data:
  postgres-user-data:
  postgres-payment-data:
  postgres-analytics-data:
  minio-data:

Полезные команды

# Проверить что всё работает
make status

# Посмотреть логи конкретного сервиса
docker compose logs -f event-service

# Зайти в контейнер
docker compose exec postgres-shared psql -U aqstream -d shared_services_db

# Перезапустить один сервис
docker compose restart event-service

# Пересобрать с нуля
docker compose build --no-cache event-service
docker compose up -d event-service

# Очистить всё
docker compose down -v

Дальнейшее чтение