78 lines
2.9 KiB
YAML
78 lines
2.9 KiB
YAML
services:
|
|
# Streams the dshackle access log (NDJSON, one line per response) to the splits
|
|
# listener on the insights host. Deliberately decoupled from dshackle via the
|
|
# file: a dead listener or slow link only ever stalls this sidecar, never the
|
|
# gateway. tail -F follows logrotate copytruncate; on disconnect the retry
|
|
# loop resumes at the file END (bounded loss, no duplication floods) — the
|
|
# per-gateway prometheus-vs-lines reconciliation on the listener side makes
|
|
# any gap visible within the hour.
|
|
accesslog-shipper:
|
|
image: busybox:1.36
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ./dshackle_logs:/logs:ro
|
|
command: >-
|
|
sh -c 'while true; do
|
|
tail -F /logs/access_log.jsonl 2>/dev/null | nc ${SPLITS_LISTENER_HOST:-78.47.193.225} ${SPLITS_LISTENER_PORT:-9102};
|
|
echo shipper lost listener connection, retrying in 10s;
|
|
sleep 10; done'
|
|
|
|
dshackle:
|
|
image: drpcorg/dshackle:0.79.10
|
|
restart: unless-stopped
|
|
volumes:
|
|
- ./main_configs:/etc/dshackle
|
|
# dshackle accessLog target (main_configs/dshackle.yaml accessLog.filename=/logs/...).
|
|
# Host-side dir so the shipper sidecar above can stream gateway->region request
|
|
# shares (earnings misattribution fix, operator + claude-machine design 2026-07-09).
|
|
- ./dshackle_logs:/logs
|
|
expose:
|
|
- 8080
|
|
- 8081
|
|
- 25703
|
|
#ports:
|
|
# - "2449:2449"
|
|
environment:
|
|
DSHACKLE_LOG_LEVEL: ${DSHACKLE_LOG_LEVEL:-info}
|
|
labels:
|
|
- "prometheus-scrape.enabled=true"
|
|
- "prometheus-scrape.port=8081"
|
|
- "prometheus-scrape.job_name=drpc-dshackle"
|
|
- "prometheus-scrape.metrics_path=/metrics"
|
|
- "traefik.enable=true"
|
|
- "traefik.http.services.drpc.loadbalancer.server.scheme=h2c"
|
|
- "traefik.http.services.drpc.loadbalancer.server.port=2449"
|
|
- "traefik.http.routers.drpc.entrypoints=grpc"
|
|
- "traefik.http.routers.drpc.service=drpc"
|
|
- "traefik.http.routers.drpc.tls.certresolver=myresolver"
|
|
- "traefik.http.routers.drpc.rule=Host(`$GW_DOMAIN`)"
|
|
|
|
- "traefik.http.services.dshackle.loadbalancer.server.port=8080"
|
|
- "traefik.http.routers.dshackle.entrypoints=websecure"
|
|
- "traefik.http.routers.dshackle.service=dshackle"
|
|
- "traefik.http.routers.dshackle.tls.certresolver=myresolver"
|
|
- "traefik.http.routers.dshackle.rule=Host(`$GW_DOMAIN`)"
|
|
- "${GW_ALLOW_LIST:+traefik.http.middlewares.gwallowlist.ipallowlist.sourcerange=$GW_ALLOW_LIST}"
|
|
- "${GW_ALLOW_LIST:+traefik.http.routers.dshackle.middlewares=gwallowlist}"
|
|
extra_hosts:
|
|
- "host.docker.internal:host-gateway"
|
|
networks:
|
|
- chains
|
|
logging:
|
|
driver: journald
|
|
|
|
|
|
redis:
|
|
image: healthcheck/redis:alpine
|
|
restart: unless-stopped
|
|
command:
|
|
- "redis-server"
|
|
- "--maxmemory ${GW_REDIS_RAM}"
|
|
- "--maxmemory-policy allkeys-lru"
|
|
- '--save ""'
|
|
networks:
|
|
- chains
|
|
|
|
|
|
|