diff --git a/API.md b/API.md index 6cf9e94..f060bfa 100644 --- a/API.md +++ b/API.md @@ -88,7 +88,7 @@ uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4 **Docker with channel key:** ```bash -STEGASOO_CHANNEL_KEY=XXXX-XXXX-... docker-compose up api +STEGASOO_CHANNEL_KEY=XXXX-XXXX-... docker-compose -f docker/docker-compose.yml up api ``` --- @@ -843,7 +843,7 @@ curl -s -X POST "$BASE_URL/decode/multipart" \ ## Docker Configuration -### docker-compose.yml +### docker/docker-compose.yml ```yaml x-common-env: &common-env diff --git a/CLI.md b/CLI.md index 862eb2e..4db092f 100644 --- a/CLI.md +++ b/CLI.md @@ -810,7 +810,7 @@ stegasoo decode -r ref.jpg -s stego.png -p "phrase" --pin 123456 ### Docker Deployment -**docker-compose.yml:** +**docker/docker-compose.yml:** ```yaml x-common-env: &common-env STEGASOO_CHANNEL_KEY: ${STEGASOO_CHANNEL_KEY:-} diff --git a/DOCKER.md b/DOCKER.md index b886413..132814c 100644 --- a/DOCKER.md +++ b/DOCKER.md @@ -6,10 +6,10 @@ Stegasoo provides Docker images for both the Web UI and REST API. ```bash # Build and start all services -docker-compose up -d +docker-compose -f docker/docker-compose.yml up -d # Check status -docker-compose ps +docker-compose -f docker/docker-compose.yml ps ``` Access: @@ -61,10 +61,10 @@ Uses a pre-built base image with all dependencies: ```bash # First time only: build the base image -docker build -f Dockerfile.base -t stegasoo-base:latest . +docker build -f docker/Dockerfile.base -t stegasoo-base:latest . # Build services (fast - only copies app code) -docker-compose build +docker-compose -f docker/docker-compose.yml build ``` ### Full Build (No Base Image) @@ -72,26 +72,26 @@ docker-compose build If you don't have the base image, the Dockerfile will build all dependencies (slower): ```bash -docker-compose build +docker-compose -f docker/docker-compose.yml build ``` ## Commands ```bash # Start services -docker-compose up -d +docker-compose -f docker/docker-compose.yml up -d # View logs -docker-compose logs -f +docker-compose -f docker/docker-compose.yml logs -f # Stop services -docker-compose down +docker-compose -f docker/docker-compose.yml down # Rebuild after code changes -docker-compose build && docker-compose up -d +docker-compose -f docker/docker-compose.yml build && docker-compose -f docker/docker-compose.yml up -d # Full rebuild (no cache) -docker-compose build --no-cache +docker-compose -f docker/docker-compose.yml build --no-cache ``` ## Resource Limits @@ -112,7 +112,7 @@ Both services include health checks: Check health status: ```bash -docker-compose ps +docker-compose -f docker/docker-compose.yml ps ``` ## Production Deployment @@ -129,7 +129,7 @@ For production, consider: ```bash # Don't commit .env files with secrets export STEGASOO_CHANNEL_KEY=your-key - docker-compose up -d + docker-compose -f docker/docker-compose.yml up -d ``` 3. **Reverse proxy**: Put behind nginx/traefik for TLS termination @@ -145,12 +145,12 @@ For production, consider: ### Container won't start ```bash # Check logs -docker-compose logs web -docker-compose logs api +docker-compose -f docker/docker-compose.yml logs web +docker-compose -f docker/docker-compose.yml logs api ``` ### Out of memory -Increase Docker's memory allocation or reduce worker count in Dockerfile. +Increase Docker's memory allocation or reduce worker count in `docker/Dockerfile`. ### Permission errors The containers run as non-root user `stego` (UID 1000). Ensure volume permissions match. diff --git a/INSTALL.md b/INSTALL.md index fbec218..0ea832f 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -154,10 +154,10 @@ Build and run individual containers. #### Build Images ```bash -# Build all targets -docker build -t stegasoo-web --target web . -docker build -t stegasoo-api --target api . -docker build -t stegasoo-cli --target cli . +# From project root - build all targets +docker build -t stegasoo-web --target web -f docker/Dockerfile . +docker build -t stegasoo-api --target api -f docker/Dockerfile . +docker build -t stegasoo-cli --target cli -f docker/Dockerfile . ``` #### Run Web UI @@ -214,17 +214,17 @@ The easiest way to run all services. ```bash # Start in background -docker-compose up -d +docker-compose -f docker/docker-compose.yml up -d # Start specific service -docker-compose up -d web -docker-compose up -d api +docker-compose -f docker/docker-compose.yml up -d web +docker-compose -f docker/docker-compose.yml up -d api # View logs -docker-compose logs -f +docker-compose -f docker/docker-compose.yml logs -f # Stop all -docker-compose down +docker-compose -f docker/docker-compose.yml down ``` #### Authentication Configuration (v4.0.2) @@ -239,7 +239,7 @@ STEGASOO_HOSTNAME=localhost # Hostname for SSL cert STEGASOO_CHANNEL_KEY= # Optional channel key # Then run -docker-compose up -d web +docker-compose -f docker/docker-compose.yml up -d web ``` On first access, you'll be prompted to create an admin account. The database and SSL certs are persisted in Docker volumes. @@ -255,16 +255,16 @@ On first access, you'll be prompted to create an admin account. The database and ```bash # Build images and start -docker-compose up -d --build +docker-compose -f docker/docker-compose.yml up -d --build # Force rebuild (no cache) -docker-compose build --no-cache -docker-compose up -d +docker-compose -f docker/docker-compose.yml build --no-cache +docker-compose -f docker/docker-compose.yml up -d ``` #### Resource Configuration -The `docker-compose.yml` includes resource limits: +The `docker/docker-compose.yml` includes resource limits: ```yaml services: @@ -852,7 +852,7 @@ Argon2 needs 256MB per operation. Increase container memory: # Docker run docker run --memory=768m ... -# Docker Compose - edit docker-compose.yml +# Docker Compose - edit docker/docker-compose.yml deploy: resources: limits: diff --git a/README.md b/README.md index 64efa7b..a0d587d 100644 --- a/README.md +++ b/README.md @@ -106,17 +106,17 @@ ruff check src/ tests/ frontends/ ```bash # Quick start (HTTPS enabled by default) -docker-compose up -d +docker-compose -f docker/docker-compose.yml up -d # Access # Web UI: https://localhost:5000 (self-signed cert) # REST API: http://localhost:8000 # Disable HTTPS if needed: -STEGASOO_HTTPS_ENABLED=false docker-compose up -d +STEGASOO_HTTPS_ENABLED=false docker-compose -f docker/docker-compose.yml up -d ``` -See [DOCKER.md](DOCKER.md) for full documentation. +See [DOCKER.md](DOCKER.md) and [docs/DOCKER_QUICKSTART.md](docs/DOCKER_QUICKSTART.md) for full documentation. ## Raspberry Pi diff --git a/RELEASE_CHECKLIST.md b/RELEASE_CHECKLIST.md index ee8439f..468c17e 100644 --- a/RELEASE_CHECKLIST.md +++ b/RELEASE_CHECKLIST.md @@ -21,12 +21,12 @@ Pre-release validation checklist. Complete all items before tagging a release. ## Docker Validation -- [ ] Base image builds: `docker build -f Dockerfile.base -t stegasoo-base:latest .` -- [ ] Web image builds: `docker-compose build web` -- [ ] Container starts: `docker-compose up -d web` +- [ ] Base image builds: `docker build -f docker/Dockerfile.base -t stegasoo-base:latest .` +- [ ] Web image builds: `docker-compose -f docker/docker-compose.yml build web` +- [ ] Container starts: `docker-compose -f docker/docker-compose.yml up -d web` - [ ] Web UI accessible at http://localhost:5000 - [ ] Encode/decode works in container -- [ ] Container stops cleanly: `docker-compose down` +- [ ] Container stops cleanly: `docker-compose -f docker/docker-compose.yml down` ## Release Process diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index ea17b2c..7fa1804 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -39,8 +39,8 @@ First boot runs the setup wizard for WiFi, HTTPS, and channel key configuration. ### Docker ```bash -docker-compose up -d web # Web UI on :5000 -docker-compose up -d api # REST API on :8000 +docker-compose -f docker/docker-compose.yml up -d web # Web UI on :5000 +docker-compose -f docker/docker-compose.yml up -d api # REST API on :8000 ``` ### Full Changelog diff --git a/WEB_UI.md b/WEB_UI.md index 3f8ba24..ccfddfa 100644 --- a/WEB_UI.md +++ b/WEB_UI.md @@ -177,7 +177,7 @@ python app.py ### Docker Configuration ```yaml -# docker-compose.yml +# docker/docker-compose.yml services: web: environment: @@ -360,7 +360,7 @@ gunicorn --bind 0.0.0.0:5000 --workers 2 --threads 4 --timeout 60 app:app **Docker:** ```bash -docker-compose up web +docker-compose -f docker/docker-compose.yml up web ``` ### First-Time Setup @@ -1245,7 +1245,7 @@ volumes: ```bash pip install scipy # Or rebuild Docker image -docker-compose build --no-cache +docker-compose -f docker/docker-compose.yml build --no-cache ``` ### Browser Compatibility diff --git a/docker/Dockerfile b/docker/Dockerfile index b5d3047..3118c50 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -43,6 +43,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ RUN pip install --no-cache-dir \ cython numpy scipy>=1.10.0 jpegio>=0.2.0 \ argon2-cffi>=23.0.0 pillow>=10.0.0 cryptography>=41.0.0 \ + reedsolo>=1.7.0 \ flask>=3.0.0 gunicorn>=21.0.0 \ fastapi>=0.100.0 "uvicorn[standard]>=0.20.0" python-multipart>=0.0.6 \ qrcode>=7.3.0 pyzbar>=0.1.9 click>=8.0.0 lz4>=4.0.0 diff --git a/docker/Dockerfile.base b/docker/Dockerfile.base index 4fa4e2a..9a3ae96 100644 --- a/docker/Dockerfile.base +++ b/docker/Dockerfile.base @@ -32,7 +32,8 @@ RUN pip install --no-cache-dir \ jpegio>=0.2.0 \ argon2-cffi>=23.0.0 \ pillow>=10.0.0 \ - cryptography>=41.0.0 + cryptography>=41.0.0 \ + reedsolo>=1.7.0 # Install web/api framework packages (also stable) RUN pip install --no-cache-dir \