[doc-staleness] Netgrimoire/Gremlin/Gremlin_Directives.md :: Environment Files #9

Closed
opened 2026-06-19 08:07:12 -05:00 by traveler · 0 comments
Owner

Doc Staleness Report

File: Netgrimoire/Gremlin/Gremlin_Directives.md
Section: Environment Files
Source: manual
Run ID: 20260619-130649-docflag-sec2

What changed:
For Swarm engine, current CI/CD v3 (pipelineVersion v3.2026-06-16-1139) node order is Secrets Sync -> Deploy -> ... -> Env Sync, so Env Sync running after Deploy cannot block that deploy. The substitution responsibility for environment/.env on Swarm appears to already be covered by Secrets Sync (which runs pre-Deploy and auto-detects both secrets/ and environment/.env with no directive required). The 'Blocks deploy if env file missing' claim does not match this for Swarm; it may still hold for Compose/Pocket where Env Sync writes a real file to the host.


Gemini Draft

Lines changed: 371 / 91% change rate ⚠️ HIGH CHANGE RATE — review carefully

---
---
title: Gremlin CI/CD Directives
description: Gremlin Cheatsheet
published: true
date: 2026-05-26T21:12:58.452Z
tags: 
editor: markdown
dateCreated: 2026-05-06T21:12:26.442Z
---

# Gremlin Directives — Complete Reference

> Pipeline version: v3.2026-05-26-2101  
> Wiki path: `NetGrimoire → Automation & AI → Gremlin → Directives Reference`

---

## Quick Reference

# ── Required on every service ──────────────────────────────
gremlin.version: "2026-05-17"         # auto-stamped if missing
diun.enable: "true"                   # image update monitoring

# ── Identity ───────────────────────────────────────────────
# Option A — LinuxServer/homelab images
PUID: "1964"
PGID: "1964"
# Option B — Official Docker Hub images
user: "1964:1964"                     # at service level, not labels
# Option C — Root-required images
gremlin.uid.exempt: "true"
gremlin.uid.reason: "reason here"

# ── Caddy ──────────────────────────────────────────────────
caddy: myapp.netgrimoire.com
caddy.import_1: crowdsec
caddy.import_2: authentik             # or: authelia | (omit with gremlin.auth: none)
caddy.reverse_proxy: myapp:8080

# ── Homepage ───────────────────────────────────────────────
homepage.group: My Group
homepage.name: My App
homepage.icon: myapp.png
homepage.href: https://myapp.netgrimoire.com
homepage.description: My application

# ── Monitor (Gatus) ────────────────────────────────────────
monitor.name: My App
monitor.url: http://myapp:8080        # http:// for internal, bare host:port → tcp://

# ── Flame (Pocket only) ────────────────────────────────────
flame.type: app
flame.name: "myapp"
flame.url: "http://myapp.pocket.lan:8080"

---

## All Directives

### Pipeline Control

| Directive | Values | Default | Description |
|---|---|---|---|
| `gremlin.version` | `YYYY-MM-D` | auto-stamped | Pipeline version stamp |
| `gremlin.enable` | `true/false` | `true` | Skip file entirely if false |
| `gremlin.deploy` | `true/false` | `true` | Run checks but skip deploy |
| `gremlin.autofix` | `true/false` | `true` | Enable auto-fix |
| `gremlin.autofix.skip` | `true/false` | `false` | Prevent auto-fixing this file |
| `gremlin.autofix.skip_fields` | comma list | — | Skip autofix for specific fields |
| `gremlin.checks` | comma list\|`all` | `all` | Run only these checks |
| `gremlin.checks.skip` | comma list | — | Skip these checks |
| `gremlin.notify` | `true/false` | `true` | Suppress ntfy notifications |
| `gremlin.notify.level` | `all/fail/none` | `all` | Notification verbosity |
| `gremlin.context` | string | — | Context passed to Ollama audit |
| `gremlin.manifest.type` | `swarm/compose/pocket` | auto | Override file type detection |
| `gremlin.deploy.strategy` | `stack/compose` | auto | Deploy method |
| `gremlin.deploy.target` | hostname | auto | Override target node |

---

### Identity

| Directive | Values | Description |
|---|---|---|
| `gremlin.uid.exempt` | `true` | Skip UID/GID check |
| `gremlin.uid.reason` | string | **Required** when uid.exempt: true |

---

### Skip Flags

