Files
mono/docker-compose.yml
giles 03196c3ad0 Add sx documentation app (sx.rose-ash.com)
New public-facing service documenting the s-expression rendering engine.
Modelled on four.htmx.org with violet theme, all content rendered via sx.

Sections: docs, reference, protocols, examples (live demos), essays
(including "sx sucks"). No database — purely static documentation.

Port 8012, Redis DB 10. CI and deploy.sh updated with app_dir() mapping
for sx_docs -> sx/ directory. Caddy reverse proxy entry added separately.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 21:25:52 +00:00

315 lines
8.8 KiB
YAML

x-app-common: &app-common
networks:
appnet:
externalnet:
deploy:
placement:
constraints:
- node.labels.gpu != true
volumes:
- /root/rose-ash/_config/app-config.yaml:/app/config/app-config.yaml:ro
x-app-env: &app-env
DATABASE_URL_ACCOUNT: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_account
DATABASE_URL_FEDERATION: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_federation
SMTP_HOST: ${SMTP_HOST}
SMTP_PORT: ${SMTP_PORT}
MAIL_FROM: ${MAIL_FROM}
SMTP_USER: ${SMTP_USER}
SMTP_PASS: ${SMTP_PASS}
GHOST_API_URL: ${GHOST_API_URL}
GHOST_ADMIN_API_URL: ${GHOST_ADMIN_API_URL}
GHOST_PUBLIC_URL: ${GHOST_PUBLIC_URL}
GHOST_CONTENT_API_KEY: ${GHOST_CONTENT_API_KEY}
GHOST_WEBHOOK_SECRET: ${GHOST_WEBHOOK_SECRET}
GHOST_ADMIN_API_KEY: ${GHOST_ADMIN_API_KEY}
REDIS_AUTH_URL: redis://redis-auth:6379/0
SECRET_KEY: ${SECRET_KEY}
SUMUP_API_KEY: ${SUMUP_API_KEY}
APP_URL_BLOG: https://blog.rose-ash.com
APP_URL_MARKET: https://market.rose-ash.com
APP_URL_CART: https://cart.rose-ash.com
APP_URL_EVENTS: https://events.rose-ash.com
APP_URL_FEDERATION: https://federation.rose-ash.com
APP_URL_ACCOUNT: https://account.rose-ash.com
APP_URL_ORDERS: https://orders.rose-ash.com
APP_URL_RELATIONS: http://relations:8000
APP_URL_LIKES: http://likes:8000
APP_URL_SX: https://sx.rose-ash.com
APP_URL_TEST: https://test.rose-ash.com
APP_URL_ARTDAG: https://celery-artdag.rose-ash.com
APP_URL_ARTDAG_L2: https://artdag.rose-ash.com
INTERNAL_URL_BLOG: http://blog:8000
INTERNAL_URL_MARKET: http://market:8000
INTERNAL_URL_CART: http://cart:8000
INTERNAL_URL_EVENTS: http://events:8000
INTERNAL_URL_FEDERATION: http://federation:8000
INTERNAL_URL_ACCOUNT: http://account:8000
INTERNAL_URL_ORDERS: http://orders:8000
INTERNAL_URL_RELATIONS: http://relations:8000
INTERNAL_URL_LIKES: http://likes:8000
INTERNAL_URL_SX: http://sx_docs:8000
INTERNAL_URL_TEST: http://test:8000
INTERNAL_URL_ARTDAG: http://l1-server:8100
AP_DOMAIN: federation.rose-ash.com
AP_DOMAIN_BLOG: blog.rose-ash.com
AP_DOMAIN_MARKET: market.rose-ash.com
AP_DOMAIN_EVENTS: events.rose-ash.com
EXTERNAL_INBOXES: "artdag|https://celery-artdag.rose-ash.com/inbox"
services:
blog:
<<: *app-common
image: registry.rose-ash.com:5000/blog:latest
build:
context: .
dockerfile: blog/Dockerfile
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_blog
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_blog
REDIS_URL: redis://redis:6379/0
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
market:
<<: *app-common
image: registry.rose-ash.com:5000/market:latest
build:
context: .
dockerfile: market/Dockerfile
volumes:
- /root/rose-ash/_config/app-config.yaml:/app/config/app-config.yaml:ro
- /root/rose-ash/_snapshot:/app/_snapshot
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_market
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_market
REDIS_URL: redis://redis:6379/1
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
cart:
<<: *app-common
image: registry.rose-ash.com:5000/cart:latest
build:
context: .
dockerfile: cart/Dockerfile
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_cart
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_cart
REDIS_URL: redis://redis:6379/2
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
events:
<<: *app-common
image: registry.rose-ash.com:5000/events:latest
build:
context: .
dockerfile: events/Dockerfile
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_events
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_events
REDIS_URL: redis://redis:6379/3
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
federation:
<<: *app-common
image: registry.rose-ash.com:5000/federation:latest
build:
context: .
dockerfile: federation/Dockerfile
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_federation
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_federation
REDIS_URL: redis://redis:6379/4
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
account:
<<: *app-common
image: registry.rose-ash.com:5000/account:latest
build:
context: .
dockerfile: account/Dockerfile
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_account
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_account
REDIS_URL: redis://redis:6379/5
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
relations:
<<: *app-common
image: registry.rose-ash.com:5000/relations:latest
build:
context: .
dockerfile: relations/Dockerfile
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_relations
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_relations
REDIS_URL: redis://redis:6379/6
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
likes:
<<: *app-common
image: registry.rose-ash.com:5000/likes:latest
build:
context: .
dockerfile: likes/Dockerfile
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_likes
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_likes
REDIS_URL: redis://redis:6379/7
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
orders:
<<: *app-common
image: registry.rose-ash.com:5000/orders:latest
build:
context: .
dockerfile: orders/Dockerfile
environment:
<<: *app-env
DATABASE_URL: postgresql+asyncpg://postgres:change-me@pgbouncer:5432/db_orders
ALEMBIC_DATABASE_URL: postgresql+psycopg://postgres:change-me@db:5432/db_orders
REDIS_URL: redis://redis:6379/8
DATABASE_HOST: db
DATABASE_PORT: "5432"
RUN_MIGRATIONS: "true"
WORKERS: "1"
test:
<<: *app-common
image: registry.rose-ash.com:5000/test:latest
build:
context: .
dockerfile: test/Dockerfile
environment:
<<: *app-env
REDIS_URL: redis://redis:6379/9
WORKERS: "1"
sx_docs:
<<: *app-common
image: registry.rose-ash.com:5000/sx_docs:latest
build:
context: .
dockerfile: sx/Dockerfile
environment:
<<: *app-env
REDIS_URL: redis://redis:6379/10
WORKERS: "1"
db:
image: postgres:16
environment:
POSTGRES_USER: ${POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change-me}
POSTGRES_DB: ${POSTGRES_DB:-appdb}
volumes:
- db_data_1:/var/lib/postgresql/data
networks:
appnet:
deploy:
placement:
constraints:
- node.labels.gpu != true
pgbouncer:
image: edoburu/pgbouncer:latest
environment:
DB_HOST: db
DB_PORT: "5432"
DB_USER: ${POSTGRES_USER:-postgres}
DB_PASSWORD: ${POSTGRES_PASSWORD:-change-me}
POOL_MODE: transaction
DEFAULT_POOL_SIZE: "20"
MAX_CLIENT_CONN: "300"
MIN_POOL_SIZE: "5"
AUTH_TYPE: plain
networks:
appnet:
deploy:
placement:
constraints:
- node.labels.gpu != true
adminer:
image: adminer
networks:
appnet:
externalnet:
deploy:
placement:
constraints:
- node.labels.gpu != true
redis:
image: redis:7-alpine
container_name: redis
volumes:
- redis_data:/data
networks:
appnet:
command:
redis-server
--maxmemory 1gb
--maxmemory-policy allkeys-lru
deploy:
placement:
constraints:
- node.labels.gpu != true
redis-auth:
image: redis:7-alpine
volumes:
- redis_auth_data:/data
networks:
appnet:
command:
redis-server
--maxmemory 64mb
--maxmemory-policy noeviction
deploy:
placement:
constraints:
- node.labels.gpu != true
volumes:
db_data_1:
redis_data:
redis_auth_data:
networks:
appnet:
driver: overlay
externalnet:
driver: overlay
external: true