@celilo/e2e 0.7.11 → 0.7.13-alpha.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.
Files changed (31) hide show
  1. package/.celilo-website-cache/_astro/docs.DwsUauWZ.css +1 -0
  2. package/.celilo-website-cache/_astro/network.BB0RR2mM.css +1 -0
  3. package/.celilo-website-cache/diagrams/physical.svg +1 -0
  4. package/.celilo-website-cache/diagrams/zone-topology.svg +1 -0
  5. package/.celilo-website-cache/docs/index.html +250 -0
  6. package/.celilo-website-cache/docs/network/index.html +300 -0
  7. package/.celilo-website-cache/favicon.svg +4 -0
  8. package/.celilo-website-cache/fonts/theia-300.otf +0 -0
  9. package/.celilo-website-cache/fonts/theia-400.otf +0 -0
  10. package/.celilo-website-cache/fonts/theia-500.otf +0 -0
  11. package/.celilo-website-cache/index.html +93 -0
  12. package/.celilo-website-cache/install.sh +330 -0
  13. package/.celilo-website-cache/modules/index.html +86 -0
  14. package/.celilo-website-cache/modules/view/index.html +69 -0
  15. package/.celilo-website-cache/vision/index.html +121 -0
  16. package/.npm-registry-cache/celilo-capabilities-0.1.10.tgz +0 -0
  17. package/.npm-registry-cache/celilo-cli-0.3.30.tgz +0 -0
  18. package/.npm-registry-cache/celilo-cli-display-0.1.9.tgz +0 -0
  19. package/.npm-registry-cache/celilo-e2e-0.7.13.tgz +0 -0
  20. package/.npm-registry-cache/celilo-event-bus-0.1.4.tgz +0 -0
  21. package/netapps/authentik.netapp +0 -0
  22. package/netapps/caddy.netapp +0 -0
  23. package/netapps/celilo-website.netapp +0 -0
  24. package/netapps/greenwave.netapp +0 -0
  25. package/netapps/homebridge.netapp +0 -0
  26. package/netapps/iptables.netapp +0 -0
  27. package/netapps/knot-unbound-internal.netapp +0 -0
  28. package/netapps/namecheap.netapp +0 -0
  29. package/netapps/technitium.netapp +0 -0
  30. package/package.json +6 -3
  31. package/src/docker-compose-generator.ts +30 -2
@@ -0,0 +1,121 @@
1
+ <!DOCTYPE html><html lang="en" data-astro-cid-5hce7sga> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="description" content="The philosophy behind Celilo — why home labs deserve the same rigor as production infrastructure."><title>Vision — Celilo</title><link rel="icon" type="image/svg+xml" href="/favicon.svg"><script>
2
+ // Resolve theme BEFORE first paint to avoid the flash of wrong
3
+ // theme. Order: explicit user choice (localStorage) → system
4
+ // preference (prefers-color-scheme) → fallback dark. The
5
+ // resolved value lands on <html data-theme="...">; CSS variables
6
+ // below pick the matching palette.
7
+ (function () {
8
+ try {
9
+ const stored = localStorage.getItem('celilo-theme');
10
+ const sys =
11
+ window.matchMedia &&
12
+ window.matchMedia('(prefers-color-scheme: light)').matches
13
+ ? 'light'
14
+ : 'dark';
15
+ const theme = stored === 'light' || stored === 'dark' ? stored : sys;
16
+ document.documentElement.setAttribute('data-theme', theme);
17
+ } catch (_e) {
18
+ document.documentElement.setAttribute('data-theme', 'dark');
19
+ }
20
+ })();
21
+ </script><link rel="stylesheet" href="/_astro/docs.DwsUauWZ.css">
22
+ <style>.page-header[data-astro-cid-ywlweo73]{padding:1.5rem 0;border-bottom:1px solid var(--border);margin-bottom:2rem}.page-header[data-astro-cid-ywlweo73] h1[data-astro-cid-ywlweo73]{font-size:2.5rem;font-weight:800;letter-spacing:-.03em;margin-bottom:.75rem}.page-header[data-astro-cid-ywlweo73] p[data-astro-cid-ywlweo73]{color:var(--muted);font-size:1.05rem}.prose[data-astro-cid-ywlweo73]{max-width:44rem}.prose[data-astro-cid-ywlweo73] h2[data-astro-cid-ywlweo73]{font-size:1.5rem;font-weight:700;letter-spacing:-.02em;margin:2.5rem 0 1rem;padding-top:2.5rem;border-top:1px solid var(--border)}.prose[data-astro-cid-ywlweo73] h2[data-astro-cid-ywlweo73]:first-child{margin-top:0;padding-top:0;border-top:none}.prose[data-astro-cid-ywlweo73] p[data-astro-cid-ywlweo73]{color:var(--muted);line-height:1.8;margin-bottom:1.25rem}.prose[data-astro-cid-ywlweo73] strong[data-astro-cid-ywlweo73]{color:var(--text)}.prose[data-astro-cid-ywlweo73] ul[data-astro-cid-ywlweo73]{color:var(--muted);padding-left:1.5rem;margin-bottom:1.25rem;line-height:1.8}.prose[data-astro-cid-ywlweo73] li[data-astro-cid-ywlweo73]{margin-bottom:.375rem}.quote[data-astro-cid-ywlweo73]{border-left:3px solid var(--accent);padding:.75rem 0 .75rem 1.5rem;margin:2rem 0}.quote[data-astro-cid-ywlweo73] p[data-astro-cid-ywlweo73]{font-size:1.1rem;font-style:italic;color:var(--text)}.quote[data-astro-cid-ywlweo73] cite[data-astro-cid-ywlweo73]{display:block;margin-top:.5rem;font-size:.85rem;font-style:normal;color:var(--muted)}
23
+ </style></head> <body data-astro-cid-5hce7sga> <!--
24
+ Background pattern — vertical streams of falling water drawn in
25
+ the geometric vocabulary of a Greek meander. The <pattern>
26
+ tile (240×240) repeats seamlessly across the viewport. Strokes
27
+ use `currentColor` so the .bg-pattern CSS rule above can tint
28
+ them via `color: var(--bg-pattern-color)` without rebuilding
29
+ the SVG. To change the streams themselves, edit the four <path>
30
+ elements below.
31
+ --> <svg class="bg-pattern" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" data-astro-cid-5hce7sga> <defs data-astro-cid-5hce7sga> <pattern id="celilo-streams" width="240" height="240" patternUnits="userSpaceOnUse" data-astro-cid-5hce7sga> <!-- Streams flow downward — the patternTransform shifts the
32
+ pattern origin by one full tile (240px) over `dur`, then
33
+ loops seamlessly. Edit `dur` for speed; delete this
34
+ <animateTransform> to freeze the flow. --> <animateTransform attributeName="patternTransform" type="translate" from="0 0" to="0 240" dur="30s" repeatCount="indefinite" data-astro-cid-5hce7sga></animateTransform> <g fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="butt" stroke-linejoin="miter" data-astro-cid-5hce7sga> <!-- Stroke color cycle — driven by SMIL inside the SVG
35
+ (not CSS `color`) because Chromium doesn't reliably
36
+ repaint strokes that resolve via currentColor when
37
+ the parent's CSS `color` is animated. Edit the
38
+ `values` list to pick your palette; semicolons
39
+ separate stops, last value should match first to
40
+ close the loop seamlessly. --> <animate attributeName="stroke" values="#818cf8;#f472b6;#4ade80;#22d3ee;#818cf8" dur="10s" repeatCount="indefinite" data-astro-cid-5hce7sga></animate> <!-- Stream A (x=40): big staircase cascade near top, single hook near bottom --> <path d="M 40,0 V 30 H 55 V 45 H 70 V 60 H 55 V 75 H 40 V 175 H 25 V 195 H 40 V 240" data-astro-cid-5hce7sga></path> <!-- Stream B (x=100): small step near top, three-tier cascade in middle --> <path d="M 100,0 V 60 H 85 V 80 H 100 V 130 H 115 V 145 H 130 V 160 H 115 V 175 H 100 V 240" data-astro-cid-5hce7sga></path> <!-- Stream C (x=160): three small hooks distributed top-to-bottom --> <path d="M 160,0 V 20 H 175 V 35 H 160 V 110 H 145 V 130 H 160 V 200 H 175 V 220 H 160 V 240" data-astro-cid-5hce7sga></path> <!-- Stream D (x=220): single deep cascade in the upper-middle --> <path d="M 220,0 V 85 H 205 V 100 H 190 V 115 H 220 V 240" data-astro-cid-5hce7sga></path> </g> </pattern> </defs> <rect width="100%" height="100%" fill="url(#celilo-streams)" data-astro-cid-5hce7sga></rect> </svg> <nav data-astro-cid-5hce7sga> <div class="nav-inner" data-astro-cid-5hce7sga> <a href="/" class="nav-logo" data-astro-cid-5hce7sga>celilo</a> <ul class="nav-links" data-astro-cid-5hce7sga> <li data-astro-cid-5hce7sga> <a href="/docs" data-astro-cid-5hce7sga> <svg viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-5hce7sga> <path d="M4 5a2 2 0 0 1 2-2h11v18H6a2 2 0 0 1-2-2V5z" data-astro-cid-5hce7sga></path> <path d="M9 7h6M9 11h6M9 15h4" data-astro-cid-5hce7sga></path> </svg>
41
+ docs
42
+ </a> </li> <li data-astro-cid-5hce7sga> <a href="/modules" data-astro-cid-5hce7sga> <svg viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-5hce7sga> <rect x="3" y="3" width="7" height="7" rx="1" data-astro-cid-5hce7sga></rect> <rect x="14" y="3" width="7" height="7" rx="1" data-astro-cid-5hce7sga></rect> <rect x="3" y="14" width="7" height="7" rx="1" data-astro-cid-5hce7sga></rect> <rect x="14" y="14" width="7" height="7" rx="1" data-astro-cid-5hce7sga></rect> </svg>
43
+ modules
44
+ </a> </li> <li data-astro-cid-5hce7sga> <a href="/vision" data-astro-cid-5hce7sga> <svg viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-5hce7sga> <path d="M2 12s3.5-7 10-7 10 7 10 7-3.5 7-10 7S2 12 2 12z" data-astro-cid-5hce7sga></path> <circle cx="12" cy="12" r="3" data-astro-cid-5hce7sga></circle> </svg>
45
+ vision
46
+ </a> </li> <li data-astro-cid-5hce7sga> <a href="https://github.com/celilo/celilo" target="_blank" rel="noopener" data-astro-cid-5hce7sga> <svg viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-5hce7sga> <path d="M9 19c-4.3 1.4-4.3-2.5-6-3m12 5v-3.5c0-1 .1-1.4-.5-2 2.8-.3 5.5-1.4 5.5-6a4.6 4.6 0 0 0-1.3-3.2 4.2 4.2 0 0 0-.1-3.2s-1.1-.3-3.5 1.3a12.3 12.3 0 0 0-6.2 0C6.5 2.8 5.4 3.1 5.4 3.1a4.2 4.2 0 0 0-.1 3.2A4.6 4.6 0 0 0 4 9.5c0 4.6 2.7 5.7 5.5 6-.6.6-.6 1.2-.5 2V21" data-astro-cid-5hce7sga></path> </svg>
47
+ github
48
+ </a> </li> <li data-astro-cid-5hce7sga> <button type="button" class="theme-toggle" id="theme-toggle" aria-label="Toggle light/dark theme" title="Toggle theme" data-astro-cid-5hce7sga> <svg class="icon-sun" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-5hce7sga> <circle cx="12" cy="12" r="4" data-astro-cid-5hce7sga></circle> <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M4.93 19.07l1.41-1.41M17.66 6.34l1.41-1.41" data-astro-cid-5hce7sga></path> </svg> <svg class="icon-moon" viewBox="0 0 24 24" aria-hidden="true" data-astro-cid-5hce7sga> <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" data-astro-cid-5hce7sga></path> </svg> </button> </li> </ul> </div> </nav> <script>
49
+ // Click handler for the toggle. Reads the current data-theme,
50
+ // flips it, persists to localStorage, applies to <html>. The
51
+ // resolution script in <head> already set the initial value
52
+ // (system-aware) before paint, so this only runs on user
53
+ // interaction.
54
+ (function () {
55
+ const btn = document.getElementById('theme-toggle');
56
+ if (!btn) return;
57
+ btn.addEventListener('click', function () {
58
+ const current = document.documentElement.getAttribute('data-theme');
59
+ const next = current === 'light' ? 'dark' : 'light';
60
+ document.documentElement.setAttribute('data-theme', next);
61
+ try {
62
+ localStorage.setItem('celilo-theme', next);
63
+ } catch (_e) {
64
+ // localStorage unavailable (private mode) — toggle still
65
+ // works for the session, just doesn't persist.
66
+ }
67
+ });
68
+ })();
69
+ </script> <main data-astro-cid-5hce7sga> <div class="page-header" data-astro-cid-ywlweo73> <h1 data-astro-cid-ywlweo73>Vision</h1> <p data-astro-cid-ywlweo73>Why home labs deserve the same rigor as production infrastructure.</p> </div> <div class="prose" data-astro-cid-ywlweo73> <h2 data-astro-cid-ywlweo73>The problem with home labs</h2> <p data-astro-cid-ywlweo73>
70
+ Home labs are fascinating machines — half museum, half chaos. A Raspberry Pi running Pi-hole.
71
+ A Proxmox cluster someone built from old workstations. A VPS with a reverse proxy configured
72
+ by hand six months ago, now unmaintainable.
73
+ </p> <p data-astro-cid-ywlweo73>
74
+ The problem isn't that people don't know what they're doing. The problem is that <strong data-astro-cid-ywlweo73>no good
75
+ tooling exists for this scale</strong>. Kubernetes is designed for teams. Nomad needs a
76
+ cluster. Terraform alone doesn't know about your DNS provider. Ansible doesn't know what
77
+ services you have running. Each tool does one thing — and wiring them together is left as an
78
+ exercise for the reader.
79
+ </p> <p data-astro-cid-ywlweo73>
80
+ The result: every home lab is unique, undocumented, and unmaintainable by anyone but its owner.
81
+ Most can't be rebuilt from scratch. Many drift from their intended state over years of ad-hoc
82
+ changes. And migrating to new hardware is a weekend project that stretches into a month.
83
+ </p> <h2 data-astro-cid-ywlweo73>The Celilo approach</h2> <div class="quote" data-astro-cid-ywlweo73> <p data-astro-cid-ywlweo73>Infrastructure should be a declaration, not a procedure.</p> </div> <p data-astro-cid-ywlweo73>
84
+ Celilo treats your home lab as a collection of <strong data-astro-cid-ywlweo73>modules</strong> — each one a
85
+ well-defined unit of infrastructure with clear inputs, outputs, and dependencies. A module
86
+ declares what it needs (a DNS registrar, a firewall, a container host) and what it provides
87
+ (a public web endpoint, an identity provider, a DNS server). Celilo wires them together.
88
+ </p> <p data-astro-cid-ywlweo73>
89
+ This is the same principle that makes large-scale infrastructure manageable:
90
+ <strong data-astro-cid-ywlweo73>declarative state, dependency resolution, typed interfaces</strong>. Celilo brings
91
+ these ideas down to the scale of one person with a few machines and a domain name.
92
+ </p> <h2 data-astro-cid-ywlweo73>Capabilities, not configuration</h2> <p data-astro-cid-ywlweo73>
93
+ Celilo solves this with the <strong data-astro-cid-ywlweo73>capability system</strong>. Instead of configuring modules
94
+ with raw hostnames and IP addresses, modules declare what capability they need:
95
+ <code data-astro-cid-ywlweo73>dns_registrar</code>, <code data-astro-cid-ywlweo73>public_web</code>, <code data-astro-cid-ywlweo73>firewall</code>. Celilo resolves
96
+ those dependencies at deploy time, injecting the right implementation wherever it's needed.
97
+ </p> <p data-astro-cid-ywlweo73>
98
+ This means:
99
+ </p> <ul data-astro-cid-ywlweo73> <li data-astro-cid-ywlweo73>You can swap your DNS provider without reconfiguring every module that uses DNS.</li> <li data-astro-cid-ywlweo73>You can add a second domain and it works everywhere automatically.</li> <li data-astro-cid-ywlweo73>Modules written by others work with your infrastructure — they don't need to know the specifics.</li> </ul> <p data-astro-cid-ywlweo73>
100
+ The capability system is what lets Celilo be both opinionated and flexible. Modules follow
101
+ conventions, but the implementations are pluggable.
102
+ </p> <h2 data-astro-cid-ywlweo73>Dogfooding as a design principle</h2> <p data-astro-cid-ywlweo73>
103
+ This website is a Celilo module. The registry that serves these modules is a Celilo module.
104
+ The DNS records for <code data-astro-cid-ywlweo73>celilo.computer</code> are managed by the Namecheap module.
105
+ The TLS certificates are handled by the Caddy module.
106
+ </p> <p data-astro-cid-ywlweo73>
107
+ Every piece of infrastructure that runs Celilo itself was deployed using Celilo. This is
108
+ intentional. If something is painful to express as a module, that pain surfaces immediately
109
+ during development — not later, when real users hit it. The tool must be pleasant to use for
110
+ real work, not just in demos.
111
+ </p> <h2 data-astro-cid-ywlweo73>Where we're going</h2> <p data-astro-cid-ywlweo73>
112
+ Celilo v1 focuses on the core: module lifecycle, the capability system, and a registry of
113
+ well-crafted official modules. The goal is to make the common home lab scenarios — DNS,
114
+ reverse proxy, identity, smart home — genuinely pleasant to run.
115
+ </p> <p data-astro-cid-ywlweo73>
116
+ From there, the module ecosystem grows. Community modules. Better observability. A declarative
117
+ "desired state" model that can detect and repair drift. Multi-user support for shared home labs.
118
+ </p> <p data-astro-cid-ywlweo73>
119
+ The north star: <strong data-astro-cid-ywlweo73>your home lab should be as easy to rebuild as it was to build the
120
+ first time</strong>. That's what Celilo is for.
121
+ </p> </div> </main> <footer data-astro-cid-5hce7sga> <p data-astro-cid-5hce7sga>Celilo — home lab orchestration. Built with care.</p> </footer> </body></html>
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@celilo/e2e",
3
- "version": "0.7.11",
3
+ "version": "0.7.13-alpha.0",
4
4
  "description": "E2E test infrastructure for Celilo-deployed applications. Provides a simulated internet with DNS hierarchy, ACME server, firewalls, and target machines in Docker.",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -35,7 +35,9 @@
