mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-06-27 19:21:34 +00:00
The Usage card showed runtime.MemStats.Sys, a never-shrinking high-water mark of reserved address space that also counts memory already returned to the OS, so it overstated real usage (e.g. ~300 MB on an idle 1-client server). Report process RSS instead so the number matches the OS and drops as memory is freed. Replace the auto GOMEMLIMIT that targeted ~90 percent of total system RAM (a near no-op while the heap sits far below the limit, and a GC-thrash risk on small/shared VPS per go.dev/doc/gc-guide) with: a lower default GOGC (XUI_GOGC, default 75), a periodic debug.FreeOSMemory job (XUI_MEMORY_RELEASE_INTERVAL, default 10m, 0 disables), and a soft limit applied only from an explicit budget (GOMEMLIMIT, XUI_MEMORY_LIMIT, or a real cgroup cap at 90 percent).
56 lines
2.2 KiB
YAML
56 lines
2.2 KiB
YAML
services:
|
|
3xui:
|
|
build:
|
|
context: .
|
|
dockerfile: ./Dockerfile
|
|
container_name: 3xui_app
|
|
# hostname: yourhostname <- optional
|
|
# Optional hard memory cap. When set, the panel derives its Go soft limit
|
|
# (GOMEMLIMIT, ~90% of this cap) so it GCs before the OOM killer fires.
|
|
# mem_limit: 512m
|
|
# The bundled Fail2ban (XUI_ENABLE_FAIL2BAN below) enforces the IP limit
|
|
# with iptables, which needs NET_ADMIN. Without these caps a ban is logged
|
|
# and shown in fail2ban status but never actually applied. NET_RAW covers
|
|
# ip6tables. If you disable Fail2ban, you can drop cap_add.
|
|
cap_add:
|
|
- NET_ADMIN
|
|
- NET_RAW
|
|
volumes:
|
|
- $PWD/db/:/etc/x-ui/
|
|
- $PWD/cert/:/root/cert/
|
|
environment:
|
|
XRAY_VMESS_AEAD_FORCED: "false"
|
|
XUI_ENABLE_FAIL2BAN: "true"
|
|
# Memory tuning. The panel keeps RAM low via GOGC + periodic release; it no
|
|
# longer sets a soft limit from total host RAM (no benefit, risks GC thrash).
|
|
# XUI_GOGC: "75" # lower = less RAM, slightly more CPU; GOGC env overrides
|
|
# XUI_MEMORY_RELEASE_INTERVAL: "10" # minutes between FreeOSMemory; 0 disables
|
|
# Go memory soft limit, only applied from an explicit budget below (or a
|
|
# real cgroup/mem_limit cap). Pin it with one of:
|
|
# XUI_MEMORY_LIMIT: "400" # in MiB
|
|
# GOMEMLIMIT: "400MiB" # Go syntax, takes precedence
|
|
# XUI_PPROF: "true" # expose pprof on 127.0.0.1:6060 for profiling
|
|
# XUI_INIT_WEB_BASE_PATH: "/"
|
|
# XUI_PORT: "8080"
|
|
# To use PostgreSQL instead of the default SQLite, run:
|
|
# docker compose --profile postgres up -d
|
|
# and uncomment the two lines below.
|
|
# XUI_DB_TYPE: "postgres"
|
|
# XUI_DB_DSN: "postgres://xui:xui@postgres:5432/xui?sslmode=disable"
|
|
tty: true
|
|
ports:
|
|
# When XUI_PORT is set, publish the same container port (for example "8080:8080").
|
|
- "2053:2053"
|
|
restart: unless-stopped
|
|
|
|
postgres:
|
|
image: postgres:16-alpine
|
|
container_name: 3xui_postgres
|
|
profiles: ["postgres"]
|
|
environment:
|
|
POSTGRES_USER: xui
|
|
POSTGRES_PASSWORD: xui
|
|
POSTGRES_DB: xui
|
|
volumes:
|
|
- $PWD/pgdata/:/var/lib/postgresql/data
|
|
restart: unless-stopped
|