Delete page "EvoSync-v3-%E2%80%94-Step-1%3A-Environment-Setup"
@@ -1,116 +0,0 @@
|
|||||||
# EvoSync v3 — Step 1: Environment Setup
|
|
||||||
|
|
||||||
## Context
|
|
||||||
Rebuilding EvoSync from scratch (Python sync platform, Evotor → VK Market). Repo is clean — no web app exists. Goal for this step: scaffold the project skeleton, wire up Docker, and verify all services start healthy with a working DB connection and a live FastAPI app.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Stack
|
|
||||||
- **Backend**: FastAPI 0.115 + Uvicorn (Python 3.12)
|
|
||||||
- **Task queue**: Celery 5.4 + Redis 7
|
|
||||||
- **Database**: MariaDB 11.4 + SQLAlchemy 2.0 + Alembic
|
|
||||||
- **Templates**: Jinja2 + Bootstrap 5 CDN
|
|
||||||
- **Monitoring**: Celery Flower
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## What gets created in this step
|
|
||||||
|
|
||||||
### Root-level files
|
|
||||||
- `Dockerfile.web` — single image for web/worker/beat/flower
|
|
||||||
- `docker-compose.yml` — 6 services: db, redis, web, worker, beat, flower
|
|
||||||
- `requirements.txt` — all pinned dependencies
|
|
||||||
- `.env.example` — template with all required vars
|
|
||||||
- `alembic.ini` — points to `web/migrations/`
|
|
||||||
|
|
||||||
### `web/` package skeleton
|
|
||||||
```
|
|
||||||
web/
|
|
||||||
├── __init__.py
|
|
||||||
├── main.py # FastAPI app, single health route GET /health
|
|
||||||
├── config.py # pydantic-settings Settings (DATABASE_URL, REDIS_URL, SECRET_KEY, …)
|
|
||||||
├── database.py # SQLAlchemy engine + SessionLocal + Base
|
|
||||||
├── models/
|
|
||||||
│ └── __init__.py # empty for now
|
|
||||||
├── tasks/
|
|
||||||
│ ├── __init__.py
|
|
||||||
│ └── celery_app.py # Celery app factory, broker=REDIS_URL, no beat schedule yet
|
|
||||||
└── migrations/
|
|
||||||
├── env.py # Alembic env wired to web.database.Base
|
|
||||||
├── script.py.mako
|
|
||||||
└── versions/
|
|
||||||
└── 0001_initial.py # empty migration (no tables yet)
|
|
||||||
```
|
|
||||||
|
|
||||||
### `tests/`
|
|
||||||
```
|
|
||||||
tests/
|
|
||||||
├── conftest.py # SQLite in-memory engine, db_session fixture
|
|
||||||
└── test_health.py # GET /health returns 200 {"status": "ok"}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## docker-compose services
|
|
||||||
|
|
||||||
| Service | Image | Port | Command |
|
|
||||||
|---------|-------|------|---------|
|
|
||||||
| `db` | mariadb:11.4 | — | default, healthcheck |
|
|
||||||
| `redis` | redis:7-alpine | — | `redis-server --save 60 1`, healthcheck |
|
|
||||||
| `web` | Dockerfile.web | 8080→8000 | `alembic upgrade head && uvicorn web.main:app --host 0.0.0.0 --port 8000` |
|
|
||||||
| `worker` | Dockerfile.web | — | `celery -A web.tasks.celery_app worker --loglevel=info` |
|
|
||||||
| `beat` | Dockerfile.web | — | `celery -A web.tasks.celery_app beat --scheduler celery.beat:PersistentScheduler --schedule /tmp/celerybeat-schedule` |
|
|
||||||
| `flower` | Dockerfile.web | 5555 | `celery -A web.tasks.celery_app flower --port=5555` |
|
|
||||||
|
|
||||||
- `web` depends on `db` and `redis` being healthy before starting
|
|
||||||
- `worker` and `beat` depend on `redis` being healthy
|
|
||||||
- Single `Dockerfile.web` image, `command:` selects role
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Dockerfile.web
|
|
||||||
```dockerfile
|
|
||||||
FROM python:3.12-slim
|
|
||||||
ENV PYTHONDONTWRITEBYTECODE=1 PYTHONUNBUFFERED=1 PIP_NO_CACHE_DIR=1
|
|
||||||
WORKDIR /app
|
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends curl && rm -rf /var/lib/apt/lists/*
|
|
||||||
COPY requirements.txt .
|
|
||||||
RUN pip install --upgrade pip && pip install -r requirements.txt
|
|
||||||
COPY . .
|
|
||||||
CMD ["uvicorn", "web.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## requirements.txt
|
|
||||||
```
|
|
||||||
fastapi==0.115.5
|
|
||||||
uvicorn[standard]==0.32.1
|
|
||||||
python-multipart==0.0.12
|
|
||||||
jinja2==3.1.4
|
|
||||||
sqlalchemy==2.0.36
|
|
||||||
alembic==1.14.0
|
|
||||||
pymysql==1.1.1
|
|
||||||
cryptography>=44.0.0
|
|
||||||
passlib[bcrypt]==1.7.4
|
|
||||||
bcrypt==4.2.1
|
|
||||||
pydantic-settings==2.6.1
|
|
||||||
httpx==0.28.1
|
|
||||||
celery[redis]==5.4.0
|
|
||||||
redis==5.2.1
|
|
||||||
flower==2.0.1
|
|
||||||
python-json-logger==3.2.1
|
|
||||||
pytest==8.3.4
|
|
||||||
pytest-asyncio==0.24.0
|
|
||||||
pytest-cov==6.0.0
|
|
||||||
factory-boy==3.3.1
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Verification checklist
|
|
||||||
1. `docker compose up --build` → all 6 services reach healthy/running state
|
|
||||||
2. `curl http://localhost:8080/health` → `{"status": "ok"}`
|
|
||||||
3. Flower at `http://localhost:5555` → shows worker connected
|
|
||||||
4. `docker compose exec web alembic upgrade head` → no error
|
|
||||||
5. `pytest tests/` → `test_health.py` passes
|
|
||||||
Reference in New Issue
Block a user