2026-05-18 08:40:42 +07:00
|
|
|
services:
|
|
|
|
|
app:
|
2026-07-05 22:06:52 +07:00
|
|
|
build: .
|
2026-07-07 19:58:15 +07:00
|
|
|
container_name: filedrop-app
|
2026-05-18 08:40:42 +07:00
|
|
|
restart: always
|
|
|
|
|
environment:
|
2026-07-29 15:03:02 +07:00
|
|
|
- BOT_TOKENS=${BOT_TOKENS}
|
2026-07-29 15:08:49 +07:00
|
|
|
- BOT_TOKEN=${BOT_TOKEN}
|
|
|
|
|
- ADDITIONAL_BOT_TOKENS=${ADDITIONAL_BOT_TOKENS:-}
|
2026-05-18 08:40:42 +07:00
|
|
|
- STORAGE_CHANNEL_ID=${STORAGE_CHANNEL_ID}
|
|
|
|
|
- BASE_URL=${BASE_URL}
|
|
|
|
|
- DATABASE_URL=${DATABASE_URL}
|
|
|
|
|
- PORT=3000
|
|
|
|
|
- NODE_ENV=production
|
|
|
|
|
- LOG_LEVEL=info
|
2026-05-29 03:33:39 +07:00
|
|
|
- TRUST_PROXY=true
|
|
|
|
|
- BATCH_MAX_ITEMS=${BATCH_MAX_ITEMS:-20}
|
|
|
|
|
- BATCH_MAX_SIZE_BYTES=${BATCH_MAX_SIZE_BYTES:-524288000}
|
|
|
|
|
- MAX_REQUEST_BODY_BYTES=${MAX_REQUEST_BODY_BYTES:-2147483648}
|
2026-07-07 08:08:22 +07:00
|
|
|
- TELEGRAM_CHUNK_SIZE_BYTES=${TELEGRAM_CHUNK_SIZE_BYTES:-20971520}
|
|
|
|
|
- COMPRESS_CHUNKED_UPLOADS=${COMPRESS_CHUNKED_UPLOADS:-true}
|
|
|
|
|
- CHUNK_COMPRESSION_MIN_SIZE_BYTES=${CHUNK_COMPRESSION_MIN_SIZE_BYTES:-4096}
|
2026-05-29 03:33:39 +07:00
|
|
|
- RATE_LIMIT_WINDOW_MS=${RATE_LIMIT_WINDOW_MS:-60000}
|
|
|
|
|
- RATE_LIMIT_MAX_REQUESTS=${RATE_LIMIT_MAX_REQUESTS:-30}
|
2026-07-07 19:58:15 +07:00
|
|
|
- ADMIN_API_TOKEN=${ADMIN_API_TOKEN:-}
|
|
|
|
|
- SESSION_COOKIE_NAME=${SESSION_COOKIE_NAME:-tu_session}
|
|
|
|
|
- SESSION_COOKIE_MAX_AGE_SECONDS=${SESSION_COOKIE_MAX_AGE_SECONDS:-86400}
|
|
|
|
|
- S3_ACCESS_KEY=${S3_ACCESS_KEY:-filedrop-admin}
|
2026-07-07 00:49:45 +07:00
|
|
|
- S3_SECRET_KEY=${S3_SECRET_KEY}
|
|
|
|
|
- S3_DEFAULT_REGION=${S3_DEFAULT_REGION:-us-east-1}
|
2026-07-07 06:02:16 +07:00
|
|
|
- S3_VHOST_DOMAINS=${S3_VHOST_DOMAINS:-upload.asepharyana.my.id,asepharyana.web.id}
|
2026-05-29 03:33:39 +07:00
|
|
|
security_opt:
|
|
|
|
|
- no-new-privileges:true
|
|
|
|
|
read_only: true
|
|
|
|
|
tmpfs:
|
|
|
|
|
- /tmp:size=4g,mode=1777
|
2026-07-05 22:06:52 +07:00
|
|
|
- /usr/src/app/logs:size=64m,mode=1777
|
2026-05-29 03:33:39 +07:00
|
|
|
deploy:
|
|
|
|
|
resources:
|
|
|
|
|
limits:
|
|
|
|
|
cpus: '2.0'
|
|
|
|
|
memory: 2G
|
|
|
|
|
reservations:
|
|
|
|
|
cpus: '0.5'
|
|
|
|
|
memory: 512M
|
|
|
|
|
healthcheck:
|
|
|
|
|
test:
|
|
|
|
|
- CMD-SHELL
|
2026-07-05 22:06:52 +07:00
|
|
|
- "bun -e \"fetch('http://localhost:3000/health').then(r => r.status === 200 ? process.exit(0) : process.exit(1))\""
|
2026-05-29 03:33:39 +07:00
|
|
|
interval: 30s
|
|
|
|
|
timeout: 10s
|
|
|
|
|
retries: 3
|
|
|
|
|
start_period: 15s
|
2026-05-18 08:40:42 +07:00
|
|
|
networks:
|
|
|
|
|
- app-shared-net
|
|
|
|
|
labels:
|
|
|
|
|
- "traefik.enable=true"
|
2026-07-07 19:58:15 +07:00
|
|
|
- "traefik.http.routers.filedrop.rule=Host(`upload.asepharyana.my.id`) || Host(`upload.asepharyana.web.id`) || Host(`asepharyana.web.id`) || HostRegexp(`{subhost:[a-z0-9][a-z0-9.-]+}.asepharyana.web.id`)"
|
|
|
|
|
- "traefik.http.routers.filedrop.entrypoints=websecure"
|
|
|
|
|
- "traefik.http.routers.filedrop.tls=true"
|
|
|
|
|
- "traefik.http.routers.filedrop.tls.certresolver=cloudflare"
|
|
|
|
|
- "traefik.http.services.filedrop.loadbalancer.server.port=3000"
|
|
|
|
|
- "traefik.http.middlewares.filedrop-rl.ratelimit.average=300"
|
|
|
|
|
- "traefik.http.middlewares.filedrop-rl.ratelimit.burst=100"
|
|
|
|
|
- "traefik.http.middlewares.filedrop-rl.ratelimit.period=1m"
|
|
|
|
|
- "traefik.http.middlewares.filedrop-buf.buffering.maxRequestBodyBytes=2147483648"
|
|
|
|
|
- "traefik.http.routers.filedrop.middlewares=filedrop-rl@docker,filedrop-buf@docker"
|
2026-05-18 08:40:42 +07:00
|
|
|
|
|
|
|
|
networks:
|
|
|
|
|
app-shared-net:
|
|
|
|
|
name: app-shared-net
|
2026-05-29 03:33:39 +07:00
|
|
|
external: true
|