v2.2.4 af396ea

installation.md RawHistoryFolder

Installation

Detailed installation guide for production environments.

System Requirements

  • OS: Linux (Ubuntu 24.04 LTS, Debian 13 recommended) or macOS
  • Architecture: x86_64 (amd64) or ARM64
  • Memory: 512MB minimum, 1GB recommended
  • Disk: 10GB minimum for registry storage
  • Runtime: Docker or Podman

Download Gordon

From GitHub Releases

Linux (x86_64)

wget https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64.tar.gz
tar -xzf gordon_linux_amd64.tar.gz
chmod +x gordon
sudo mv gordon /usr/local/bin/

Linux (ARM64) - for Raspberry Pi 4, AWS Graviton, Oracle Ampere, etc.

wget https://github.com/bnema/gordon/releases/latest/download/gordon_linux_arm64.tar.gz
tar -xzf gordon_linux_arm64.tar.gz
chmod +x gordon
sudo mv gordon /usr/local/bin/

macOS (Apple Silicon)

curl -LO https://github.com/bnema/gordon/releases/latest/download/gordon_darwin_arm64.tar.gz
tar -xzf gordon_darwin_arm64.tar.gz
chmod +x gordon
sudo mv gordon /usr/local/bin/

macOS (Intel)

curl -LO https://github.com/bnema/gordon/releases/latest/download/gordon_darwin_amd64.tar.gz
tar -xzf gordon_darwin_amd64.tar.gz
chmod +x gordon
sudo mv gordon /usr/local/bin/

Verify installation:

gordon version

From Source

# Requires Go 1.21+
git clone https://github.com/bnema/gordon.git
cd gordon
make build
sudo mv gordon /usr/local/bin/

Container Runtime Setup

Docker

# Install Docker
curl -fsSL https://get.docker.com | sh

# Add user to docker group
sudo usermod -aG docker $USER
newgrp docker

# Verify
docker run hello-world

Podman (Rootless)

Podman rootless mode provides enhanced security by running containers without root privileges.

# Install Podman
sudo apt update
sudo apt install -y podman

# Enable user namespaces
echo 'user.max_user_namespaces=28633' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

# Setup subuid/subgid
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER

# Enable Podman socket
systemctl --user enable --now podman.socket

# Configure insecure localhost registry
mkdir -p ~/.config/containers
cat > ~/.config/containers/registries.conf <<EOF
[registries.insecure]
registries = ['localhost:5000']
EOF

Firewall Configuration

Gordon needs ports accessible for the registry and proxy.

Using firewalld

# Install and enable firewalld
sudo apt install -y firewalld
sudo systemctl enable --now firewalld

# Allow HTTP/HTTPS
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https

# For rootless containers, redirect privileged ports
sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
sudo firewall-cmd --permanent --add-forward-port=port=443:proto=tcp:toport=8443

# Apply changes
sudo firewall-cmd --reload

# Verify
sudo firewall-cmd --list-all

Using ufw

sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 5000/tcp  # Registry port (if accessing directly)
sudo ufw enable

Configuration

Gordon creates a default configuration on first run:

# Run once to generate config, then stop
gordon start
# Press Ctrl+C

# Edit configuration
nano ~/.config/gordon/gordon.toml

Minimum required configuration:

[server]
port = 8080
registry_port = 5000
registry_domain = "registry.yourdomain.com"

[routes]
"app.yourdomain.com" = "myapp:latest"

See Configuration Reference for all options.

Systemd Service

mkdir -p ~/.config/systemd/user
cat > ~/.config/systemd/user/gordon.service <<EOF
[Unit]
Description=Gordon Container Platform
After=podman.socket

[Service]
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/gordon start

[Install]
WantedBy=default.target
EOF

# Enable and start
systemctl --user daemon-reload
systemctl --user enable --now gordon

# Enable linger (keep service running after logout)
sudo loginctl enable-linger $USER

# Check status
systemctl --user status gordon

System Service (Root Mode)

sudo cat > /etc/systemd/system/gordon.service <<EOF
[Unit]
Description=Gordon Container Platform
After=docker.service
Requires=docker.service