| Directive | Description |
|---|---|
| `gremlin.caddy.skip` | Skip all Caddy label checks |
| `gremlin.caddy.reverse_proxy.skip` | Skip caddy.reverse_proxy check only |
| `gremlin.homepage.skip` | Skip Homepage label checks |
| `gremlin.monitor.skip` | Skip monitor label checks |
| `gremlin.network.skip` | Skip network checks |
| `gremlin.diun.skip` | Skip diun.enable check |
| `gremlin.flame.skip` | Skip flame label checks (Pocket only) |

---

### Placement (Swarm Only)

| Directive | Description |
|---|---|
| `gremlin.arm.allow` | Allow ARM deployment (removes ARM exclusion constraints) |
| `gremlin.port` | Port hint for auto-deriving caddy.reverse_proxy |

---

### Auth Provider

| Directive | Caddyfile Result |
|---|---|
| *(not set)* | `import authentik` |
| `gremlin.auth: authentik` | `import authentik` |
| `gremlin.auth: authelia` | `import authelia` |
| `gremlin.auth: none` | *(no import_2)* |
| `gremlin.authentik.skip: "true"` | *(legacy — use `gremlin.auth: none`)* |

---

### Caddy Labels

| Label | Required | Description |
|---|---|---|
| `caddy` | Yes | Hostname. No `https://`. Comma-separated for multi-domain |
| `caddy.import_1` | Yes | Always `crowdsec` |
| `caddy.import_2` | Conditional | `authentik` or `authelia` (set by `gremlin.auth`) |
| `caddy.reverse_proxy` | Yes | `servicename:PORT` |

---

### Homepage Labels

| Label | Required | Description |
|---|---|---|
| `homepage.group` | Yes | Tab/group name |
| `homepage.name` | Yes | Display name |
| `homepage.icon` | Yes | Icon filename |
| `homepage.href` | Yes | URL — must use `https://` |
| `homepage.description` | Yes | Short description |
| `homepage.widget.type` | No | Widget type |
| `homepage.widget.url` | No | Widget API URL |
| `homepage.widget.key` | No | Widget API key |

---

### Monitor Labels

| Label | Required | Description |
|---|---|---|
| `monitor.name` | Yes | Display name in Gatus |
| `monitor.url` | Yes | `http://` for internal. Bare `host:port``tcp://` |
| `monitor.type` | No | `http` (default) or `tcp` |
| `monitor.interval` | No | Seconds (default: 60) |

---

### Flame Labels (Pocket Only)

| Label | Required | Description |
|---|---|---|
| `flame.type` | Yes | Always `app` |
| `flame.name` | Yes | Display name |
| `flame.url` | Yes | `http://<service>.pocket.lan:<port>` |

---

### Secrets

