Appearance
Keryx / sourcectl secret store
Approved: 1 September 2026
This packet names the approved secret store and the durable evidence archive for Keryx for SafeCall (#114 OA-114-archive). Policy for what to back up lives in Android signing and iOS signing. This page is where files live and how to reach them.
#114 is closed (13 September 2026). Org / EU trader how-to: store-org-and-eu-trader.md. Apple Account Recovery remains #158. OA-114-archive is done (1 September 2026): share reachable from GLaDOS and MiniVan-3, evidence notes in evidence/keryx/, both Macs’ .p12 files in secrets/keryx/iOS/, unlock steps in nas-unlock.md.
Decision
| Choice | Value |
|---|---|
| Host | Existing Proxmox CT 500 nas (Debian, privileged), 192.168.178.213 |
| At rest | gocryptfs on /srv/sourcectl.cipher → mount /srv/sourcectl |
| Access | File Browser (LAN HTTP) and SFTP to the same mount |
| Users | File Browser users + Unix user sourcectl for SFTP |
| Network | LAN only (192.168.178.0/24). No port forward, no public DNS |
| Daily logins | Apple Passwords (unchanged) |
| Not this (now) | Vaultwarden, Docker, a new LXC/VM, vault.sourcectl.com, Samba for secrets |
Do not put .jks, .p12, .p8, or key.properties on Samba [public] or [builders]. Those shares stay for non-secret files; macOS discovery/mount failures are why secrets do not go there.
File Browser v2.63.23 is the last release; the project was archived 2026-09-01 (unmaintained). Use it only on the LAN, leave the command runner disabled, and prefer SFTP if you stop trusting the web UI later.
Honest limits: this is not travel-from-hotel access. After a NAS reboot you must unlock gocryptfs or File Browser/SFTP see an empty or missing root. A stolen disk without the gocryptfs passphrase is ciphertext.
Do not put passwords, keystores, .p12, .p8, or tokens in git, Slack, email, or ~/sourcectl/keryx-release-evidence/ (checksums only).
Layout on the unlocked mount
| Path | Contents |
|---|---|
/srv/sourcectl/secrets/keryx/android/ | upload-keystore.jks, key.properties |
/srv/sourcectl/secrets/keryx/iOS/ | Apple Distribution .p12 (GLaDOS + MiniVan); APNs .p8 when it exists |
/srv/sourcectl/secrets/keryx/ntfy/ | Host / username notes for the dual-run ntfy users (no tk_… or passwords) |
/srv/sourcectl/secrets/keryx/firebase/ | Firebase Admin SDK JSON used as ntfy firebase-key-file (never git) |
/srv/sourcectl/secrets/theseus/ | Production Theseus unlock PHC as unlock.hash (done 17 September 2026, 97 B). Passphrase in Apple Passwords, not this file |
/srv/sourcectl/secrets/theseus/ops/ | Host / username / token-label notes (token_label_notes.txt, 17 September 2026). Token value in Apple Passwords, not git |
/srv/sourcectl/secrets/theseus/android/ | Theseus upload upload-keystore.jks + key.properties (create in OA-AT-theseus-play) |
/srv/sourcectl/secrets/theseus/iOS/ | Copy of the team Apple Distribution .p12 (same bytes as secrets/keryx/iOS/keryx-apple-distribution-glados-8P59575P2K.p12; do in OA-AT-theseus-apple) |
/srv/sourcectl/secrets/ariadne/android/ | Ariadne upload upload-keystore.jks + key.properties (create in OA-AT-ariadne-play) |
/srv/sourcectl/secrets/ariadne/iOS/ | Copy of the team Apple Distribution .p12 (same bytes as secrets/keryx/iOS/keryx-apple-distribution-glados-8P59575P2K.p12; do in OA-AT-ariadne-apple) |
/srv/sourcectl/evidence/keryx/ | AAB/IPA checksum notes and filled release-record stubs (no secrets, no public-contact values) |
/srv/sourcectl/evidence/ariadne-theseus/ | Secret-free lab host / Internal-track notes (no keystores, no QR photos) |
~/sourcectl/keryx-release-evidence/ on the Macs may stay as a scratch copy.
1. FUSE on CT 500
On the Proxmox host (once):
bash
pct set 500 -features fuse=1
pct reboot 500Inside nas:
bash
apt-get update
apt-get install -y gocryptfs fuse
grep -q '^user_allow_other' /etc/fuse.conf \
|| echo user_allow_other >> /etc/fuse.conf2. Encrypted directory
Still inside nas. Passphrase is not stored on disk and not in git.
bash
mkdir -p /srv/sourcectl.cipher /srv/sourcectl
chown root:root /srv/sourcectl.cipher
gocryptfs -init /srv/sourcectl.cipher
gocryptfs -allow_other /srv/sourcectl.cipher /srv/sourcectl
groupadd --force sourcectl
mkdir -p /srv/sourcectl/secrets /srv/sourcectl/evidence
chown -R root:sourcectl /srv/sourcectl
chmod 2770 /srv/sourcectl /srv/sourcectl/secrets /srv/sourcectl/evidenceAfter every NAS reboot, follow nas-unlock.md before starting File Browser. Do not put the passphrase in a world-readable script or in git.
3. File Browser (LAN web UI)
Last planned binary: GitHub filebrowser v2.63.23 (linux-amd64-filebrowser.tar.gz + checksums file). Verify SHA-256 before install.
bash
useradd --system --home /var/lib/filebrowser --shell /usr/sbin/nologin filebrowser
usermod -aG sourcectl filebrowser
mkdir -p /var/lib/filebrowser
# copy filebrowser binary to /usr/local/bin/filebrowser
chmod 755 /usr/local/bin/filebrowser
chown -R filebrowser:filebrowser /var/lib/filebrowserInitialize config (run as root; then chown the db). Bind only the NAS LAN address. Leave exec/hooks disabled (default).
bash
filebrowser config init -d /var/lib/filebrowser/filebrowser.db
filebrowser config set -d /var/lib/filebrowser/filebrowser.db \
--address 192.168.178.213 \
--port 8080 \
--root /srv/sourcectl
filebrowser users add sourcectl PLACEHOLDER --perm.admin \
-d /var/lib/filebrowser/filebrowser.db
# replace PLACEHOLDER in the terminal only; do not record the password in git
# then change it in the web UI
chown filebrowser:filebrowser /var/lib/filebrowser/filebrowser.db/etc/systemd/system/filebrowser.service:
ini
[Unit]
Description=File Browser (LAN secret store)
After=network.target
# Start only after you have unlocked gocryptfs (see §2)
[Service]
User=filebrowser
Group=filebrowser
ExecStart=/usr/local/bin/filebrowser -d /var/lib/filebrowser/filebrowser.db
Restart=on-failure
[Install]
WantedBy=multi-user.targetbash
systemctl daemon-reload
systemctl enable filebrowser.service
systemctl start filebrowser.serviceFrom GLaDOS on LAN: http://192.168.178.213:8080 — not from the public internet. Optional nftables: accept tcp/8080 only from 192.168.178.0/24.
Add a second File Browser user without admin if MiniVan should not manage accounts.
4. SFTP fallback (Finder)
Same unlocked tree. Skip Samba.
bash
id sourcectl >/dev/null 2>&1 || useradd --home /srv/sourcectl --shell /usr/sbin/nologin sourcectl
usermod -aG sourcectl sourcectl
passwd sourcectl
# password not in git; keep 2770 group sourcectl on secrets/ and evidence/sshd snippet (/etc/ssh/sshd_config.d/sourcectl-sftp.conf):
text
Match User sourcectl
ForceCommand internal-sftp
PasswordAuthentication yes
AllowTcpForwarding no
X11Forwarding nosystemctl reload ssh. From a Mac: Finder → Go → Connect to Server → sftp://192.168.178.213 as sourcectl. This user has no shell.
If sshd already listens on 0.0.0.0, restrict with the CT firewall: SSH from LAN only (you likely already do that for nas admin).
5. What to copy now
Into secrets/:
keryx/android/upload-keystore.jks+ store password + key password + aliasupload(password in a small sidecar text file only on the share, never git)keryx/android/key.properties- GLaDOS Apple Distribution
.p12(recreate Distribution in Xcode if Keychain only shows Developer ID — that is the wrong identity) namedkeryx-apple-distribution-glados-8P59575P2K.p12plus export password - MiniVan
.p12askeryx-apple-distribution-minivan-8P59575P2K.p12 - SSH keys that must survive GLaDOS (e.g.
gitlab_sourcectl), not a zip of~/.ssh - APNs
.p8when it exists (OA-110-apns-p8)
Into evidence/: copy ~/sourcectl/keryx-release-evidence/*.txt.
Confirm git check-ignore still lists key.properties and the .jks. Never git add them.
6. Close bars
| Log row | Status (1 September 2026) |
|---|---|
| OA-114-archive | Done. Unlock: nas-unlock.md. File Browser from GLaDOS and MiniVan-3. evidence/keryx/ populated. |
| OA-110-cert-backup | Done. Both Macs’ Apple Distribution .p12 in secrets/keryx/iOS/. |
| #114 | Closed 13 September 2026. Residual Apple Account Recovery is #158. |
Later (not this phase)
A self-hosted password manager (Vaultwarden) behind vault.sourcectl.com can wait until there is a larger server and time. Do not start that LXC while Keryx signing files only need this NAS directory.