feat: initial Skeen-CRM AI Agent architecture

- FastAPI + Python 3.12 backend
- Meta WhatsApp Business API client (official)
- OpenAI GPT-4o with function calling
- RAG vector store with pgvector
- ERPNext Frappe REST client
- Celery + Redis async task queue
- PostgreSQL with migrations (Alembic)
- Docker Compose full stack
- Enterprise logging, metrics, health checks
This commit is contained in:
root
2026-04-29 05:30:59 +00:00
commit d30b22b50c
44 changed files with 3603 additions and 0 deletions

145
docker-compose.yml Normal file
View File

@@ -0,0 +1,145 @@
version: "3.9"
services:
api:
build:
context: .
dockerfile: Dockerfile
container_name: skeen-api
restart: unless-stopped
ports:
- "8000:8000"
env_file:
- .env
environment:
- DATABASE_URL=postgresql+asyncpg://skeen:skeen123@postgres:5432/skeen_crm
- REDIS_URL=redis://redis:6379/0
- CELERY_BROKER_URL=redis://redis:6379/1
- CELERY_RESULT_BACKEND=redis://redis:6379/2
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
migrate:
condition: service_completed_successfully
networks:
- skeen-network
command: >
uvicorn src.main:app
--host 0.0.0.0
--port 8000
--workers 2
--loop uvloop
--http httptools
--log-level info
worker:
build:
context: .
dockerfile: Dockerfile
container_name: skeen-worker
restart: unless-stopped
env_file:
- .env
environment:
- DATABASE_URL=postgresql+asyncpg://skeen:skeen123@postgres:5432/skeen_crm
- REDIS_URL=redis://redis:6379/0
- CELERY_BROKER_URL=redis://redis:6379/1
- CELERY_RESULT_BACKEND=redis://redis:6379/2
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
migrate:
condition: service_completed_successfully
networks:
- skeen-network
command: >
celery -A src.workers.celery_app worker
--loglevel=info
--concurrency=4
-Q default,whatsapp,erpnext,ai
scheduler:
build:
context: .
dockerfile: Dockerfile
container_name: skeen-scheduler
restart: unless-stopped
env_file:
- .env
environment:
- DATABASE_URL=postgresql+asyncpg://skeen:skeen123@postgres:5432/skeen_crm
- REDIS_URL=redis://redis:6379/0
- CELERY_BROKER_URL=redis://redis:6379/1
- CELERY_RESULT_BACKEND=redis://redis:6379/2
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
networks:
- skeen-network
command: >
celery -A src.workers.celery_app beat
--loglevel=info
--scheduler celery.beat.PersistentScheduler
migrate:
build:
context: .
dockerfile: Dockerfile
container_name: skeen-migrate
env_file:
- .env
environment:
- DATABASE_URL=postgresql+asyncpg://skeen:skeen123@postgres:5432/skeen_crm
depends_on:
postgres:
condition: service_healthy
networks:
- skeen-network
command: >
alembic upgrade head
postgres:
image: ankane/pgvector:latest
container_name: skeen-postgres
restart: unless-stopped
environment:
POSTGRES_USER: skeen
POSTGRES_PASSWORD: skeen123
POSTGRES_DB: skeen_crm
volumes:
- postgres_data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
- skeen-network
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U skeen -d skeen_crm" ]
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
container_name: skeen-redis
restart: unless-stopped
volumes:
- redis_data:/data
ports:
- "6379:6379"
networks:
- skeen-network
command: redis-server --appendonly yes
volumes:
postgres_data:
redis_data:
networks:
skeen-network:
driver: bridge