```yaml
gremlin.secrets: "true"

File: secrets/<stackname>.yaml in traveler/services

db_password: mysecretpassword
api_key: abc123

Stack declaration:

secrets:
  db_password:
    external: true   # Swarm
    # Gremlin rewrites to file: path for Compose/Pocket

services:
  myapp:
    secrets:
      - db_password
    environment:
      DB_PASSWORD_FILE: /run/secrets/db_password
Engine Behavior
Swarm Recreates Docker secrets on every deploy (brief downtime)
Compose/Pocket Writes to /opt/grimoire/secrets/<stackname>/<key>.txt
All Also writes to host filesystem for backup script access

Blocks deploy if secrets file missing or any declared key absent.


Environment Files

gremlin.env: "true"

File: environment/<stackname>.env in traveler/services

SB_USER=username:password
API_KEY=mytoken123

Stack usage:

environment:
  SB_USER: ${SB_USER}
  API_KEY: ${API_KEY}
Engine Behavior
Swarm Variables are substituted in-memory by the Secrets Sync step before deploy. The environment/<stackname>.env file is auto-detected and processed by Secrets Sync.
Compose/Pocket File written to /opt/grimoire/env/<stackname>.env, passed via --env-file

For Swarm, Secrets Sync blocks deploy if the environment file is missing or unreadable. For Compose/Pocket, Env Sync blocks deploy if the file is missing.


Backup

Directive Default Description
gremlin.backup.enable false Required opt-in
gremlin.backup.cron 0 2 * * * Cron schedule
gremlin.backup.path auto Extra paths — comma-separated
gremlin.backup.script Pre-backup script. Name only → /opt/grimoire/scripts/backup/. Full path → used as-is
gremlin.backup.db sqlite | postgres | mysql | mariadb
gremlin.backup.db.name Database name
gremlin.backup.db.user postgres Database user
gremlin.backup.db.password Secret key name for password (reads from host secrets dir)
gremlin.backup.db.path SQLite: path inside container
gremlin.backup.db.container auto Override container name

Volume auto-detection:

  • /DockerVol/ — always included
  • /data/nfs/znas/Docker/<stackname> — included
  • /data/nfs/ (other paths) — excluded
  • /etc/, /var/run/ — excluded
  • :ro mounts — excluded

Script path resolution:

  • mailcow-pre.sh/opt/grimoire/scripts/backup/mailcow-pre.sh
  • /opt/mailcow/backup.sh/opt/mailcow/backup.sh

Scripts

Numbered directives support multiple scripts per service:

Directive Description
gremlin.script.N.name Filename in traveler/scripts — fetched and deployed
gremlin.script.N.path Full path on host — already exists, just set up cron
gremlin.script.N.cron Cron schedule — added to gremlin's crontab
gremlin.script.N.run Interpreter prefix (e.g. python3, bash)
gremlin.script.N.branch Branch in traveler/scripts (default: deploy branch)

name only (no path separator) → deployed to /opt/grimoire/scripts/
path with slashes → used as-is


Service File Directives (gremlin/*.yaml)

Directive Required Description
gremlin.name Yes Display name
gremlin.host Yes IP or hostname
gremlin.port Yes Port
gremlin.desc No Description
gremlin.group No Homepage group (default: Services)
gremlin.icon No Icon filename
gremlin.protocol No http or https (default: https)
gremlin.auth No authentik | authelia | none
gremlin.caddy.skip No Skip Caddy
gremlin.monitor.skip No Skip Gatus
gremlin.backup.enable No Enable backup
gremlin.backup.path No Comma-separated paths
gremlin.backup.cron No Schedule
gremlin.backup.script No Pre-backup script

All caddy.*, homepage.*, monitor.* overrides also work in service files.


Commit Directives

Override any directive in the commit message — highest priority:

[gremlin: deploy=false]
[gremlin: autofix=false checks.skip=caddy,homepage]
[gremlin: notify=false]

Gremlin Config File

gremlin/config.yaml in traveler/services — pipeline-wide defaults:

version: "2026-05-17"
deploy: true
autofix: true
ollama_model: "qwen2.5-coder:14b"
ollama_audit_model: "gemma3:4b"
ntfy_alerts_topic: "gremlin-alerts"
ntfy_monitor_topic: "gremlin-watch"
ssh_key_path: "/home/gremlin/.ssh/id_ed25519"
repo_path: "/home/gremlin/services"
forgejo_owner: "traveler"
forgejo_repo: "services"
gatus_config_path: "/DockerVol/gatus/config/config.yaml"
caddy_file_path: "swarm/stack/caddy/Caddyfile"
caddy_static_path: "/export/Docker/caddy/Caddyfile"
maintenance: false
maintenance_message: "Gremlin is in maintenance mode"

Pocket overrides in gremlin/config.yaml in traveler/pocket:

ntfy_alerts_topic: "gremlin-pocket"
ntfy_monitor_topic: "gremlin-pocket"
repo_path: "/pocket/green/services/stacks"
forgejo_repo: "pocket"
pocket_pi_ip: "192.168.8.100"

Directory Structure Reference

traveler/services/
  swarm/                          # Swarm stacks
  compose/<node>/                 # Compose stacks per node
  gremlin/                        # Service definitions + config
    config.yaml
    opnsense.yaml
    znas.yaml
  secrets/                        # Secret files
    myapp.yaml
    silverbullet.yaml
  environment/                    # Env files
    myapp.env
    silverbullet.env

traveler/pocket/                  # Pocket stacks
  pocketstash.yaml
  flame.yaml
  gremlin/
    config.yaml

traveler/scripts/                 # Shared scripts
  sync-calendar.py
  cleanup.sh

traveler/homepage/                # Homepage config
  config/
    services.yaml

traveler/Netgrimoire/             # Deploy logs
  Logs/
    myapp.md

Host Directory Structure

/opt/grimoire/
  scripts/
    gremlin-backup.sh             # managed by Gremlin
    backup/                       # pre-backup scripts default location
  secrets/
    <stackname>/
      db_password.txt
      api_key.txt
  env/
    <stackname>.env

/var/log/
  gremlin-backup.log
  gremlin-scripts.log
## Doc Staleness Report **File:** `Netgrimoire/Gremlin/Gremlin_Directives.md` **Section:** `Environment Files` **Source:** `manual` **Run ID:** `20260619-130649-docflag-sec2` **What changed:** For Swarm engine, current CI/CD v3 (pipelineVersion v3.2026-06-16-1139) node order is Secrets Sync -> Deploy -> ... -> Env Sync, so Env Sync running after Deploy cannot block that deploy. The substitution responsibility for environment/<stackname>.env on Swarm appears to already be covered by Secrets Sync (which runs pre-Deploy and auto-detects both secrets/<stackname> and environment/<stackname>.env with no directive required). The 'Blocks deploy if env file missing' claim does not match this for Swarm; it may still hold for Compose/Pocket where Env Sync writes a real file to the host. --- ## Gemini Draft > Lines changed: 371 / 91% change rate ⚠️ HIGH CHANGE RATE — review carefully ```markdown --- --- title: Gremlin CI/CD Directives description: Gremlin Cheatsheet published: true date: 2026-05-26T21:12:58.452Z tags: editor: markdown dateCreated: 2026-05-06T21:12:26.442Z --- # Gremlin Directives — Complete Reference > Pipeline version: v3.2026-05-26-2101 > Wiki path: `NetGrimoire → Automation & AI → Gremlin → Directives Reference` --- ## Quick Reference # ── Required on every service ────────────────────────────── gremlin.version: "2026-05-17" # auto-stamped if missing diun.enable: "true" # image update monitoring # ── Identity ─────────────────────────────────────────────── # Option A — LinuxServer/homelab images PUID: "1964" PGID: "1964" # Option B — Official Docker Hub images user: "1964:1964" # at service level, not labels # Option C — Root-required images gremlin.uid.exempt: "true" gremlin.uid.reason: "reason here" # ── Caddy ────────────────────────────────────────────────── caddy: myapp.netgrimoire.com caddy.import_1: crowdsec caddy.import_2: authentik # or: authelia | (omit with gremlin.auth: none) caddy.reverse_proxy: myapp:8080 # ── Homepage ─────────────────────────────────────────────── homepage.group: My Group homepage.name: My App homepage.icon: myapp.png homepage.href: https://myapp.netgrimoire.com homepage.description: My application # ── Monitor (Gatus) ──────────────────────────────────────── monitor.name: My App monitor.url: http://myapp:8080 # http:// for internal, bare host:port → tcp:// # ── Flame (Pocket only) ──────────────────────────────────── flame.type: app flame.name: "myapp" flame.url: "http://myapp.pocket.lan:8080" --- ## All Directives ### Pipeline Control | Directive | Values | Default | Description | |---|---|---|---| | `gremlin.version` | `YYYY-MM-D` | auto-stamped | Pipeline version stamp | | `gremlin.enable` | `true/false` | `true` | Skip file entirely if false | | `gremlin.deploy` | `true/false` | `true` | Run checks but skip deploy | | `gremlin.autofix` | `true/false` | `true` | Enable auto-fix | | `gremlin.autofix.skip` | `true/false` | `false` | Prevent auto-fixing this file | | `gremlin.autofix.skip_fields` | comma list | — | Skip autofix for specific fields | | `gremlin.checks` | comma list\|`all` | `all` | Run only these checks | | `gremlin.checks.skip` | comma list | — | Skip these checks | | `gremlin.notify` | `true/false` | `true` | Suppress ntfy notifications | | `gremlin.notify.level` | `all/fail/none` | `all` | Notification verbosity | | `gremlin.context` | string | — | Context passed to Ollama audit | | `gremlin.manifest.type` | `swarm/compose/pocket` | auto | Override file type detection | | `gremlin.deploy.strategy` | `stack/compose` | auto | Deploy method | | `gremlin.deploy.target` | hostname | auto | Override target node | --- ### Identity | Directive | Values | Description | |---|---|---| | `gremlin.uid.exempt` | `true` | Skip UID/GID check | | `gremlin.uid.reason` | string | **Required** when uid.exempt: true | --- ### Skip Flags | Directive | Description | |---|---| | `gremlin.caddy.skip` | Skip all Caddy label checks | | `gremlin.caddy.reverse_proxy.skip` | Skip caddy.reverse_proxy check only | | `gremlin.homepage.skip` | Skip Homepage label checks | | `gremlin.monitor.skip` | Skip monitor label checks | | `gremlin.network.skip` | Skip network checks | | `gremlin.diun.skip` | Skip diun.enable check | | `gremlin.flame.skip` | Skip flame label checks (Pocket only) | --- ### Placement (Swarm Only) | Directive | Description | |---|---| | `gremlin.arm.allow` | Allow ARM deployment (removes ARM exclusion constraints) | | `gremlin.port` | Port hint for auto-deriving caddy.reverse_proxy | --- ### Auth Provider | Directive | Caddyfile Result | |---|---| | *(not set)* | `import authentik` | | `gremlin.auth: authentik` | `import authentik` | | `gremlin.auth: authelia` | `import authelia` | | `gremlin.auth: none` | *(no import_2)* | | `gremlin.authentik.skip: "true"` | *(legacy — use `gremlin.auth: none`)* | --- ### Caddy Labels | Label | Required | Description | |---|---|---| | `caddy` | Yes | Hostname. No `https://`. Comma-separated for multi-domain | | `caddy.import_1` | Yes | Always `crowdsec` | | `caddy.import_2` | Conditional | `authentik` or `authelia` (set by `gremlin.auth`) | | `caddy.reverse_proxy` | Yes | `servicename:PORT` | --- ### Homepage Labels | Label | Required | Description | |---|---|---| | `homepage.group` | Yes | Tab/group name | | `homepage.name` | Yes | Display name | | `homepage.icon` | Yes | Icon filename | | `homepage.href` | Yes | URL — must use `https://` | | `homepage.description` | Yes | Short description | | `homepage.widget.type` | No | Widget type | | `homepage.widget.url` | No | Widget API URL | | `homepage.widget.key` | No | Widget API key | --- ### Monitor Labels | Label | Required | Description | |---|---|---| | `monitor.name` | Yes | Display name in Gatus | | `monitor.url` | Yes | `http://` for internal. Bare `host:port` → `tcp://` | | `monitor.type` | No | `http` (default) or `tcp` | | `monitor.interval` | No | Seconds (default: 60) | --- ### Flame Labels (Pocket Only) | Label | Required | Description | |---|---|---| | `flame.type` | Yes | Always `app` | | `flame.name` | Yes | Display name | | `flame.url` | Yes | `http://<service>.pocket.lan:<port>` | --- ### Secrets ```yaml gremlin.secrets: "true" ``` **File:** `secrets/<stackname>.yaml` in `traveler/services` ```yaml db_password: mysecretpassword api_key: abc123 ``` **Stack declaration:** ```yaml secrets: db_password: external: true # Swarm # Gremlin rewrites to file: path for Compose/Pocket services: myapp: secrets: - db_password environment: DB_PASSWORD_FILE: /run/secrets/db_password ``` | Engine | Behavior | |---|---| | Swarm | Recreates Docker secrets on every deploy (brief downtime) | | Compose/Pocket | Writes to `/opt/grimoire/secrets/<stackname>/<key>.txt` | | All | Also writes to host filesystem for backup script access | Blocks deploy if secrets file missing or any declared key absent. --- ### Environment Files ```yaml gremlin.env: "true" ``` **File:** `environment/<stackname>.env` in `traveler/services` ```bash SB_USER=username:password API_KEY=mytoken123 ``` **Stack usage:** ```yaml environment: SB_USER: ${SB_USER} API_KEY: ${API_KEY} ``` | Engine | Behavior | |---|---| | Swarm | Variables are substituted in-memory by the `Secrets Sync` step *before* deploy. The `environment/<stackname>.env` file is auto-detected and processed by `Secrets Sync`. | | Compose/Pocket | File written to `/opt/grimoire/env/<stackname>.env`, passed via `--env-file` | For Swarm, `Secrets Sync` blocks deploy if the environment file is missing or unreadable. For Compose/Pocket, `Env Sync` blocks deploy if the file is missing. --- ### Backup | Directive | Default | Description | |---|---|---| | `gremlin.backup.enable` | `false` | **Required** opt-in | | `gremlin.backup.cron` | `0 2 * * *` | Cron schedule | | `gremlin.backup.path` | auto | Extra paths — comma-separated | | `gremlin.backup.script` | — | Pre-backup script. Name only → `/opt/grimoire/scripts/backup/`. Full path → used as-is | | `gremlin.backup.db` | — | `sqlite` \| `postgres` \| `mysql` \| `mariadb` | | `gremlin.backup.db.name` | — | Database name | | `gremlin.backup.db.user` | `postgres` | Database user | | `gremlin.backup.db.password` | — | Secret key name for password (reads from host secrets dir) | | `gremlin.backup.db.path` | — | SQLite: path inside container | | `gremlin.backup.db.container` | auto | Override container name | **Volume auto-detection:** - ✅ `/DockerVol/` — always included - ✅ `/data/nfs/znas/Docker/<stackname>` — included - ❌ `/data/nfs/` (other paths) — excluded - ❌ `/etc/`, `/var/run/` — excluded - ❌ `:ro` mounts — excluded **Script path resolution:** - `mailcow-pre.sh` → `/opt/grimoire/scripts/backup/mailcow-pre.sh` - `/opt/mailcow/backup.sh` → `/opt/mailcow/backup.sh` --- ### Scripts Numbered directives support multiple scripts per service: | Directive | Description | |---|---| | `gremlin.script.N.name` | Filename in `traveler/scripts` — fetched and deployed | | `gremlin.script.N.path` | Full path on host — already exists, just set up cron | | `gremlin.script.N.cron` | Cron schedule — added to gremlin's crontab | | `gremlin.script.N.run` | Interpreter prefix (e.g. `python3`, `bash`) | | `gremlin.script.N.branch` | Branch in `traveler/scripts` (default: deploy branch) | `name` only (no path separator) → deployed to `/opt/grimoire/scripts/` `path` with slashes → used as-is --- ### Service File Directives (`gremlin/*.yaml`) | Directive | Required | Description | |---|---|---| | `gremlin.name` | Yes | Display name | | `gremlin.host` | Yes | IP or hostname | | `gremlin.port` | Yes | Port | | `gremlin.desc` | No | Description | | `gremlin.group` | No | Homepage group (default: `Services`) | | `gremlin.icon` | No | Icon filename | | `gremlin.protocol` | No | `http` or `https` (default: `https`) | | `gremlin.auth` | No | `authentik` \| `authelia` \| `none` | | `gremlin.caddy.skip` | No | Skip Caddy | | `gremlin.monitor.skip` | No | Skip Gatus | | `gremlin.backup.enable` | No | Enable backup | | `gremlin.backup.path` | No | Comma-separated paths | | `gremlin.backup.cron` | No | Schedule | | `gremlin.backup.script` | No | Pre-backup script | All `caddy.*`, `homepage.*`, `monitor.*` overrides also work in service files. --- ### Commit Directives Override any directive in the commit message — highest priority: ``` [gremlin: deploy=false] [gremlin: autofix=false checks.skip=caddy,homepage] [gremlin: notify=false] ``` --- ## Gremlin Config File `gremlin/config.yaml` in `traveler/services` — pipeline-wide defaults: ```yaml version: "2026-05-17" deploy: true autofix: true ollama_model: "qwen2.5-coder:14b" ollama_audit_model: "gemma3:4b" ntfy_alerts_topic: "gremlin-alerts" ntfy_monitor_topic: "gremlin-watch" ssh_key_path: "/home/gremlin/.ssh/id_ed25519" repo_path: "/home/gremlin/services" forgejo_owner: "traveler" forgejo_repo: "services" gatus_config_path: "/DockerVol/gatus/config/config.yaml" caddy_file_path: "swarm/stack/caddy/Caddyfile" caddy_static_path: "/export/Docker/caddy/Caddyfile" maintenance: false maintenance_message: "Gremlin is in maintenance mode" ``` Pocket overrides in `gremlin/config.yaml` in `traveler/pocket`: ```yaml ntfy_alerts_topic: "gremlin-pocket" ntfy_monitor_topic: "gremlin-pocket" repo_path: "/pocket/green/services/stacks" forgejo_repo: "pocket" pocket_pi_ip: "192.168.8.100" ``` --- ## Directory Structure Reference ``` traveler/services/ swarm/ # Swarm stacks compose/<node>/ # Compose stacks per node gremlin/ # Service definitions + config config.yaml opnsense.yaml znas.yaml secrets/ # Secret files myapp.yaml silverbullet.yaml environment/ # Env files myapp.env silverbullet.env traveler/pocket/ # Pocket stacks pocketstash.yaml flame.yaml gremlin/ config.yaml traveler/scripts/ # Shared scripts sync-calendar.py cleanup.sh traveler/homepage/ # Homepage config config/ services.yaml traveler/Netgrimoire/ # Deploy logs Logs/ myapp.md ``` --- ## Host Directory Structure ``` /opt/grimoire/ scripts/ gremlin-backup.sh # managed by Gremlin backup/ # pre-backup scripts default location secrets/ <stackname>/ db_password.txt api_key.txt env/ <stackname>.env /var/log/ gremlin-backup.log gremlin-scripts.log ``` ```
Sign in to join this conversation.
No labels
doc-staleness
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
traveler/Netgrimoire#9
No description provided.