Skip to content

Commit 0d60398

Browse files
initial commit
0 parents  commit 0d60398

58 files changed

Lines changed: 14552 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.dockerignore

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
__pycache__
2+
*.pyc
3+
*.pyo
4+
*.pyd
5+
.Python
6+
env/
7+
venv/
8+
.env
9+
.venv
10+
.env/
11+
.venv/
12+
*.egg-info/
13+
.pytest_cache/
14+
.mypy_cache/
15+
.coverage
16+
htmlcov/
17+
.DS_Store
18+
.git/
19+
.gitignore

.env.test

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
MODE = TEST
2+
3+
# Gateway
4+
GATEWAY_PORT = 5000
5+
6+
# Tasks app
7+
TASKS_APP_PORT = 5001
8+
9+
TASKS_DB_USER = postgres
10+
TASKS_DB_PASS = postgres
11+
TASKS_DB_HOST = db_tasks_app_test
12+
TASKS_DB_PORT = 5432
13+
TASKS_DB_NAME = tasks_app_test
14+
15+
# Loki
16+
LOKI_PORT=3100
17+
18+
# Порт для Grafana
19+
GRAFANA_PORT=3010

.github/workflows/test.yml

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: ["main"]
6+
pull_request:
7+
branches: ["main"]
8+
9+
jobs:
10+
tests:
11+
runs-on: ubuntu-latest
12+
13+
steps:
14+
- name: Checkout code
15+
uses: actions/checkout@v4
16+
17+
- name: Build and start test services
18+
run: docker compose -f docker-compose.test.yml --env-file ./tasks/.env.test up -d --build
19+
20+
- name: Run pytest inside tasks_app_test
21+
run: docker compose -f docker-compose.test.yml --env-file ./tasks/.env.test exec -T tasks_app_test pytest -v
22+
23+
- name: Stop and remove test services
24+
if: always()
25+
run: docker compose -f docker-compose.test.yml --env-file ./tasks/.env.test down -v --remove-orphans

