# Overlay that swaps the in-process queues for durable RabbitMQ ones. # # docker compose up # channels # docker compose -f docker-compose.yml -f docker-compose.rabbitmq.yml up # # The base file is left alone deliberately: `docker compose up` still brings up # exactly what it always did, so neither backend is the awkward one to run. # # What the broker changes: a job stays unacked until its handler commits, so a # restart resumes each file at the stage it had reached instead of re-driving # everything in spool/ from stage 1. See "Queue backends" in the README for the # guarantees, and for the deliberate holes. services: rabbitmq: image: rabbitmq:4-management environment: # The built-in guest/guest only authenticates over loopback, so it cannot # work across the compose network. Override these for anything real; they # are here so the stack comes up with one command, not as a credential. RABBITMQ_DEFAULT_USER: "fileserver" RABBITMQ_DEFAULT_PASS: "fileserver" ports: # 5672 is published so you can run the server on the host # (`julia --project=. -t auto bin/server.jl`) against this broker; 15672 is # the management UI, which is most of the reason to run a broker you can # look at. Neither needs publishing for the composed server to work. - "5672:5672" - "15672:15672" volumes: # Durable queues and persistent messages are only as durable as what they # are written to: without this, `docker compose down` discards the backlog # the acks exist to protect. - rabbitmq-data:/var/lib/rabbitmq healthcheck: test: ["CMD", "rabbitmq-diagnostics", "-q", "ping"] interval: 10s timeout: 5s retries: 12 start_period: 30s restart: unless-stopped file-server: environment: FS_QUEUE_BACKEND: "rabbitmq" FS_AMQP_URL: "amqp://fileserver:fileserver@rabbitmq:5672/" depends_on: rabbitmq: # The server retries a broker that isn't up yet (AMQP_CONNECT_RETRY_SECONDS), # so this gate is belt-and-braces rather than load-bearing — but it keeps # a cold start quiet instead of a screenful of retry lines. condition: service_healthy volumes: rabbitmq-data: