yakmesh 2.8.2 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +637 -0
- package/CONTRIBUTING.md +42 -0
- package/Caddyfile +77 -0
- package/README.md +119 -29
- package/adapters/adapter-mlv-bible/README.md +124 -0
- package/adapters/adapter-mlv-bible/index.js +400 -0
- package/adapters/chat-mod-adapter.js +532 -0
- package/adapters/content-adapter.js +273 -0
- package/content/api.js +50 -41
- package/content/index.js +2 -2
- package/content/store.js +355 -173
- package/dashboard/index.html +19 -3
- package/database/replication.js +117 -37
- package/docs/CRYPTO-AGILITY.md +204 -0
- package/docs/MTLS-RESEARCH.md +367 -0
- package/docs/NAMCHE-SPEC.md +681 -0
- package/docs/PEERQUANTA-YAKMESH-INTEGRATION.md +407 -0
- package/docs/PRECISION-DISCLOSURE.md +96 -0
- package/docs/README.md +76 -0
- package/docs/ROADMAP-2.4.0.md +447 -0
- package/docs/ROADMAP-2.5.0.md +244 -0
- package/docs/SECURITY-AUDIT-REPORT.md +306 -0
- package/docs/SST-INTEGRATION.md +712 -0
- package/docs/STEADYWATCH-IMPLEMENTATION.md +303 -0
- package/docs/TERNARY-AUDIT-REPORT.md +247 -0
- package/docs/TME-FAQ.md +221 -0
- package/docs/WHITEPAPER.md +623 -0
- package/docs/adapters.html +1001 -0
- package/docs/advanced-systems.html +1045 -0
- package/docs/annex.html +1046 -0
- package/docs/api.html +970 -0
- package/docs/business/response-templates.md +160 -0
- package/docs/c2c.html +1225 -0
- package/docs/cli.html +1332 -0
- package/docs/configuration.html +1248 -0
- package/docs/darshan.html +1085 -0
- package/docs/dharma.html +966 -0
- package/docs/docs-bundle.html +1075 -0
- package/docs/docs.css +3120 -0
- package/docs/docs.js +556 -0
- package/docs/doko.html +969 -0
- package/docs/geo-proof.html +858 -0
- package/docs/getting-started.html +840 -0
- package/docs/gumba-tutorial.html +1144 -0
- package/docs/gumba.html +1098 -0
- package/docs/index.html +914 -0
- package/docs/jhilke.html +1312 -0
- package/docs/karma.html +1100 -0
- package/docs/katha.html +1037 -0
- package/docs/lama.html +978 -0
- package/docs/mandala.html +1067 -0
- package/docs/mani.html +964 -0
- package/docs/mantra.html +967 -0
- package/docs/mesh.html +1409 -0
- package/docs/nakpak.html +869 -0
- package/docs/namche.html +928 -0
- package/docs/nav-order.json +53 -0
- package/docs/prahari.html +1043 -0
- package/docs/prism-bash.min.js +1 -0
- package/docs/prism-javascript.min.js +1 -0
- package/docs/prism-json.min.js +1 -0
- package/docs/prism-tomorrow.min.css +1 -0
- package/docs/prism.min.js +1 -0
- package/docs/privacy.html +699 -0
- package/docs/quick-reference.html +1181 -0
- package/docs/sakshi.html +1402 -0
- package/docs/sandboxing.md +386 -0
- package/docs/seva.html +911 -0
- package/docs/sherpa.html +871 -0
- package/docs/studio.html +860 -0
- package/docs/stupa.html +995 -0
- package/docs/tailwind.min.css +2 -0
- package/docs/tattva.html +1332 -0
- package/docs/terms.html +686 -0
- package/docs/time-server-deployment.md +166 -0
- package/docs/time-sources.html +1392 -0
- package/docs/tivra.html +1127 -0
- package/docs/trademark-policy.html +686 -0
- package/docs/tribhuj.html +1183 -0
- package/docs/trust-security.html +1029 -0
- package/docs/tutorials/backup-recovery.html +654 -0
- package/docs/tutorials/dashboard.html +604 -0
- package/docs/tutorials/domain-setup.html +605 -0
- package/docs/tutorials/host-website.html +456 -0
- package/docs/tutorials/mesh-network.html +505 -0
- package/docs/tutorials/mobile-access.html +445 -0
- package/docs/tutorials/privacy.html +467 -0
- package/docs/tutorials/raspberry-pi.html +600 -0
- package/docs/tutorials/security-basics.html +539 -0
- package/docs/tutorials/share-files.html +431 -0
- package/docs/tutorials/troubleshooting.html +637 -0
- package/docs/tutorials/trust-karma.html +419 -0
- package/docs/tutorials/yak-protocol.html +456 -0
- package/docs/tutorials.html +1034 -0
- package/docs/vani.html +1270 -0
- package/docs/webserver.html +809 -0
- package/docs/yak-protocol.html +940 -0
- package/docs/yak-timeserver-design.md +475 -0
- package/docs/yakapp.html +1015 -0
- package/docs/ypc27.html +1069 -0
- package/docs/yurt.html +1344 -0
- package/embedded-docs/bundle.js +334 -74
- package/gossip/protocol.js +247 -27
- package/identity/key-resolver.js +262 -0
- package/identity/machine-seed.js +632 -0
- package/identity/node-key.js +669 -368
- package/identity/tribhuj-ratchet.js +506 -0
- package/knowledge-base.js +37 -8
- package/launcher/yakmesh.bat +62 -0
- package/launcher/yakmesh.sh +70 -0
- package/mesh/annex.js +462 -108
- package/mesh/beacon-broadcast.js +113 -1
- package/mesh/darshan.js +1718 -0
- package/mesh/gumba.js +1567 -0
- package/mesh/jhilke.js +651 -0
- package/mesh/katha.js +1012 -0
- package/mesh/nakpak-routing.js +8 -5
- package/mesh/network.js +724 -34
- package/mesh/pulse-sync.js +4 -1
- package/mesh/rate-limiter.js +127 -15
- package/mesh/seva.js +526 -0
- package/mesh/sherpa-discovery.js +89 -8
- package/mesh/sybil-defense.js +19 -5
- package/mesh/temporal-encoder.js +4 -3
- package/mesh/vani.js +1364 -0
- package/mesh/yurt.js +1340 -0
- package/models/entropy-sentinel.onnx +0 -0
- package/models/karma-trust.onnx +0 -0
- package/models/manifest.json +43 -0
- package/models/sakshi-anomaly.onnx +0 -0
- package/oracle/code-proof-protocol.js +7 -6
- package/oracle/codebase-lock.js +257 -28
- package/oracle/index.js +74 -15
- package/oracle/ma902-snmp.js +678 -0
- package/oracle/module-sealer.js +5 -3
- package/oracle/network-identity.js +16 -0
- package/oracle/packet-checksum.js +201 -0
- package/oracle/sst.js +579 -0
- package/oracle/ternary-144t.js +714 -0
- package/oracle/ternary-ml.js +481 -0
- package/oracle/time-api.js +239 -0
- package/oracle/time-source.js +137 -47
- package/oracle/validation-oracle-hardened.js +1111 -1071
- package/oracle/validation-oracle.js +4 -2
- package/oracle/ypc27.js +211 -0
- package/package.json +20 -3
- package/protocol/yak-handler.js +35 -9
- package/protocol/yak-protocol.js +28 -13
- package/reference/cpp/yakmesh_mceliece_shard.cpp +168 -0
- package/reference/cpp/yakmesh_ypc27.cpp +179 -0
- package/sbom.json +87 -0
- package/scripts/security-audit.mjs +264 -0
- package/scripts/update-docs-nav.js +194 -0
- package/scripts/update-docs-sidebar.cjs +164 -0
- package/security/crypto-config.js +4 -3
- package/security/dharma-moderation.js +517 -0
- package/security/doko-identity.js +193 -143
- package/security/domain-consensus.js +86 -85
- package/security/fs-hardening.js +620 -0
- package/security/hardware-attestation.js +5 -3
- package/security/hybrid-trust.js +227 -87
- package/security/karma-rate-limiter.js +692 -0
- package/security/khata-protocol.js +22 -21
- package/security/khata-trust-integration.js +277 -150
- package/security/memory-safety.js +635 -0
- package/security/mesh-auth.js +11 -10
- package/security/mesh-revocation.js +373 -5
- package/security/namche-gateway.js +298 -69
- package/security/sakshi.js +460 -3
- package/security/sangha.js +770 -0
- package/security/secure-config.js +473 -0
- package/security/silicon-parity.js +13 -10
- package/security/steadywatch.js +1142 -0
- package/security/strike-system.js +32 -3
- package/security/temporal-signing.js +488 -0
- package/security/trit-commitment.js +464 -0
- package/server/crypto/annex.js +247 -0
- package/server/darshan-api.js +343 -0
- package/server/index.js +3259 -362
- package/server/komm-api.js +668 -0
- package/utils/accel.js +2273 -0
- package/utils/ternary-id.js +79 -0
- package/utils/verify-worker.js +57 -0
- package/webserver/index.js +95 -5
- package/assets/yakmesh-logo.png +0 -0
- package/assets/yakmesh-logo.svg +0 -80
- package/assets/yakmesh-logo2.png +0 -0
- package/assets/yakmesh-logo2sm.png +0 -0
- package/assets/ymsm.png +0 -0
- package/website/assets/silhouettes/adapters.svg +0 -107
- package/website/assets/silhouettes/api-endpoints.svg +0 -115
- package/website/assets/silhouettes/atomic-clock.svg +0 -83
- package/website/assets/silhouettes/base-camp.svg +0 -81
- package/website/assets/silhouettes/bridge.svg +0 -69
- package/website/assets/silhouettes/docs-bundle.svg +0 -113
- package/website/assets/silhouettes/doko-basket.svg +0 -70
- package/website/assets/silhouettes/fortress.svg +0 -93
- package/website/assets/silhouettes/gateway.svg +0 -54
- package/website/assets/silhouettes/gears.svg +0 -93
- package/website/assets/silhouettes/globe-satellite.svg +0 -67
- package/website/assets/silhouettes/karma-wheel.svg +0 -137
- package/website/assets/silhouettes/lama-council.svg +0 -141
- package/website/assets/silhouettes/mandala-network.svg +0 -169
- package/website/assets/silhouettes/mani-stones.svg +0 -149
- package/website/assets/silhouettes/mantra-wheel.svg +0 -116
- package/website/assets/silhouettes/mesh-nodes.svg +0 -113
- package/website/assets/silhouettes/nakpak.svg +0 -56
- package/website/assets/silhouettes/peak-lightning.svg +0 -73
- package/website/assets/silhouettes/sherpa.svg +0 -69
- package/website/assets/silhouettes/stupa-tower.svg +0 -119
- package/website/assets/silhouettes/tattva-eye.svg +0 -78
- package/website/assets/silhouettes/terminal.svg +0 -74
- package/website/assets/silhouettes/webserver.svg +0 -145
- package/website/assets/silhouettes/yak.svg +0 -78
- package/website/assets/yakmesh-logo.png +0 -0
- package/website/assets/yakmesh-logo.webp +0 -0
- package/website/assets/yakmesh-logo128x140.webp +0 -0
- package/website/assets/yakmesh-logo2.png +0 -0
- package/website/assets/yakmesh-logo2.svg +0 -51
- package/website/assets/yakmesh-logo40x44.webp +0 -0
- package/website/assets/yakmesh.gif +0 -0
- package/website/assets/yakmesh.ico +0 -0
- package/website/assets/yakmesh.jpg +0 -0
- package/website/assets/yakmesh.pdf +0 -0
- package/website/assets/yakmesh.png +0 -0
- package/website/assets/yakmesh.svg +0 -70
- package/website/assets/yakmesh128.webp +0 -0
- package/website/assets/yakmesh32.png +0 -0
- package/website/assets/yakmesh32.svg +0 -65
- package/website/assets/yakmesh32o.ico +0 -2
- package/website/assets/yakmesh32o.svg +0 -65
- package/website/assets/yakmesh32o.svgz +0 -0
|
@@ -0,0 +1,605 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" data-theme="tutorials">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<link rel="icon" href="../favicon.ico" sizes="32x32">
|
|
7
|
+
<link rel="icon" href="../icon.svg" type="image/svg+xml">
|
|
8
|
+
<link rel="apple-touch-icon" href="../apple-touch-icon.png">
|
|
9
|
+
<title>Using with a Domain Name - YAKMESH Tutorials</title>
|
|
10
|
+
<meta name="description" content="Point your own domain name to your YAKMESH node with HTTPS. Complete guide to DNS, SSL, and reverse proxy setup.">
|
|
11
|
+
|
|
12
|
+
<link rel="stylesheet" href="../tailwind.min.css">
|
|
13
|
+
<link rel="stylesheet" href="../prism-tomorrow.min.css">
|
|
14
|
+
<link rel="stylesheet" href="../docs.css">
|
|
15
|
+
<style>
|
|
16
|
+
.theme-accent { color: #10b981; }
|
|
17
|
+
.theme-accent-hover:hover { color: #34d399; }
|
|
18
|
+
.theme-badge { background: rgba(16, 185, 129, 0.2); color: #34d399; }
|
|
19
|
+
.theme-border { border-color: #10b981; }
|
|
20
|
+
.theme-callout { background: rgba(16, 185, 129, 0.1); border-color: #059669; }
|
|
21
|
+
.active-link { background: rgba(16, 185, 129, 0.2) !important; color: #34d399 !important; }
|
|
22
|
+
.tutorial-card { background: rgba(30, 41, 59, 0.5); border: 1px solid #334155; border-radius: 0.75rem; padding: 1.5rem; margin-bottom: 1.5rem; }
|
|
23
|
+
.step-number { display: inline-flex; align-items: center; justify-content: center; width: 2rem; height: 2rem; background: #10b981; color: white; border-radius: 50%; font-weight: bold; margin-right: 0.75rem; flex-shrink: 0; }
|
|
24
|
+
.step-header { display: flex; align-items: center; margin-bottom: 1rem; }
|
|
25
|
+
</style>
|
|
26
|
+
</head>
|
|
27
|
+
<body class="bg-mountain-900 text-white min-h-screen">
|
|
28
|
+
|
|
29
|
+
<nav class="docs-sidebar" id="sidebar">
|
|
30
|
+
<a href="../index.html" class="sidebar-logo">
|
|
31
|
+
<span class="logo-icon">🏔️</span>
|
|
32
|
+
<span class="logo-text">Yakmesh</span>
|
|
33
|
+
</a>
|
|
34
|
+
<a href="/dashboard" class="sidebar-dashboard-link"><span>📊</span> <span>Dashboard</span></a>
|
|
35
|
+
<ul class="sidebar-nav">
|
|
36
|
+
<li><a href="../index.html"><span>🏠</span> <span>Overview</span></a></li>
|
|
37
|
+
<li><a href="../getting-started.html"><span>🚀</span> <span>Getting Started</span></a></li>
|
|
38
|
+
<li><a href="../tutorials.html"><span>📖</span> <span>Tutorials</span></a></li>
|
|
39
|
+
<li><a href="../yak-protocol.html"><span class="yak-icon"></span> <span>YAK://</span></a></li>
|
|
40
|
+
<li><a href="../annex.html"><span>🌉</span> <span>ANNEX</span></a></li>
|
|
41
|
+
<li><a href="../nakpak.html"><span>🎒</span> <span>NAKPAK</span></a></li>
|
|
42
|
+
<li><a href="../namche.html"><span>🚪</span> <span>NAMCHE</span></a></li>
|
|
43
|
+
<li><a href="../doko.html"><span>🧺</span> <span>DOKO</span></a></li>
|
|
44
|
+
<li><a href="../sherpa.html"><span>🧗</span> <span>SHERPA</span></a></li>
|
|
45
|
+
<li><a href="../mandala.html"><span>🌐</span> <span>MANDALA</span></a></li>
|
|
46
|
+
<li><a href="../mantra.html"><span>🕉️</span> <span>MANTRA</span></a></li>
|
|
47
|
+
<li><a href="../gumba.html"><span>🛕</span> <span>GUMBA</span></a></li>
|
|
48
|
+
<li><a href="../yurt.html"><span>🏕️</span> <span>YURT</span></a></li>
|
|
49
|
+
<li><a href="../katha.html"><span>💬</span> <span>KATHA</span></a></li>
|
|
50
|
+
<li><a href="../vani.html"><span>🎙️</span> <span>VANI</span></a></li>
|
|
51
|
+
<li><a href="../darshan.html"><span>👁️</span> <span>DARSHAN</span></a></li>
|
|
52
|
+
<li><a href="../stupa.html"><span>🛕</span> <span>STUPA</span></a></li>
|
|
53
|
+
<li><a href="../lama.html"><span>🔮</span> <span>LAMA</span></a></li>
|
|
54
|
+
<li><a href="../mani.html"><span>⏱️</span> <span>MANI</span></a></li>
|
|
55
|
+
<li><a href="../karma.html"><span>☯️</span> <span>KARMA</span></a></li>
|
|
56
|
+
<li><a href="../tattva.html"><span>🔯</span> <span>TATTVA</span></a></li>
|
|
57
|
+
<li><a href="../tribhuj.html"><span>🔺</span> <span>TRIBHUJ</span></a></li>
|
|
58
|
+
<li><a href="../ypc27.html"><span>🔐</span> <span>YPC-27</span></a></li>
|
|
59
|
+
<li><a href="../sakshi.html"><span>👁️</span> <span>SAKSHI</span></a></li>
|
|
60
|
+
<li><a href="../geo-proof.html"><span>🌍</span> <span>PRAMAAN</span></a></li>
|
|
61
|
+
<li><a href="../trust-security.html"><span>🔒</span> <span>SURAKSHA</span></a></li>
|
|
62
|
+
<li><a href="../docs-bundle.html"><span>📚</span> <span>GRANTH</span></a></li>
|
|
63
|
+
<li><a href="../api.html"><span>📡</span> <span>API</span></a></li>
|
|
64
|
+
<li><a href="../adapters.html"><span>🔌</span> <span>Adapters</span></a></li>
|
|
65
|
+
<li><a href="../studio.html"><span>🎨</span> <span>Studio</span></a></li>
|
|
66
|
+
<li><a href="../quick-reference.html"><span>📋</span> <span>Quick Ref</span></a></li>
|
|
67
|
+
</ul>
|
|
68
|
+
</nav>
|
|
69
|
+
|
|
70
|
+
<button class="sidebar-toggle" id="sidebarToggle" title="Toggle sidebar">
|
|
71
|
+
<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
|
|
72
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 19l-7-7 7-7m8 14l-7-7 7-7" />
|
|
73
|
+
</svg>
|
|
74
|
+
</button>
|
|
75
|
+
|
|
76
|
+
<div class="sidebar-overlay" id="sidebarOverlay"></div>
|
|
77
|
+
|
|
78
|
+
<main class="docs-main" id="mainContent">
|
|
79
|
+
<div class="docs-content">
|
|
80
|
+
|
|
81
|
+
<!-- Breadcrumb -->
|
|
82
|
+
<nav class="mb-6">
|
|
83
|
+
<a href="../tutorials.html" class="text-mountain-400 hover:text-white transition">← Back to Tutorials</a>
|
|
84
|
+
</nav>
|
|
85
|
+
|
|
86
|
+
<!-- Page Header -->
|
|
87
|
+
<div class="mb-8">
|
|
88
|
+
<div class="flex items-center gap-3 mb-2">
|
|
89
|
+
<span class="text-4xl">🌍</span>
|
|
90
|
+
<h1 class="text-4xl font-bold">Using with a Domain Name</h1>
|
|
91
|
+
<span class="theme-badge text-xs px-2 py-1 rounded-full">15 min</span>
|
|
92
|
+
</div>
|
|
93
|
+
<p class="theme-accent text-lg">Point example.com to your YAKMESH node</p>
|
|
94
|
+
<p class="text-mountain-300 mt-2">
|
|
95
|
+
Make your node accessible via a custom domain with HTTPS. Professional setup for production deployments.
|
|
96
|
+
</p>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<!-- What You'll Learn -->
|
|
100
|
+
<div class="tutorial-card">
|
|
101
|
+
<h2 class="text-xl font-bold mb-4">📋 What You'll Learn</h2>
|
|
102
|
+
<ul class="space-y-2 text-mountain-300">
|
|
103
|
+
<li>• Configure DNS records (A, CNAME) for your domain</li>
|
|
104
|
+
<li>• Set up free HTTPS with Let's Encrypt</li>
|
|
105
|
+
<li>• Optional: Use Cloudflare for CDN and DDoS protection</li>
|
|
106
|
+
<li>• Optional: Configure nginx as a reverse proxy</li>
|
|
107
|
+
<li>• Update YAKMESH config for custom domain</li>
|
|
108
|
+
</ul>
|
|
109
|
+
</div>
|
|
110
|
+
|
|
111
|
+
<!-- Prerequisites -->
|
|
112
|
+
<div class="tutorial-card">
|
|
113
|
+
<h2 class="text-xl font-bold mb-4">⚡ Prerequisites</h2>
|
|
114
|
+
<ul class="space-y-2 text-mountain-300">
|
|
115
|
+
<li>• A running YAKMESH node (see <a href="../getting-started.html" class="theme-accent theme-accent-hover">Getting Started</a>)</li>
|
|
116
|
+
<li>• A domain name you control (e.g., from Namecheap, GoDaddy, Cloudflare)</li>
|
|
117
|
+
<li>• A public IP address (port forwarding configured on your router)</li>
|
|
118
|
+
<li>• Basic terminal access to your server</li>
|
|
119
|
+
</ul>
|
|
120
|
+
</div>
|
|
121
|
+
|
|
122
|
+
<!-- Step 1: Get Your Public IP -->
|
|
123
|
+
<div class="tutorial-card">
|
|
124
|
+
<div class="step-header">
|
|
125
|
+
<span class="step-number">1</span>
|
|
126
|
+
<h2 class="text-xl font-bold">Get Your Public IP Address</h2>
|
|
127
|
+
</div>
|
|
128
|
+
<p class="text-mountain-300 mb-4">
|
|
129
|
+
First, find your server's public IP address. This is what your domain will point to.
|
|
130
|
+
</p>
|
|
131
|
+
<pre class="language-bash mb-4"><code># On Linux/Mac
|
|
132
|
+
curl ifconfig.me
|
|
133
|
+
|
|
134
|
+
# On Windows PowerShell
|
|
135
|
+
(Invoke-WebRequest -Uri "https://api.ipify.org").Content</code></pre>
|
|
136
|
+
<p class="text-mountain-300 mb-4">
|
|
137
|
+
You should get an IP address like <code class="bg-mountain-800 px-2 py-1 rounded">203.0.113.45</code>.
|
|
138
|
+
</p>
|
|
139
|
+
<div class="theme-callout rounded-lg p-4 border">
|
|
140
|
+
<p class="font-semibold theme-accent mb-1">💡 Dynamic IP?</p>
|
|
141
|
+
<p class="text-sm text-mountain-300">
|
|
142
|
+
If your ISP assigns a dynamic IP, consider using a dynamic DNS service like
|
|
143
|
+
<a href="https://www.duckdns.org" class="theme-accent theme-accent-hover" target="_blank">DuckDNS</a> or
|
|
144
|
+
<a href="https://www.noip.com" class="theme-accent theme-accent-hover" target="_blank">No-IP</a>.
|
|
145
|
+
</p>
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
<!-- Step 2: Configure DNS -->
|
|
150
|
+
<div class="tutorial-card">
|
|
151
|
+
<div class="step-header">
|
|
152
|
+
<span class="step-number">2</span>
|
|
153
|
+
<h2 class="text-xl font-bold">Configure DNS Records</h2>
|
|
154
|
+
</div>
|
|
155
|
+
<p class="text-mountain-300 mb-4">
|
|
156
|
+
Log in to your domain registrar's DNS management panel and add these records:
|
|
157
|
+
</p>
|
|
158
|
+
|
|
159
|
+
<h3 class="font-semibold text-lg mb-3">Option A: Root Domain (example.com)</h3>
|
|
160
|
+
<div class="overflow-x-auto mb-6">
|
|
161
|
+
<table class="w-full text-sm">
|
|
162
|
+
<thead>
|
|
163
|
+
<tr class="border-b border-mountain-700">
|
|
164
|
+
<th class="text-left py-2 px-3">Type</th>
|
|
165
|
+
<th class="text-left py-2 px-3">Name</th>
|
|
166
|
+
<th class="text-left py-2 px-3">Value</th>
|
|
167
|
+
<th class="text-left py-2 px-3">TTL</th>
|
|
168
|
+
</tr>
|
|
169
|
+
</thead>
|
|
170
|
+
<tbody class="text-mountain-300">
|
|
171
|
+
<tr class="border-b border-mountain-800">
|
|
172
|
+
<td class="py-2 px-3 font-mono theme-accent">A</td>
|
|
173
|
+
<td class="py-2 px-3">@</td>
|
|
174
|
+
<td class="py-2 px-3">203.0.113.45</td>
|
|
175
|
+
<td class="py-2 px-3">3600</td>
|
|
176
|
+
</tr>
|
|
177
|
+
</tbody>
|
|
178
|
+
</table>
|
|
179
|
+
</div>
|
|
180
|
+
|
|
181
|
+
<h3 class="font-semibold text-lg mb-3">Option B: Subdomain (mesh.example.com)</h3>
|
|
182
|
+
<div class="overflow-x-auto mb-6">
|
|
183
|
+
<table class="w-full text-sm">
|
|
184
|
+
<thead>
|
|
185
|
+
<tr class="border-b border-mountain-700">
|
|
186
|
+
<th class="text-left py-2 px-3">Type</th>
|
|
187
|
+
<th class="text-left py-2 px-3">Name</th>
|
|
188
|
+
<th class="text-left py-2 px-3">Value</th>
|
|
189
|
+
<th class="text-left py-2 px-3">TTL</th>
|
|
190
|
+
</tr>
|
|
191
|
+
</thead>
|
|
192
|
+
<tbody class="text-mountain-300">
|
|
193
|
+
<tr class="border-b border-mountain-800">
|
|
194
|
+
<td class="py-2 px-3 font-mono theme-accent">A</td>
|
|
195
|
+
<td class="py-2 px-3">mesh</td>
|
|
196
|
+
<td class="py-2 px-3">203.0.113.45</td>
|
|
197
|
+
<td class="py-2 px-3">3600</td>
|
|
198
|
+
</tr>
|
|
199
|
+
<tr class="border-b border-mountain-800">
|
|
200
|
+
<td class="py-2 px-3 font-mono theme-accent">CNAME</td>
|
|
201
|
+
<td class="py-2 px-3">www.mesh</td>
|
|
202
|
+
<td class="py-2 px-3">mesh.example.com</td>
|
|
203
|
+
<td class="py-2 px-3">3600</td>
|
|
204
|
+
</tr>
|
|
205
|
+
</tbody>
|
|
206
|
+
</table>
|
|
207
|
+
</div>
|
|
208
|
+
|
|
209
|
+
<p class="text-mountain-300">
|
|
210
|
+
DNS changes can take up to 48 hours to propagate, but usually complete within 15-30 minutes.
|
|
211
|
+
</p>
|
|
212
|
+
<pre class="language-bash mt-4"><code># Verify DNS propagation
|
|
213
|
+
nslookup mesh.example.com
|
|
214
|
+
# Or use dig
|
|
215
|
+
dig mesh.example.com +short</code></pre>
|
|
216
|
+
</div>
|
|
217
|
+
|
|
218
|
+
<!-- Step 3: Port Forwarding -->
|
|
219
|
+
<div class="tutorial-card">
|
|
220
|
+
<div class="step-header">
|
|
221
|
+
<span class="step-number">3</span>
|
|
222
|
+
<h2 class="text-xl font-bold">Configure Port Forwarding</h2>
|
|
223
|
+
</div>
|
|
224
|
+
<p class="text-mountain-300 mb-4">
|
|
225
|
+
If your YAKMESH node is behind a router, forward these ports to your server:
|
|
226
|
+
</p>
|
|
227
|
+
<div class="overflow-x-auto mb-4">
|
|
228
|
+
<table class="w-full text-sm">
|
|
229
|
+
<thead>
|
|
230
|
+
<tr class="border-b border-mountain-700">
|
|
231
|
+
<th class="text-left py-2 px-3">Port</th>
|
|
232
|
+
<th class="text-left py-2 px-3">Protocol</th>
|
|
233
|
+
<th class="text-left py-2 px-3">Purpose</th>
|
|
234
|
+
</tr>
|
|
235
|
+
</thead>
|
|
236
|
+
<tbody class="text-mountain-300">
|
|
237
|
+
<tr class="border-b border-mountain-800">
|
|
238
|
+
<td class="py-2 px-3 font-mono theme-accent">80</td>
|
|
239
|
+
<td class="py-2 px-3">TCP</td>
|
|
240
|
+
<td class="py-2 px-3">HTTP (for Let's Encrypt verification)</td>
|
|
241
|
+
</tr>
|
|
242
|
+
<tr class="border-b border-mountain-800">
|
|
243
|
+
<td class="py-2 px-3 font-mono theme-accent">443</td>
|
|
244
|
+
<td class="py-2 px-3">TCP</td>
|
|
245
|
+
<td class="py-2 px-3">HTTPS (secure traffic)</td>
|
|
246
|
+
</tr>
|
|
247
|
+
<tr class="border-b border-mountain-800">
|
|
248
|
+
<td class="py-2 px-3 font-mono theme-accent">3000</td>
|
|
249
|
+
<td class="py-2 px-3">TCP</td>
|
|
250
|
+
<td class="py-2 px-3">YAKMESH Dashboard (if exposed directly)</td>
|
|
251
|
+
</tr>
|
|
252
|
+
<tr class="border-b border-mountain-800">
|
|
253
|
+
<td class="py-2 px-3 font-mono theme-accent">9001</td>
|
|
254
|
+
<td class="py-2 px-3">TCP</td>
|
|
255
|
+
<td class="py-2 px-3">WebSocket peer connections</td>
|
|
256
|
+
</tr>
|
|
257
|
+
</tbody>
|
|
258
|
+
</table>
|
|
259
|
+
</div>
|
|
260
|
+
<div class="theme-callout rounded-lg p-4 border">
|
|
261
|
+
<p class="font-semibold theme-accent mb-1">🔒 Security Note</p>
|
|
262
|
+
<p class="text-sm text-mountain-300">
|
|
263
|
+
Only forward the ports you actually need. If using nginx as a reverse proxy, you only need 80 and 443.
|
|
264
|
+
</p>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
|
|
268
|
+
<!-- Step 4: HTTPS with Let's Encrypt -->
|
|
269
|
+
<div class="tutorial-card">
|
|
270
|
+
<div class="step-header">
|
|
271
|
+
<span class="step-number">4</span>
|
|
272
|
+
<h2 class="text-xl font-bold">Set Up HTTPS with Let's Encrypt</h2>
|
|
273
|
+
</div>
|
|
274
|
+
<p class="text-mountain-300 mb-4">
|
|
275
|
+
Let's Encrypt provides free SSL certificates. We'll use Certbot to automate the process.
|
|
276
|
+
</p>
|
|
277
|
+
|
|
278
|
+
<h3 class="font-semibold text-lg mb-3">Install Certbot</h3>
|
|
279
|
+
<pre class="language-bash mb-4"><code># Ubuntu/Debian
|
|
280
|
+
sudo apt update
|
|
281
|
+
sudo apt install certbot
|
|
282
|
+
|
|
283
|
+
# CentOS/RHEL
|
|
284
|
+
sudo yum install certbot
|
|
285
|
+
|
|
286
|
+
# macOS with Homebrew
|
|
287
|
+
brew install certbot</code></pre>
|
|
288
|
+
|
|
289
|
+
<h3 class="font-semibold text-lg mb-3">Obtain Certificate (Standalone Mode)</h3>
|
|
290
|
+
<p class="text-mountain-300 mb-3">
|
|
291
|
+
Stop any service using port 80, then run:
|
|
292
|
+
</p>
|
|
293
|
+
<pre class="language-bash mb-4"><code># Stop YAKMESH temporarily
|
|
294
|
+
npx yakmesh stop
|
|
295
|
+
|
|
296
|
+
# Get certificate
|
|
297
|
+
sudo certbot certonly --standalone -d mesh.example.com
|
|
298
|
+
|
|
299
|
+
# Certificate files will be saved to:
|
|
300
|
+
# /etc/letsencrypt/live/mesh.example.com/fullchain.pem
|
|
301
|
+
# /etc/letsencrypt/live/mesh.example.com/privkey.pem</code></pre>
|
|
302
|
+
|
|
303
|
+
<h3 class="font-semibold text-lg mb-3">Auto-Renewal</h3>
|
|
304
|
+
<p class="text-mountain-300 mb-3">
|
|
305
|
+
Set up automatic certificate renewal:
|
|
306
|
+
</p>
|
|
307
|
+
<pre class="language-bash mb-4"><code># Test renewal
|
|
308
|
+
sudo certbot renew --dry-run
|
|
309
|
+
|
|
310
|
+
# Certbot automatically adds a cron job for renewal</code></pre>
|
|
311
|
+
</div>
|
|
312
|
+
|
|
313
|
+
<!-- Step 5: Configure YAKMESH -->
|
|
314
|
+
<div class="tutorial-card">
|
|
315
|
+
<div class="step-header">
|
|
316
|
+
<span class="step-number">5</span>
|
|
317
|
+
<h2 class="text-xl font-bold">Configure YAKMESH for HTTPS</h2>
|
|
318
|
+
</div>
|
|
319
|
+
<p class="text-mountain-300 mb-4">
|
|
320
|
+
Update your <code class="bg-mountain-800 px-2 py-1 rounded">yakmesh.config.js</code> to use SSL:
|
|
321
|
+
</p>
|
|
322
|
+
<pre class="language-javascript mb-4"><code>// yakmesh.config.js
|
|
323
|
+
export default {
|
|
324
|
+
node: {
|
|
325
|
+
name: 'my-mesh-node',
|
|
326
|
+
publicUrl: 'https://mesh.example.com',
|
|
327
|
+
},
|
|
328
|
+
|
|
329
|
+
server: {
|
|
330
|
+
port: 443,
|
|
331
|
+
ssl: {
|
|
332
|
+
enabled: true,
|
|
333
|
+
cert: '/etc/letsencrypt/live/mesh.example.com/fullchain.pem',
|
|
334
|
+
key: '/etc/letsencrypt/live/mesh.example.com/privkey.pem',
|
|
335
|
+
},
|
|
336
|
+
},
|
|
337
|
+
|
|
338
|
+
websocket: {
|
|
339
|
+
port: 9001,
|
|
340
|
+
ssl: {
|
|
341
|
+
enabled: true,
|
|
342
|
+
cert: '/etc/letsencrypt/live/mesh.example.com/fullchain.pem',
|
|
343
|
+
key: '/etc/letsencrypt/live/mesh.example.com/privkey.pem',
|
|
344
|
+
},
|
|
345
|
+
},
|
|
346
|
+
};</code></pre>
|
|
347
|
+
<p class="text-mountain-300">
|
|
348
|
+
Restart YAKMESH to apply changes:
|
|
349
|
+
</p>
|
|
350
|
+
<pre class="language-bash mt-3"><code>npx yakmesh start</code></pre>
|
|
351
|
+
</div>
|
|
352
|
+
|
|
353
|
+
<!-- Step 6: Cloudflare (Optional) -->
|
|
354
|
+
<div class="tutorial-card">
|
|
355
|
+
<div class="step-header">
|
|
356
|
+
<span class="step-number">6</span>
|
|
357
|
+
<h2 class="text-xl font-bold">Cloudflare Integration (Optional)</h2>
|
|
358
|
+
</div>
|
|
359
|
+
<p class="text-mountain-300 mb-4">
|
|
360
|
+
Cloudflare provides free CDN, DDoS protection, and simplified SSL. Here's how to set it up:
|
|
361
|
+
</p>
|
|
362
|
+
|
|
363
|
+
<h3 class="font-semibold text-lg mb-3">Add Your Domain to Cloudflare</h3>
|
|
364
|
+
<ol class="list-decimal list-inside space-y-2 text-mountain-300 mb-4">
|
|
365
|
+
<li>Create a free account at <a href="https://cloudflare.com" class="theme-accent theme-accent-hover" target="_blank">cloudflare.com</a></li>
|
|
366
|
+
<li>Add your domain and scan existing DNS records</li>
|
|
367
|
+
<li>Update your domain's nameservers to Cloudflare's (provided during setup)</li>
|
|
368
|
+
<li>Wait for nameserver propagation (up to 24 hours)</li>
|
|
369
|
+
</ol>
|
|
370
|
+
|
|
371
|
+
<h3 class="font-semibold text-lg mb-3">Configure Proxy Settings</h3>
|
|
372
|
+
<div class="overflow-x-auto mb-4">
|
|
373
|
+
<table class="w-full text-sm">
|
|
374
|
+
<thead>
|
|
375
|
+
<tr class="border-b border-mountain-700">
|
|
376
|
+
<th class="text-left py-2 px-3">Record</th>
|
|
377
|
+
<th class="text-left py-2 px-3">Proxy Status</th>
|
|
378
|
+
<th class="text-left py-2 px-3">Notes</th>
|
|
379
|
+
</tr>
|
|
380
|
+
</thead>
|
|
381
|
+
<tbody class="text-mountain-300">
|
|
382
|
+
<tr class="border-b border-mountain-800">
|
|
383
|
+
<td class="py-2 px-3">A (mesh)</td>
|
|
384
|
+
<td class="py-2 px-3 text-orange-400">🟠 Proxied</td>
|
|
385
|
+
<td class="py-2 px-3">Dashboard traffic goes through Cloudflare</td>
|
|
386
|
+
</tr>
|
|
387
|
+
<tr class="border-b border-mountain-800">
|
|
388
|
+
<td class="py-2 px-3">A (ws.mesh)</td>
|
|
389
|
+
<td class="py-2 px-3 text-gray-400">⚪ DNS Only</td>
|
|
390
|
+
<td class="py-2 px-3">WebSocket traffic bypasses proxy</td>
|
|
391
|
+
</tr>
|
|
392
|
+
</tbody>
|
|
393
|
+
</table>
|
|
394
|
+
</div>
|
|
395
|
+
|
|
396
|
+
<h3 class="font-semibold text-lg mb-3">SSL/TLS Settings</h3>
|
|
397
|
+
<p class="text-mountain-300 mb-3">
|
|
398
|
+
In Cloudflare dashboard → SSL/TLS:
|
|
399
|
+
</p>
|
|
400
|
+
<ul class="space-y-1 text-mountain-300 mb-4">
|
|
401
|
+
<li>• Set encryption mode to <strong>Full (strict)</strong> if you have Let's Encrypt</li>
|
|
402
|
+
<li>• Or use <strong>Full</strong> with Cloudflare Origin Certificates</li>
|
|
403
|
+
<li>• Enable <strong>Always Use HTTPS</strong></li>
|
|
404
|
+
</ul>
|
|
405
|
+
|
|
406
|
+
<div class="theme-callout rounded-lg p-4 border">
|
|
407
|
+
<p class="font-semibold theme-accent mb-1">⚠️ WebSocket Consideration</p>
|
|
408
|
+
<p class="text-sm text-mountain-300">
|
|
409
|
+
Cloudflare's free tier supports WebSockets, but for best performance with YAKMESH peer connections,
|
|
410
|
+
use a separate subdomain (e.g., ws.mesh.example.com) with proxy disabled.
|
|
411
|
+
</p>
|
|
412
|
+
</div>
|
|
413
|
+
</div>
|
|
414
|
+
|
|
415
|
+
<!-- Step 7: Nginx Reverse Proxy (Optional) -->
|
|
416
|
+
<div class="tutorial-card">
|
|
417
|
+
<div class="step-header">
|
|
418
|
+
<span class="step-number">7</span>
|
|
419
|
+
<h2 class="text-xl font-bold">Nginx Reverse Proxy (Optional)</h2>
|
|
420
|
+
</div>
|
|
421
|
+
<p class="text-mountain-300 mb-4">
|
|
422
|
+
If you're running multiple services, nginx can route traffic to YAKMESH:
|
|
423
|
+
</p>
|
|
424
|
+
|
|
425
|
+
<h3 class="font-semibold text-lg mb-3">Install nginx</h3>
|
|
426
|
+
<pre class="language-bash mb-4"><code># Ubuntu/Debian
|
|
427
|
+
sudo apt install nginx
|
|
428
|
+
|
|
429
|
+
# Start nginx
|
|
430
|
+
sudo systemctl start nginx
|
|
431
|
+
sudo systemctl enable nginx</code></pre>
|
|
432
|
+
|
|
433
|
+
<h3 class="font-semibold text-lg mb-3">Configure Virtual Host</h3>
|
|
434
|
+
<p class="text-mountain-300 mb-3">
|
|
435
|
+
Create <code class="bg-mountain-800 px-2 py-1 rounded">/etc/nginx/sites-available/yakmesh</code>:
|
|
436
|
+
</p>
|
|
437
|
+
<pre class="language-bash mb-4"><code>server {
|
|
438
|
+
listen 80;
|
|
439
|
+
server_name mesh.example.com;
|
|
440
|
+
return 301 https://$server_name$request_uri;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
server {
|
|
444
|
+
listen 443 ssl http2;
|
|
445
|
+
server_name mesh.example.com;
|
|
446
|
+
|
|
447
|
+
ssl_certificate /etc/letsencrypt/live/mesh.example.com/fullchain.pem;
|
|
448
|
+
ssl_certificate_key /etc/letsencrypt/live/mesh.example.com/privkey.pem;
|
|
449
|
+
ssl_protocols TLSv1.2 TLSv1.3;
|
|
450
|
+
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
|
|
451
|
+
ssl_prefer_server_ciphers off;
|
|
452
|
+
|
|
453
|
+
# Security headers
|
|
454
|
+
add_header X-Frame-Options DENY;
|
|
455
|
+
add_header X-Content-Type-Options nosniff;
|
|
456
|
+
add_header X-XSS-Protection "1; mode=block";
|
|
457
|
+
|
|
458
|
+
# Dashboard and API
|
|
459
|
+
location / {
|
|
460
|
+
proxy_pass http://127.0.0.1:3000;
|
|
461
|
+
proxy_http_version 1.1;
|
|
462
|
+
proxy_set_header Host $host;
|
|
463
|
+
proxy_set_header X-Real-IP $remote_addr;
|
|
464
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
465
|
+
proxy_set_header X-Forwarded-Proto $scheme;
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
# WebSocket connections
|
|
469
|
+
location /ws {
|
|
470
|
+
proxy_pass http://127.0.0.1:9001;
|
|
471
|
+
proxy_http_version 1.1;
|
|
472
|
+
proxy_set_header Upgrade $http_upgrade;
|
|
473
|
+
proxy_set_header Connection "upgrade";
|
|
474
|
+
proxy_set_header Host $host;
|
|
475
|
+
proxy_read_timeout 86400;
|
|
476
|
+
}
|
|
477
|
+
}</code></pre>
|
|
478
|
+
|
|
479
|
+
<h3 class="font-semibold text-lg mb-3">Enable and Test</h3>
|
|
480
|
+
<pre class="language-bash"><code># Enable the site
|
|
481
|
+
sudo ln -s /etc/nginx/sites-available/yakmesh /etc/nginx/sites-enabled/
|
|
482
|
+
|
|
483
|
+
# Test configuration
|
|
484
|
+
sudo nginx -t
|
|
485
|
+
|
|
486
|
+
# Reload nginx
|
|
487
|
+
sudo systemctl reload nginx</code></pre>
|
|
488
|
+
</div>
|
|
489
|
+
|
|
490
|
+
<!-- Step 8: Update YAKMESH for Proxy -->
|
|
491
|
+
<div class="tutorial-card">
|
|
492
|
+
<div class="step-header">
|
|
493
|
+
<span class="step-number">8</span>
|
|
494
|
+
<h2 class="text-xl font-bold">Update Config for Reverse Proxy</h2>
|
|
495
|
+
</div>
|
|
496
|
+
<p class="text-mountain-300 mb-4">
|
|
497
|
+
When using nginx, YAKMESH runs on localhost without SSL (nginx handles it):
|
|
498
|
+
</p>
|
|
499
|
+
<pre class="language-javascript mb-4"><code>// yakmesh.config.js - behind reverse proxy
|
|
500
|
+
export default {
|
|
501
|
+
node: {
|
|
502
|
+
name: 'my-mesh-node',
|
|
503
|
+
publicUrl: 'https://mesh.example.com',
|
|
504
|
+
},
|
|
505
|
+
|
|
506
|
+
server: {
|
|
507
|
+
host: '127.0.0.1', // Only accept local connections
|
|
508
|
+
port: 3000,
|
|
509
|
+
ssl: { enabled: false }, // nginx handles SSL
|
|
510
|
+
trustProxy: true, // Trust X-Forwarded headers
|
|
511
|
+
},
|
|
512
|
+
|
|
513
|
+
websocket: {
|
|
514
|
+
host: '127.0.0.1',
|
|
515
|
+
port: 9001,
|
|
516
|
+
publicUrl: 'wss://mesh.example.com/ws',
|
|
517
|
+
},
|
|
518
|
+
};</code></pre>
|
|
519
|
+
</div>
|
|
520
|
+
|
|
521
|
+
<!-- Verification -->
|
|
522
|
+
<div class="tutorial-card">
|
|
523
|
+
<h2 class="text-xl font-bold mb-4">✅ Verify Your Setup</h2>
|
|
524
|
+
<p class="text-mountain-300 mb-4">
|
|
525
|
+
Test that everything works:
|
|
526
|
+
</p>
|
|
527
|
+
<pre class="language-bash mb-4"><code># Check HTTPS is working
|
|
528
|
+
curl -I https://mesh.example.com
|
|
529
|
+
|
|
530
|
+
# Check health endpoint
|
|
531
|
+
curl https://mesh.example.com/health
|
|
532
|
+
|
|
533
|
+
# Test WebSocket (requires wscat: npm install -g wscat)
|
|
534
|
+
wscat -c wss://mesh.example.com/ws</code></pre>
|
|
535
|
+
<p class="text-mountain-300">
|
|
536
|
+
You should see your node responding with valid SSL certificates and health status.
|
|
537
|
+
</p>
|
|
538
|
+
</div>
|
|
539
|
+
|
|
540
|
+
<!-- Troubleshooting -->
|
|
541
|
+
<div class="tutorial-card">
|
|
542
|
+
<h2 class="text-xl font-bold mb-4">🔧 Troubleshooting</h2>
|
|
543
|
+
<div class="space-y-4">
|
|
544
|
+
<div>
|
|
545
|
+
<p class="font-semibold text-white mb-1">DNS not resolving?</p>
|
|
546
|
+
<p class="text-sm text-mountain-300">Wait longer for propagation, or try <code class="bg-mountain-800 px-1 rounded">nslookup</code> from different networks.</p>
|
|
547
|
+
</div>
|
|
548
|
+
<div>
|
|
549
|
+
<p class="font-semibold text-white mb-1">Certificate errors?</p>
|
|
550
|
+
<p class="text-sm text-mountain-300">Ensure certificates are readable by YAKMESH/nginx. Check permissions with <code class="bg-mountain-800 px-1 rounded">ls -la /etc/letsencrypt/live/</code>.</p>
|
|
551
|
+
</div>
|
|
552
|
+
<div>
|
|
553
|
+
<p class="font-semibold text-white mb-1">Connection refused?</p>
|
|
554
|
+
<p class="text-sm text-mountain-300">Check firewall rules with <code class="bg-mountain-800 px-1 rounded">sudo ufw status</code> and port forwarding on your router.</p>
|
|
555
|
+
</div>
|
|
556
|
+
<div>
|
|
557
|
+
<p class="font-semibold text-white mb-1">WebSocket failing?</p>
|
|
558
|
+
<p class="text-sm text-mountain-300">Ensure nginx config has proper WebSocket upgrade headers. Check logs with <code class="bg-mountain-800 px-1 rounded">sudo tail -f /var/log/nginx/error.log</code>.</p>
|
|
559
|
+
</div>
|
|
560
|
+
</div>
|
|
561
|
+
</div>
|
|
562
|
+
|
|
563
|
+
<!-- Success -->
|
|
564
|
+
<div class="bg-emerald-900/30 border border-emerald-600 rounded-xl p-6 mb-8">
|
|
565
|
+
<h2 class="text-xl font-bold mb-2 text-emerald-400">🎉 You Did It!</h2>
|
|
566
|
+
<p class="text-mountain-300">
|
|
567
|
+
Your YAKMESH node is now accessible via your custom domain with secure HTTPS.
|
|
568
|
+
Share your public URL <code class="bg-mountain-800 px-2 py-1 rounded">https://mesh.example.com</code>
|
|
569
|
+
with peers so they can connect to your node.
|
|
570
|
+
</p>
|
|
571
|
+
</div>
|
|
572
|
+
|
|
573
|
+
<!-- Navigation Footer -->
|
|
574
|
+
<div class="border-t border-mountain-700 mt-12 pt-8">
|
|
575
|
+
<div class="flex flex-col sm:flex-row gap-4">
|
|
576
|
+
<a href="security-basics.html" class="flex-1 block bg-mountain-800 border border-mountain-700 rounded-xl p-4 hover:border-emerald-500 transition group">
|
|
577
|
+
<div class="text-xs text-mountain-400 mb-1">← Previous</div>
|
|
578
|
+
<div class="flex items-center gap-2">
|
|
579
|
+
<span class="text-xl">🛡️</span>
|
|
580
|
+
<span class="font-semibold group-hover:text-emerald-400">Security Basics</span>
|
|
581
|
+
</div>
|
|
582
|
+
</a>
|
|
583
|
+
<a href="raspberry-pi.html" class="flex-1 block bg-mountain-800 border border-mountain-700 rounded-xl p-4 hover:border-emerald-500 transition group">
|
|
584
|
+
<div class="text-xs text-mountain-400 mb-1">Next →</div>
|
|
585
|
+
<div class="flex items-center gap-2">
|
|
586
|
+
<span class="text-xl">🍓</span>
|
|
587
|
+
<span class="font-semibold group-hover:text-emerald-400">Running on Raspberry Pi</span>
|
|
588
|
+
</div>
|
|
589
|
+
</a>
|
|
590
|
+
</div>
|
|
591
|
+
</div>
|
|
592
|
+
|
|
593
|
+
</div>
|
|
594
|
+
</main>
|
|
595
|
+
|
|
596
|
+
<footer class="docs-footer">
|
|
597
|
+
<p>© 2026 YAKMESH™</p>
|
|
598
|
+
</footer>
|
|
599
|
+
|
|
600
|
+
<script src="../prism.min.js"></script>
|
|
601
|
+
<script src="../prism-bash.min.js"></script>
|
|
602
|
+
<script src="../prism-javascript.min.js"></script>
|
|
603
|
+
<script src="../docs.js"></script>
|
|
604
|
+
</body>
|
|
605
|
+
</html>
|