.gitignore

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# IDE and editor directories
2+
.idea/
3+
.vscode/
4+
!.vscode/extensions.json
5+
.DS_Store
6+
*.suo
7+
*.ntvs*
8+
*.njsproj
9+
*.sln
10+
*.sw?
11+
12+
# Virtual environments
13+
.env/
14+
.env__/
15+
.venv/
16+
.venv__/
17+
.env*
18+
19+
# Byte-compiled / caches
20+
__pycache__/
21+
.pytest_cache/
22+
23+
# Databases
24+
*.db
25+
*.sqlite
26+
*.sqlite3
27+
28+
# Migrations
29+
# migrations/versions/*
30+
31+
# Data
32+
data/
33+
34+
# Certs
35+
certs/
36+
37+
# Node.js dependencies
38+
/node_modules
39+
node_modules
40+
/.pnp
41+
.pnp.*
42+
.yarn/*
43+
!.yarn/patches
44+
!.yarn/plugins
45+
!.yarn/releases
46+
!.yarn/versions
47+
48+
# Build and production
49+
/build
50+
build
51+
/dist
52+
dist
53+
/dist-ssr
54+
dist-ssr
55+
/coverage
56+
/out
57+
58+
# Next.js
59+
.next/
60+
61+
# Logs and debug files
62+
logs/
63+
*.log
64+
npm-debug.log*
65+
yarn-debug.log*
66+
yarn-error.log*
67+
.pnpm-debug.log*
68+
lerna-debug.log*
69+
70+
# Other misc files
71+
*.pem
72+
*.local
73+
74+
# Vercel
75+
.vercel
76+
77+
tz.md
78+
.coverage
79+
80+

Makefile

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
up:
2+
docker compose up
3+
4+
down:
5+
docker compose down
6+
7+
build:
8+
docker compose up --build -d
9+
10+
test:
11+
docker compose -f docker-compose.test.yml up --build -d --remove-orphans
12+
docker compose -f docker-compose.test.yml exec -it tasks_app_test bash -c "pytest -v"
13+
docker compose -f docker-compose.test.yml down

README.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# FastAPI Microservices
2+
3+
Микро-сервисы на FastAPI с использованием PostgreSQL, SQLAlchemy 2.0 и Docker.
4+
5+
## 🚀 Технологии
6+
7+
- **FastAPI** - веб-фреймворк для создания API
8+
- **Uvicorn** - ASGI сервер для FastAPI
9+
- **SQLAlchemy** - ORM для работы с базой данных
10+
- **PostgreSQL** - реляционная база данных
11+
- **Alembic** - управление миграциями
12+
- **Docker** и **Docker Compose** - контейнеризация
13+
- **Make** - упрощение команд для запуска проекта
14+
- **Poetry** - управление зависимостями
15+
- **Pydantic** - валидация данных
16+
- **Loki** - система логирования
17+
- **Grafana** - система мониторинга
18+
- **Promtail** - инструмент для сбора логов
19+
20+
## 🚀 Запуск проекта
21+
22+
### Требования
23+
24+
- Docker и Docker Compose
25+
- Python 3.13+
26+
- Poetry
27+
- Make
28+
29+
### Установка
30+
31+
1. Клонируйте репозиторий:
32+
33+
```bash
34+
git clone https://github.com/powermacintosh/microservices-example.git
35+
cd microservices-example
36+
```
37+
38+
2. Создайте файл `.env` на основе `.env.test`:
39+
40+
3. Запустите приложение с помощью Makefile:
41+
42+
```bash
43+
make build
44+
```
45+
46+
## 🧪 Запуск тестов
47+
48+
```bash
49+
make test
50+
```
51+
52+
## 📚 Документация API
53+
54+
После запуска документация API будет доступна по адресу:
55+
56+
- Swagger UI: http://localhost:5000/docs/
57+
![gateway/static/swagger-custom.png](gateway/static/swagger-custom.png)
58+
59+
## 🔧 Настройка окружения
60+
61+
Создайте файл `.env` в корне проекта и в каждом сервисе
62+
`gateway/`, `tasks/`.
63+
Аналогично файлу `.env.test`.
64+
65+
```env
66+
MODE = DEVELOPMENT
67+
```
68+
69+
## 📊 Логирование
70+
71+
Логи приложения отправляются в Loki и доступны через Grafana.
72+
**Grafana**: `http://localhost:3010`
73+
74+
### Подключение Loki к Grafana
75+
76+
**Loki-connection-url**: `http://loki:3100`
77+
78+
## 📄 Лицензия
79+
80+
Этот проект распространяется под лицензией MIT.

docker-compose.test.yml

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
services:
2+
tasks_app_test:
3+
build:
4+
context: tasks/
5+
container_name: tasks_app_test
6+
env_file:
7+
- ./tasks/.env.test
8+
ports:
9+
- "${TASKS_APP_PORT}"
10+
entrypoint: ["sh", "-c"]
11+
command:
12+
- |
13+
chmod +x /app/scripts/*.sh &&
14+
/app/scripts/init_test_db.sh &&
15+
poetry run uvicorn main:app \
16+
--host 0.0.0.0 \
17+
--port ${TASKS_APP_PORT}
18+
depends_on:
19+
db_tasks_app_test:
20+
condition: service_healthy
21+
22+
db_tasks_app_test:
23+
image: postgres:17
24+
container_name: db_tasks_app_test
25+
env_file:
26+
- ./tasks/.env.test
27+
environment:
28+
POSTGRES_USER: ${TASKS_DB_USER}
29+
POSTGRES_PASSWORD: ${TASKS_DB_PASS}
30+
POSTGRES_DB: ${TASKS_DB_NAME}
31+
ports:
32+
- "${TASKS_DB_PORT}"
33+
volumes:
34+
- db_tasks_app_test:/var/lib/postgresql/data
35+
healthcheck:
36+
test: ["CMD-SHELL", "pg_isready -U ${TASKS_DB_USER}"]
37+
interval: 5s
38+
timeout: 5s
39+
retries: 5
40+
41+
volumes:
42+
db_tasks_app_test:

docker-compose.yml

Lines changed: 102 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
services:
2+
gateway_app:
3+
build:
4+
context: gateway/
5+
container_name: gateway_app
6+
env_file:
7+
- ./gateway/.env
8+
ports:
9+
- "${GATEWAY_PORT}:${GATEWAY_PORT}"
10+
entrypoint: ["sh", "-c"]
11+
command:
12+
- |
13+
poetry run uvicorn main:app \
14+
--host 0.0.0.0 \
15+
--port ${GATEWAY_PORT}
16+
depends_on:
17+
loki:
18+
condition: service_started
19+
20+
tasks_app:
21+
build:
22+
context: tasks/
23+
container_name: tasks_app
24+
env_file:
25+
- ./tasks/.env
26+
ports:
27+
- "${TASKS_APP_PORT}"
28+
entrypoint: ["sh", "-c"]
29+
command:
30+
- |
31+
chmod +x /app/scripts/*.sh &&
32+
/app/scripts/init_db.sh &&
33+
poetry run uvicorn main:app \
34+
--host 0.0.0.0 \
35+
--port ${TASKS_APP_PORT}
36+
depends_on:
37+
db_tasks_app:
38+
condition: service_healthy
39+
loki:
40+
condition: service_started
41+
42+
db_tasks_app:
43+
image: postgres:17
44+
container_name: db_tasks_app
45+
env_file:
46+
- ./tasks/.env
47+
environment:
48+
POSTGRES_USER: ${TASKS_DB_USER}
49+
POSTGRES_PASSWORD: ${TASKS_DB_PASS}
50+
POSTGRES_DB: ${TASKS_DB_NAME}
51+
ports:
52+
- "${TASKS_DB_PORT}"
53+
volumes:
54+
- db_tasks_app:/var/lib/postgresql/data
55+
healthcheck:
56+
test: ["CMD-SHELL", "pg_isready -U ${TASKS_DB_USER}"]
57+
interval: 5s
58+
timeout: 5s
59+
retries: 5
60+
61+
loki:
62+
image: grafana/loki:latest
63+
ports:
64+
- "${LOKI_PORT}"
65+
volumes:
66+
- ./loki-config.yaml:/etc/loki/local-config.yaml
67+
- loki_data:/loki
68+
command:
69+
- -config.expand-env=true
70+
- -config.file=/etc/loki/local-config.yaml
71+
environment:
72+
LOKI_PORT: ${LOKI_PORT}
73+
74+
promtail:
75+
image: grafana/promtail:latest
76+
volumes:
77+
- ./promtail-config.yaml:/etc/promtail/config.yaml
78+
- /var/run/docker.sock:/var/run/docker.sock
79+
- /var/lib/docker/containers:/var/lib/docker/containers:ro
80+
command:
81+
- -config.expand-env=true
82+
- -config.file=/etc/promtail/config.yaml
83+
environment:
84+
LOKI_URL: http://loki:${LOKI_PORT}/loki/api/v1/push
85+
depends_on:
86+
- loki
87+
88+
grafana:
89+
image: grafana/grafana:latest
90+
ports:
91+
- "${GRAFANA_PORT}:3000"
92+
volumes:
93+
- grafana_data:/var/lib/grafana
94+
environment:
95+
- GF_SECURITY_ADMIN_USER=admin
96+
- GF_SECURITY_ADMIN_PASSWORD=admin
97+
- GF_USERS_ALLOW_SIGN_UP=false
98+
99+
volumes:
100+
db_tasks_app:
101+
loki_data:
102+
grafana_data:

gateway/.env.test

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
MODE = TEST
2+
3+
# FastAPI
4+
GATEWAY_PORT = 5000

0 commit comments

Comments
 (0)