2026-06-16 06:41:37 +02:00
name : fluxer
2026-08-31 19:00:43 +02:00
x-fluxer-postgres-env : &fluxer-postgres-env
FLUXER_DATABASE_BACKEND : postgres
FLUXER_POSTGRES_HOST : postgres
FLUXER_POSTGRES_PORT : "5432"
FLUXER_POSTGRES_DATABASE : fluxer
FLUXER_POSTGRES_USERNAME : fluxer
FLUXER_POSTGRES_PASSWORD : ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
FLUXER_POSTGRES_SSL : "false"
FLUXER_POSTGRES_PREPARED_STATEMENTS : ${FLUXER_POSTGRES_PREPARED_STATEMENTS:-true}
2026-06-16 06:41:37 +02:00
x-fluxer-env : &fluxer-env
2026-08-31 19:00:43 +02:00
<< : *fluxer-postgres-env
2026-06-16 06:41:37 +02:00
FLUXER_ENV : production
NODE_ENV : production
FLUXER_SELF_HOSTED : "true"
FLUXER_BASE_DOMAIN : ${FLUXER_DOMAIN:?set FLUXER_DOMAIN in .env}
FLUXER_PUBLIC_SCHEME : ${FLUXER_PUBLIC_SCHEME:-https}
FLUXER_PUBLIC_PORT : ${FLUXER_PUBLIC_PORT:-443}
FLUXER_TRUST_CLIENT_IP_HEADER : "true"
FLUXER_CLIENT_IP_HEADER_NAME : x-forwarded-for
2026-08-31 18:43:14 +02:00
FLUXER_API_HEADERS_TIMEOUT_MS : ${FLUXER_API_HEADERS_TIMEOUT_MS:-30000}
FLUXER_API_REQUEST_TIMEOUT_MS : ${FLUXER_API_REQUEST_TIMEOUT_MS:-120000}
2026-06-16 06:41:37 +02:00
FLUXER_KV_URL : redis://valkey:6379/0
FLUXER_NATS_URL : nats://nats:4222
FLUXER_NATS_JETSTREAM_URL : nats://nats:4222
FLUXER_SVC_NATS_URL : nats://nats:4222
FLUXER_SVC_SHARD_COUNT : "1"
FLUXER_SEARCH_ENGINE : meilisearch
FLUXER_SEARCH_URL : http://meilisearch:7700
FLUXER_SEARCH_API_KEY : ${MEILI_MASTER_KEY:?set MEILI_MASTER_KEY in .env}
FLUXER_S3_ENDPOINT : http://seaweedfs:8333
FLUXER_S3_PUBLIC_ENDPOINT : http://seaweedfs:8333
FLUXER_S3_REGION : us-east-1
FLUXER_S3_ACCESS_KEY_ID : ${FLUXER_S3_ACCESS_KEY:?set FLUXER_S3_ACCESS_KEY in .env}
FLUXER_S3_SECRET_ACCESS_KEY : ${FLUXER_S3_SECRET_KEY:?set FLUXER_S3_SECRET_KEY in .env}
FLUXER_S3_FORCE_PATH_STYLE : "true"
FLUXER_S3_BUCKET_CDN : fluxer
FLUXER_S3_BUCKET_UPLOADS : fluxer-uploads
FLUXER_S3_BUCKET_DOWNLOADS : fluxer-downloads
FLUXER_S3_BUCKET_REPORTS : fluxer-reports
FLUXER_S3_BUCKET_HARVESTS : fluxer-harvests
AWS_ACCESS_KEY_ID : ${FLUXER_S3_ACCESS_KEY:?}
AWS_SECRET_ACCESS_KEY : ${FLUXER_S3_SECRET_KEY:?}
AWS_DEFAULT_REGION : us-east-1
AWS_EC2_METADATA_DISABLED : "true"
FLUXER_LIVEKIT_ENABLED : "true"
FLUXER_LIVEKIT_API_KEY : ${LIVEKIT_API_KEY:?set LIVEKIT_API_KEY in .env}
FLUXER_LIVEKIT_API_SECRET : ${LIVEKIT_API_SECRET:?set LIVEKIT_API_SECRET in .env}
2026-08-26 18:52:53 +02:00
FLUXER_LIVEKIT_INTERNAL_URL : http://livekit:7880
2026-06-16 06:41:37 +02:00
FLUXER_LIVEKIT_WEBHOOK_URL : http://api:8080/webhooks/livekit
2026-06-30 01:23:36 +02:00
FLUXER_LIVEKIT_DEFAULT_REGION : '{"id":"default","name":"Default","emoji":"🌍","latitude":0,"longitude":0}'
2026-06-16 06:41:37 +02:00
2026-06-30 01:19:57 +02:00
FLUXER_KLIPY_API_KEY : ${FLUXER_KLIPY_API_KEY:-}
2026-06-16 06:41:37 +02:00
FLUXER_EMAIL_ENABLED : ${FLUXER_EMAIL_ENABLED:-false}
FLUXER_EMAIL_PROVIDER : ${FLUXER_EMAIL_PROVIDER:-none}
FLUXER_EMAIL_FROM_EMAIL : ${FLUXER_EMAIL_FROM_EMAIL:-noreply@localhost}
FLUXER_EMAIL_FROM_NAME : ${FLUXER_EMAIL_FROM_NAME:-Fluxer}
2026-08-27 03:26:11 +02:00
FLUXER_EMAIL_APP_BASE_URL : ${FLUXER_EMAIL_APP_BASE_URL:-}
2026-06-16 06:41:37 +02:00
FLUXER_EMAIL_SMTP_HOST : ${FLUXER_EMAIL_SMTP_HOST:-}
FLUXER_EMAIL_SMTP_PORT : ${FLUXER_EMAIL_SMTP_PORT:-587}
FLUXER_EMAIL_SMTP_USERNAME : ${FLUXER_EMAIL_SMTP_USERNAME:-}
FLUXER_EMAIL_SMTP_PASSWORD : ${FLUXER_EMAIL_SMTP_PASSWORD:-}
FLUXER_EMAIL_SMTP_SECURE : ${FLUXER_EMAIL_SMTP_SECURE:-true}
FLUXER_SMS_ENABLED : "false"
FLUXER_CAPTCHA_ENABLED : ${FLUXER_CAPTCHA_ENABLED:-false}
FLUXER_CAPTCHA_PROVIDER : ${FLUXER_CAPTCHA_PROVIDER:-none}
FLUXER_STRIPE_ENABLED : "false"
FLUXER_NCMEC_ENABLED : "false"
FLUXER_CLAMAV_ENABLED : "false"
FLUXER_DISCOVERY_ENABLED : ${FLUXER_DISCOVERY_ENABLED:-true}
FLUXER_SUDO_MODE_SECRET : ${FLUXER_SUDO_MODE_SECRET:?set FLUXER_SUDO_MODE_SECRET in .env}
FLUXER_CONNECTION_INITIATION_SECRET : ${FLUXER_CONNECTION_INITIATION_SECRET:?set FLUXER_CONNECTION_INITIATION_SECRET in .env}
2026-08-15 22:30:46 +02:00
FLUXER_SSO_ALLOW_PRIVATE_ADDRESSES : ${FLUXER_SSO_ALLOW_PRIVATE_ADDRESSES:-false}
2026-06-16 06:41:37 +02:00
FLUXER_VAPID_PUBLIC_KEY : ${FLUXER_VAPID_PUBLIC_KEY:?set FLUXER_VAPID_PUBLIC_KEY in .env}
FLUXER_VAPID_PRIVATE_KEY : ${FLUXER_VAPID_PRIVATE_KEY:?set FLUXER_VAPID_PRIVATE_KEY in .env}
FLUXER_VAPID_EMAIL : ${FLUXER_VAPID_EMAIL:-admin@${FLUXER_DOMAIN}}
2026-08-15 20:23:19 +02:00
FLUXER_PASSKEY_RP_ID : ${FLUXER_PASSKEY_RP_ID:-${FLUXER_DOMAIN}}
FLUXER_PASSKEY_RP_NAME : ${FLUXER_PASSKEY_RP_NAME:-Fluxer}
FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS : ${FLUXER_PASSKEY_ADDITIONAL_ALLOWED_ORIGINS:-${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}}
2026-06-16 06:41:37 +02:00
FLUXER_GATEWAY_RPC_AUTH_TOKEN : ${FLUXER_GATEWAY_RPC_AUTH_TOKEN:?set FLUXER_GATEWAY_RPC_AUTH_TOKEN in .env}
FLUXER_MEDIA_PROXY_SECRET_KEY : ${FLUXER_MEDIA_PROXY_SECRET_KEY:?set FLUXER_MEDIA_PROXY_SECRET_KEY in .env}
FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64 : ${FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64:?set FLUXER_MEDIA_PROXY_UPLOAD_RELAY_SECRET_BASE64 in .env}
FLUXER_ADMIN_SECRET_KEY_BASE : ${FLUXER_ADMIN_SECRET_KEY_BASE:?set FLUXER_ADMIN_SECRET_KEY_BASE in .env}
FLUXER_ADMIN_OAUTH_CLIENT_SECRET : ${FLUXER_ADMIN_OAUTH_CLIENT_SECRET:?set FLUXER_ADMIN_OAUTH_CLIENT_SECRET in .env}
FLUXER_INTERNAL_API_ENDPOINT : http://api:8080
FLUXER_INTERNAL_GATEWAY_ENDPOINT : http://gateway:8080
FLUXER_INTERNAL_MEDIA_PROXY_ENDPOINT : http://media-proxy:8080
FLUXER_MARKETING_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}
FLUXER_MEDIA_PROXY_ENDPOINT : http://media-proxy:8080
FLUXER_MEDIA_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/media
FLUXER_MEDIA_PROXY_UPLOAD_RELAY_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/media
x-fluxer-service : &fluxer-service
restart : unless-stopped
networks : [ fluxer]
services :
caddy :
image : caddy:2.10-alpine
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_CADDY_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
restart : unless-stopped
networks : [ fluxer]
ports :
- "80:80"
- "443:443"
- "443:443/udp"
environment :
FLUXER_CADDY_SITE_ADDRESS : ${FLUXER_CADDY_SITE_ADDRESS:?set FLUXER_CADDY_SITE_ADDRESS in .env}
volumes :
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy-data:/data
- caddy-config:/config
2026-08-31 00:13:20 +02:00
depends_on :
api : {condition : service_started}
gateway : {condition : service_healthy}
media-proxy : {condition : service_started}
static-proxy : {condition : service_started}
admin : {condition : service_started}
2026-06-16 06:41:37 +02:00
postgres :
image : postgres:16-alpine
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_POSTGRES_MEMORY_LIMIT:-5gb}
2026-08-31 00:22:48 +02:00
reservations :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_POSTGRES_MEMORY_RESERVATION:-3gb}
2026-06-16 06:41:37 +02:00
restart : unless-stopped
networks : [ fluxer]
2026-08-30 22:14:52 +02:00
command : >
postgres
2026-08-31 13:42:12 +02:00
-c max_connections=${FLUXER_POSTGRES_SERVER_MAX_CONNECTIONS:-150}
-c shared_buffers=${FLUXER_POSTGRES_SHARED_BUFFERS:-512MB}
-c effective_cache_size=${FLUXER_POSTGRES_EFFECTIVE_CACHE_SIZE:-2GB}
-c work_mem=${FLUXER_POSTGRES_WORK_MEM:-8MB}
2026-08-30 22:14:52 +02:00
-c maintenance_work_mem=256MB
-c autovacuum_work_mem=128MB
-c random_page_cost=1.1
-c effective_io_concurrency=200
-c default_statistics_target=200
-c jit=off
-c min_wal_size=512MB
-c max_wal_size=2GB
-c checkpoint_completion_target=0.9
-c wal_buffers=16MB
-c wal_compression=zstd
-c bgwriter_delay=50ms
-c bgwriter_lru_maxpages=1000
-c autovacuum_vacuum_scale_factor=0.05
-c autovacuum_analyze_scale_factor=0.02
-c autovacuum_vacuum_cost_limit=2000
-c track_io_timing=on
-c shared_preload_libraries=pg_stat_statements
shm_size : 256mb
2026-06-16 06:41:37 +02:00
environment :
POSTGRES_DB : fluxer
POSTGRES_USER : fluxer
POSTGRES_PASSWORD : ${POSTGRES_PASSWORD:?set POSTGRES_PASSWORD in .env}
volumes :
- postgres-data:/var/lib/postgresql/data
healthcheck :
test : [ "CMD-SHELL" , "pg_isready -U fluxer -d fluxer" ]
interval : 10s
timeout : 5s
retries : 10
valkey :
image : valkey/valkey:8.1-alpine
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_VALKEY_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
restart : unless-stopped
networks : [ fluxer]
2026-08-31 14:48:58 +02:00
command : [ "valkey-server" , "--appendonly" , "yes" , "--appendfsync" , "everysec" , "--dir" , "/data" ,
"--maxmemory" , "${FLUXER_VALKEY_MAXMEMORY:-192mb}" ,
"--maxmemory-policy" , "${FLUXER_VALKEY_MAXMEMORY_POLICY:-noeviction}" ]
volumes :
- valkey-data:/data
2026-06-16 06:41:37 +02:00
healthcheck :
test : [ "CMD" , "valkey-cli" , "ping" ]
interval : 10s
timeout : 5s
retries : 10
nats :
image : nats:2.14-alpine
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_NATS_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
restart : unless-stopped
networks : [ fluxer]
command : [ "-js" , "-sd" , "/data" , "-m" , "8222" ]
volumes :
- nats-data:/data
meilisearch :
image : getmeili/meilisearch:v1.12
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_MEILISEARCH_MEMORY_LIMIT:-768mb}
2026-06-16 06:41:37 +02:00
restart : unless-stopped
networks : [ fluxer]
environment :
MEILI_ENV : production
MEILI_NO_ANALYTICS : "true"
2026-08-31 00:22:48 +02:00
MEILI_MAX_INDEXING_MEMORY : 384mb
2026-06-16 06:41:37 +02:00
MEILI_MASTER_KEY : ${MEILI_MASTER_KEY:?set MEILI_MASTER_KEY in .env}
volumes :
- meilisearch-data:/meili_data
seaweedfs :
image : chrislusf/seaweedfs:4.34
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_SEAWEEDFS_MEMORY_LIMIT:-512mb}
2026-06-16 06:41:37 +02:00
restart : unless-stopped
networks : [ fluxer]
command : [ "server" , "-s3" , "-dir=/data" ]
volumes :
- seaweedfs-data:/data
seaweedfs-init :
image : chrislusf/seaweedfs:4.34
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_SEAWEEDFS_INIT_MEMORY_LIMIT:-128mb}
2026-06-16 06:41:37 +02:00
networks : [ fluxer]
depends_on : [ seaweedfs]
restart : "no"
entrypoint :
- /bin/sh
- -c
- >
2026-08-15 22:21:24 +02:00
buckets="fluxer fluxer-uploads fluxer-downloads fluxer-reports fluxer-harvests";
missing="$$buckets";
for attempt in $$(seq 1 60); do
if ! nc -z seaweedfs 9333 2>/dev/null; then
sleep 2;
continue;
fi;
listed=$$(echo "s3.bucket.list" | timeout 10 weed shell -master=seaweedfs:9333 2>&1);
missing="";
for b in $$buckets; do
echo "$$listed" | grep -q "^[[:space:]]*$$b[[:space:]]" || missing="$${missing:+$$missing }$$b";
done;
if [ -z "$$missing" ]; then
echo "buckets ready";
exit 0;
fi;
for b in $$missing; do
echo "s3.bucket.create -name $$b" | timeout 10 weed shell -master=seaweedfs:9333 >/dev/null 2>&1;
done;
sleep 2;
2026-06-16 06:41:37 +02:00
done;
2026-08-15 22:21:24 +02:00
echo "seaweedfs-init could not verify buckets: $$missing" >&2;
exit 1;
2026-06-16 06:41:37 +02:00
livekit :
image : livekit/livekit-server:v1.12.0
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_LIVEKIT_MEMORY_LIMIT:-512mb}
2026-06-16 06:41:37 +02:00
restart : unless-stopped
networks : [ fluxer]
command : [ "--config" , "/etc/livekit.yaml" ]
environment :
LIVEKIT_KEYS : "${LIVEKIT_API_KEY:?set LIVEKIT_API_KEY in .env}: ${LIVEKIT_API_SECRET:?set LIVEKIT_API_SECRET in .env}"
volumes :
- ./livekit.yaml:/etc/livekit.yaml:ro
ports :
- "${FLUXER_LIVEKIT_TCP_PORT:-7881}:7881"
- "${FLUXER_LIVEKIT_UDP_PORT:-7882}:7882/udp"
api :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-api:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_API_MEMORY_LIMIT:-2560mb}
2026-08-31 00:22:48 +02:00
reservations :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_API_MEMORY_RESERVATION:-1gb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
FLUXER_API_PORT : "8080"
2026-08-31 14:09:13 +02:00
NODE_OPTIONS : --enable-source-maps${FLUXER_API_NODE_HEAP_MB:+ --max-old-space-size=$FLUXER_API_NODE_HEAP_MB}
2026-06-16 06:41:37 +02:00
FLUXER_API_PRESIGNED_ATTACHMENT_UPLOADS_ENABLED : "true"
2026-08-30 22:14:56 +02:00
FLUXER_POSTGRES_MAX_CONNECTIONS : "25"
2026-06-16 06:41:37 +02:00
healthcheck :
test : [ "CMD-SHELL" , "node -e \"fetch('http://127.0.0.1:8080/_health').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))\"" ]
interval : 10s
timeout : 5s
retries : 30
start_period : 90s
2026-08-31 00:17:09 +02:00
start_interval : 1s
2026-06-16 06:41:37 +02:00
depends_on :
postgres : {condition : service_healthy}
valkey : {condition : service_healthy}
nats : {condition : service_started}
meilisearch : {condition : service_started}
seaweedfs-init : {condition : service_completed_successfully}
2026-06-30 01:19:57 +02:00
gifs : {condition : service_started}
gifs-shard : {condition : service_started}
2026-06-16 06:41:37 +02:00
snowflakes : {condition : service_started}
snowflakes-shard : {condition : service_started}
messages : {condition : service_started}
messages-shard : {condition : service_started}
users : {condition : service_started}
users-shard : {condition : service_started}
worker :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-api:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_WORKER_MEMORY_LIMIT:-2560mb}
reservations :
memory : ${FLUXER_WORKER_MEMORY_RESERVATION:-1gb}
2026-06-16 06:41:37 +02:00
working_dir : /usr/src/app/fluxer_api
2026-08-31 01:26:30 +02:00
command : [ "node" , "dist/WorkerEntrypoint.js" ]
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
2026-08-31 14:09:13 +02:00
NODE_OPTIONS : --enable-source-maps${FLUXER_WORKER_NODE_HEAP_MB:+ --max-old-space-size=$FLUXER_WORKER_NODE_HEAP_MB}
2026-06-16 06:41:37 +02:00
FLUXER_API_WORKER_MODE : all_lanes
FLUXER_API_WORKER_ENABLE_CRON_SCHEDULER : "true"
FLUXER_API_WORKER_ENABLE_VOICE_RECONCILIATION : "true"
2026-08-30 22:14:56 +02:00
FLUXER_POSTGRES_MAX_CONNECTIONS : "25"
2026-06-16 06:41:37 +02:00
depends_on :
postgres : {condition : service_healthy}
valkey : {condition : service_healthy}
nats : {condition : service_started}
seaweedfs-init : {condition : service_completed_successfully}
snowflakes-shard : {condition : service_started}
messages-shard : {condition : service_started}
users-shard : {condition : service_started}
gateway :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-gateway:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_GATEWAY_MEMORY_LIMIT:-1gb}
2026-08-31 00:22:48 +02:00
reservations :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_GATEWAY_MEMORY_RESERVATION:-384mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
FLUXER_GATEWAY_PORT : "8080"
FLUXER_GATEWAY_MEDIA_PROXY_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/media
FLUXER_GATEWAY_STATIC_CDN_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}
FLUXER_GATEWAY_LOGGER_LEVEL : info
2026-08-31 00:13:20 +02:00
healthcheck :
test : [ "CMD" , "curl" , "-fsS" , "-o" , "/dev/null" , "http://127.0.0.1:8080/_health/ready" ]
interval : 10s
timeout : 5s
retries : 30
start_period : 90s
2026-06-16 06:41:37 +02:00
depends_on :
nats : {condition : service_started}
valkey : {condition : service_healthy}
media-proxy :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-media-proxy:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_MEDIA_PROXY_MEMORY_LIMIT:-512mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
FLUXER_MEDIA_PROXY_HOST : 0.0.0.0
FLUXER_MEDIA_PROXY_PORT : "8080"
FLUXER_MEDIA_PROXY_MODE : upload
FLUXER_MEDIA_PROXY_STORAGE_BACKEND : s3
healthcheck :
disable : true
depends_on :
seaweedfs-init : {condition : service_completed_successfully}
nats : {condition : service_started}
static-proxy :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-static:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_STATIC_PROXY_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
app-proxy :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-app-proxy-self-hosted:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_APP_PROXY_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
environment :
2026-08-31 19:00:43 +02:00
<< : *fluxer-postgres-env
2026-06-16 06:41:37 +02:00
FLUXER_APP_PROXY_HOST : 0.0.0.0
FLUXER_APP_PROXY_PORT : "8080"
DISCOVERY_UPSTREAM_URL : http://caddy:8088/api/.well-known/fluxer
PUBLIC_BOOTSTRAP_API_ENDPOINT : /api
PUBLIC_BOOTSTRAP_API_PUBLIC_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/api
2026-08-15 21:32:16 +02:00
FLUXER_CSP_EXTRA_DEFAULT_SRC : ${FLUXER_CSP_EXTRA_DEFAULT_SRC:-}
FLUXER_CSP_EXTRA_CONNECT_SRC : ${FLUXER_CSP_EXTRA_CONNECT_SRC:-}
FLUXER_CSP_EXTRA_IMG_SRC : ${FLUXER_CSP_EXTRA_IMG_SRC:-}
FLUXER_CSP_EXTRA_MEDIA_SRC : ${FLUXER_CSP_EXTRA_MEDIA_SRC:-}
FLUXER_CSP_EXTRA_FONT_SRC : ${FLUXER_CSP_EXTRA_FONT_SRC:-}
FLUXER_CSP_EXTRA_SCRIPT_SRC : ${FLUXER_CSP_EXTRA_SCRIPT_SRC:-}
FLUXER_CSP_EXTRA_STYLE_SRC : ${FLUXER_CSP_EXTRA_STYLE_SRC:-}
FLUXER_CSP_EXTRA_FRAME_SRC : ${FLUXER_CSP_EXTRA_FRAME_SRC:-}
FLUXER_CSP_EXTRA_WORKER_SRC : ${FLUXER_CSP_EXTRA_WORKER_SRC:-}
FLUXER_CSP_EXTRA_MANIFEST_SRC : ${FLUXER_CSP_EXTRA_MANIFEST_SRC:-}
FLUXER_CSP_REPORT_URI : ${FLUXER_CSP_REPORT_URI:-}
2026-08-30 22:14:56 +02:00
FLUXER_POSTGRES_MAX_CONNECTIONS : "5"
2026-06-16 06:41:37 +02:00
depends_on :
api : {condition : service_healthy}
caddy : {condition : service_started}
2026-08-15 19:38:19 +02:00
postgres : {condition : service_healthy}
2026-06-16 06:41:37 +02:00
snowflakes :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-snowflakes:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_SNOWFLAKES_MEMORY_LIMIT:-128mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
2026-08-30 22:45:50 +02:00
FLUXER_SVC_NAME : snowflakes
2026-06-16 06:41:37 +02:00
FLUXER_SVC_MODE : router
depends_on :
nats : {condition : service_started}
snowflakes-shard :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-snowflakes:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_SNOWFLAKES_SHARD_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
2026-08-30 22:45:50 +02:00
FLUXER_SVC_NAME : snowflakes
2026-06-16 06:41:37 +02:00
FLUXER_SVC_MODE : shard
FLUXER_SVC_SHARD_ID : "0"
depends_on :
nats : {condition : service_started}
users :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-users:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_USERS_MEMORY_LIMIT:-128mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
FLUXER_SVC_MODE : router
2026-08-31 14:23:11 +02:00
FLUXER_SVC_MAX_CONCURRENT_REQUESTS : "${FLUXER_SVC_MAX_CONCURRENT_REQUESTS:-20}"
2026-06-16 06:41:37 +02:00
depends_on :
nats : {condition : service_started}
users-shard :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-users:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_USERS_SHARD_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
FLUXER_SVC_MODE : shard
FLUXER_SVC_SHARD_ID : "0"
2026-08-30 22:14:56 +02:00
FLUXER_POSTGRES_MAX_CONNECTIONS : "20"
2026-08-30 22:17:12 +02:00
FLUXER_SVC_MAX_CONCURRENT_REQUESTS : "20"
2026-06-16 06:41:37 +02:00
depends_on :
nats : {condition : service_started}
2026-08-15 19:38:19 +02:00
postgres : {condition : service_healthy}
2026-06-16 06:41:37 +02:00
2026-06-30 01:19:57 +02:00
gifs :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-gifs:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_GIFS_MEMORY_LIMIT:-128mb}
2026-06-30 01:19:57 +02:00
environment :
<< : *fluxer-env
FLUXER_SVC_NAME : gifs
FLUXER_SVC_MODE : router
FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/media
depends_on :
nats : {condition : service_started}
gifs-shard :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-gifs:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_GIFS_SHARD_MEMORY_LIMIT:-256mb}
2026-06-30 01:19:57 +02:00
environment :
<< : *fluxer-env
FLUXER_SVC_NAME : gifs
FLUXER_SVC_MODE : shard
FLUXER_SVC_SHARD_ID : "0"
FLUXER_MEDIA_PROXY_PUBLIC_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/media
depends_on :
nats : {condition : service_started}
2026-06-16 06:41:37 +02:00
messages :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-messages:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_MESSAGES_MEMORY_LIMIT:-128mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
2026-08-30 22:45:50 +02:00
FLUXER_SVC_NAME : messages
2026-06-16 06:41:37 +02:00
FLUXER_SVC_MODE : router
2026-08-31 14:23:11 +02:00
FLUXER_SVC_MAX_CONCURRENT_REQUESTS : "${FLUXER_SVC_MAX_CONCURRENT_REQUESTS:-20}"
2026-06-16 06:41:37 +02:00
depends_on :
nats : {condition : service_started}
messages-shard :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-messages:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_MESSAGES_SHARD_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
2026-08-30 22:45:50 +02:00
FLUXER_SVC_NAME : messages
2026-06-16 06:41:37 +02:00
FLUXER_SVC_MODE : shard
FLUXER_SVC_SHARD_ID : "0"
2026-08-30 22:14:56 +02:00
FLUXER_POSTGRES_MAX_CONNECTIONS : "20"
2026-08-30 22:17:12 +02:00
FLUXER_SVC_MAX_CONCURRENT_REQUESTS : "20"
2026-06-16 06:41:37 +02:00
depends_on :
nats : {condition : service_started}
postgres : {condition : service_healthy}
unfurl :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-unfurl:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_UNFURL_MEMORY_LIMIT:-128mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
FLUXER_SVC_MODE : router
depends_on :
nats : {condition : service_started}
unfurl-shard :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-unfurl:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_UNFURL_SHARD_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
FLUXER_SVC_MODE : shard
FLUXER_SVC_SHARD_ID : "0"
depends_on :
nats : {condition : service_started}
admin :
<< : *fluxer-service
image : ${FLUXER_REGISTRY:-ghcr.io/${FLUXER_REGISTRY_OWNER:-fluxerapp}}/fluxer-admin:${FLUXER_IMAGE_TAG:-v1}
2026-08-31 00:22:48 +02:00
deploy :
resources :
limits :
2026-08-31 13:42:12 +02:00
memory : ${FLUXER_ADMIN_MEMORY_LIMIT:-256mb}
2026-06-16 06:41:37 +02:00
environment :
<< : *fluxer-env
FLUXER_ADMIN_HOST : 0.0.0.0
FLUXER_ADMIN_PORT : "8080"
FLUXER_ADMIN_BASE_PATH : /admin
FLUXER_API_ENDPOINT : http://api:8080
FLUXER_ADMIN_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/admin
FLUXER_APP_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}
FLUXER_MEDIA_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/media
FLUXER_STATIC_CDN_ENDPOINT : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}
FLUXER_ADMIN_OAUTH_REDIRECT_URI : ${FLUXER_PUBLIC_SCHEME:-https}://${FLUXER_DOMAIN}/admin/oauth2_callback
depends_on :
api : {condition : service_healthy}
networks :
fluxer :
driver : bridge
volumes :
caddy-data :
caddy-config :
postgres-data :
2026-08-31 14:48:58 +02:00
valkey-data :
2026-06-16 06:41:37 +02:00
nats-data :
meilisearch-data :
seaweedfs-data :