mirror of
https://gitverse.ru/kpa39l/fastapi-microservice.git
synced 2026-09-29 09:15:08 +00:00
6.3 KiB
6.3 KiB
name, description, version, author, license, platforms, metadata
| name | description | version | author | license | platforms | metadata | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| fastapi-microservice | Bootstrap FastAPI: SQLAlchemy, auth, Docker, one-pass build. | 1.0.0 | Hermes Agent | MIT |
|
|
FastAPI Microservice Bootstrap
When to Use
The user asks to create a new FastAPI-based microservice. Signals:
- "создай каталог /opt/xxx, спланируем и напишем сервис"
- "нужен сервис для X с API на FastAPI"
- "bootstrap a new API service for Y"
- Any request where the output is a Python/FastAPI server with routes, database, and external integration
Core Rules
1. No analysis preamble — start immediately
The user says "создай каталог и спланируем" — your first action is to create the directory. Do not:
- ❌ Summarize the requirement back to them
- ❌ Ask clarifying questions about scope
- ❌ Propose technology choices for approval
- ❌ Write a multi-step plan document before coding
✅ Instead: mkdir -p /opt/project/app → start writing files
Investigation is part of execution, not preparation. If you need to check Python version, installed packages, or port availability, do it as the first action of writing code, not as a preamble.
2. Build in layers, bottom-up
Write files in this order for maximum efficiency:
Layer 1 — Foundation
├── requirements.txt
├── .env.example
├── __init__.py files (empty, create dirs)
├── app/config.py # pydantic-settings from env
├── app/security.py # encryption, key generation
├── app/database.py # async engine + session
└── app/models.py # ORM models (User, Account, etc.)
Layer 2 — Business logic
├── app/converters/ # domain-specific converters
└── app/vk_client.py # external API clients
Layer 3 — API
├── app/api/schemas.py # Pydantic request/response
├── app/api/deps.py # auth dependencies
└── app/api/v1.py # route handlers
Layer 4 — Entry point
└── app/main.py # FastAPI app + lifespan
Layer 5 — Infrastructure
├── Dockerfile
├── docker-compose.yml
├── Makefile
└── .gitignore
3. Generate secrets and verify immediately
After writing code, do NOT stop at "code is written". Do:
- Generate encryption key:
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" > secrets/token_encryption_key - Install deps:
pip install -r requirements.txt - Verify all modules import:
python3 -c "from app import ..." - Start server and test: curl health endpoint
- Test at least one API endpoint (e.g. convert endpoint if it's a converter service)
4. Write all project files in one pass
Do not save README.md and STATUS.md separately from code. Write them last, after the code compiles and runs:
- README.md — API reference, usage examples, security, run instructions
- STATUS.md — implementation status table, phases, architecture diagram, how to run
- Dockerfile — multi-stage, slim, read-only rootfs, non-root user
- docker-compose.yml — service + volume + secret + healthcheck
- Makefile — dev/install/run/test/key/user commands
5. Security by default
Every microservice needs:
- Encrypted secrets — Fernet (AES-128-CBC + HMAC-SHA256), key from file/secret, NOT in code
- API key auth — sha256 hashed, not stored in plaintext
- API key ≠ external token — the API key lets you use the service, not read the upstream token
- Minimal scope — upstream tokens should have minimal permissions (e.g. VK wall scope only)
- Docker read-only rootfs — only /data writable
- Non-root user in Docker container
Log these in README.md as a security matrix table.
Expected File Structure
/opt/<project-name>/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── config.py
│ ├── database.py
│ ├── models.py
│ ├── security.py
│ ├── vk_client.py # or external_api.py
│ ├── converters/
│ │ ├── __init__.py
│ │ └── markdown_to_vk.py # or relevant converter
│ └── api/
│ ├── __init__.py
│ ├── schemas.py
│ ├── deps.py
│ └── v1.py
├── tests/
│ └── (TODO after code)
├── secrets/
│ └── token_encryption_key # NOT in git (.gitignore it)
├── Dockerfile
├── docker-compose.yml
├── requirements.txt
├── .env.example
├── .gitignore
├── Makefile
├── README.md
└── STATUS.md
Common Pitfalls
| Pitfall | Fix |
|---|---|
| Writing README before code runs | Write docs last — they reflect what's real |
| Asking for approval on every file | Write all files in one batch, then verify |
| Skipping security docs | Include security matrix table in README |
| Not testing the API after writing code | Always start server and curl at least health + one endpoint |
Using & in foreground terminal command |
Use terminal(background=True) for server, then curl |
| Hand-typing code that could be written | Batch independent file writes in the same turn |
| Explaining the design before building | Say "Начинаю" and write files — the code IS the design |
Verification Checklist
After writing all code:
pip install -r requirements.txtsucceeds- All modules import:
python3 -c "from app import config, database, models, security, ..." - Encryption key generated and stored in secrets/
- Encrypt/decrypt round-trip works
- API keys generate and verify
- Converter (if any) produces correct output
- Server starts:
uvicorn app.main:app --host 0.0.0.0 --port N GET /api/v1/healthreturns{"status":"ok"}- At least one POST endpoint responds correctly (e.g. convert or account create)
- Swagger UI at
/docsreturns 200 - Dockerfile builds (if docker is available)
Related Skills
- task-list-execution — for executing tasks from STATUS.md files
- writing-plans — for multi-step implementation plans with subagent delegation