v3.0.0-alpha.1 6fdddb8

gordon.toml.example RawHistoryFolder

1# Gordon example configuration
2# Copy this file to ~/.config/gordon/gordon.toml and adjust for your domain.
3
4[server]
5registry_port = 5000
6gordon_domain = "gordon.example.com"
7# legacy_registry_domains = ["registry.example.com:5000"]
8# proxy_allowed_ips = ["173.245.48.0/20"]
9# registry_allowed_ips = []
10# registry_listen_address = ""
11# tls_cert_file = ""
12# tls_key_file = ""
13# force_https_redirect = false
14# data_dir = "~/.gordon"
15# max_blob_chunk_size = "95MB"
16# max_blob_size = "1GB"
17# max_proxy_body_size = "512MB"
18# max_proxy_response_size = "1GB"
19# max_concurrent_connections = 10000
20
21# "edge" is the conventional route-capable entrypoint name, but a single
22# custom smart_tcp or tls_mux entrypoint can also serve normal Gordon routes.
23[entrypoints.edge]
24address = ":443"
25protocol = "smart_tcp"
26# trusted_cidrs = []
27# raw_fallback = "ssh-fallback"
28# raw_fallback_trusted_cidrs = ["100.64.0.0/10"]
29# allow_public_raw_fallback = false
30
31[dns]
32resolvers = ["1.1.1.1:53", "8.8.8.8:53"]
33propagation_timeout = "5m"
34polling_interval = "5s"
35
36[tls.acme]
37enabled = false
38email = ""
39challenge = "auto"
40obtain_batch_size = 1
41
42[auth]
43enabled = true
44# Use "pass" or "sops" in production. The unsafe backend reads a local file
45# under server.data_dir/secrets and is intended for development only.
46secrets_backend = "pass"
47token_secret = "gordon/auth/token_secret"
48token_expiry = "30d"
49access_token_ttl = "15m"
50
51[api.rate_limit]
52enabled = true
53global_rps = 500
54per_ip_rps = 50
55burst = 100
56trusted_proxies = []
57
58[containers]
59# "compat" preserves broad image compatibility. "strict" enables a read-only
60# root filesystem and narrower Linux capabilities.
61security_profile = "compat"
62
63[network_isolation]
64# Installation network policy for Gordon-managed networks (prefix filter
65# for `gordon networks list`). Per-app isolation is removed: apps declare
66# `[[network.shared]]` membership in their app file instead.
67enabled = true
68network_prefix = "gordon"
69# Set true to create Docker internal networks without direct external egress.
70internal = false
71
72[volumes]
73auto_create = true
74prefix = "gordon"
75preserve = true
76
77[images]
78# Docker Hub, ghcr.io, quay.io, and Gordon's registry are always allowed.
79# Add other registries as exact hostname+port entries; this does not configure credentials.
80allowed_registries = []
81# Require @sha256:<64 hex chars> for images from every registry, including Gordon.
82require_digest = false
83
84[images.prune]
85enabled = false
86schedule = "daily"
87keep_last = 3
88
89[logging]
90level = "info"
91format = "console"
92
93[logging.file]
94enabled = false
95# path = "~/.gordon/logs/gordon.log"
96# max_size = 100
97# max_backups = 3
98# max_age = 28
99
100[logging.access_log]
101enabled = false
102format = "json"
103output = "stdout"
104# file_path = "~/.gordon/logs/access.log"
105max_size = 100
106max_backups = 3
107max_age = 28
108exclude_health_checks = true
109syslog_identifier = "gordon-access"
110
111# =============================================================================
112# ADMINISTRATIVE APP BIND MOUNTS
113# =============================================================================
114# A named policy is the only way an app manifest may reference a host path.
115# The manifest declares [[service.bind]] name = "<mount>"; direct host paths
116# are always rejected. allowed_apps/allowed_services are exact and non-empty,
117# and read_only/readonly force read-only: either side wins.
118# [app_mounts.app-logs]
119# source = "/srv/gordon/host-logs"   # Required; absolute, normalized
120# read_only = true                   # Either side forcing read-only wins
121# allowed_apps = ["metrics-agent"]   # Required; exact, non-empty
122# allowed_services = ["web"]         # Required; exact, non-empty
123# root = "/srv/gordon"               # Optional; defaults to the source's parent
124
125# =============================================================================
126# ADMINISTRATIVE APP DEVICES (CDI)
127# =============================================================================
128# A named device grant is the only way an app manifest may request host
129# devices. The manifest declares devices = ["<name>"]; raw /dev paths,
130# privileged containers, and runtime-specific GPU flags are never used.
131# Gordon resolves each name to explicit CDI IDs at activation time and
132# encodes them as one native CDI DeviceRequest. allowed_apps and
133# allowed_services are exact and non-empty: only that app+service pair
134# receives the grant. Aggregate "=all" selectors are rejected: name every
135# device explicitly. Changing a mapping never recreates a running
136# container; the next deploy serves the new resolution. Revoking a grant
137# fails subsequent deploys closed while the running service is untouched.
138# Supported engines: Podman 5.4+ or Docker 28.3+ with native CDI
139# configured (CDI specs, toolkit, device permissions on the host).
140# [app_devices.transcode-gpu]
141# cdi = ["example.com/gpu=GPU-device-uuid"]  # Required; explicit, non-empty
142# allowed_apps = ["video"]                   # Required; exact, non-empty
143# allowed_services = ["transcoder"]          # Required; exact, non-empty
144
145[telemetry]
146enabled = false
147# endpoint = "http://localhost:4318"
148# auth_token = ""
149traces = true
150metrics = true
151logs = true
152trace_sample_rate = 1.0
153
154[env]
155# dir = "~/.gordon/env"
156
157[backups.databases]
158enabled = false
159schedule = "daily"
160storage_dir = ""
161
162[backups.databases.retention]
163hourly = 0
164daily = 0
165weekly = 0
166monthly = 0
167
168[backups.volumes]
169enabled = false
170interval = "24h"
171compression = "gzip"
172timeout = "2h"
173max_concurrency = 2
174# Helper image must include tar and the selected compressor.
175helper_image = "alpine:3.20"
176
177[backups.volumes.s3]
178bucket = ""
179region = ""
180prefix = ""
181# endpoint = "https://s3.example.com"
182# path_style = false
183# sse_algorithm = "AES256"
184# sse_kms_key_id = ""
185
186[backups.volumes.retention]
187keep = 14
188
189[routes]
190# "app.example.com" = { image = "myapp:latest" }
191
192[external_routes]
193# "status.example.com" = "127.0.0.1:9000"
194#
195# NOTE: the pre-v3 application keys below were removed by the
196# declarative-apps cutover. Gordon fails boot/reload closed when any of
197# them is present (see validateRetiredAppConfig in internal/app/run.go).
198# Declare application workloads in standalone <app>.toml files instead:
199# one file per app, applied with `gordon apps apply --file <app>.toml`
200# and activated with `gordon apps deploy <app>`.
201#
202# REMOVED: [routes]            -> [[service.http]] in an app file
203# REMOVED: [attachments]       -> [[service]] + volumes in an app file
204# REMOVED: [network_groups]    -> [[network.shared]] in an app file
205# REMOVED: [[services]]-as-app -> one [[service]] per app file
206# REMOVED: [service_routes]    -> [[service.http]] in an app file
207# REMOVED: [auto]/[auto_route] -> explicit interfaces in an app file
208# REMOVED: [previews]          -> staging is an ordinary app file
209
210# Gordon-managed standalone L4 services. Use service:<name>:<port> from
211# traffic routers to expose published loopback ports. Standalone services
212# are installation-level: they live in gordon.toml, not in app files.
213# (App services are declared with [[service]] in <app>.toml files and
214# managed with `gordon apps`; see docs/cli/apps.md.)
215# [[services]]
216# name = "rust"
217# image = "registry.example.com:5000/rust:latest"
218# enabled = true
219# env_file = "/srv/gordon/services/rust.env"
220#
221# [[services.ports]]
222# name = "game"
223# container = 28015
224# protocol = "udp"
225# publish = "127.0.0.1:38015"
226#
227# [[services.ports]]
228# name = "rcon"
229# container = 28016
230# protocol = "tcp"
231# publish = "127.0.0.1:38016"
232# trusted_cidrs = ["100.64.0.0/10"]
233#
234# [entrypoints.rust]
235# address = "0.0.0.0:28015"
236# protocol = "udp"
237#
238# [[traffic.udp.routers]]
239# name = "rust-game"
240# entrypoint = "rust"
241# service = "service:rust:game"
242#
243# [entrypoints.rcon]
244# address = "0.0.0.0:28016"
245# protocol = "tcp"
246# trusted_cidrs = ["100.64.0.0/10"]
247#
248# [[traffic.tcp.routers]]
249# name = "rust-rcon"
250# entrypoint = "rcon"
251# service = "service:rust:rcon"
252#
253# REMOVED application sections (see note under [external_routes] above):
254# [routes], [network_groups], [attachments] were deleted with the cutover.

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 7

Tags 106

↑↓ moveenter openesc close