7.5 KiB
Config Generator for ntfy Docs
Context
The ntfy config page (docs/config.md) documents 60+ server configuration options across many sections. Users often struggle to assemble a working config file. An interactive config generator helps users build a server.yml, docker-compose.yml, or env vars file by answering guided questions, with real-time preview.
Files Created
| File | Purpose |
|---|---|
docs/static/js/config-generator.js |
All generator logic (vanilla JS, ~300 lines) |
docs/static/css/config-generator.css |
All generator styles (~250 lines) |
Files Modified
| File | Change |
|---|---|
docs/config.md |
Inserted ## Config generator HTML block at line 137 (before ## Database options) |
mkdocs.yml |
Added config-generator.js to extra_javascript and config-generator.css to extra_css |
UI Layout
Two-panel side-by-side layout:
- Left panel: Collapsible accordion sections with form inputs for config options
- Right panel (sticky): Tabs for
server.yml/docker-compose.yml/Environment variables, with a copy button. Updates in real-time as the user changes options. - Responsive: Stacks vertically on screens < 900px
Configuration Sections (Left Panel)
1. Basic Setup
base-url(text, placeholder:https://ntfy.example.com)listen-http(text, placeholder::80)behind-proxy(checkbox)
2. Database
- Radio: SQLite (default) vs PostgreSQL
- SQLite →
cache-file(text, placeholder:/var/cache/ntfy/cache.db) - PostgreSQL →
database-url(text, placeholder:postgres://user:pass@host:5432/ntfy)
3. Access Control
- "Enable access control" (checkbox) → shows:
auth-file(text, placeholder:/var/lib/ntfy/auth.db) — hidden if PostgreSQLauth-default-access(select:read-write,read-only,write-only,deny-all)enable-login(checkbox)enable-signup(checkbox)- Provisioned users (repeatable rows): username, password hash, role (admin/user)
- Provisioned ACLs (repeatable rows): username, topic pattern, permission (rw/ro/wo/deny)
- Provisioned tokens (repeatable rows): username, token, label
4. Attachments
- "Enable attachments" (checkbox) → shows:
attachment-cache-dir(text, placeholder:/var/cache/ntfy/attachments)attachment-file-size-limit(text, placeholder:15M)attachment-total-size-limit(text, placeholder:5G)attachment-expiry-duration(text, placeholder:3h)
5. Message Cache
cache-duration(text, placeholder:12h)
6. Web Push
- "Enable web push" (checkbox) → shows:
web-push-public-key(text)web-push-private-key(text)web-push-file(text, placeholder:/var/lib/ntfy/webpush.db) — hidden if PostgreSQLweb-push-email-address(text)
7. Email Notifications (Outgoing)
- "Enable email sending" (checkbox) → shows:
smtp-sender-addr(text, placeholder:smtp.example.com:587)smtp-sender-from(text, placeholder:ntfy@example.com)smtp-sender-user(text)smtp-sender-pass(text, type=password)
8. Email Publishing (Incoming)
- "Enable email publishing" (checkbox) → shows:
smtp-server-listen(text, placeholder::25)smtp-server-domain(text, placeholder:ntfy.example.com)smtp-server-addr-prefix(text, placeholder:ntfy-)
9. Upstream Server
- "iOS users will use this server" (checkbox) → sets
upstream-base-url: https://ntfy.sh
10. Monitoring
- "Enable Prometheus metrics" (checkbox) → sets
enable-metrics: true
JavaScript Architecture (config-generator.js)
Single vanilla JS file, no dependencies. Key structure:
-
Config definitions array (
CONFIG): Each entry haskey,env,type,def,section. This is the single source of truth for all three output formats. -
collectValues(): Reads all form inputs, returns an object of key→value, filtering out empty values. Handles repeatable rows for auth-users/access/tokens. Respects conditional visibility (skips hidden fields). -
generateServerYml(values): Outputs YAML with section comments. Provisioned users/ACLs/tokens rendered as YAML arrays. -
generateDockerCompose(values): Wraps values as env vars in Docker Compose format. Key transformations:- Uses
NTFY_prefixed env var names from config definitions - File paths adjusted for Docker via
DOCKER_PATH_MAP $doubled to$$in bcrypt hashes (with comment)- Standard boilerplate:
services:,image:,volumes:,ports:,command: serve - Provisioned users/ACLs/tokens use indexed env vars (e.g.,
NTFY_AUTH_USERS_0_USERNAME)
- Uses
-
generateEnvVars(values): Simpleexport NTFY_KEY="value"format. Single quotes for values containing$. -
updateOutput(): Called on every input change. Runs the active tab's generator and updates the<code>element. -
initGenerator(): Called on DOMContentLoaded, no-ops if#config-generatoris missing. Sets up event listeners for tabs, accordions, repeatable row add/remove, conditional toggles, and special checkboxes (upstream, metrics).
Conditional visibility
- Database = PostgreSQL → hide
cache-file,auth-file,web-push-file; showdatabase-url - Access control unchecked → hide all auth fields
- Each "enable X" checkbox controls visibility of its section's detail fields via
data-toggleattribute
Docker Compose path mapping
/var/cache/ntfy/cache.db→/var/lib/ntfy/cache.db/var/cache/ntfy/attachments→/var/lib/ntfy/attachments/var/lib/ntfy/*→ unchanged- Volume:
./:/var/lib/ntfy
CSS Architecture (config-generator.css)
Key aspects:
- Flex layout with
gap: 24pxfor the two-panel layout - Sticky right panel:
position: sticky; top: 76px; align-self: flex-start; max-height: calc(100vh - 100px); overflow-y: auto - Dark mode: Uses
body[data-md-color-scheme="slate"]selectors (matching existing pattern inextra.css) - Accent color: Uses
var(--md-primary-fg-color)(#338574) for focus states, active tabs, and interactive elements - Responsive:
@media (max-width: 900px)→ column layout, static right panel - Accordion:
.cg-section-headerclick toggles.cg-section.openwhich shows/hides.cg-section-body - Tabs:
.cg-tab.activegets accent color border-bottom highlight - Code output: Dark background (
#1e1e1e) with light text, consistent in both light and dark mode
HTML Block (in config.md)
~250 lines of HTML inserted at line 137. Pure HTML (no markdown inside). Structure:
## Config generator
<div id="config-generator">
<div id="cg-left">
<!-- 10 accordion sections with form fields -->
</div>
<div id="cg-right">
<!-- Tab bar + code output + copy button -->
</div>
</div>
Verification
The docs build was verified with mkdocs build — completed successfully with no errors. The generated HTML at server/docs/config/index.html contains the config-generator elements.
Manual verification checklist:
cd ntfy && mkdocs serve— open config page in browser- Verify all 10 sections expand/collapse
- Fill in basic setup → check server.yml output updates
- Switch tabs → verify docker-compose.yml and env vars render correctly
- Toggle access control → verify auth fields show/hide
- Add provisioned users/ACLs/tokens → verify repeatable rows work
- Switch database to PostgreSQL → verify SQLite fields hide
- Toggle dark mode → verify styles look correct
- Resize to mobile width → verify column layout
- Click copy button → verify clipboard content