Konfigurationsreferenz
Wippy liest seine Runtime-Konfiguration aus .wippy.yaml-Dateien.
Verwenden Sie die wiederholbare Option wippy run --set section.path=value, um die folgenden Konfigurationsfelder beim Start zu überschreiben. Für einzelne Registry-Einträge statt Konfigurationsabschnitte verwenden Sie override: oder -o; siehe Einträge überschreiben.
Konfigurations-Komposition {#config-composition}
--config ist wiederholbar; Dateien komponieren von links nach rechts mit demselben Schema:
wippy run --config .wippy.yaml --config .wippy.local.yaml
- Spätere Dateien überschreiben übereinstimmende Werte und behalten alles andere bei.
- Jede explizit benannte Datei muss existieren. Ohne
--configist die Standarddatei.wippy.yamloptional. - Die erste Datei verankert das Verzeichnis, gegen das relative Pfade aufgelöst werden.
- Dateinamen tragen keine reservierte Bedeutung; nichts außer dem Standard wird automatisch entdeckt.
Die Konfiguration wird in dieser Reihenfolge angewendet: komponierte Dateien, ausgewählte --profile-Overlays und anschließend --set-Überschreibungen. Bei Anwendungen aus Packs haben gepackte Runtime-Defaults eine niedrigere Priorität; siehe Runtime-Defaults veröffentlichen.
Profile {#profiles}
Eine Konfigurationsdatei kann benannte Overlays unter profiles: deklarieren. Jeder Profilkörper spiegelt die normalen Konfigurationsabschnitte; die Auswahl mit --profile <name> legt diese Werte über die zusammengeführte Basiskonfiguration:
version: "1.0"
vars:
port: 8085
override:
app:db:kind: db.sql.sqlite
disable:
namespaces: ["legacy.**"]
profiles:
pg:
vars:
port: 18085
override:
app:db:kind: db.sql.postgres
disable:
namespaces.add: ["experimental.**"]
wippy run --profile pg
--profileist wiederholbar; Profile komponieren von links nach rechts, nach der Datei-Komposition und vor--set. Ein unbekannter Name ist ein Fehler.- Werte werden pro Blatt zusammengeführt (der letzte Schreiber gewinnt). Der Abschnitt
profiles:selbst wird aus der aufgelösten Konfiguration entfernt. - Der Abschnitt
disableunterstützt Listenoperationen innerhalb von Profilen —namespaces.add,namespaces.remove,entries.add,entries.remove— sodass ein Profil die Basisliste anpassen kann, statt sie zu ersetzen. ${name}-Referenzen interpolieren aus dem zusammengeführtenvars:-Abschnitt. OS-Umgebungsreferenzen sind innerhalb von Profil-Vars nicht erlaubt; verwenden Sie${env:NAME}in der Basiskonfiguration, aufgelöst beim Laden der Datei.
wippy run, test und pack akzeptieren --profile; run list, install, update, lint und registry akzeptieren es ebenfalls für Workspace-Profile (zusammen mit --set). Anwendungen können Profile in Packs ausliefern — siehe Profile veröffentlichen.
Logger
Steuert den zap-Logger-Encoder. CLI-Flags (-v, -c, -s) überschreiben Level/Ausgabe; die einzige yaml-gesteuerte Option ist die Kodierung.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
encoding |
string | console | Encoder: console (menschenlesbar) oder json (strukturiert) |
logger:
encoding: json
Log-Manager
Steuert das Runtime-Log-Routing. Konsolenausgabe wird über CLI-Flags (-v, -c, -s) konfiguriert.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
propagate_downstream |
bool | true | Logs an Konsolen-/Dateiausgabe senden |
stream_to_events |
bool | false | Logs für programmatischen Zugriff zum Event-Bus veröffentlichen |
min_level |
int | 0 (-1 mit -v) |
Minimales Level: -1=debug, 0=info, 1=warn, 2=error. Die CLI schreibt diesen Schlüssel nach dem Lesen der Datei aus ihren Flags, sodass ein Dateiwert ignoriert wird; ändern Sie ihn mit --set logmanager.min_level=<n> |
logmanager:
propagate_downstream: true
stream_to_events: false
Siehe: Logger-Modul
Profiler
Go pprof HTTP-Server für CPU-/Speicher-Profiling. Mit -p Flag oder Konfiguration aktivieren.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
enabled |
bool | false | Profiler-Server starten |
address |
string | localhost:6060 | Adresse zum Lauschen |
read_timeout |
duration | 15s | HTTP Read-Timeout |
write_timeout |
duration | 15s | HTTP Write-Timeout |
idle_timeout |
duration | 60s | Keep-Alive-Timeout |
profiler:
enabled: true
address: "localhost:6060"
Zugriff unter http://localhost:6060/debug/pprof/
Sicherheit
Globales Sicherheitsverhalten. Individuelle Richtlinien werden als security.policy-Einträge definiert.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
strict_mode |
bool | true | Zugriff verweigern, wenn der Sicherheitskontext unvollständig ist |
security:
strict_mode: false
Siehe: Sicherheitssystem, Sicherheitsmodul
Registry
Eintragsspeicherung und Versionshistorie. Die Registry enthält alle Konfigurationseinträge.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
enable_history |
bool | true | Eintragsversionen verfolgen |
history_type |
string | memory | Speicher: memory, sqlite, postgres, nil |
history_path |
string | .wippy/registry.db | SQLite-Dateipfad (verwendet bei history_type: sqlite) |
history_dsn |
string | Postgres-DSN (verwendet bei history_type: postgres) |
|
history_schema |
string | Postgres-Schemaname (verwendet bei history_type: postgres) |
|
event_wait_timeout |
duration | 30s | Wartezeit pro Operation auf die Bestätigung durch Listener während eines Registry-Apply |
dispatch_internal_kinds |
string[] | [registry.entry, ns.dependency, ns.requirement, ns.definition] |
Entry-Typen, die intern behandelt statt an Komponenten-Listener verteilt werden |
dependency_resolve_timeout |
duration | 0 (keins) | Grenze für die Auflösung von Abhängigkeiten |
dependency_download_timeout |
duration | 0 (keins) | Grenze für jeden Modul-Download und jede Download-URL-Anfrage |
dependency_lock_path |
string | gefundene wippy.lock |
Lock-Datei, die der Abhängigkeits-Handler liest und schreibt |
dependency_vendor_dir |
string | <lock-Verzeichnis>/<directories.modules>/vendor |
Verzeichnis mit den heruntergeladenen Modul-Packs |
registry:
history_type: sqlite
history_path: /var/lib/wippy/registry.db
registry:
history_type: postgres
history_dsn: ${env:WIPPY_REGISTRY_HISTORY_DSN}
history_schema: wippy_registry
Siehe: Registry-Konzept, Registry-Modul
Artifact
Ausgabewurzel für materialisierte Build-Zeit-Artefakte.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
materialization_root |
string | übergeordnetes Verzeichnis des Dependency-Vendor-Verzeichnisses | Von der Anwendung besessene Wurzel, unter der jedes Artefaktformat seinen eigenen Teilbaum schreibt |
artifact:
materialization_root: build/wippy
Siehe: Build-Zeit-Artefakte
Workspace
Lokale Modulersetzungen, adressiert über org/module. Die Werte sind Verzeichnisse; relative Pfade werden gegen das Verzeichnis der ersten --config-Datei aufgelöst, und null deaktiviert eine Ersetzung, die aus einer früheren Konfigurationsebene oder einem Profil geerbt wurde.
workspace:
replacements:
acme/http: ../local-http
acme/sql: null
Ersetzungen werden nie in wippy.lock geschrieben. Siehe Lokale Entwicklung mit Ersetzungen.
Relay
Nachrichtenrouting zwischen Prozessen über Knoten hinweg.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
node_name |
string | abgeleitete instanzspezifische ID | Bezeichner für diesen Relay-Knoten (Standard: UUIDv5 aus machine-id/Hostname + Arbeitsverzeichnis; überschreibbar über WIPPY_NODE_ID / WIPPY_RELAY_NODE_NAME) |
relay:
node_name: worker-1
Siehe: Prozessmodell
Supervisor
Dienst-Lebenszyklus-Verwaltung. Steuert das interne Steuerungs-Postfach des Supervisors, das zum Versand von Lebenszyklus-Ereignissen verwendet wird.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
host.buffer_size |
int | 1024 | Kapazität des internen Steuerungs-Postfachs |
host.worker_count |
int | 16 | Nebenläufige Dispatcher-Worker |
supervisor:
host:
buffer_size: 2048
worker_count: 32
Siehe: Supervision-Anleitung
Lua-Runtime
Lua-VM-Caching und Expression-Auswertung.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
cache.enabled |
bool | type_system.enabled |
Kompilierten Bytecode-/Typecheck-Cache auf Disk persistieren; folgt type_system.enabled, sofern nicht explizit gesetzt |
cache.dir |
string | .wippy/cache/lua |
Cache-Verzeichnis-Pfad (relativ zum Konfigurations-/Arbeitsverzeichnis) |
cache.mode |
string | readwrite |
Cache-Modus: readwrite (Standard), readonly, off; unbekannte Werte fallen auf readwrite zurück |
cache.compile.enabled |
bool | true | Kompilierten Bytecode persistieren (bei cache.enabled) |
cache.typecheck.enabled |
bool | true | Typecheck-Ergebnisse persistieren (bei cache.enabled) |
cache.max_bytes |
int | 1073741824 | Obergrenze der Cache-Größe auf Disk in Bytes |
cache.max_entries |
int | 20000 | Maximale Anzahl gecachter Einträge |
cache.prune_interval |
int | 256 | Schreibvorgänge zwischen Cache-Bereinigungsläufen |
type_system.enabled |
bool | false | Statische Typprüfung aktivieren |
type_system.strict |
bool | false | Typwarnungen als Fehler behandeln |
invalidation_wait_timeout |
duration | registry.event_wait_timeout (30s) |
Wartezeit auf die Bestätigung der Code-Invalidierung nach einer Eintragsänderung |
eval.max_steps |
int | 10000 | Standardbudget an Scheduler-Schritten für einen eval-Lauf; negative Werte werden abgelehnt |
eval.cache_size |
int | 256 | Cache-Einträge kompilierter Programme für ausgewerteten Quellcode |
eval.cache_ttl |
duration | 0 (kein Ablauf) | Lebensdauer eines zwischengespeicherten kompilierten Programms |
lua:
cache:
enabled: true
dir: .cache/lua
type_system:
enabled: true
Siehe: Lua-Übersicht
Scheduler
Core-Partitionierung für die WASM-Runtime. Wenn aktiviert, werden reserved_cores CPUs für die WASM-Ausführung reserviert und die übrigen bedienen den Actor-Scheduler; eine ungültige Aufteilung (zum Beispiel mehr reservierte Cores als verfügbar) wird protokolliert und ignoriert.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
wasm_isolation.enabled |
bool | false | Cores zwischen WASM- und Actor-Arbeit aufteilen |
wasm_isolation.reserved_cores |
int | 1 | Für die WASM-Ausführung reservierte Cores |
scheduler:
wasm_isolation:
enabled: true
reserved_cores: 2
Finder
Registry-Such-Caching. Wird intern für Eintrags-Lookups verwendet.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
query_cache_size |
int | 1000 | Gecachte Abfrageergebnisse |
regex_cache_size |
int | 100 | Kompilierte Regex-Muster |
finder:
query_cache_size: 2000
OpenTelemetry
Verteiltes Tracing und Metrik-Export über OTLP.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
enabled |
bool | false | OTEL aktivieren |
endpoint |
string | localhost:4318 | OTLP-Endpunkt |
protocol |
string | http/protobuf | Protokoll: grpc, http/protobuf |
service_name |
string | wippy-runtime | Dienst-Bezeichner |
service_version |
string | Dienst-Versions-Tag | |
insecure |
bool | true | Unverschlüsselte OTLP-Verbindung zulassen |
sample_rate |
float | 1.0 | Trace-Sampling (0.0-1.0) |
propagators |
string[] | [tracecontext, baggage] |
Context-Propagatoren |
traces_enabled |
bool | true | Traces exportieren |
metrics_enabled |
bool | false | Metriken exportieren |
http.enabled |
bool | true | HTTP-Anfragen tracen |
http.extract_headers |
bool | true | Trace-Context aus eingehenden Headern extrahieren |
http.inject_headers |
bool | true | Trace-Kontext in die HTTP-Antwort einfügen |
process.enabled |
bool | true | Prozess-Lebenszyklus tracen |
process.trace_lifecycle |
bool | true | Spans für spawn/terminate ausgeben |
interceptor.enabled |
bool | true | Funktionsaufrufe tracen |
interceptor.order |
int | 100 | Dekodiertes Kompatibilitätsfeld; Runtime v0.3.32a registriert den Interceptor unabhängig von diesem Wert mit Reihenfolge 100 |
queue.enabled |
bool | true | Queue publish/consume tracen |
temporal.enabled |
bool | false | Temporal-Workflows tracen |
otel:
enabled: true
endpoint: "http://jaeger:4318"
traces_enabled: true
process:
trace_lifecycle: true
Standard-OTEL-Umgebungsvariablen (OTEL_SDK_DISABLED, OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_PROTOCOL, OTEL_EXPORTER_OTLP_INSECURE, OTEL_SERVICE_NAME, OTEL_SERVICE_VERSION, OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG, OTEL_PROPAGATORS) überschreiben die entsprechenden Felder.
Siehe: Observability-Anleitung
Herunterfahren :id=shutdown
Verhalten beim kontrollierten Herunterfahren.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
timeout |
duration | 30s | Maximale Wartezeit für Komponenten zum Stoppen |
shutdown:
timeout: 60s
Metriken
Interner Metriken-Sammlungspuffer.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
buffer.size |
int | 10000 | Metriken-Puffer-Kapazität |
interceptor.enabled |
bool | true | Funktionsaufrufe automatisch verfolgen |
metrics:
buffer:
size: 20000
interceptor:
enabled: true
Siehe: Metriken-Modul, Observability-Anleitung
Prometheus
Prometheus-Metriken-Endpunkt.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
enabled |
bool | false | Metriken-Server starten |
address |
string | Adresse zum Lauschen; muss explizit gesetzt werden, wenn enabled: true, sonst startet der Metriken-Server nicht |
|
max_cardinality |
int | 1024 | Pro Metrik behaltene unterschiedliche Label-Sets (LRU); 0 oder kleiner verwendet den Standard |
prometheus:
enabled: true
address: "0.0.0.0:9090"
Stellt /metrics-Endpunkt für Prometheus-Scraping bereit, zusätzlich /livez.
Siehe: Observability-Anleitung
Cluster
Multi-Node-Clustering: Gossip-Mitgliedschaft plus ein begrenzter Raft-Konsenskern. Siehe den Cluster-Leitfaden für Architektur und Betriebsmodell; dieser Abschnitt ist die Konfigurationsschlüssel-Referenz.
Oberste Ebene
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
enabled |
bool | false | Clustering aktivieren |
name |
string | hostname | Knotenname; muss im Cluster eindeutig sein |
failure_domain |
string | Zonen-/Rack-Label; im Gossip beworben, damit Voter über Domains verteilt werden | |
kv_crdt_tombstone_retention |
duration | 0 | Alter, ab dem store.kv.crdt-Lösch-Tombstones freigegeben werden; 0 deaktiviert die altersbasierte GC |
kv_crdt_tombstone_gc_alive_peers |
bool | false | Die aktuelle Alive-Mitgliedschaft als Bestätigungsmenge für Tombstones verwenden |
Mitgliedschaft (Gossip)
SWIM-Gossip über memberlist. Wird für Knotenentdeckung, Fehlererkennung und Metadaten-Verbreitung verwendet.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
membership.bind_addr |
string | 0.0.0.0 | Gossip-Bind-Adresse |
membership.bind_port |
int | 7946 | Gossip-Bind-Port (TCP+UDP) |
membership.advertise_addr |
string | Adresse, die Peers verwenden, um diesen Knoten zu erreichen (NAT/k8s) | |
membership.join_addrs |
string | Kommagetrennte Seed-host:port-Paare |
|
membership.secret_key |
string | Base64-kodierter Gossip-Verschlüsselungsschlüssel (inline) | |
membership.secret_file |
string | Pfad zur Datei mit dem Gossip-Verschlüsselungsschlüssel | |
membership.gossip_interval |
duration | 500ms | Gossip-Verbreitungsperiode |
membership.push_pull_interval |
duration | 5s | Periode der vollständigen Zustandssynchronisation |
membership.dead_node_reclaim_time |
duration | 30s | Wann Name/Adresse eines toten Knotens wiederverwendet werden können |
membership.probe_interval |
duration | 1s | Zyklus der Fehlererkennungs-Probes |
membership.probe_timeout |
duration | 200ms | Ack-Wartezeit pro Probe |
membership.tcp_timeout |
duration | 1s | Timeout der TCP-Fallback-Probe |
membership.suspicion_mult |
int | 3 | Multiplikator des Suspicion-Timeouts |
Ein Gossip-Secret ist erforderlich. Entweder membership.secret_key oder membership.secret_file setzen (die Datei gewinnt, wenn beides angegeben ist); ohne beides startet die Cluster-Komponente nicht. Der Wert ist base64-kodiert.
Die vier Probe-Schlüssel erben die Local-Network-Defaults von memberlist, wenn sie nicht gesetzt sind; erhöhen Sie sie für Verbindungen mit hoher Latenz (z.B. probe_interval: 2s, probe_timeout: 500ms, suspicion_mult: 5).
Internode (Transport)
TCP-Mesh für Relay- und Raft-Verkehr zwischen Knoten. Raft nutzt dieses Mesh über Internode-Request/Reply; es gibt keinen separaten Raft-Port.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
internode.bind_addr |
string | 0.0.0.0 | Mesh-Bind-Adresse |
internode.bind_port |
int | 0 | Mesh-Port (0 = auto: 7950-7959, dann ephemer) |
internode.auto_port |
bool | true | Tatsächlichen Port beim Start ermitteln, festlegen und im Gossip bewerben |
internode.advertise_addr |
string | Zusätzlicher Relay-Endpunkt (IP oder DNS-Name), veröffentlicht für aktualisierte Peers — für NAT- oder Load-Balancer-Erreichbarkeit | |
internode.advertise_port |
int | 0 | Port für advertise_addr (0 = Bind-Port; erfordert advertise_addr) |
internode.identity_key |
string | Base64-kodierter privater ed25519-Schlüssel, der diesen Knoten identifiziert (inline) | |
internode.identity_key_file |
string | Pfad zu einer Datei, die diesen Schlüssel enthält | |
internode.trusted_peer_keys |
map | Base64-kodierter öffentlicher ed25519-Schlüssel je Knotenname, einschließlich dieses Knotens |
advertise_addr/advertise_port veröffentlichen einen additiven Endpunkt in den Knoten-Metadaten, während der Bind-Endpunkt unverändert beworben bleibt, sodass Cluster mit gemischten Versionen während eines Rolling Upgrades verbunden bleiben.
Die Internode-Identität ist zwingend, sobald Clustering aktiviert ist. identity_key und identity_key_file schließen sich gegenseitig aus, und eines von beiden muss vorhanden sein; der Wert dekodiert (Standard- oder Raw-base64) entweder zu einem 32-Byte-ed25519-Seed oder zu einem 64-Byte-ed25519-Privatschlüssel. trusted_peer_keys bildet jeden Knotennamen auf den 32-Byte-ed25519-Public-Key dieses Knotens ab und muss einen Eintrag für den lokalen cluster.name enthalten, dessen Wert zur lokalen Identität passt — andernfalls schlägt der Start fehl. Siehe die Cluster-Anleitung.
Raft (Konsens)
Begrenztes Raft. Der Raft-Zustand ist standardmäßig fs-dauerhaft und wird unter raft.data_dir (Standard ~/.wippy/store) gespeichert; ein neugestarteter Knoten tritt dem Quorum dennoch von Peers wieder bei. store.kv.raft-Einträge replizieren darüber. Bootstrap ist gossip-gesteuert (Consul/Nomad bootstrap_expect-Stil).
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
raft.data_dir |
string | ~/.wippy/store |
Verzeichnis für fs-dauerhaften Raft-Zustand und dauerhafte CRDT-Snapshots (unter <data_dir>/_sys/). Festplatten-los nur, wenn kein Pfad aufgelöst wird (kein Home-Verzeichnis und keiner gesetzt) |
raft.enabled |
bool | true | Raft-Knoten betreiben; false macht diesen zum reinen Gossip-Client |
raft.role |
string | server | server betreibt einen Raft-Knoten; client ist nur Gossip |
raft.eligible |
bool | true | Ob dieser Knoten als Voter oder Standby ausgewählt werden darf; false hält ihn als Client außerhalb von Raft |
raft.priority |
int | 100 | Voter-Auswahlpriorität (niedrigerer Wert wird bevorzugt) |
raft.bootstrap_expect |
int | 1 | Initiale Quorumgröße: 0=bestehendem beitreten, 1=Einzelknoten, N=auf N berechtigte Knoten einschließlich des lokalen warten, dann Quorum bilden |
raft.max_voters |
int | 5 | Voter-Obergrenze (muss ungerade sein); bis zu max_standbys weitere berechtigte Knoten werden Standbys, der Rest bleibt Client |
raft.max_standbys |
int | 4 | Nicht-abstimmende Mitglieder, warm gehalten für Beförderung; Knoten jenseits voters+standbys sind keine Raft-Mitglieder |
raft.reconcile_debounce |
duration | 2s | Koaleszenzfenster nach einem Gossip-Ereignis, bevor der Voter-Reconciler läuft |
raft.reconcile_timeout |
duration | 2s | Schranke pro Reconcile-Durchlauf |
raft.heartbeat_timeout |
duration | 3s | Follower-Leerlaufwartzeit vor dem Start einer Wahl |
raft.election_timeout |
duration | 3s | Kandidaten-Wahltimeout (mindestens heartbeat) |
raft.commit_timeout |
duration | 500ms | Heartbeat-Takt des Leerlauf-Leaders |
raft.snapshot_threshold |
uint64 | 8192 | Log-Einträge seit dem letzten Snapshot, bevor ein neuer erstellt wird |
raft.snapshot_interval |
duration | 2m | Snapshot-Prüfintervall |
raft.snapshot_retain |
int | 3 | Beibehaltene Snapshots |
raft.trailing_logs |
uint64 | 10240 | Nach einem Snapshot beibehaltene Log-Einträge |
raft.max_append_entries |
int | 16 | Maximale Einträge pro AppendEntries RPC |
raft.leader_probe_interval |
duration | 3s | Takt der Globale-Registry-Leader-Erreichbarkeits-Probe |
raft.leader_probe_grace |
int | 3 | Aufeinanderfolgende Probe-Fehler, bevor Leader als nicht erreichbar gilt |
raft.registry_backend |
string | kv | Implementierung der Cluster-Namensregistry: kv (gemeinsamer kv-Keyspace) oder fsm (dedizierte Raft-FSM) |
raft.global_dissem_tombstone_retention |
duration | 0 | Wie lange der Verbreitungs-Cache globaler Namen Lösch-Tombstones behält |
Einzelknoten (Entwicklung) — Clustering aktiviert, bootstrappt sich sofort:
cluster:
enabled: true
name: dev
membership:
secret_key: "d2lwcHktZG9jcy1nb3NzaXAtc2VjcmV0LTMyYnl0ZXM="
internode:
identity_key: "d2lwcHktZG9jcy1kZXYtbm9kZS1leGFtcGxlc2VlZCE="
trusted_peer_keys:
dev: "rNqImcjOzef28dzvma80mSrCW1px5LBAc5TbaYqAgm0="
raft:
bootstrap_expect: 1
Drei-Knoten-Voting-Cluster — jeder Knoten listet die anderen als Seeds und wartet auf alle drei vor der Quorumbildung. Jeder Knoten trägt dieselbe trusted_peer_keys-Karte und seinen eigenen privaten Schlüssel:
cluster:
enabled: true
name: node-1
failure_domain: us-east-1a
membership:
bind_port: 7946
join_addrs: "node-2:7946,node-3:7946"
secret_file: /etc/wippy/cluster.key
internode:
identity_key_file: /etc/wippy/node-1.key
trusted_peer_keys:
node-1: "okmamN3PKkMpPwPBurknHy2Wi3dwp/rz+uTM2fF9aD0="
node-2: "PWX+oOYrFdtjUxbgmTkXCFI0KEvG++ZM52HOWfDkqP8="
node-3: "QfP0fgllbj4s95VAztTORhy3bv9mst1l0lwuUNvO/hE="
raft:
bootstrap_expect: 3
max_voters: 5
Gossip-only-Client — tritt dem Cluster für Benennung/Messaging bei, betreibt nie Raft. Er braucht dennoch eine eigene Identität und muss in der Vertrauenskarte jedes Knotens auftauchen:
cluster:
enabled: true
name: edge-7
membership:
join_addrs: "node-1:7946,node-2:7946"
secret_file: /etc/wippy/cluster.key
internode:
identity_key_file: /etc/wippy/edge-7.key
trusted_peer_keys:
node-1: "okmamN3PKkMpPwPBurknHy2Wi3dwp/rz+uTM2fF9aD0="
node-2: "PWX+oOYrFdtjUxbgmTkXCFI0KEvG++ZM52HOWfDkqP8="
node-3: "QfP0fgllbj4s95VAztTORhy3bv9mst1l0lwuUNvO/hE="
edge-7: "7lzP4jBAkC3P+0jq4vtMsC45571BlVXk3mSlOD/Z0SA="
raft:
role: client
LSP
Language-Server-Protocol-Server für Editor-Integrationen.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
enabled |
bool | false | TCP-Server aktivieren |
address |
string | :7777 | TCP-Listen-Adresse |
http_enabled |
bool | false | HTTP-Transport aktivieren |
http_address |
string | :7778 | HTTP-Listen-Adresse |
http_path |
string | /lsp | HTTP-Endpunkt-Pfad |
http_allow_origin |
string | * | CORS Allowed-Origin |
max_message_bytes |
int | 8388608 | Maximale Größe eingehender Nachrichten |
lsp:
enabled: true
address: ":7777"
http_enabled: true
Siehe: LSP-Anleitung
Netzwerkdienst
Overlay-Netzwerk-Manager (SOCKS5-, I2P-, Tailscale-Treiber).
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
state_dir |
string | .wippy/net | Verzeichnis für Treiber-Statusspeicherung |
default_network |
string | Standard-Netzwerk-ID, die angewendet wird, wenn Einträge network weglassen |
network_service:
state_dir: /var/lib/wippy/net
default_network: app:tailscale
Siehe: Netzwerk-Overlays
HTTP-Dispatcher
Tuning für den gemeinsamen HTTP-Client-Pool, der von HTTP-dispatched Funktionen und ausgehenden Anfragen verwendet wird.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
dispatcher.http.timeout |
duration | 0 (kein) | Timeout pro Anfrage |
dispatcher.http.max_idle_conns |
int | 0 (stdlib) | Maximale Leerlaufverbindungen über alle Hosts |
dispatcher.http.max_idle_per_host |
int | 0 (stdlib) | Maximale Leerlaufverbindungen pro Host |
dispatcher.http.idle_conn_timeout |
duration | 0 (stdlib) | Leerlaufverbindungs-Timeout |
dispatcher.http.max_clients |
int | 0 (unbegrenzt) | Maximale unterschiedliche gepoolte Clients |
dispatcher:
http:
timeout: 30s
max_idle_per_host: 32
Module
Modul-Registry-Client, der von wippy install/update verwendet wird.
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
registry_url |
string | https://hub.wippy.ai | Registry-Endpunkt |
modules:
registry_url: https://internal-registry.example.com
Erweiterungen
Native Go-Plugin-Erweiterungen, die beim Booten geladen werden (nur Unix).
| Feld | Typ | Standard | Beschreibung |
|---|---|---|---|
enabled |
bool | true | Erweiterungen laden |
paths |
string[] | Plugin-Dateipfade (relativ zum Konfigurationsverzeichnis) |
extensions:
enabled: true
paths:
- ./extensions/myplugin.so
Umgebungsvariablen
| Variable | Beschreibung |
|---|---|
GOMEMLIMIT |
Speicherlimit-Fallback, wenn das Flag --memory-limit nicht gesetzt ist (Vorrang: Flag --memory-limit > GOMEMLIMIT > Standard 1G) |
Internode-TLS
Aktivieren Sie gegenseitiges TLS für das Internode-TCP-Mesh mit cluster.internode.tls. Damit wird auch der darüber transportierte Relay- und Raft-Verkehr geschützt. Ergänzen Sie die bestehende Cluster-Konfiguration:
cluster:
internode:
tls:
enabled: true
cert_file: /etc/wippy/node.crt
key_file: /etc/wippy/node.key
ca_file: /etc/wippy/cluster-ca.pem
TLS ist standardmäßig deaktiviert. Bei enabled: true sind alle drei nicht leeren Dateipfade erforderlich: ein PEM-Zertifikat, der passende private Schlüssel und ein PEM-CA-Bundle zur Prüfung von Server- und Client-Zertifikaten. Die Mindestversion ist TLS 1.2. Alle Peers benötigen kompatible Zertifikate und Vertrauenswurzeln. Die ed25519-Identität und die Liste vertrauenswürdiger Peer-Schlüssel bleiben erforderlich.
Unbekannte TLS-Einstellungen, ungültige Typen, fehlende oder ungültige Zugangsdaten, fehlerhafte CA-Bundles und Dateipfade ohne enabled: true verhindern den Start. Eine ungültige explizite Konfiguration fällt niemals stillschweigend auf Klartext zurück.
Siehe auch
- CLI-Referenz — Kommandozeilenoptionen
- Cluster-Leitfaden — Clustering-Architektur und Betrieb
- Entry-Kinds — Entry-Kinds und Felder
- Observability — Logging, Metriken und Tracing