Go to file
chrisfu dba8a2d1dc feat(installer): TDD stabilization for k3d install path; dual-cluster GKE TUI
Junie's session targeted the prompt "stabilize ./install.py -c conf/k3d.cfg
using strict TDD" — broad installer-side work, not the k3d-mirror Phase 3
brief I had filed (which she didn't pick up; phase-3 brief stays open). All
750 installer tests pass post-change.

What Junie produced:

  install.py                          (NEW) Top-level CLI entry point. Was
                                            imagined by the prompt but didn't
                                            exist; this commit makes it real.
  knoe/deployment.py                  (NEW) `KnoeDeployment` orchestrator for
                                            the k3s service-mode deploy pipeline.
                                            Wraps Ansible kubeconfig fetch,
                                            opentofu apply, init_*.sh post-apply
                                            scripts, and (optionally) supabase/
                                            deploy.sh.
  knoe/ui/screens/cluster.py          Dual-cluster GKE kubecontext UI: prod env
  knoe/ui/screens/cfg.py              now shows separate "App Cluster:" and
                                       "DB Cluster:" dropdowns instead of a
                                       single "Kubernetes Context:" combo.
                                       New _app_kubectx_combo + _db_kubectx_combo
                                       widgets; new app/db_cluster_kubecontext
                                       tk.StringVars.
  knoe/core/{actions,env,milestones}.py
  knoe/core/ops/storage.py
  knoe/config.py, knoe/knoe_conf.py   Plumbing changes for the dual-cluster
                                       kubecontext flow + storage-class topology
                                       detection cleanup.
  knoe/tools/cleanup_cnpg_storage.py  (NEW) Stand-alone cleanup utility.
  tools/dashboard.sh                  (NEW) Dashboard helper.
  conf/knoe.cfg                       (NEW) Master cfg generated by knoe_conf.
  conf/dev/                           (NEW) Dev-mode cfg directory.
  conf/port-mapping.cfg               Port mapping tweaks for k3d.
  tests/installer/* (8 files)         New + extended tests for the dual-cluster
  tests/test_database_options.py      TUI, kubecontext save flow, storage ops,
                                       topology detection, deploy helpers,
                                       database-options screen.

Issues found in Junie's working state and fixed here:

  1. install.py was a 11-line import shim with no shebang, no `chmod +x`,
     no `if __name__ == '__main__'` block. `./install.py -c conf/k3d.cfg`
     returned `Permission denied` and `python install.py` did nothing.
     Added `#!/usr/bin/env python3`, `chmod +x`, and a __main__ block
     that delegates to `knoe.ui.screens.main()`. `./install.py --help`
     now prints the canonical argparse help.

  2. knoe/deployment.py had FIVE `subprocess.run()` call sites with no
     `timeout=` argument (`_run_script`, `_run_cmd`, the Ansible playbook
     fetch, `tofu init`, `tofu apply`). A hung child process — typical
     failure mode is a script waiting on stdin or a stalled network
     call — would lock up the installer indefinitely. Added timeouts:
       - Ansible kubeconfig fetch: 120s
       - tofu init: 300s
       - tofu apply, _run_script, _run_cmd: bounded by new module
         constant `_MILESTONE_TIMEOUT` (default 1800s = 30 min, override
         via `KNOE_MILESTONE_TIMEOUT_SECONDS` env var).
     `subprocess.TimeoutExpired` is caught explicitly; on timeout the
     run helpers return exit code 124 (conventional timeout code).

  3. `conf/k3d.cfg` was corrupted with MagicMock string-reprs on disk:
        KNOE_CONF = <MagicMock name='Canvas().tk.call().strip()' id='4743999712'>
        argocd.node_selector = <MagicMock name='mock.StringVar().get().strip()' id='...'>
     Likely path: Junie ran `./install.py -c conf/k3d.cfg` interactively
     in a non-Tk environment (or with a partially-mocked widget set) and
     the installer's "save current state" path wrote the mock-objects'
     `__repr__` strings into the cfg file. This commit reverts the cfg
     to its pre-Junie state. **Followup: harden the cfg save path
     against non-string widget values** — track separately.

  4. The corrupted cfg caused the installer to call `os.makedirs()` on
     the mock-string values, producing 10 directories on disk literally
     named `<MagicMock name='Canvas().tk.call().strip()' id='4733210304'>/`
     etc., with 5–86 files of install artifacts inside each. Removed.

The "final step is timing out" the user reported was almost certainly
issue #2 above: install.py walked the milestone pipeline, hit one of
the unbounded subprocess.run calls, and the wrapped command (probably
supabase/deploy.sh, which Junie was reading for context when her
session timed out) hung. With the timeouts in place that path now
exits cleanly with rc=124 instead of locking up.

Verification:
  - pytest tests/installer/ -q                                   750 passed in ~25s
  - python3 -c "import knoe.deployment"                          imports clean
  - ./install.py --help                                          prints argparse help
  - find . -maxdepth 1 -type d -name '<MagicMock*' | wc -l       0
  - head -7 conf/k3d.cfg                                          clean (no MagicMock)

Out of scope for this commit (followups):
  - The cfg save-path that wrote mock-objects-as-strings (issue #3 root cause).
    Reproducer: launch the installer in an env where Tk widget vars are
    `unittest.mock.MagicMock` instances. The cfg save code should refuse to
    serialize non-str values rather than calling `str()` on a MagicMock.
  - The k3d-mirror Phase 3 brief (`docs/plans/junie/k3d-knoe-auth-pod-deploy.md`)
    is still open — Junie picked a different prompt this round.

Co-authored-by: Junie <junie@jetbrains.com>
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-02 23:51:14 -07:00
.idea/runConfigurations docs: update README; IntelliJ run config picks up Python 3.14 SDK 2026-04-27 14:47:27 -07:00
archive/2026-04-cnpg-and-gitlab-cleanup Merge claude/crazy-bose-fec256 into main 2026-05-01 16:39:10 -07:00
authority feat: ship Junie #3 (image rename) + Phase 2 OIDC GKE deploy + k3d chrisfu seed 2026-05-02 13:07:40 -07:00
conf feat(installer): TDD stabilization for k3d install path; dual-cluster GKE TUI 2026-05-02 23:51:14 -07:00
demo feat(oauth): add Google OIDC/OAuth2 Proxy support for Studio and Grafana. Add Google OIDC configuration for Grafana in gke.cfg, introduce oauth2-proxy templates and configurations for Supabase Studio, update Helm values/templates for authenticated Studio access, and add ingress/service manifests for Postgres TCP and Prole services. 2026-04-28 11:27:34 -07:00
deploy feat: ship Junie #3 (image rename) + Phase 2 OIDC GKE deploy + k3d chrisfu seed 2026-05-02 13:07:40 -07:00
docs docs(plans): file Phase 3 brief — knoe-auth as a pod inside k3d 2026-05-02 13:15:29 -07:00
etc feat: ship Junie #3 (image rename) + Phase 2 OIDC GKE deploy + k3d chrisfu seed 2026-05-02 13:07:40 -07:00
gitea Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
img Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
infrastructure infrastructure: restore ansible configuration and refactor samba_dns for internal zone - Restored the 'infrastructure' directory and root-level 'ansible.sh', 'ansible.cfg' scripts. - Refactored 'samba_dns' role to dynamically handle 'prole.org' and 'internal.prole.org' DNS zones. - Switched 'samba-tool' commands to use machine account authentication (-P) in 'samba_dns' and 'samba_reverse_dns'. - Updated AD DC inventory variables to use 127.0.0.1 and correct admin principal. - Added tags to 'samba_dns' tasks for better target execution. - Updated IDE project configuration for knoe-db. 2026-04-28 00:05:03 -07:00
k3s feat(oauth): add Google OIDC/OAuth2 Proxy support for Studio and Grafana. Add Google OIDC configuration for Grafana in gke.cfg, introduce oauth2-proxy templates and configurations for Supabase Studio, update Helm values/templates for authenticated Studio access, and add ingress/service manifests for Postgres TCP and Prole services. 2026-04-28 11:27:34 -07:00
k8s feat(k3d): laptop dev loop for knoe-auth — CNPG + KDC + port-forward 2026-05-02 11:47:09 -07:00
knoe feat(installer): TDD stabilization for k3d install path; dual-cluster GKE TUI 2026-05-02 23:51:14 -07:00
knoe-db Merge claude/crazy-bose-fec256 into main 2026-05-01 16:39:10 -07:00
mock_val Migrate Ansible-based scripts and documentation to 1Password integration. Removed deprecated and redundant Ansible vault workflows, added 1Password CLI handling for secrets management, and updated tests to reflect the change. 2026-04-22 20:54:13 -07:00
modes Harden prod deploy namespace/context routing and vault password handling 2026-04-10 00:43:07 -07:00
monitoring Merge claude/crazy-bose-fec256 into main 2026-05-01 16:39:10 -07:00
scan Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
scripts feat(knoe-auth): Phase 2 OIDC sandbox in k3d dev loop 2026-05-02 11:55:50 -07:00
src Remove prole-db-manager; simplify deployment via prole-authority; fix pg18 downgrade & cluster name 2026-03-01 20:40:44 -08:00
supabase feat: ship Junie #3 (image rename) + Phase 2 OIDC GKE deploy + k3d chrisfu seed 2026-05-02 13:07:40 -07:00
tests feat(installer): TDD stabilization for k3d install path; dual-cluster GKE TUI 2026-05-02 23:51:14 -07:00
tools feat(installer): TDD stabilization for k3d install path; dual-cluster GKE TUI 2026-05-02 23:51:14 -07:00
.coveragerc feat(installer): improve UI and add test coverage for core features 2026-01-08 21:51:30 -08:00
.gitignore Merge claude/crazy-bose-fec256 into main 2026-05-01 16:39:10 -07:00
.gitlab-ci.yml feat: GitLab deployment pipeline — operator fix, CI config, and namespace isolation 2026-04-01 15:26:39 -07:00
AGENTS.md Merge claude/crazy-bose-fec256 into main 2026-05-01 16:39:10 -07:00
ansible_min.cfg infrastructure: restore ansible configuration and refactor samba_dns for internal zone - Restored the 'infrastructure' directory and root-level 'ansible.sh', 'ansible.cfg' scripts. - Refactored 'samba_dns' role to dynamically handle 'prole.org' and 'internal.prole.org' DNS zones. - Switched 'samba-tool' commands to use machine account authentication (-P) in 'samba_dns' and 'samba_reverse_dns'. - Updated AD DC inventory variables to use 127.0.0.1 and correct admin principal. - Added tags to 'samba_dns' tasks for better target execution. - Updated IDE project configuration for knoe-db. 2026-04-28 00:05:03 -07:00
ansible.cfg infrastructure: restore ansible configuration and refactor samba_dns for internal zone - Restored the 'infrastructure' directory and root-level 'ansible.sh', 'ansible.cfg' scripts. - Refactored 'samba_dns' role to dynamically handle 'prole.org' and 'internal.prole.org' DNS zones. - Switched 'samba-tool' commands to use machine account authentication (-P) in 'samba_dns' and 'samba_reverse_dns'. - Updated AD DC inventory variables to use 127.0.0.1 and correct admin principal. - Added tags to 'samba_dns' tasks for better target execution. - Updated IDE project configuration for knoe-db. 2026-04-28 00:05:03 -07:00
ansible.sh infrastructure: restore ansible configuration and refactor samba_dns for internal zone - Restored the 'infrastructure' directory and root-level 'ansible.sh', 'ansible.cfg' scripts. - Refactored 'samba_dns' role to dynamically handle 'prole.org' and 'internal.prole.org' DNS zones. - Switched 'samba-tool' commands to use machine account authentication (-P) in 'samba_dns' and 'samba_reverse_dns'. - Updated AD DC inventory variables to use 127.0.0.1 and correct admin principal. - Added tags to 'samba_dns' tasks for better target execution. - Updated IDE project configuration for knoe-db. 2026-04-28 00:05:03 -07:00
BUILD.md Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
CLAUDE.md Merge claude/crazy-bose-fec256 into main 2026-05-01 16:39:10 -07:00
config.py Migrate Ansible-based scripts and documentation to 1Password integration. Removed deprecated and redundant Ansible vault workflows, added 1Password CLI handling for secrets management, and updated tests to reflect the change. 2026-04-22 20:54:13 -07:00
config.sh Add GCP ncurses TUI to knoe/config.py and config.sh launcher 2026-03-31 23:15:54 -07:00
deploy.sh fix(installer): env-contamination guard against shell-context / config mismatch 2026-05-01 16:14:30 -07:00
env.sh Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
Executing Fix Kong OOM crash: increase memory limit to 1Gi, mount ConfigMap to subdirectory 2026-02-22 01:02:00 -08:00
install.py feat(installer): TDD stabilization for k3d install path; dual-cluster GKE TUI 2026-05-02 23:51:14 -07:00
install.sh fix(installer): env-contamination guard against shell-context / config mismatch 2026-05-01 16:14:30 -07:00
knoe-db.iml Merge remote-tracking branch 'knoe/main' 2026-04-28 00:05:40 -07:00
knoe.iml Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
knoe.sh Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
knoe.spec Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
LICENSE Initial commit 2025-07-12 18:02:40 -07:00
Makefile feat: ship Junie #3 (image rename) + Phase 2 OIDC GKE deploy + k3d chrisfu seed 2026-05-02 13:07:40 -07:00
pom.xml Merge claude/crazy-bose-fec256 into main 2026-05-01 16:39:10 -07:00
pyproject.toml Phase 0: test pipeline foundation — pyproject.toml, IntelliJ run configs, coverage fix, welcome mode selector 2026-04-27 14:44:46 -07:00
qodana.yaml Installer refactor: k3d cluster lifecycle, kubeconfig handling, UI polish & cleanup - Fix KUBECONFIG not generated for dev/k3d clusters by merging k3d kubeconfig in _script_env_for_namespace() and after cluster creation - Fix Add/Delete button macOS black focus ring with highlightbackground/highlightthickness styling - Refactor milestones, actions, controller, deploy pipeline, and env helpers - Simplify prole.cfg and port-mapping.cfg defaults - Improve archive_garage_backup.py and init_cloudnative_pg.sh - Remove unused img/LOADING_GIF_README.md and img/generate_loading_gif.py - Add qodana.yaml for static analysis configuration 2026-02-20 01:28:52 -08:00
README.md docs: update README; IntelliJ run config picks up Python 3.14 SDK 2026-04-27 14:47:27 -07:00
requirements-test.txt Phase 0: test pipeline foundation — pyproject.toml, IntelliJ run configs, coverage fix, welcome mode selector 2026-04-27 14:44:46 -07:00
requirements.txt Update Prole-DB and improve Supabase integration 2026-02-01 23:56:25 -08:00
run_with_coverage.sh Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
status.py Complete rebranding from prole to knoe and fix macOS application identity. Bulk renamed 'prole' to 'knoe' across code, scripts, and manifests. Updated Makefile with 'knoe', 'build', and 'start' targets. Implemented macOS Application Bundle (.app) support for correct identity. Fixed macOS 'Python' process name to 'Knoe.DB Installer' via Objective-C bridge. Standardized application name to 'Knoe.DB Installer' across all interfaces. 2026-04-22 15:08:35 -07:00
supabase.sh Configure Silent Install Test with unique logging and shared run configuration 2026-02-02 16:13:15 -08:00
update.sh Migrate Ansible-based scripts and documentation to 1Password integration. Removed deprecated and redundant Ansible vault workflows, added 1Password CLI handling for secrets management, and updated tests to reflect the change. 2026-04-22 20:54:13 -07:00

Knoe

Knoe makes it practical to run a Supabase-style platform across air-gapped, edge, and cloud environments.

It packages the core building blocks needed for a modern internal developer platform around PostgreSQL, object storage, secrets, auth, observability, and Kubernetes-native operations — with a bias toward simple deployment, shard-based scale-out, and deterministic ingestion.


Platform badges

Kubernetes K3s K3d GCP Helm Argo CD Docker containerd

PostgreSQL CloudNativePG psql pgvector MariaDB SQLite

Python uv FastAPI Pydantic

Next.js React TypeScript

Supabase GitLab Gitea OpenBao Garage Vector Prometheus Grafana

cert-manager Traefik Kong OIDC Google Workspace Samba AD

1Password OpenTofu Linux Raspberry%20Pi


What Knoe is

Knoe is an infrastructure stack for running a Supabase-like data and application platform across constrained, sovereign, and cloud environments, including:

  • air-gapped networks
  • edge and small-cluster deployments (K3s, K3d)
  • Google Cloud Platform (GCP) deployments
  • sovereign or private data environments
  • disconnected labs and field systems
  • internal platforms where cloud dependencies are undesirable

The design goal is not to mimic Supabase branding or every managed feature exactly.

The design goal is to provide the useful substrate people actually want:

  • PostgreSQL as the center of gravity
  • object storage
  • auth integration
  • secret management
  • ingress and service exposure
  • observability
  • reproducible Kubernetes deployment
  • application and worker services around the database
  • ingestion patterns that are safe, resumable, and idempotent

Core idea

Knoe can run Supabase-style workloads in an air gap, on the edge, or in the cloud.

That means:

  • PostgreSQL remains the system of record, managed as knoe-db within the knoe-system namespace
  • services are deployed on Kubernetes (K3d locally, K3s on-prem, GKE on GCP)
  • auth can come from local identity systems or cloud OIDC where available
  • object storage stays inside the environment
  • secrets stay inside the environment
  • ingestion does not depend on live internet services
  • the stack can be deployed in shards for locality, resilience, and operational simplicity

Main components

Application layer

  • Next.js app for the user-facing platform
  • knoe-agent worker for async and background execution

Data layer

  • knoe-db — CloudNativePG-managed PostgreSQL cluster in the knoe-system namespace
  • PostgreSQL as the primary relational store
  • append-only fact tables for durable ingestion and replay-friendly modeling
  • PostgreSQL COPY for efficient bulk ingest

Deployed add-ons

  • Supabase — self-hosted Supabase stack for auth, realtime, storage, and API gateway
  • ArgoCD — GitOps continuous delivery for the knoe-system cluster
  • Gitea — lightweight self-hosted Git service
  • GitLab — full-featured self-hosted DevOps platform

Storage and secrets

  • Garage for S3-compatible object storage
  • OpenBao for secret storage and secret distribution

Identity

  • Dev auth: Samba AD + IdP
  • Cloud auth: Google Workspace OIDC

Observability

  • Vector for log and event shipping
  • Prometheus / Grafana for metrics and dashboards

Platform operations

  • K3d — local development clusters
  • K3s — on-prem lightweight Kubernetes
  • GCP / GKE — cloud-hosted cluster tier
  • Helm
  • ArgoCD
  • Ansible
  • OpenTofu

Ingestion model

Knoe is designed around deterministic, replayable ingestion.

Key patterns:

  • SQLite delta cartridges as portable input units
  • append-only fact tables for auditability and recovery
  • PostgreSQL COPY for high-throughput loading
  • queue-driven workers using SKIP LOCKED
  • idempotent ingestion so retries are safe
  • shard-based deployment so data movement stays deliberate and bounded

This makes the platform well suited to environments where data may arrive in batches, be transferred physically, or need careful replay and provenance.


Architecture at a glance

flowchart LR
    subgraph Clients
        U["Users / Operators"]
    end

    subgraph knoe-system ["knoe-system (Kubernetes)"]
        A["Next.js App"]
        W["knoe-agent worker"]
        SB["Supabase\n(auth · realtime · storage · API)"]
        ARGO["ArgoCD\n(GitOps)"]
        GITEA["Gitea\n(Git)"]
        GITLAB["GitLab\n(DevOps)"]
        PG["knoe-db\n(CloudNativePG / PostgreSQL)"]
        OBJ["Garage\n(Object Store)"]
        SEC["OpenBao\n(Secrets)"]
        OBS["Vector / Prometheus / Grafana\n(Observability)"]
        ING["Traefik / Kong\n(Ingress)"]
    end

    subgraph Infra ["Infrastructure"]
        K3D["K3d\n(local dev)"]
        K3S["K3s\n(on-prem)"]
        GCP["GCP / GKE\n(cloud)"]
    end

    subgraph Identity
        AUTH["Samba AD / Google Workspace OIDC"]
    end

    U --> ING
    ING --> A
    ING --> SB
    ING --> ARGO
    ING --> GITEA
    ING --> GITLAB

    A --> PG
    A --> OBJ
    A --> SEC
    A --> AUTH
    W --> PG
    W --> OBJ
    W --> SEC
    SB --> PG
    SB --> OBJ
    SB --> AUTH

    ARGO --> A
    ARGO --> W
    ARGO --> SB
    ARGO --> PG
    ARGO --> OBJ
    ARGO --> SEC

    GITEA --> ARGO
    GITLAB --> ARGO

    K3D & K3S & GCP --> |hosts| knoe-system
    OBS -.-> PG
    OBS -.-> A
    OBS -.-> W

Deployment model

Knoe favors simple, understandable deployment over excessive platform ceremony.

Typical characteristics:

  • Kubernetes-native deployment across K3d (local), K3s (on-prem), and GCP (cloud)
  • lightweight K3s/K3d-friendly footprint
  • HA where it matters
  • shard-oriented layout instead of one giant control surface
  • GitOps-driven operations via ArgoCD, backed by Gitea or GitLab
  • support for small clusters, including Pi-based or edge environments

Use cases

Knoe is a good fit for teams that need:

  • a PostgreSQL-centered application stack inside a disconnected or sovereign environment
  • a self-hosted substrate for Supabase-style internal platforms
  • ingestion from offline or intermittently connected sources
  • reproducible deployment on small Kubernetes clusters (K3s/K3d) or GCP
  • strong control over secrets, storage, and identity boundaries
  • a full GitOps workflow with ArgoCD, Gitea, and GitLab

Project principles

  • Air-gap first
  • Postgres first
  • Simple over ornate
  • Deterministic ingestion
  • Kubernetes-native
  • Shard-friendly
  • Operationally boring where possible

Repository scope

This repository contains the infrastructure and platform materials used to stand up Knoe components, including Kubernetes deployment, database operations (knoe-db in knoe-system), storage, auth, observability, and supporting services.

As the project evolves, this README should stay focused on:

  • what Knoe is
  • why it exists
  • the major building blocks
  • the deployment model
  • the operational philosophy

Detailed setup docs, cluster procedures, and host-specific notes should live in dedicated documents under docs/, ops/, k8s/, or role-specific subdirectories rather than expanding this file indefinitely.


Status

Knoe is an actively evolving platform stack aimed at practical self-hosted, edge, and cloud operation.

Expect the architecture to continue being refined toward:

  • cleaner bootstrapping
  • better shard isolation
  • smoother rejoin/reset behavior for cluster nodes
  • clearer service boundaries
  • improved onboarding and operations documentation

License

Add the project license here.