Initial commit: webmail client (M0/M1)
Three-pane webmail client. - Backend: FastAPI + async SQLAlchemy + arq worker (Postgres/Redis), IMAP/SMTP sync, threading, search, drafts/outbox with undo, attachments, 2FA. - Frontend: React 18 + Vite + TypeScript + TanStack Query + Tailwind; three-pane UI with rich-text composer, light/dark themes, resizable panels. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
name: webmail
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:16
|
||||
environment:
|
||||
POSTGRES_USER: webmail
|
||||
POSTGRES_PASSWORD: webmail_dev
|
||||
POSTGRES_DB: webmail_dev
|
||||
ports: ["127.0.0.1:5433:5432"]
|
||||
volumes: [pgdata:/var/lib/postgresql/data]
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U webmail -d webmail_dev"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 10
|
||||
|
||||
redis:
|
||||
image: redis:7
|
||||
ports: ["127.0.0.1:6380:6379"]
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 10
|
||||
|
||||
meilisearch:
|
||||
image: getmeili/meilisearch:v1.8
|
||||
environment:
|
||||
MEILI_MASTER_KEY: dev_master_key_change_me
|
||||
MEILI_ENV: development
|
||||
ports: ["127.0.0.1:7700:7700"]
|
||||
volumes: [meilidata:/meili_data]
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:7700/health | grep -q available"]
|
||||
interval: 5s
|
||||
timeout: 3s
|
||||
retries: 10
|
||||
|
||||
# Test mail servers (integration tests + manual dev against a throwaway mailbox)
|
||||
greenmail:
|
||||
image: greenmail/standalone:2.0.1
|
||||
environment:
|
||||
GREENMAIL_OPTS: >-
|
||||
-Dgreenmail.setup.test.all -Dgreenmail.hostname=0.0.0.0
|
||||
-Dgreenmail.users=dev:devpass@dev.local -Dgreenmail.verbose
|
||||
ports:
|
||||
- "127.0.0.1:3025:3025" # SMTP
|
||||
- "127.0.0.1:3143:3143" # IMAP
|
||||
- "127.0.0.1:3993:3993" # IMAPS
|
||||
|
||||
volumes:
|
||||
pgdata:
|
||||
meilidata:
|
||||
Reference in New Issue
Block a user