[Service]
Type=simple
Restart=always
RestartSec=5
ExecStart=/usr/local/bin/gordon start
User=root

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now gordon

DNS Configuration

Point your domains to your server:

Type Name Content Proxy
A app SERVER_IP Yes (Cloudflare)
A registry SERVER_IP Yes (Cloudflare)

Note: Enable Cloudflare proxy (orange cloud) for automatic HTTPS. Gordon receives HTTP traffic from Cloudflare.

Verify Installation

# Check Gordon is running
systemctl --user status gordon

# View logs
journalctl --user -u gordon -f

# Test registry (from local machine)
docker login registry.yourdomain.com
docker pull alpine
docker tag alpine registry.yourdomain.com/test:latest
docker push registry.yourdomain.com/test:latest

Data Directories

Gordon stores data in the following locations:

Path Purpose
~/.config/gordon/gordon.toml Configuration file
~/.gordon/ Default data directory
~/.gordon/registry/ Container images
~/.gordon/env/ Environment files
~/.gordon/logs/ Application logs
~/.gordon/secrets/ Secrets (unsafe backend only)
source
1# Installation
2
3Detailed installation guide for production environments.
4
5## System Requirements
6
7- **OS**: Linux (Ubuntu 24.04 LTS, Debian 13 recommended) or macOS
8- **Architecture**: x86_64 (amd64) or ARM64
9- **Memory**: 512MB minimum, 1GB recommended
10- **Disk**: 10GB minimum for registry storage
11- **Runtime**: Docker or Podman
12
13## Download Gordon
14
15### From GitHub Releases
16
17**Linux (x86_64)**
18```bash
19wget https://github.com/bnema/gordon/releases/latest/download/gordon_linux_amd64.tar.gz
20tar -xzf gordon_linux_amd64.tar.gz
21chmod +x gordon
22sudo mv gordon /usr/local/bin/
23```
24
25**Linux (ARM64)** - for Raspberry Pi 4, AWS Graviton, Oracle Ampere, etc.
26```bash
27wget https://github.com/bnema/gordon/releases/latest/download/gordon_linux_arm64.tar.gz
28tar -xzf gordon_linux_arm64.tar.gz
29chmod +x gordon
30sudo mv gordon /usr/local/bin/
31```
32
33**macOS (Apple Silicon)**
34```bash
35curl -LO https://github.com/bnema/gordon/releases/latest/download/gordon_darwin_arm64.tar.gz
36tar -xzf gordon_darwin_arm64.tar.gz
37chmod +x gordon
38sudo mv gordon /usr/local/bin/
39```
40
41**macOS (Intel)**
42```bash
43curl -LO https://github.com/bnema/gordon/releases/latest/download/gordon_darwin_amd64.tar.gz
44tar -xzf gordon_darwin_amd64.tar.gz
45chmod +x gordon
46sudo mv gordon /usr/local/bin/
47```
48
49Verify installation:
50```bash
51gordon version
52```
53
54### From Source
55
56```bash
57# Requires Go 1.21+
58git clone https://github.com/bnema/gordon.git
59cd gordon
60make build
61sudo mv gordon /usr/local/bin/
62```
63
64## Container Runtime Setup
65
66### Docker
67
68```bash
69# Install Docker
70curl -fsSL https://get.docker.com | sh
71
72# Add user to docker group
73sudo usermod -aG docker $USER
74newgrp docker
75
76# Verify
77docker run hello-world
78```
79
80### Podman (Rootless)
81
82Podman rootless mode provides enhanced security by running containers without root privileges.
83
84```bash
85# Install Podman
86sudo apt update
87sudo apt install -y podman
88
89# Enable user namespaces
90echo 'user.max_user_namespaces=28633' | sudo tee -a /etc/sysctl.conf
91sudo sysctl -p
92
93# Setup subuid/subgid
94sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 $USER
95
96# Enable Podman socket
97systemctl --user enable --now podman.socket
98
99# Configure insecure localhost registry
100mkdir -p ~/.config/containers
101cat > ~/.config/containers/registries.conf <<EOF
102[registries.insecure]
103registries = ['localhost:5000']
104EOF
105```
106
107## Firewall Configuration
108
109Gordon needs ports accessible for the registry and proxy.
110
111### Using firewalld
112
113```bash
114# Install and enable firewalld
115sudo apt install -y firewalld
116sudo systemctl enable --now firewalld
117
118# Allow HTTP/HTTPS
119sudo firewall-cmd --permanent --add-service=http
120sudo firewall-cmd --permanent --add-service=https
121
122# For rootless containers, redirect privileged ports
123sudo firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toport=8080
124sudo firewall-cmd --permanent --add-forward-port=port=443:proto=tcp:toport=8443
125
126# Apply changes
127sudo firewall-cmd --reload
128
129# Verify
130sudo firewall-cmd --list-all
131```
132
133### Using ufw
134
135```bash
136sudo ufw allow 80/tcp
137sudo ufw allow 443/tcp
138sudo ufw allow 5000/tcp  # Registry port (if accessing directly)
139sudo ufw enable
140```
141
142## Configuration
143
144Gordon creates a default configuration on first run:
145
146```bash
147# Run once to generate config, then stop
148gordon start
149# Press Ctrl+C
150
151# Edit configuration
152nano ~/.config/gordon/gordon.toml
153```
154
155Minimum required configuration:
156
157```toml
158[server]
159port = 8080
160registry_port = 5000
161registry_domain = "registry.yourdomain.com"
162
163[routes]
164"app.yourdomain.com" = "myapp:latest"
165```
166
167See [Configuration Reference](./config/index.md) for all options.
168
169## Systemd Service
170
171### User Service (Recommended for Rootless)
172
173```bash
174mkdir -p ~/.config/systemd/user
175cat > ~/.config/systemd/user/gordon.service <<EOF
176[Unit]
177Description=Gordon Container Platform
178After=podman.socket
179
180[Service]
181Type=simple
182Restart=always
183RestartSec=5
184ExecStart=/usr/local/bin/gordon start
185
186[Install]
187WantedBy=default.target
188EOF
189
190# Enable and start
191systemctl --user daemon-reload
192systemctl --user enable --now gordon
193
194# Enable linger (keep service running after logout)
195sudo loginctl enable-linger $USER
196
197# Check status
198systemctl --user status gordon
199```
200
201### System Service (Root Mode)
202
203```bash
204sudo cat > /etc/systemd/system/gordon.service <<EOF
205[Unit]
206Description=Gordon Container Platform
207After=docker.service
208Requires=docker.service
209
210[Service]
211Type=simple
212Restart=always
213RestartSec=5
214ExecStart=/usr/local/bin/gordon start
215User=root
216
217[Install]
218WantedBy=multi-user.target
219EOF
220
221sudo systemctl daemon-reload
222sudo systemctl enable --now gordon
223```
224
225## DNS Configuration
226
227Point your domains to your server:
228
229| Type | Name | Content | Proxy |
230|------|------|---------|-------|
231| A | `app` | `SERVER_IP` | Yes (Cloudflare) |
232| A | `registry` | `SERVER_IP` | Yes (Cloudflare) |
233
234> **Note:** Enable Cloudflare proxy (orange cloud) for automatic HTTPS. Gordon receives HTTP traffic from Cloudflare.
235
236## Verify Installation
237
238```bash
239# Check Gordon is running
240systemctl --user status gordon
241
242# View logs
243journalctl --user -u gordon -f
244
245# Test registry (from local machine)
246docker login registry.yourdomain.com
247docker pull alpine
248docker tag alpine registry.yourdomain.com/test:latest
249docker push registry.yourdomain.com/test:latest
250```
251
252## Data Directories
253
254Gordon stores data in the following locations:
255
256| Path | Purpose |
257|------|---------|
258| `~/.config/gordon/gordon.toml` | Configuration file |
259| `~/.gordon/` | Default data directory |
260| `~/.gordon/registry/` | Container images |
261| `~/.gordon/env/` | Environment files |
262| `~/.gordon/logs/` | Application logs |
263| `~/.gordon/secrets/` | Secrets (unsafe backend only) |
264
265## Related
266
267- [Getting Started](./getting-started.md)
268- [Configuration Reference](./config/index.md)
269- [Podman Rootless Setup](/wiki/guides/podman-rootless.md)

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