35
35
  "scripts/",
36
36
  "README.md",
37
37
  "netapps/*.netapp",
38
- "!netapps/celilo-registry.netapp"
38
+ "!netapps/celilo-registry.netapp",
39
+ ".celilo-website-cache/",
40
+ ".npm-registry-cache/"
39
41
  ],
40
42
  "dependencies": {
41
43
  "@celilo/cli-display": "^0.1.9",
@@ -58,5 +60,6 @@
58
60
  "type": "git",
59
61
  "url": "https://github.com/psbanka/infra",
60
62
  "directory": "packages/e2e"
61
- }
63
+ },
64
+ "gitHead": "8e436b714b3a163fe62a84394732ce28f50e7452"
62
65
  }
@@ -1,8 +1,36 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
1
3
  import { stringify } from 'yaml';
2
4
  import { SIMULATOR_IPS } from './simulator-ips';
3
5
  import type { MachineSpec, NetworkConfig, TopologyPreset } from './types';
4
6
  import { ZONE_GATEWAYS } from './types';
5
7
 
8
+ /**
9
+ * Volumes for the registry container. Picks between source-bootstrap and
10
+ * uploads-bootstrap based on where the @celilo/e2e package lives:
11
+ *
12
+ * - **Monorepo dev** — `../../modules` from the compose file (which lives
13
+ * in `packages/e2e/`) resolves to `<repo>/modules`. The registry runs
14
+ * in BOOTSTRAP_MODULES_DIR mode and packs source modules on the fly,
15
+ * so edits to a module's source flow through without manual repack.
16
+ *
17
+ * - **npm-installed consumer** (lunacycle and friends) — `../../modules`
18
+ * would resolve to `<consumer>/node_modules/modules`, which doesn't
19
+ * exist. Docker fails the mount with "permission denied" trying to
20
+ * create that path. Instead we bind the pre-shipped `./netapps/` dir
21
+ * (always present in the npm tarball) to `/uploads`, and the registry's
22
+ * scanUploadsDir picks up the .netapp files.
23
+ *
24
+ * Detection: check whether the would-be monorepo modules dir is real.
25
+ * `import.meta.dir` is `<pkgDir>/src/`, so `../../../modules` from there
26
+ * is `<repo>/modules` in the monorepo and `<consumer>/node_modules/modules`
27
+ * (nonexistent) in a consumer install.
28
+ */
29
+ function getRegistryVolumes(): string[] {
30
+ const monorepoModules = join(import.meta.dir, '..', '..', '..', 'modules');
31
+ return existsSync(monorepoModules) ? ['../../modules:/modules:ro'] : ['./netapps:/uploads:ro'];
32
+ }
33
+
6
34
  const NETWORK_DRIVER_OPTS = {
7
35
  'com.docker.network.bridge.enable_ip_masquerade': 'false',
8
36
  'com.docker.network.endpoint.sysctls': 'net.ipv4.conf.IFNAME.rp_filter=0',
@@ -233,7 +261,7 @@ export function generateSharedInfraYaml(): string {
233
261
  build: { context: '.', dockerfile: 'docker/Dockerfile.registry' },
234
262
  networks: { 'internet-external': { ipv4_address: SIMULATOR_IPS.REGISTRY } },
235
263
  cap_add: ['NET_ADMIN'],
236
- volumes: ['../../modules:/modules:ro'],
264
+ volumes: getRegistryVolumes(),
237
265
  });
238
266
 
239
267
  // External website prober simulator — mimics isitup.org's /api.json endpoint.
@@ -598,7 +626,7 @@ export function generateComposeYaml(config: NetworkConfig, celiloRoot = '..'): s
598
626
  build: { context: '.', dockerfile: 'docker/Dockerfile.registry' },
599
627
  networks: { 'internet-external': { ipv4_address: SIMULATOR_IPS.REGISTRY } },
600
628
  cap_add: ['NET_ADMIN'],
601
- volumes: ['../../modules:/modules:ro'],
629
+ volumes: getRegistryVolumes(),
602
630
  });
603
631
 
604
632
  const allMachines = [