17 KiB
Docker compose guide
Table of content
Suggestions
In order for labels to work correctly in compose.yml
:
key: value
mapping is suggested for label, instead of- key=value
- you need to add
|
in the end for multiline strings.
Example
services:
app:
...
container_name: app
labels:
proxy.app.middlewares.modify_request.set_headers: |
X-Custom-Header1: value1, value2
X-Custom-Header2: value3
proxy.app.middlewares.modify_request.hide_headers: |
X-Custom-Header4
X-Custom-Header5
X-Custom-Header6
Additional setup
-
Enable HTTPs (optional)
Mount a folder to store obtained certs or to load existing cert
services: go-proxy: ... volumes: - ./certs:/app/certs
To use autocert, complete that section in
config.yml
, e.g.autocert: email: john.doe@x.y.z # ACME Email domains: # a list of domains for cert registration - y.z - *.y.z provider: cloudflare options: auth_token: c1234565789-abcdefghijklmnopqrst # your zone API token
To use existing certificate, set path for cert and key in
config.yml
, e.g.autocert: provider: local cert_path: /app/certs/cert.crt key_path: /app/certs/priv.key
-
Modify
compose.yml
to fit your needs -
Run
docker compose up -d
to start the container -
Navigate to Web panel
http://gp.yourdomain.com
or use Visual Studio Code (provides schema check) to edit proxy config
Labels
Parts surrounded by []
are optional
Syntax
Label | Description | Example | Default | Accepted values |
---|---|---|---|---|
proxy.aliases |
comma separated aliases for subdomain and label matching | gitlab,gitlab-reg,gitlab-ssh |
container_name |
any |
proxy.exclude |
to be excluded from go-proxy |
false | boolean | |
proxy.idle_timeout |
time for idle (no traffic) before put it into sleep (http/s only) NOTE: idlewatcher will only be enabled containers that has non-empty idle_timeout |
1h |
empty or 0 (disabled) |
number[unit]... , e.g. 1m30s |
proxy.wake_timeout |
time to wait for target site to be ready | 30s |
number[unit]... |
|
proxy.stop_method |
method to stop after idle_timeout |
stop |
stop , pause , kill |
|
proxy.stop_timeout |
time to wait for stop command | 10s |
number[unit]... |
|
proxy.stop_signal |
signal sent to container for stop and kill methods |
docker's default | SIGINT , SIGTERM , SIGHUP , SIGQUIT and those without SIG prefix |
|
proxy.<alias>.<field> |
set field for specific alias | proxy.gitlab-ssh.scheme |
N/A | N/A |
proxy.#<index>.<field> |
set field for specific alias at index (starting from 1) | proxy.#3.port |
N/A | N/A |
proxy.*.<field> |
set field for all aliases | proxy.*.set_headers |
N/A | N/A |
proxy.?.middlewares.<middleware>[.<field>] |
enable and set field for specific middleware | ? here means <alias> / $<index> / *
|
N/A | Middleware specific See middlewares.md for more |
Fields
Field | Description | Default | Allowed Values / Syntax |
---|---|---|---|
scheme |
proxy protocol |
|
http , https , tcp , udp |
host |
proxy host |
|
IP address, hostname |
port |
proxy port (http/s) | first port returned from docker | number in range of 1 - 65535 |
port |
proxy port (tcp/udp) | 0:first_port |
x:y
|
no_tls_verify |
whether skip tls verify (https only) | false |
boolean |
path_patterns |
proxy path patterns (http/s only) only requests that matched a pattern will be proxied |
/ (proxy all requests) |
list1 of (path patterns) |
Key-value mapping example
Docker Compose
services:
nginx:
...
labels:
proxy.nginx.middlewares.modify_request.set_headers: | # remember to add the '|'
X-Custom-Header1: value1, value2
X-Custom-Header2: value3, value4
File Provider
service_a:
host: service_a.internal
middlewares:
modify_request:
set_headers:
X-Custom-Header1: value1, value2
X-Custom-Header2: value3
List example
Docker Compose
services:
nginx:
...
labels:
proxy.nginx.path_patterns: | # remember to add the '|'
GET /
POST /auth
proxy.nginx.middlewares.modify_request.hide_headers: | # remember to add the '|'
X-Custom-Header1
X-Custom-Header2
Include file
service_a:
host: service_a.internal
path_patterns:
GET /
POST /auth
middlewares:
modify_request:
hide_headers:
- X-Custom-Header1
- X-Custom-Header2
Troubleshooting
-
Container not showing up in proxies list
Please check that either
ports
or labelproxy.<alias>.port
is declared, e.g.services: nginx-1: # Option 1 ... ports: - 80 nginx-2: # Option 2 ... container_name: nginx-2 network_mode: host labels: proxy.nginx-2.port: 80
-
Firewall issues
If you are using
ufw
with vpn that drop all inbound traffic except vpn, run below:sudo ufw allow from 172.16.0.0/16 to 100.64.0.0/10
Explaination:
Docker network is usually
172.16.0.0/16
Tailscale is used as an example,
100.64.0.0/10
will be the CIDRYou can also list CIDRs of all docker bridge networks by:
docker network inspect $(docker network ls | awk '$3 == "bridge" { print $1}') | jq -r '.[] | .Name + " " + .IPAM.Config[0].Subnet' -
Docker compose examples
More examples in here
volumes:
adg-work:
adg-conf:
mc-data:
palworld:
nginx:
services:
adg:
image: adguard/adguardhome
restart: unless-stopped
labels:
- proxy.aliases=adg,adg-dns,adg-setup
- proxy.#1.port=80
- proxy.#2.scheme=udp
- proxy.#2.port=20000:dns
- proxy.#3.port=3000
volumes:
- adg-work:/opt/adguardhome/work
- adg-conf:/opt/adguardhome/conf
ports:
- 80
- 3000
- 53/udp
mc:
image: itzg/minecraft-server
tty: true
stdin_open: true
container_name: mc
restart: unless-stopped
ports:
- 25565
labels:
- proxy.mc.port=20001:25565
environment:
- EULA=TRUE
volumes:
- mc-data:/data
palworld:
image: thijsvanloef/palworld-server-docker:latest
restart: unless-stopped
container_name: pal
stop_grace_period: 30s
ports:
- 8211/udp
- 27015/udp
labels:
- proxy.aliases=pal1,pal2
- proxy.*.scheme=udp
- proxy.#1.port=20002:8211
- proxy.#2.port=20003:27015
environment: ...
volumes:
- palworld:/palworld
nginx:
image: nginx
container_name: nginx
volumes:
- nginx:/usr/share/nginx/html
ports:
- 80
labels:
proxy.idle_timeout: 1m
go-proxy:
image: ghcr.io/yusing/go-proxy:latest
container_name: go-proxy
restart: always
network_mode: host
volumes:
- ./config:/app/config
- /var/run/docker.sock:/var/run/docker.sock
go-proxy-frontend:
image: ghcr.io/yusing/go-proxy-frontend:latest
container_name: go-proxy-frontend
restart: unless-stopped
network_mode: host
labels:
- proxy.aliases=gp
- proxy.gp.port=3000
depends_on:
- go-proxy
Services URLs for above examples
gp.yourdomain.com
: go-proxy web paneladg-setup.yourdomain.com
: adguard setup (first time setup)adg.yourdomain.com
: adguard dashboardnginx.yourdomain.com
: nginxyourdomain.com:2000
: adguard dns (udp)yourdomain.com:20001
: minecraft serveryourdomain.com:20002
: palworld server