v3.1.0 d676137

secrets.md RawHistoryFolder

Secrets Configuration

Configure how Gordon stores and retrieves sensitive data: auth secrets such as token_secret (this page) and app secret values (managed with gordon apps secrets, values in pass under gordon/apps/<uuid>/<service>/<name>).

Configuration

The secrets backend is configured within the [auth] section:

[auth]
secrets_backend = "pass"  # "pass", "sops", or "unsafe"

Options

Option Type Default Description
secrets_backend string "unsafe" Secrets storage backend

Backends

Uses the Unix password manager (pass) for secure secret storage:

[auth]
secrets_backend = "pass"

Setup:

# Install pass
sudo apt install pass

# Initialize with GPG key
pass init your-gpg-key-id

# Store secrets
pass insert gordon/auth/token_secret

Usage in config:

[auth]
token_secret = "gordon/auth/token_secret"  # Path in pass store

Benefits:

  • GPG-encrypted storage
  • Version control friendly (encrypted files)
  • Standard Unix tooling
  • Works with team GPG keys

SOPS

Uses Mozilla SOPS for encrypted file-based secrets:

[auth]
secrets_backend = "sops"

Setup:

# Install sops
brew install sops  # macOS
# or download from https://github.com/getsops/sops/releases

# Create encrypted secrets file
sops secrets.yaml

Benefits:

  • Multiple encryption backends (AWS KMS, GCP KMS, Azure Key Vault, PGP)
  • YAML/JSON file encryption
  • Git-friendly (encrypted files in repo)

Security:

  • Absolute paths are rejected to prevent arbitrary file access
  • Path traversal (..) is blocked
  • Only relative paths from your config directory are allowed

Unsafe (Development Only)

Stores secrets as plain text files:

[auth]
secrets_backend = "unsafe"

Storage location:

{data_dir}/secrets/
├── gordon/
│   └── auth/
│       └── token_secret

Usage:

# Create secret
mkdir -p ~/.gordon/secrets/gordon/auth
echo "your-token-secret" > ~/.gordon/secrets/gordon/auth/token_secret

Warning: Only use for local development. Secrets are stored in plain text.

App Secret Values

App secret names are registered in the app manifest ([services.<name>.secrets] maps ENV name to secret name); values are written separately and stay in pass:

gordon apps secrets set blog --service web DATABASE_URL=...

Values affect the next deploy/restart, never running containers. Only key names are ever echoed back, never values. See App Manifest and Apps CLI.

Examples

Production with Pass

[auth]
enabled = true
secrets_backend = "pass"
token_secret = "gordon/auth/token_secret"
# Setup
pass insert gordon/auth/token_secret
# Enter a random 32+ character string

# Generate tokens
gordon auth token generate --subject deploy --expiry 0

Development with Unsafe

[auth]
enabled = false
secrets_backend = "unsafe"

Security Recommendations

  1. Production: Always use pass or sops backend
  2. Never commit: Don't commit unencrypted secrets to git (app files must never contain secret values)
  3. Rotate regularly: Regenerate tokens and passwords periodically
  4. Least privilege: Use separate secrets per environment
  5. Path validation: SOPS provider rejects absolute paths and path traversal attempts for security
source
1# Secrets Configuration
2
3Configure how Gordon stores and retrieves sensitive data: auth secrets such as `token_secret` (this page) and app secret values (managed with `gordon apps secrets`, values in pass under `gordon/apps/<uuid>/<service>/<name>`).
4
5## Configuration
6
7The secrets backend is configured within the `[auth]` section:
8
9```toml
10[auth]
11secrets_backend = "pass"  # "pass", "sops", or "unsafe"
12```
13
14## Options
15
16| Option | Type | Default | Description |
17|--------|------|---------|-------------|
18| `secrets_backend` | string | `"unsafe"` | Secrets storage backend |
19
20## Backends
21
22### Pass (Recommended for Production)
23
24Uses the Unix password manager (`pass`) for secure secret storage:
25
26```toml
27[auth]
28secrets_backend = "pass"
29```
30
31**Setup:**
32```bash
33# Install pass
34sudo apt install pass
35
36# Initialize with GPG key
37pass init your-gpg-key-id
38
39# Store secrets
40pass insert gordon/auth/token_secret
41```
42
43**Usage in config:**
44```toml
45[auth]
46token_secret = "gordon/auth/token_secret"  # Path in pass store
47```
48
49**Benefits:**
50- GPG-encrypted storage
51- Version control friendly (encrypted files)
52- Standard Unix tooling
53- Works with team GPG keys
54
55### SOPS
56
57Uses Mozilla SOPS for encrypted file-based secrets:
58
59```toml
60[auth]
61secrets_backend = "sops"
62```
63
64**Setup:**
65```bash
66# Install sops
67brew install sops  # macOS
68# or download from https://github.com/getsops/sops/releases
69
70# Create encrypted secrets file
71sops secrets.yaml
72```
73
74**Benefits:**
75- Multiple encryption backends (AWS KMS, GCP KMS, Azure Key Vault, PGP)
76- YAML/JSON file encryption
77- Git-friendly (encrypted files in repo)
78
79**Security:**
80- Absolute paths are rejected to prevent arbitrary file access
81- Path traversal (`..`) is blocked
82- Only relative paths from your config directory are allowed
83
84### Unsafe (Development Only)
85
86Stores secrets as plain text files:
87
88```toml
89[auth]
90secrets_backend = "unsafe"
91```
92
93**Storage location:**
94```
95{data_dir}/secrets/
96├── gordon/
97│   └── auth/
98│       └── token_secret
99```
100
101**Usage:**
102```bash
103# Create secret
104mkdir -p ~/.gordon/secrets/gordon/auth
105echo "your-token-secret" > ~/.gordon/secrets/gordon/auth/token_secret
106```
107
108> **Warning:** Only use for local development. Secrets are stored in plain text.
109
110## App Secret Values
111
112App secret names are registered in the app manifest (`[services.<name>.secrets]` maps ENV name to secret name); values are written separately and stay in pass:
113
114```bash
115gordon apps secrets set blog --service web DATABASE_URL=...
116```
117
118Values affect the next deploy/restart, never running containers. Only key names are ever echoed back, never values. See [App Manifest](./apps.md) and [Apps CLI](../cli/apps.md).
119
120## Examples
121
122### Production with Pass
123
124```toml
125[auth]
126enabled = true
127secrets_backend = "pass"
128token_secret = "gordon/auth/token_secret"
129```
130
131```bash
132# Setup
133pass insert gordon/auth/token_secret
134# Enter a random 32+ character string
135
136# Generate tokens
137gordon auth token generate --subject deploy --expiry 0
138```
139
140### Development with Unsafe
141
142```toml
143[auth]
144enabled = false
145secrets_backend = "unsafe"
146```
147
148## Security Recommendations
149
1501. **Production**: Always use `pass` or `sops` backend
1512. **Never commit**: Don't commit unencrypted secrets to git (app files must never contain secret values)
1523. **Rotate regularly**: Regenerate tokens and passwords periodically
1534. **Least privilege**: Use separate secrets per environment
1545. **Path validation**: SOPS provider rejects absolute paths and path traversal attempts for security
155
156## Related
157
158- [Authentication](./auth.md)
159- [App Manifest](./apps.md)
160- [Configuration Overview](./index.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