21ccd369d2933334a79b47ac023eb6e4350c0903
services/Distributed-Wiki-New.md
| ... | ... | @@ -1,169 +1,11 @@ |
| 1 | -# The New Distributed Wiki |
|
| 1 | +## Anycast Wiki Mirrors |
|
| 2 | 2 | |
| 3 | -> This document replaces the legacy Gollum/ExaBGP setup notes. It explains how to deploy the Go-based wiki mirror while keeping the original structure for easy comparison. |
|
| 3 | +These instances are part of the anycast network for [wiki.dn42](https://wiki.dn42/) and run the new wiki software, `dn42-wiki-go`, which replaces the legacy `Gollum`. |
|
| 4 | 4 | |
| 5 | -Thanks to [wiki-ng](https://git.dn42.dev/wiki/wiki-ng), based on their work, [dn42-wiki-go](https://github.com/iedon/dn42-wiki-go) can provide both static site generation and live edit. |
|
| 5 | +| Node / Region | URL | ASN | |
|
| 6 | +| ----------------------- | ------------------------------------------- | ----------- | |
|
| 7 | +| iedon.dn42 114 (US-LAX) | [https://wiki-114.iedon.dn42/](https://wiki-114.iedon.dn42/) | 4242422189 | |
|
| 6 | 8 | |
| 7 | -## Overview |
|
| 9 | +## Deploying dn42-wiki-go |
|
| 8 | 10 | |
| 9 | -`dn42-wiki-go` provides a statically rendered, Git-backed documentation site for dn42. The binary can run in two modes: |
|
| 10 | - |
|
| 11 | -- **Live mode** (the default) serves HTTP directly, watches the upstream Git repository, and rebuilds pages on change. |
|
| 12 | -- **Static build mode (`live=false or run with --build`)** produces pre-rendered HTML into `dist/` once, suitable for delivery by any web server. |
|
| 13 | - |
|
| 14 | -Nginx or another TLS proxy is still recommended for public access, but the application ships with native HTTPS and webhook support. |
|
| 15 | - |
|
| 16 | -## Prerequisites |
|
| 17 | - |
|
| 18 | -- A stable dn42-connected host with enough CPU and disk to cache the Git repository and generated site (`~500 MB`). |
|
| 19 | -- Operational Git access to `git.dn42.dev/wiki/wiki` (read-only for mirrors, write access if you contribute edits). |
|
| 20 | -- Software: |
|
| 21 | - - [Go ≥ 1.24](https://go.dev/dl/) (only needed for building from source). |
|
| 22 | - - [Git](https://git-scm.com/). |
|
| 23 | - - Optional but recommended: [Nginx](https://nginx.org/) or [Caddy](https://caddyserver.com/) for TLS termination. |
|
| 24 | - - Optional: [Docker](https://docs.docker.com/) / [Docker Compose](https://docs.docker.com/compose/) if you prefer containers. |
|
| 25 | -- Solid operational knowledge—production mirrors are expected to run reliably and coordinate with the dn42 maintainers. |
|
| 26 | - |
|
| 27 | -## Network |
|
| 28 | - |
|
| 29 | -- The daemon listens on the address configured in `config.json` (`listen`, default `:8080`). Use firewalling or a reverse proxy to expose the service on your chosen anycast/unicast IPs. |
|
| 30 | -- You may terminate HTTPS in-process (set `enableTLS`, `tlsCert`, `tlsKey`) or offload TLS to Nginx/Caddy. |
|
| 31 | -- If you operate an anycast mirror, advertise `172.23.0.80/32` and `fd42:d42:d42:80::1/64` only when the health checks succeed. ExaBGP or native BGP daemons work well; see the _Monitoring & Routing_ section. |
|
| 32 | - |
|
| 33 | -## Repository Synchronisation |
|
| 34 | - |
|
| 35 | -The wiki content lives in Git. The application already performs periodic pulls (configured via `git.pullIntervalSec`) and exposes a webhook for faster updates. You still need an initial clone and credentials. |
|
| 36 | - |
|
| 37 | -### Initial clone |
|
| 38 | - |
|
| 39 | -```bash |
|
| 40 | -git clone [email protected]:wiki/wiki.git repo |
|
| 41 | -``` |
|
| 42 | - |
|
| 43 | -Populate `config.json` with the same `remote` URL and point `git.localDirectory` at the clone (default `./repo`). |
|
| 44 | - |
|
| 45 | -### Optional external sync script |
|
| 46 | - |
|
| 47 | -If you want an **independent** watchdog, a minimal cron job keeps the repository fresh: |
|
| 48 | - |
|
| 49 | -```bash |
|
| 50 | -#!/bin/sh |
|
| 51 | -set -euo pipefail |
|
| 52 | -cd /srv/dn42-wiki/repo |
|
| 53 | -/usr/bin/git pull --ff-only |
|
| 54 | -/usr/bin/git push # if you have write access |
|
| 55 | -``` |
|
| 56 | - |
|
| 57 | -Schedule it every 5–15 minutes. Avoid overlapping with the built-in poll interval to reduce churn. |
|
| 58 | - |
|
| 59 | -## Application Setup |
|
| 60 | - |
|
| 61 | -1. Copy `config.example.json` to `config.json` and adjust: |
|
| 62 | - - `live`: set `true` for mirrors that serve HTTP directly; set `false` to produce static HTML. |
|
| 63 | - - `editable`: mirrors that allow edits should be reachable from dn42 only. |
|
| 64 | - - `git.remote`: use your git.dn42 credentials. Leave empty to run against a local repository only. |
|
| 65 | - - `webhook.enabled`: enable for fast sync and provide a shared secret. |
|
| 66 | - - `webhook.polling`: set `enabled` and `endpoint` if you need active polling. `skipRemoteCert` lets you disable TLS verification for trusted endpoints. See also `dn42notifyd`. |
|
| 67 | - - `trustedProxies`: add your reverse proxy or load balancer networks. |
|
| 68 | - |
|
| 69 | -2. Compile the binary: |
|
| 70 | - |
|
| 71 | -```bash |
|
| 72 | -./build.sh |
|
| 73 | -``` |
|
| 74 | - |
|
| 75 | -3. Launch the service: |
|
| 76 | - |
|
| 77 | -```bash |
|
| 78 | -./dn42-wiki-go --config ./config.json |
|
| 79 | -``` |
|
| 80 | - |
|
| 81 | -The first run performs a full static build into `dist/`. Subsequent requests serve directly from disk, and background pulls rebuild the output as needed. |
|
| 82 | - |
|
| 83 | -### Static-only build |
|
| 84 | - |
|
| 85 | -If you just need HTML assets: |
|
| 86 | - |
|
| 87 | -```bash |
|
| 88 | -./dn42-wiki-go --config ./config.json --build |
|
| 89 | -``` |
|
| 90 | - |
|
| 91 | -Deploy `dist/` with any web server or object store. |
|
| 92 | - |
|
| 93 | -### Systemd unit (example) |
|
| 94 | - |
|
| 95 | -See [dn42-wiki-go.service](dn42-wiki-go.service) and [dn42-wiki-go.socket](dn42-wiki-go.socket). |
|
| 96 | - |
|
| 97 | -Reload systemd, enable, and start the service. |
|
| 98 | - |
|
| 99 | -## Reverse Proxy / TLS |
|
| 100 | - |
|
| 101 | -Place a reverse proxy in front of the daemon for certificate management and to present the canonical hostnames. |
|
| 102 | - |
|
| 103 | -The repository includes `nginx-vhost.conf` with a more complete example (HTTP -> HTTPS redirect, QUIC, static asset caching, and API proxying). Adjust: |
|
| 104 | - |
|
| 105 | -- `root` so it points at your rendered `dist/` directory when serving static files directly. |
|
| 106 | -- `proxy_pass` directives if you run the Go binary on a different port or on a Unix socket. |
|
| 107 | -- Certificate paths, `X-SiteID`, and anycast/unicast listener addresses to match your deployment. |
|
| 108 | - |
|
| 109 | -To keep HPKP/HSTS behaviour consistent with the legacy setup, reuse the same headers. Coordinate DNS and certification with the dn42 Automatic CA workflow when exposing official mirrors. |
|
| 110 | - |
|
| 111 | -## Docker & Compose |
|
| 112 | - |
|
| 113 | -The repository ships with a multi-stage `Dockerfile` and `docker-compose.yml`. |
|
| 114 | - |
|
| 115 | -```bash |
|
| 116 | -# Build and start |
|
| 117 | -docker compose up --build -d |
|
| 118 | - |
|
| 119 | -# Logs |
|
| 120 | -docker compose logs -f |
|
| 121 | -``` |
|
| 122 | - |
|
| 123 | -Bind-mount `./config/config.json` to override settings and use `./data/dist` plus `./data/repo` for persistent state. The container runs as a non-root user and exposes port `8080`. |
|
| 124 | - |
|
| 125 | -## Webhooks & Polling |
|
| 126 | - |
|
| 127 | -- `/api/webhook/pull` and `/api/webhook/push` require the shared secret. Integrate them with your Git hosting or ExaBGP watchdog to trigger immediate pulls or pushes. |
|
| 128 | -- The optional poller registers with a remote notification service specified in `webhook.polling.endpoint`. Set `skipRemoteCert` only if the endpoint uses self-signed certificates you trust. |
|
| 129 | - |
|
| 130 | -## Monitoring & Routing |
|
| 131 | - |
|
| 132 | -For anycast mirrors, advertise the service prefix only when the local HTTP endpoint is healthy. A trimmed-down watchdog using ExaBGP: |
|
| 133 | - |
|
| 134 | -```bash |
|
| 135 | -#!/bin/sh |
|
| 136 | -set -eu |
|
| 137 | -check() { |
|
| 138 | - curl -fsS --max-time 5 https://127.0.0.1:8443/ | grep -qi "dn42" # adjust scheme/port |
|
| 139 | -} |
|
| 140 | - |
|
| 141 | -announce() { |
|
| 142 | - printf 'announce route 172.23.0.80/32 next-hop %s\n' "$NEXT_HOP" |
|
| 143 | - printf 'announce route fd42:d42:d42:80::/64 next-hop %s\n' "$NEXT_HOP6" |
|
| 144 | -} |
|
| 145 | - |
|
| 146 | -withdraw() { |
|
| 147 | - printf 'withdraw route 172.23.0.80/32 next-hop %s\n' "$NEXT_HOP" |
|
| 148 | - printf 'withdraw route fd42:d42:d42:80::/64 next-hop %s\n' "$NEXT_HOP6" |
|
| 149 | -} |
|
| 150 | - |
|
| 151 | -state=down |
|
| 152 | -while sleep 30; do |
|
| 153 | - if check; then |
|
| 154 | - [ "$state" = down ] && { announce; state=up; } |
|
| 155 | - else |
|
| 156 | - [ "$state" = up ] && { withdraw; state=down; } |
|
| 157 | - fi |
|
| 158 | -done |
|
| 159 | -``` |
|
| 160 | - |
|
| 161 | -Run the script under an ExaBGP `process` stanza. Ensure your IGP routes traffic correctly to the service when announced. |
|
| 162 | - |
|
| 163 | -## Maintenance Checklist |
|
| 164 | - |
|
| 165 | -- Monitor `dist/` age and `dn42-wiki-go` logs for build errors. |
|
| 166 | -- Keep Go and system packages patched; rebuild after Go security releases. |
|
| 167 | -- Track upstream configuration changes (`config.example.json`) and merge them into your `config.json`. |
|
| 168 | -- Verify TLS certificates before expiry and renew via the Automatic CA process. |
|
| 169 | -- Coordinate with other maintainers (mailing list/IRC) when adding or retiring mirrors. |
|
| 11 | +Instructions comming soon. |