diff --git a/EvoSync-v3-%E2%80%94-Step-1%3A-Environment-Setup.md b/EvoSync-v3-%E2%80%94-Step-1%3A-Environment-Setup.md deleted file mode 100644 index 5fb1de5..0000000 --- a/EvoSync-v3-%E2%80%94-Step-1%3A-Environment-Setup.md +++ /dev/null @@ -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