diff --git a/DEBUG-DOCUMENTATION.md b/DEBUG-DOCUMENTATION.md index 664fe35..f13bd75 100644 --- a/DEBUG-DOCUMENTATION.md +++ b/DEBUG-DOCUMENTATION.md @@ -1,121 +1,120 @@ -# KiteStacks Homelab — Debug Documentation +# KiteStacks Homelab — Problems We've Seen and How We Fixed Them -All known incidents, root causes, and fixes. Most recent first. +Newest problems at the top. --- -## 2026-06-18 — kscloud1 SSH Key Lost / Cannot SSH +## 2026-06-18 — Can't SSH into kscloud1 -**Symptom:** `Permission denied (publickey,password)` connecting to kscloud1. +**What happened:** Trying to connect to the cloud machine (kscloud1) gave a +"Permission denied" error. The SSH key was missing from the machine. -**Root cause:** SSH public key was removed from kscloud1's `authorized_keys`. +**How we found it:** The error message said `publickey,password` — meaning it tried +the SSH key first and then tried a password, both failed. -**Fix:** -1. Open Hetzner Cloud console → VNC terminal → log in as `root` -2. On monk, serve the public key temporarily: +**How we fixed it:** +1. Used Hetzner's browser console (like a TV remote for the server) to log in as root +2. Served the SSH public key from monk as a temporary download: ```bash + # On monk — share the key file over a mini web server cat ~/.ssh/id_ed25519_kscloud1.pub > ~/key.txt python3 -m http.server 7777 --directory ~/ ``` -3. In Hetzner console, type: +3. Downloaded it from the Hetzner console: ```bash - curl http://:7777/key.txt > /root/.ssh/authorized_keys + curl http://MONK_TAILSCALE_IP:7777/key.txt > /root/.ssh/authorized_keys ``` -4. If root SSH login was disabled: +4. If the machine had root SSH login disabled: ```bash sed -i 's/^#*PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config systemctl restart ssh ``` -**Note:** Hetzner VNC console does not support clipboard paste for long strings. -Serving the key via HTTP from monk's Tailscale IP is the reliable workaround. +**Why this works:** The Hetzner console bypasses SSH entirely — it's like plugging a +keyboard and monitor directly into the server. So even when SSH is broken, you can still +type commands. --- -## 2026-06-18 — BookStack SSO "An Error Occurred / An unknown error occurred" +## 2026-06-18 — BookStack Login Said "An Error Occurred" -**Symptom:** Clicking "Login with authentik" on BookStack shows a generic error page. -No stack trace even with `APP_DEBUG=true`. `laravel.log` is 0 bytes. +**What happened:** Clicking "Login with Authentik" on the wiki showed a generic error. +No details, no clues — just "An unknown error occurred." -**Root cause (3 compounding issues):** +**Why it happened (three problems at once):** -**Issue 1 — Wrong `OIDC_ISSUER_DISCOVER` default** -BookStack defaults to `OIDC_ISSUER_DISCOVER=false`. Without it set to `true`, BookStack -does not auto-discover endpoints from Authentik and cannot verify JWT tokens. +**Problem 1 — Missing setting in BookStack** +BookStack needs `OIDC_ISSUER_DISCOVER=true` to automatically find all the login +endpoints from Authentik. Without it, BookStack can't verify login tokens. -**Issue 2 — Authentik `issuer_mode=global` breaks discovery** -When `OIDC_ISSUER=https://auth.kitestacks.com/` (the global URL), BookStack tries to -fetch the discovery doc at `https://auth.kitestacks.com/.well-known/openid-configuration`. -Authentik's global URL returns an HTML login page, not JSON. -The app crashes silently trying to parse HTML as JSON. +**Problem 2 — Authentik was using the wrong login URL format** +Authentik can either use one shared URL for all apps or a unique URL per app. +BookStack expects a per-app URL. When the wrong type was set, BookStack tried to +download login instructions from a URL that returned an HTML page instead of data, +and then crashed trying to read it. -**Issue 3 — Root-owned cache directory blocks write** -Running `php artisan` commands inside the container as root creates cache subdirectories -owned by `root:root`. BookStack's PHP process runs as `abc` (UID 1000) and cannot write -to these directories, causing a `Permission denied` on the first OIDC login attempt. -This exception is caught by BookStack's generic handler → "An unknown error occurred". +**Problem 3 — File permission error hidden by BookStack** +Running a setup command inside the BookStack container as root created some folders +that only root could write to. When the normal BookStack process tried to save +a login session, it couldn't — and BookStack showed a generic error instead of +the real one. -**Fix:** +**How we fixed it:** -Step 1 — Change Authentik bookstack provider to `per_provider` issuer mode: +Step 1 — Change Authentik to use per-app URLs (run this once): ```bash docker run --rm --network host \ - -e PGPASSWORD="" \ - postgres:16 psql -h -U authentik authentik -c \ - "UPDATE authentik_providers_oauth2_oauth2provider SET issuer_mode='per_provider' WHERE provider_ptr_id=;" + -e PGPASSWORD="YOUR_DB_PASSWORD" \ + postgres:16 psql -h KSCLOUD1_TAILSCALE_IP -U authentik authentik -c \ + "UPDATE authentik_providers_oauth2_oauth2provider SET issuer_mode='per_provider' WHERE provider_ptr_id=PROVIDER_ID;" ``` -Step 2 — Update BookStack compose env vars: -```yaml -- OIDC_ISSUER=https://auth.kitestacks.com/application/o/bookstack/ -- OIDC_ISSUER_DISCOVER=true +Step 2 — Make sure BookStack's settings include: +``` +OIDC_ISSUER=https://auth.kitestacks.com/application/o/bookstack/ +OIDC_ISSUER_DISCOVER=true ``` -Step 3 — Fix cache permissions: +Step 3 — Fix the file permission problem: ```bash docker exec bookstack chown -R abc:users /config/www/framework/cache/ ``` -Step 4 — Restart BookStack and test: +Step 4 — Restart BookStack: ```bash docker compose up -d -# Verify OIDC redirect works -curl -sc /tmp/c.txt http://localhost:6875/login -o /tmp/l.html -CSRF=$(grep -oP 'name="_token" value="\K[^"]+' /tmp/l.html | head -1) -curl -v -b /tmp/c.txt -X POST http://localhost:6875/oidc/login -d "_token=$CSRF" --max-redirs 0 2>&1 | grep "Location:" -# Should show: Location: https://auth.kitestacks.com/application/o/authorize/?... ``` -**Key insight:** When Authentik's `issuer_mode=per_provider`, the discovery doc at -`https://auth.kitestacks.com/application/o/bookstack/.well-known/openid-configuration` -returns `issuer: https://auth.kitestacks.com/application/o/bookstack/` — this must match -`OIDC_ISSUER` exactly for JWT validation to pass. - --- -## 2026-06-18 — Portainer OAuth Users Can't See Environments +## 2026-06-18 — Portainer OAuth Login Couldn't See Any Servers -**Symptom:** After logging in via Authentik SSO, Portainer shows no environments. +**What happened:** Logged in through Authentik, got into Portainer, but no environments +(no servers, nothing to manage) were visible. -**Root cause:** Portainer CE creates OAuth users as Role:2 (regular user). Regular users -have no access to environments by default — only admins do. +**Why it happened:** Portainer creates new SSO users as "regular users." Regular users +can't see environments — only admins can. The fix is to create the user as an admin +**before** they log in for the first time. -**Fix:** Pre-create the OAuth user as Role:1 (admin) via API *before* their first login: +**How we fixed it:** + +Create the user as admin before first login: ```bash +# Get a temporary auth token TOKEN=$(curl -sk -X POST https://portainer.kitestacks.com/api/auth \ -H "Content-Type: application/json" \ - -d '{"username":"admin","password":""}' | python3 -c "import sys,json; print(json.load(sys.stdin)['jwt'])") + -d '{"username":"admin","password":"YOUR_PASSWORD"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['jwt'])") -# Note: do NOT include "Password" field for OAuth users +# Create the user with admin role (role 1 = admin) curl -sk -X POST "https://portainer.kitestacks.com/api/users" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"username":"user@example.com","role":1}' ``` -If the user already logged in as Role:2, promote them via API: +If they already logged in as a regular user, promote them: ```bash -curl -sk -X PUT "https://portainer.kitestacks.com/api/users/" \ +curl -sk -X PUT "https://portainer.kitestacks.com/api/users/USER_ID" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"role":1}' @@ -123,110 +122,88 @@ curl -sk -X PUT "https://portainer.kitestacks.com/api/users/" \ --- -## 2026-06-17 — Cloudflare Tunnel Phantom 3rd Connector +## 2026-06-17 — Three Cloudflare Connectors Instead of Two -**Symptom:** `cloudflared tunnel info` shows 3 connectors instead of 2. -Authentik OAuth codes fail with `invalid_grant` intermittently. +**What happened:** The Cloudflare dashboard was showing 3 tunnel connectors when there +should only be 2 (one from monk, one from kscloud1). This caused Authentik logins to +fail randomly — about half the time, the code from the login form would reach the wrong +connector and get rejected. -**Root cause:** The native cloudflared systemd service on monk was running alongside -the Docker container — two connectors from the same host, causing session/auth split. +**Why it happened:** The system's built-in cloudflared service was still running on monk, +alongside the Docker container version. So monk was connecting to Cloudflare twice. -**Fix:** +**How we fixed it:** ```bash sudo systemctl disable --now cloudflared ``` -Verify only 2 connectors remain in Cloudflare Zero Trust → Networks → Tunnels. +That stopped the duplicate. Now only the Docker container runs. -**Also fixed:** Authentik OAuth2 code TTL bumped from 1 min → 10 min to tolerate -reconnect windows when monk comes back online. +After fixing: verified only 2 connectors in Cloudflare Zero Trust → Networks → Tunnels. --- -## 2026-06-17 — BookStack MariaDB Crash Loop ("Table 'mysql.db' doesn't exist") +## 2026-06-17 — BookStack Database Kept Crashing -**Symptom:** `bookstack-db` container in crash loop, logs show: -`Table 'mysql.db' doesn't exist` +**What happened:** The BookStack database container (bookstack-db) kept restarting +and never stayed running. Logs showed: `Table 'mysql.db' doesn't exist` -**Root cause:** Stale/corrupt data in `./db/` from a previous partial MariaDB initialization. +**Why it happened:** The database's data folder had leftover files from a previous +incomplete setup. When MariaDB started, it saw partial old data and crashed trying +to use it. -**Fix:** Wipe the data directory (files are root-owned inside the container): +**How we fixed it:** ```bash +# Wipe the broken database files (they're owned by root inside the container) docker run --rm -v $(pwd)/db:/db alpine sh -c 'rm -rf /db/*' + +# Start fresh docker compose up -d ``` --- -## 2026-06-17 — BookStack "Name does not resolve" for bookstack-db +## 2026-06-17 — BookStack Said It Couldn't Find the Database -**Symptom:** BookStack Laravel log shows DB hostname resolution failure on first boot. +**What happened:** BookStack started but immediately errored saying it couldn't connect +to the database (bookstack-db). -**Root cause:** Race condition — BookStack ran DB migrations before MariaDB was fully -initialized and registered with Docker's embedded DNS (127.0.0.11). +**Why it happened:** BookStack was too fast. It started before the database was fully +ready, and when it tried to find `bookstack-db` on the internal network, Docker hadn't +finished registering it yet. -**Fix:** Wait for `bookstack-db` to be healthy, then restart the BookStack container: +**How we fixed it:** ```bash +# Just wait a few seconds and restart BookStack docker restart bookstack ``` ---- - -## 2026-06-09 — Root CHANGELOG Permission Issue - -**Symptom:** CHANGELOG.md could not be read/written by the normal user. - -**Root cause:** CHANGELOG.md was owned by root with 600 permissions. - -**Fix:** -```bash -sudo chown kenpat:kenpat CHANGELOG.md -chmod 644 CHANGELOG.md -``` +That's it — the database had finished starting up by then. --- -## 2026-06-09 — Repo Folder Ownership Issue - -**Symptom:** Could not create new files in the kitestacks-homelab repo directory. - -**Root cause:** Repo root folder was owned by root. - -**Fix:** -```bash -sudo chown -R kenpat:kenpat /opt/kitestacks-autosync/kitestacks-homelab -``` - ---- - -## Diagnostic Quick Reference +## Quick Diagnostic Commands ```bash -# Check which container is causing issues +# See which containers are running (and which are crashing) docker ps --format "table {{.Names}}\t{{.Status}}" -# Tail any service log -docker logs --tail 50 -f +# Follow the live logs of any service +docker logs CONTAINER_NAME --tail 50 -f -# BookStack PHP log +# Read BookStack's PHP error log docker exec bookstack cat /app/www/storage/logs/laravel.log | tail -50 -# Test BookStack OIDC flow directly +# Test if BookStack's login redirect works curl -sc /tmp/c.txt http://localhost:6875/login -o /tmp/l.html && \ CSRF=$(grep -oP 'name="_token" value="\K[^"]+' /tmp/l.html | head -1) && \ curl -v -b /tmp/c.txt -X POST http://localhost:6875/oidc/login \ -d "_token=$CSRF" --max-redirs 0 2>&1 | grep -E "HTTP|Location" +# Should show: Location: https://auth.kitestacks.com/application/o/authorize/?... -# Test Authentik discovery document -curl -s https://auth.kitestacks.com/application/o//.well-known/openid-configuration | python3 -m json.tool - -# Check Cloudflare tunnel connector count -docker exec cloudflared cloudflared tunnel info - -# Check Tailscale connectivity +# Check Tailscale connections between machines tailscale status -# PostgreSQL connectivity check (from monk) -docker run --rm --network host -e PGPASSWORD="" \ - postgres:16 psql -h -U authentik authentik -c "\l" +# See if both Cloudflare connectors are working +docker exec cloudflared cloudflared tunnel info TUNNEL_ID ``` diff --git a/README.md b/README.md index 57dd6f3..32296fc 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,55 @@ # KiteStacks Homelab - +Everything needed to run, fix, and understand the KiteStacks homelab lives here. -Private GitOps repository for the KiteStacks homelab. +## What is KiteStacks? -## Cluster +KiteStacks is a personal homelab — a set of useful web apps that run on two computers +(monk at home, kscloud1 in Germany). All the websites are accessible over the internet +through Cloudflare without exposing any home IP addresses. -- K3s -- FluxCD (planned) -- Longhorn (planned) +## How to Read This Repo -## Applications +| File / Folder | What it is | +|--------------|------------| +| `RUNBOOK.md` | **Start here.** Plain-English guide to how everything works and how to do common tasks | +| `DEBUG-DOCUMENTATION.md` | Every problem we've hit and how we solved it | +| `docs/` | Detailed setup guides for specific services (Authentik SSO, etc.) | +| `apps/` | Docker Compose files for each service | +| `clusters/` | Infrastructure-level configs | +| `projects/` | Active project notes | +| `cloud/` | Cloud-specific configurations (kscloud1) | +| `cloud-migration/` | Archive of cloud migration work and volume backups | +| `autosync/` | Auto-sync scripts that keep the repo up to date automatically | +| `osticket/` | OSTicket help-desk project notes | -- Homepage -- Authentik (SSO identity provider) -- Grafana -- Open WebUI (Kite AI) -- Forgejo -- BookStack -- OpenProject -- Kavita -- Raindrop.io (cloud, bookmark manager) -- Uptime Kuma -- LiteLLM -- Linkding -- Prometheus (monitoring, no SSO) -- Portainer (admin, no SSO) +## Services Running Right Now -## SSO +| Service | Website | What it does | +|---------|---------|--------------| +| Authentik | auth.kitestacks.com | Single login for all services | +| Portainer | portainer.kitestacks.com | Manage all Docker containers | +| Forgejo | gitforge.kitestacks.com | Git server (code + scripts) | +| BookStack | wiki.kitestacks.com | Wiki and notes | +| Grafana | grafana.kitestacks.com | Server health charts | +| Karakeep | links.kitestacks.com | Bookmark manager | +| Kavita | kavita.kitestacks.com | Ebook reader | +| OSTicket | tasks.kitestacks.com | Help desk / ticket system | +| Open WebUI | ai.kitestacks.com | AI chat (GPT, Claude, local) | +| Uptime Kuma | status.kitestacks.com | Service monitor | +| Portal | www.kitestacks.com | Homepage | -All services use [Authentik](https://auth.kitestacks.com) as the identity provider. -Setup guide: [docs/authentik-sso-setup.md](docs/authentik-sso-setup.md) +## Quick Reference -## Documentation +```bash +# Check all running containers +docker ps --format "table {{.Names}}\t{{.Status}}" -docs/KiteStacks-Homelab-Documentation-v1.3.884.md +# Restart a service +cd ~/kitestacks-live/docker/SERVICE_NAME && docker compose restart + +# View live logs +docker logs CONTAINER_NAME --tail 50 -f +``` + +All usernames and passwords go through Authentik at `https://auth.kitestacks.com`. diff --git a/RUNBOOK.md b/RUNBOOK.md index 8c6857c..54e44bc 100644 --- a/RUNBOOK.md +++ b/RUNBOOK.md @@ -1,221 +1,174 @@ -# KiteStacks Homelab — Complete Setup Runbook +# KiteStacks Homelab — How Everything Works -**Last Updated:** 2026-06-18 -**Status:** Production (monk primary, kscloud1 Hetzner cloud replica) -**Maintainer:** kenpat +**Last Updated:** 2026-06-18 +**Status:** Up and running +**Owner:** kenpat --- -## Architecture Overview +## The Big Picture + +KiteStacks is a personal homelab — a small set of programs (called "services") that run +on two computers. One computer sits at home (called **monk**), and one rents space in +a data center in Germany (called **kscloud1**). + +People on the internet can reach every website without knowing where the computers are, +because all traffic goes through **Cloudflare** — a free service that acts like a secret +post-office. Cloudflare knows the address; the rest of the world doesn't. ``` -Internet - │ - └── Cloudflare (DNS + Tunnel) - │ Active-Active across 2 connectors - ├── cloudflared on monk (primary home machine, Docker container) - └── cloudflared on kscloud1 (Hetzner VPS, ) - -Tailscale overlay network (VPN mesh): - monk - kscloud1 ← hosts shared Authentik Postgres + Redis +You (browser) + │ + └─► Cloudflare (the post office) + │ + ├─► monk (home machine, runs most services) + └─► kscloud1 (cloud backup machine in Germany) ``` -**Public subdomains** route through the same Cloudflare Tunnel token. -Both monk and kscloud1 are connectors so the site stays up if either goes offline. - -| Subdomain | Service | Port | -|-----------|---------|------| -| auth.kitestacks.com | Authentik | 9000 | -| portainer.kitestacks.com | Portainer | 9443 | -| wiki.kitestacks.com | BookStack | 6875 (monk) / 6877 (kscloud1) | -| grafana.kitestacks.com | Grafana | 3000 | -| gitforge.kitestacks.com | Forgejo | 3006 | -| links.kitestacks.com | Karakeep | 3100 | -| status.kitestacks.com | Uptime Kuma | 3001 | -| tasks.kitestacks.com | OSTicket | 8080 | -| flux.kitestacks.com | FluxCD | — | +If monk goes offline, kscloud1 keeps serving the sites — Cloudflare automatically +switches traffic over. This is called **active-active** (both doors are always open). --- -## Service Inventory +## What Runs Where -### Running on monk -authentik, authentik-worker, authentik-ldap, authentik-ldap-proxy, -bookstack, bookstack-db, cloudflared, flux, forgejo, grafana, -karakeep, karakeep-chrome, karakeep-meilisearch, kavita, -kite-litellm, kite-openwebui, kitestacks-metrics-api, kitestacks-portal, -node-exporter, ntfy, osticket, osticket-app, osticket-db, -portainer, prometheus, uptime-kuma, blackbox-exporter +### Services on monk +| What it is | What it does | Website | +|------------|--------------|---------| +| Authentik | Login manager — handles all usernames and passwords | auth.kitestacks.com | +| Portainer | Dashboard to manage all the Docker containers | portainer.kitestacks.com | +| Forgejo | Git — stores all the code and scripts | gitforge.kitestacks.com | +| BookStack | Wiki — where all the notes and guides live | wiki.kitestacks.com | +| Grafana | Charts showing how healthy the servers are | grafana.kitestacks.com | +| Karakeep | Saves and organizes bookmarks | links.kitestacks.com | +| Kavita | Reads ebooks and manga | kavita.kitestacks.com | +| OSTicket | Help-desk ticket system | tasks.kitestacks.com | +| Open WebUI | Chat with AI models (GPT, Claude, local models) | ai.kitestacks.com | +| Uptime Kuma | Watches every service and alerts if one goes down | status.kitestacks.com | +| KiteStacks Portal | The main homepage with links to everything | www.kitestacks.com | -### Running on kscloud1 (extras) -bookstack, bookstack-db-ks, kite-monitor, osticket-app-118, -osticket-db-118, www-backup, homepage-backup, cloudflared, -authentik-postgresql, authentik-redis - -### Shared infrastructure on kscloud1 -- PostgreSQL `:5432` — Authentik DB used by both hosts (Tailscale only) -- Redis `:6379` — Authentik session cache (Tailscale only) +### Services on kscloud1 (cloud backup) +- A copy of BookStack +- A copy of the main Portal +- The login database (PostgreSQL) and session memory (Redis) that Authentik uses +- The Cloudflare connector (so the site keeps running if monk is off) --- -## Cloudflare Tunnel +## Cloudflare Tunnel (the secret post office) -### How it works -Both monk and kscloud1 run `cloudflared` as Docker containers using the **same tunnel token**. Cloudflare load-balances across both connectors (active-active). The tunnel token is stored in: -- monk: `~/kitestacks-live/docker/cloudflared/.env` → `TUNNEL_TOKEN` -- kscloud1: `/opt/kitestacks/docker/cloudflared/.env` → `TUNNEL_TOKEN` +### Why it exists +Normal websites need a router setting called "port forwarding" and a fixed home IP address. +Cloudflare Tunnel removes both requirements — monk connects **out** to Cloudflare, and +Cloudflare forwards visitor traffic back in. Your home address is never exposed. -### Fix: Phantom 3rd Replica -If `cloudflared tunnel info` shows 3 connectors instead of 2, the native cloudflared systemd service on monk is running alongside the Docker container. +### How to check it's healthy +Go to Cloudflare Zero Trust → Networks → Tunnels. You should see **2 healthy connectors** +(one from monk, one from kscloud1). -```bash -# Check systemd cloudflared on monk -systemctl status cloudflared -# Disable it — Docker container is the correct one -sudo systemctl disable --now cloudflared -``` - -### Adding a new hostname route +### Adding a new website In Cloudflare Zero Trust → Networks → Tunnels → your tunnel → Edit → Public Hostname: - Subdomain: `newservice` - Domain: `kitestacks.com` -- Service: `http://container-name:port` +- Service URL: `http://container-name:port` -Both monk and kscloud1 must have the container running on the same port. +Both monk and kscloud1 need to be running that container on the same port. ---- +### Fix: If you see 3 connectors instead of 2 +The old cloudflared system service on monk is probably running alongside the Docker one. +Run this on monk to fix it: -## Authentik SSO - -### Architecture -Authentik uses a **shared database** hosted on kscloud1. monk's Authentik containers connect via Tailscale. - -- monk containers: `authentik`, `authentik-worker`, `authentik-ldap`, `authentik-ldap-proxy` -- DB: PostgreSQL on kscloud1 at `:5432` -- Redis: kscloud1 at `:6379` - -### Adding OIDC SSO for a new app - -1. In Authentik admin (`https://auth.kitestacks.com/if/admin/`): - - **Providers** → Create → OAuth2/OpenID Provider - - Name the provider after the app (e.g. `bookstack`) - - Set `issuer_mode` based on the app's requirements (see Debug doc) - - Note the Client ID and Client Secret - -2. **Application** → Create → link to the provider - -3. **Policy Binding** → bind the `default-authentication-flow` to the application - -4. Configure the app with: - - `OIDC_ISSUER` = discovery base URL - - `OIDC_CLIENT_ID` / `OIDC_CLIENT_SECRET` - - Callback URL = `https://yourapp.kitestacks.com/auth/callback` - -### Checking OIDC discovery URL ```bash -# Per-provider (issuer_mode=per_provider) -curl -s https://auth.kitestacks.com/application/o//.well-known/openid-configuration | python3 -m json.tool - -# Global (issuer_mode=global) -# Note: global issuer URL does NOT serve a JSON discovery doc at /.well-known/ -# Use per-provider mode for apps that auto-discover endpoints (BookStack, etc.) -``` - -### Changing provider issuer_mode via SQL -```bash -docker run --rm --network host \ - -e PGPASSWORD="" \ - postgres:16 psql -h -U authentik authentik -c \ - "UPDATE authentik_providers_oauth2_oauth2provider SET issuer_mode='per_provider' WHERE provider_ptr_id=;" +sudo systemctl disable --now cloudflared ``` --- -## Portainer +## Authentik (the login manager) -### OAuth setup (Authentik) -Portainer CE uses AuthenticationMethod=3 (OAuth). Configured via the BoltDB. +### What it does +Every website on KiteStacks uses Authentik for login. Instead of each website having its +own username and password, Authentik is the one source of truth. You log in once and +all the websites trust that login. This system is called **SSO** (Single Sign-On). -Key settings: -- `OAuthLoginURI`: `https://auth.kitestacks.com/application/o/authorize/` -- `OAuthTokenURI`: `https://auth.kitestacks.com/application/o/token/` -- `OAuthUserURI`: `https://auth.kitestacks.com/application/o/userinfo/` -- `OAuthClientID`: `portainer` -- `OAuthRedirectURI`: `https://portainer.kitestacks.com` -- `OAuthAutoCreateUsers`: `true` -- `OAuthDefaultTeamID`: `0` +### Where the database lives +Authentik's user database lives on **kscloud1** (not on monk). Both machines share it +through a private encrypted network called **Tailscale**. -### Pre-creating an admin user before first OAuth login -OAuth auto-created users default to Role:2 (regular user) and can't see environments. -Pre-create them as Role:1 (admin) via the API before they log in: +### Adding a new app to SSO + +1. Go to `https://auth.kitestacks.com/if/admin/` +2. **Providers** → Create → OAuth2/OpenID Provider +3. Name it after the app (e.g., `myapp`) +4. Note the Client ID and Client Secret +5. **Application** → Create → link it to the provider +6. Set up the app with: + - Login URL (your app's OIDC issuer URL) + - Client ID and Client Secret + - Callback URL: `https://yourapp.kitestacks.com/auth/callback` + +--- + +## Portainer (the container dashboard) + +### What it does +Portainer is a web dashboard that shows all running Docker containers. Think of Docker +containers like small self-contained boxes — each one runs one program. Portainer lets +you start, stop, restart, and view logs for all the boxes without typing commands. + +### If you get locked out +```bash +# Stop Portainer +docker stop portainer + +# Reset the password (the command will print a new temporary password) +docker run --rm -v portainer_data:/data portainer/helper-reset-password + +# Start it again +docker start portainer +``` + +### First-time OAuth login issue +When someone logs into Portainer through Authentik for the first time, they get created +as a regular user (not admin). They won't be able to see any servers. To fix this, +create their account as admin **before** their first login: ```bash -# Get auth token +# Step 1: Get a login token TOKEN=$(curl -sk -X POST https://portainer.kitestacks.com/api/auth \ -H "Content-Type: application/json" \ - -d '{"username":"admin","password":""}' | python3 -c "import sys,json; print(json.load(sys.stdin)['jwt'])") + -d '{"username":"admin","password":"YOUR_PASSWORD"}' | python3 -c "import sys,json; print(json.load(sys.stdin)['jwt'])") -# Create user as admin (Role:1), no password needed for OAuth users +# Step 2: Create the user as admin (role 1 = admin) curl -sk -X POST "https://portainer.kitestacks.com/api/users" \ -H "Authorization: Bearer $TOKEN" \ -H "Content-Type: application/json" \ -d '{"username":"user@example.com","role":1}' ``` -### Reset admin password (if locked out) -```bash -# Stop Portainer -docker stop portainer - -# Reset password (shows new temp password) -docker run --rm -v portainer_data:/data portainer/helper-reset-password - -# Restart -docker start portainer -``` - --- -## BookStack +## BookStack (the wiki) -### Setup (both monk and kscloud1) -Location: -- monk: `~/kitestacks-live/docker/bookstack/docker-compose.yml` -- kscloud1: `/opt/kitestacks/docker/bookstack/docker-compose.yml` +### What it does +BookStack is a self-hosted wiki — like a private Wikipedia just for this homelab. +All notes, runbooks, and guides live here. -Key environment variables: -```yaml -- APP_URL=https://wiki.kitestacks.com -- DB_HOST=bookstack-db -- AUTH_METHOD=oidc -- OIDC_ISSUER=https://auth.kitestacks.com/application/o/bookstack/ -- OIDC_ISSUER_DISCOVER=true -- OIDC_CLIENT_ID=bookstack -- OIDC_CLIENT_SECRET= -- OIDC_USER_ATTRIBUTE=email -- APP_KEY= -``` +### Important settings +BookStack uses Authentik for login. Two settings must be correct: -### Generate APP_KEY -```bash -docker run --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkey -``` +- `OIDC_ISSUER_DISCOVER=true` — tells BookStack to automatically find all login endpoints +- `OIDC_ISSUER` — must point to the per-app Authentik URL, like: + `https://auth.kitestacks.com/application/o/bookstack/` -### OIDC Configuration -BookStack uses `OIDC_ISSUER_DISCOVER=true` to auto-discover all endpoints from Authentik. -The `OIDC_ISSUER` must match the per-app discovery URL base (not the global Authentik URL). +### Fix: If cache breaks after running a PHP command +Sometimes running admin commands inside the container breaks file permissions: -The Authentik bookstack provider must have `issuer_mode='per_provider'` so its discovery -document returns the correct per-app issuer URL. See Debug doc for full troubleshooting. - -### Fix cache permissions after artisan runs -Running `php artisan` as root creates root-owned cache dirs that block the app: ```bash docker exec bookstack chown -R abc:users /config/www/framework/cache/ ``` -### Clear Laravel config/cache +### Clear BookStack's config cache ```bash docker exec bookstack php /app/www/artisan config:clear docker exec bookstack php /app/www/artisan cache:clear @@ -223,27 +176,27 @@ docker exec bookstack php /app/www/artisan cache:clear --- -## kscloud1 Access +## kscloud1 (the cloud backup machine) -### SSH +### SSH access ```bash -ssh -i ~/.ssh/id_ed25519_kscloud1 root@ +ssh -i ~/.ssh/id_ed25519_kscloud1 root@KSCLOUD1_TAILSCALE_IP ``` -### If SSH key is lost / not working -1. Open Hetzner Cloud console: `console.hetzner.cloud` → your server → Console tab -2. Log in as `root` (Linux user password) -3. Serve the key from monk over Tailscale: +### If you can't SSH in (key was lost) + +1. Open Hetzner Cloud console → your server → **Console** tab (this is like a TV remote for the server) +2. Log in as `root` using the Linux root password +3. On monk, share your public SSH key temporarily: ```bash - # On monk — start temporary HTTP server cat ~/.ssh/id_ed25519_kscloud1.pub > ~/key.txt python3 -m http.server 7777 --directory ~/ ``` -4. In Hetzner console, type: +4. In the Hetzner console, type: ```bash - curl http://:7777/key.txt > /root/.ssh/authorized_keys + curl http://MONK_TAILSCALE_IP:7777/key.txt > /root/.ssh/authorized_keys ``` -5. Enable root SSH (if needed): +5. If root SSH is disabled: ```bash sed -i 's/^#*PermitRootLogin.*/PermitRootLogin prohibit-password/' /etc/ssh/sshd_config systemctl restart ssh @@ -251,43 +204,67 @@ ssh -i ~/.ssh/id_ed25519_kscloud1 root@ --- -## OSTicket SMTP +## OSTicket (help desk) -**Config:** smtp.gmail.com:587, STARTTLS -**From:** `kitestacks.helpdesk@gmail.com` (app password stored in DB) +OSTicket is the ticket/task system at `tasks.kitestacks.com`. +Emails sent to `kitestacks.helpdesk@gmail.com` become tickets automatically. -To test email delivery: Admin Panel → Diagnostics → Send Test Email +To test that email is working: Admin Panel → Diagnostics → Send Test Email --- -## Forgejo +## Forgejo (code storage) -Runs on monk at `localhost:3006` (port 2222 for SSH git). +Forgejo is the Git server — all scripts, configs, and docs live here. -### Generate API token for automation +### Create an API token for automation ```bash docker exec -u git forgejo forgejo admin user generate-access-token \ - --username kenpat --token-name "my-token" --raw \ + --username kenpat \ + --token-name "my-token" \ + --raw \ --scopes "read:user,write:user,read:repository,write:repository" ``` +Note: SSH to gitforge.kitestacks.com only works from inside the local network, +not through Cloudflare (Cloudflare blocks non-HTTPS ports). +For git operations from monk, use `ssh://git@localhost:2222/kenpat/repo.git`. + --- -## Common Docker Operations +## Everyday Docker Commands ```bash -# View logs for a service -docker logs --tail 50 -f +# See all running containers and their status +docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" + +# View recent logs for a service +docker logs CONTAINER_NAME --tail 50 -f # Restart a service -cd ~/kitestacks-live/docker/ && docker compose restart +cd ~/kitestacks-live/docker/SERVICE_NAME +docker compose restart -# Full stack restart +# Stop and restart a service (harder reset) docker compose down && docker compose up -d -# Update a container image +# Pull latest image and restart docker compose pull && docker compose up -d - -# Check all running containers -docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" +``` + +--- + +## Tailscale (the private tunnel between machines) + +Tailscale creates an encrypted private network between monk and kscloud1. +Nothing on this network is visible to the public internet. + +Used for: +- monk connecting to kscloud1's PostgreSQL and Redis (for Authentik) +- SSH from monk to kscloud1 +- Prometheus on monk scraping metrics from kscloud1 + +To check connection status: +```bash +tailscale status ``` diff --git a/autosync/.gitignore b/autosync/.gitignore new file mode 100644 index 0000000..f80d2e8 --- /dev/null +++ b/autosync/.gitignore @@ -0,0 +1,9 @@ +apps/authentik/postgres/ +apps/forgejo/data/gitea/gitea.db +apps/kavita/config/*.db +apps/kavita/config/*.db-wal +apps/kavita/config/*.db-shm +apps/linkding/ +*.sqlite3 +*.sqlite3-wal +*.sqlite3-shm diff --git a/autosync/CHANGELOG.md b/autosync/CHANGELOG.md new file mode 100644 index 0000000..5e2100a --- /dev/null +++ b/autosync/CHANGELOG.md @@ -0,0 +1,78 @@ +# Changelog + +All notable changes to KiteStacks Homelab are documented here. + +## [v1.3.7] — 2026-06-06 05:08:38 + +### Changed +- [autosync] 2026-06-06 05:08:38 INFO Synced: apps/forgejo/data/gitea/gitea.db +- [autosync] 2026-06-06 05:08:38 INFO Removed: apps/forgejo/data/gitea/gitea.db-journal +- apps/forgejo/data/gitea/gitea.db +- DELETED: apps/forgejo/data/gitea/gitea.db-journal + +## [v1.3.6] — 2026-06-06 05:08:20 + +### Changed +- [autosync] 2026-06-06 05:08:20 INFO Synced: apps/forgejo/data/gitea/gitea.db +- [autosync] 2026-06-06 05:08:20 INFO Removed: apps/kavita/config/kavita.db-shm +- [autosync] 2026-06-06 05:08:20 INFO Synced: apps/kavita/config/kavita.db +- [autosync] 2026-06-06 05:08:20 INFO Removed: apps/kavita/config/kavita.db-wal +- [autosync] 2026-06-06 05:08:20 INFO Removed: apps/forgejo/data/gitea/gitea.db-journal +- [autosync] 2026-06-06 05:08:20 INFO Synced: apps/linkding/data/tasks.sqlite3-wal +- apps/forgejo/data/gitea/gitea.db +- DELETED: apps/kavita/config/kavita.db-shm +- apps/kavita/config/kavita.db +- DELETED: apps/kavita/config/kavita.db-wal +- DELETED: apps/forgejo/data/gitea/gitea.db-journal +- apps/linkding/data/tasks.sqlite3-wal + +## [v1.3.5] — 2026-06-06 05:07:39 + +### Changed +- [autosync] 2026-06-06 05:07:39 INFO Synced: apps/forgejo/data/gitea/gitea.db +- [autosync] 2026-06-06 05:07:39 INFO Removed: apps/forgejo/data/gitea/gitea.db-journal +- apps/forgejo/data/gitea/gitea.db +- DELETED: apps/forgejo/data/gitea/gitea.db-journal + +## [v1.3.4] — 2026-06-06 05:07:19 + +### Changed +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/forgejo/data/gitea/gitea.db +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17715 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/pg_wal/000000010000000000000002 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17733 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17734 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17735 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/pg_xact/0000 +- [autosync] 2026-06-06 05:07:19 INFO Removed: apps/forgejo/data/gitea/gitea.db-journal +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/linkding/data/tasks.sqlite3-wal +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17722 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17720 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/global/pg_control +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/pg_logical/replorigin_checkpoint +- apps/forgejo/data/gitea/gitea.db +- apps/authentik/postgres/base/16384/17715 +- apps/authentik/postgres/pg_wal/000000010000000000000002 +- apps/authentik/postgres/base/16384/17733 +- apps/authentik/postgres/base/16384/17734 +- apps/authentik/postgres/base/16384/17735 +- apps/authentik/postgres/pg_xact/0000 +- DELETED: apps/forgejo/data/gitea/gitea.db-journal +- apps/linkding/data/tasks.sqlite3-wal +- apps/authentik/postgres/base/16384/17722 +- apps/authentik/postgres/base/16384/17720 +- apps/authentik/postgres/global/pg_control +- apps/authentik/postgres/pg_logical/replorigin_checkpoint + +## [v1.3.3] — 2026-06-06 04:54:24 + +### Changed +- [autosync] 2026-06-06 04:54:24 INFO Synced: apps/authentik/postgres/pg_wal/000000010000000000000002 +- [autosync] 2026-06-06 04:54:24 INFO Synced: apps/kavita/config/kavita.db-wal +- [autosync] 2026-06-06 04:54:24 INFO Synced: apps/linkding/data/tasks.sqlite3-wal +- [autosync] 2026-06-06 04:54:24 INFO Synced: apps/kavita/config/cache.db-wal +- apps/authentik/postgres/pg_wal/000000010000000000000002 +- apps/kavita/config/kavita.db-wal +- apps/linkding/data/tasks.sqlite3-wal +- apps/kavita/config/cache.db-wal + diff --git a/autosync/README.md b/autosync/README.md new file mode 100644 index 0000000..5f4c411 --- /dev/null +++ b/autosync/README.md @@ -0,0 +1,157 @@ +╔══════════════════════════════════════════════════════════════════╗ +║ KiteStacks Homelab — Auto-Sync Setup Guide ║ +╚══════════════════════════════════════════════════════════════════╝ + +WHAT THIS DOES +────────────── +Watches your Docker app directories for any file changes. +On each change it automatically: + + 1. Copies the changed file into the correct repo folder + ~/docker/homepage/ → apps/homepage/ + ~/docker// → apps// + /etc/kitestacks/ → clusters/assassin/ + + 2. Bumps the version in README.md + + + 3. Creates a new versioned doc file + docs/KiteStacks-Homelab-Documentation-v1.3.3.md + + 4. Appends an entry to CHANGELOG.md + + 5. Commits with your existing style: + "Automated update: 2026-06-06 03:36:00" + + 6. Pushes to Forgejo at gitforge.kitestacks.com + +It pushes to a TEST repo first so you can verify before +flipping to kenpat/kitestacks-homelab. + + +FILES +───── + setup.sh ← Run first (as root) + promote.sh ← Run to switch test → main repo + status.sh ← Health check + config/ + settings.conf.example + settings.conf ← Your config (fill this in first) + scripts/ + kitestacks-watcher.sh ← The daemon (started by systemd) + + +STEP-BY-STEP +════════════ + +1. GET A FORGEJO TOKEN + gitforge.kitestacks.com → User Settings → Applications + → Generate New Token → name it "autosync" + → Scopes: ✓ repository (read + write) + Copy it — you only see it once. + +2. CONFIGURE + cp config/settings.conf.example config/settings.conf + nano config/settings.conf + + Required changes: + FORGEJO_TOKEN="your-token-here" + WATCH_DIRS="/home/kenpat/docker /etc/kitestacks" + ↑ adjust to match where your app files live + +3. RUN SETUP + sudo bash setup.sh + + This will: + • Install git, inotify-tools, curl, jq + • Create kitestacks-homelab-autosync-test on Forgejo + • Clone it to /opt/kitestacks-autosync/ + • Bootstrap README.md and docs/ at v1.3.0 + • Install and start the systemd service + +4. VERIFY + bash status.sh + journalctl -u kitestacks-autosync -f + + Trigger a test change: + touch /home/kenpat/docker/homepage/test-autosync.txt + + Check gitforge.kitestacks.com/kenpat/kitestacks-homelab-autosync-test + You should see: + • A new commit: "Automated update: 2026-06-06 ..." + • apps/homepage/test-autosync.txt added + • README.md version bumped: 1.3.0 → 1.3.1 + • docs/KiteStacks-Homelab-Documentation-v1.3.1.md created + • CHANGELOG.md entry added + + Clean up the test file: + rm /home/kenpat/docker/homepage/test-autosync.txt + +5. PROMOTE TO MAIN REPO + sudo bash promote.sh + + Type "promote" to confirm. From this point on, all changes + go to kenpat/kitestacks-homelab. + + +HOW THE README.md VERSIONING WORKS +════════════════════════════════════ +The script tracks versions using an HTML comment tag that is +invisible when the README renders: + + # KiteStacks Homelab + + + + Private GitOps repository for the KiteStacks homelab. + ... + +This tag is injected automatically on first run (it won't +change how your README looks in the browser). + +The docs/ reference line is also kept current: + docs/KiteStacks-Homelab-Documentation-v1.3.4.md + + +DIRECTORY MAPPING +═════════════════ +When a file changes, it's placed in the repo like this: + + Server path Repo path + ───────────────────────────────── ───────────────────────────────── + ~/docker/homepage/config/… apps/homepage/config/… + ~/docker/kavita-docker-automation/… apps/kavita-docker-automation/… + /etc/kitestacks/… clusters/assassin/… + + +MANAGING THE SERVICE +════════════════════ + bash status.sh # health check + journalctl -u kitestacks-autosync -f # live logs + sudo systemctl restart kitestacks-autosync # restart + sudo systemctl stop kitestacks-autosync # stop + + +DEBOUNCE +════════ +Default: 15 seconds after the last change before committing. +This means if you save 10 files in 5 seconds, you get ONE commit +not 10. Adjust DEBOUNCE_SECONDS in settings.conf. + + +TROUBLESHOOTING +═══════════════ +Push fails with auth error + → Check FORGEJO_TOKEN is correct in settings.conf + → Re-run: sudo bash setup.sh + +"Config not found" on start + → sudo bash setup.sh (it will copy the example for you) + +Service crashes + → journalctl -u kitestacks-autosync -n 50 + → Check WATCH_DIRS path(s) exist + +Files not appearing in apps/ subfolder + → Check WATCH_DIRS in settings.conf matches your actual + Docker compose directory (e.g. /home/kenpat/docker) diff --git a/autosync/apps/homepage/deployment.yaml b/autosync/apps/homepage/deployment.yaml new file mode 100644 index 0000000..e75871f --- /dev/null +++ b/autosync/apps/homepage/deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: homepage + namespace: homepage +spec: + replicas: 1 + selector: + matchLabels: + app: homepage + template: + metadata: + labels: + app: homepage + spec: + containers: + - name: homepage + image: ghcr.io/yourusername/homepage:latest + ports: + - containerPort: 80 diff --git a/autosync/apps/homepage/kustomization.yaml b/autosync/apps/homepage/kustomization.yaml new file mode 100644 index 0000000..e3ef270 --- /dev/null +++ b/autosync/apps/homepage/kustomization.yaml @@ -0,0 +1,13 @@ +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: homepage + namespace: flux-system +spec: + interval: 1m + path: ./apps/homepage + prune: true + sourceRef: + kind: GitRepository + name: kitestacks-homelab + targetNamespace: homepage diff --git a/autosync/apps/homepage/namespace.yaml b/autosync/apps/homepage/namespace.yaml new file mode 100644 index 0000000..19d1b55 --- /dev/null +++ b/autosync/apps/homepage/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: homepage diff --git a/autosync/apps/homepage/service.yaml b/autosync/apps/homepage/service.yaml new file mode 100644 index 0000000..2b6051f --- /dev/null +++ b/autosync/apps/homepage/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: homepage + namespace: homepage +spec: + selector: + app: homepage + ports: + - protocol: TCP + port: 80 + targetPort: 80 + type: ClusterIP diff --git a/autosync/apps/kavita-docker-automation/kavita-docker-restart-cronjob.yaml b/autosync/apps/kavita-docker-automation/kavita-docker-restart-cronjob.yaml new file mode 100644 index 0000000..05b211f --- /dev/null +++ b/autosync/apps/kavita-docker-automation/kavita-docker-restart-cronjob.yaml @@ -0,0 +1,32 @@ +apiVersion: batch/v1 +kind: CronJob +metadata: + name: kavita-docker-auto-restart + namespace: automation +spec: + schedule: "*/15 * * * *" + successfulJobsHistoryLimit: 2 + failedJobsHistoryLimit: 3 + jobTemplate: + spec: + template: + spec: + restartPolicy: OnFailure + containers: + - name: restart-kavita + image: docker:27-cli + command: + - /bin/sh + - -c + - | + echo "Restarting Kavita Docker container..." + docker restart kavita + echo "Kavita restart completed." + volumeMounts: + - name: docker-sock + mountPath: /var/run/docker.sock + volumes: + - name: docker-sock + hostPath: + path: /var/run/docker.sock + type: Socket diff --git a/autosync/apps/kavita-docker-automation/kustomization.yaml b/autosync/apps/kavita-docker-automation/kustomization.yaml new file mode 100644 index 0000000..e7e1940 --- /dev/null +++ b/autosync/apps/kavita-docker-automation/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +resources: + - namespace.yaml + - kavita-docker-restart-cronjob.yaml diff --git a/autosync/apps/kavita-docker-automation/namespace.yaml b/autosync/apps/kavita-docker-automation/namespace.yaml new file mode 100644 index 0000000..4f34a0a --- /dev/null +++ b/autosync/apps/kavita-docker-automation/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: automation diff --git a/autosync/clusters/assassin/deployment.yaml b/autosync/clusters/assassin/deployment.yaml new file mode 100644 index 0000000..84fb379 --- /dev/null +++ b/autosync/clusters/assassin/deployment.yaml @@ -0,0 +1,20 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: homepage + namespace: homepage +spec: + replicas: 1 + selector: + matchLabels: + app: homepage + template: + metadata: + labels: + app: homepage + spec: + containers: + - name: homepage + image: nginx:latest + ports: + - containerPort: 80 diff --git a/autosync/clusters/assassin/flux-system/gitrepository.yaml b/autosync/clusters/assassin/flux-system/gitrepository.yaml new file mode 100644 index 0000000..81aa5ca --- /dev/null +++ b/autosync/clusters/assassin/flux-system/gitrepository.yaml @@ -0,0 +1,12 @@ +apiVersion: source.toolkit.fluxcd.io/v1 +kind: GitRepository +metadata: + name: kitestacks-homelab + namespace: flux-system +spec: + interval: 1m + url: https://gitforge.kitestacks.com/kenpat/kitestacks-homelab.git + ref: + branch: main + secretRef: + name: forgejo-auth diff --git a/autosync/clusters/assassin/flux-system/kustomization.yaml b/autosync/clusters/assassin/flux-system/kustomization.yaml new file mode 100644 index 0000000..29050fb --- /dev/null +++ b/autosync/clusters/assassin/flux-system/kustomization.yaml @@ -0,0 +1,13 @@ +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: kitestacks-homelab + namespace: flux-system +spec: + interval: 1m + path: ./apps/kavita-docker-automation + prune: true + sourceRef: + kind: GitRepository + name: kitestacks-homelab + targetNamespace: automation diff --git a/autosync/clusters/assassin/homepage.yaml b/autosync/clusters/assassin/homepage.yaml new file mode 100644 index 0000000..7fc5927 --- /dev/null +++ b/autosync/clusters/assassin/homepage.yaml @@ -0,0 +1,13 @@ +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: homepage + namespace: flux-system +spec: + interval: 1m + path: ./apps/homepage + prune: true + sourceRef: + kind: GitRepository + name: kitestacks-homelab + diff --git a/autosync/clusters/assassin/kustomization.yaml b/autosync/clusters/assassin/kustomization.yaml new file mode 100644 index 0000000..7bdad63 --- /dev/null +++ b/autosync/clusters/assassin/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1 +kind: Kustomization +resources: + - namespace.yaml + - deployment.yaml + - service.yaml diff --git a/autosync/clusters/assassin/namespace.yaml b/autosync/clusters/assassin/namespace.yaml new file mode 100644 index 0000000..19d1b55 --- /dev/null +++ b/autosync/clusters/assassin/namespace.yaml @@ -0,0 +1,4 @@ +apiVersion: v1 +kind: Namespace +metadata: + name: homepage diff --git a/autosync/clusters/assassin/service.yaml b/autosync/clusters/assassin/service.yaml new file mode 100644 index 0000000..2b6051f --- /dev/null +++ b/autosync/clusters/assassin/service.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Service +metadata: + name: homepage + namespace: homepage +spec: + selector: + app: homepage + ports: + - protocol: TCP + port: 80 + targetPort: 80 + type: ClusterIP diff --git a/autosync/docs/KiteStacks-Homelab-Documentation-v1.2.md b/autosync/docs/KiteStacks-Homelab-Documentation-v1.2.md new file mode 100644 index 0000000..e585ca3 --- /dev/null +++ b/autosync/docs/KiteStacks-Homelab-Documentation-v1.2.md @@ -0,0 +1,32 @@ +# KiteStacks Homelab Documentation v1.2 + +## Current Architecture + +KiteStacks Homelab is transitioning from Docker Compose to Kubernetes using K3s. + +## Current Server + +Hostname: Assassin +Role: Homelab server and Kubernetes control plane +Kubernetes: K3s +Status: Ready + +## Current Docker Services + +- Homepage +- Kavita +- Forgejo +- Linkding +- Grafana +- Prometheus +- Other supporting services + +## Kubernetes Milestone + +K3s has been installed successfully. + +Verified command: + +```bash +kubectl get nodes +assassin Ready control-plane diff --git a/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.3.md b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.3.md new file mode 100644 index 0000000..f9179ac --- /dev/null +++ b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.3.md @@ -0,0 +1,48 @@ +# KiteStacks Homelab Documentation v1.3.3 + +**Version:** 1.3.3 +**Updated:** 2026-06-06 04:54:24 +**Previous:** [v1.3.2 docs](KiteStacks-Homelab-Documentation-v1.3.2.md) + +--- + +## Change Summary + +- [autosync] 2026-06-06 04:54:24 INFO Synced: apps/authentik/postgres/pg_wal/000000010000000000000002 +- [autosync] 2026-06-06 04:54:24 INFO Synced: apps/kavita/config/kavita.db-wal +- [autosync] 2026-06-06 04:54:24 INFO Synced: apps/linkding/data/tasks.sqlite3-wal +- [autosync] 2026-06-06 04:54:24 INFO Synced: apps/kavita/config/cache.db-wal +- apps/authentik/postgres/pg_wal/000000010000000000000002 +- apps/kavita/config/kavita.db-wal +- apps/linkding/data/tasks.sqlite3-wal +- apps/kavita/config/cache.db-wal + +--- + +## Cluster + +| Component | Status | +|-----------|--------| +| K3s | Active | +| FluxCD | Planned | +| Longhorn | Planned | + +## Applications + +| App | Path | +|-----|------| +| Homepage | apps/homepage/ | +| Kavita | apps/kavita-docker-automation/ | +| Linkding | apps/linkding/ | +| Forgejo | apps/forgejo/ | +| Grafana | apps/grafana/ | +| Prometheus | apps/prometheus/ | +| Authentik | apps/authentik/ | +| Open WebUI | apps/open-webui/ | +| LiteLLM | apps/litellm/ | + +## All Documentation Versions + +- [v1.2](KiteStacks-Homelab-Documentation-v1.2.md) +- [v1.3](KiteStacks-Homelab-Documentation-v1.3.md) +- [v1.3.3](KiteStacks-Homelab-Documentation-v1.3.3.md) diff --git a/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.4.md b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.4.md new file mode 100644 index 0000000..713ef19 --- /dev/null +++ b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.4.md @@ -0,0 +1,67 @@ +# KiteStacks Homelab Documentation v1.3.4 + +**Version:** 1.3.4 +**Updated:** 2026-06-06 05:07:19 +**Previous:** [v1.3.3 docs](KiteStacks-Homelab-Documentation-v1.3.3.md) + +--- + +## Change Summary + +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/forgejo/data/gitea/gitea.db +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17715 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/pg_wal/000000010000000000000002 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17733 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17734 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17735 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/pg_xact/0000 +- [autosync] 2026-06-06 05:07:19 INFO Removed: apps/forgejo/data/gitea/gitea.db-journal +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/linkding/data/tasks.sqlite3-wal +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17722 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/base/16384/17720 +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/global/pg_control +- [autosync] 2026-06-06 05:07:19 INFO Synced: apps/authentik/postgres/pg_logical/replorigin_checkpoint +- apps/forgejo/data/gitea/gitea.db +- apps/authentik/postgres/base/16384/17715 +- apps/authentik/postgres/pg_wal/000000010000000000000002 +- apps/authentik/postgres/base/16384/17733 +- apps/authentik/postgres/base/16384/17734 +- apps/authentik/postgres/base/16384/17735 +- apps/authentik/postgres/pg_xact/0000 +- DELETED: apps/forgejo/data/gitea/gitea.db-journal +- apps/linkding/data/tasks.sqlite3-wal +- apps/authentik/postgres/base/16384/17722 +- apps/authentik/postgres/base/16384/17720 +- apps/authentik/postgres/global/pg_control +- apps/authentik/postgres/pg_logical/replorigin_checkpoint + +--- + +## Cluster + +| Component | Status | +|-----------|--------| +| K3s | Active | +| FluxCD | Planned | +| Longhorn | Planned | + +## Applications + +| App | Path | +|-----|------| +| Homepage | apps/homepage/ | +| Kavita | apps/kavita-docker-automation/ | +| Linkding | apps/linkding/ | +| Forgejo | apps/forgejo/ | +| Grafana | apps/grafana/ | +| Prometheus | apps/prometheus/ | +| Authentik | apps/authentik/ | +| Open WebUI | apps/open-webui/ | +| LiteLLM | apps/litellm/ | + +## All Documentation Versions + +- [v1.2](KiteStacks-Homelab-Documentation-v1.2.md) +- [v1.3](KiteStacks-Homelab-Documentation-v1.3.md) +- [v1.3.3](KiteStacks-Homelab-Documentation-v1.3.3.md) +- [v1.3.4](KiteStacks-Homelab-Documentation-v1.3.4.md) diff --git a/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.5.md b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.5.md new file mode 100644 index 0000000..31ba710 --- /dev/null +++ b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.5.md @@ -0,0 +1,46 @@ +# KiteStacks Homelab Documentation v1.3.5 + +**Version:** 1.3.5 +**Updated:** 2026-06-06 05:07:39 +**Previous:** [v1.3.4 docs](KiteStacks-Homelab-Documentation-v1.3.4.md) + +--- + +## Change Summary + +- [autosync] 2026-06-06 05:07:39 INFO Synced: apps/forgejo/data/gitea/gitea.db +- [autosync] 2026-06-06 05:07:39 INFO Removed: apps/forgejo/data/gitea/gitea.db-journal +- apps/forgejo/data/gitea/gitea.db +- DELETED: apps/forgejo/data/gitea/gitea.db-journal + +--- + +## Cluster + +| Component | Status | +|-----------|--------| +| K3s | Active | +| FluxCD | Planned | +| Longhorn | Planned | + +## Applications + +| App | Path | +|-----|------| +| Homepage | apps/homepage/ | +| Kavita | apps/kavita-docker-automation/ | +| Linkding | apps/linkding/ | +| Forgejo | apps/forgejo/ | +| Grafana | apps/grafana/ | +| Prometheus | apps/prometheus/ | +| Authentik | apps/authentik/ | +| Open WebUI | apps/open-webui/ | +| LiteLLM | apps/litellm/ | + +## All Documentation Versions + +- [v1.2](KiteStacks-Homelab-Documentation-v1.2.md) +- [v1.3](KiteStacks-Homelab-Documentation-v1.3.md) +- [v1.3.3](KiteStacks-Homelab-Documentation-v1.3.3.md) +- [v1.3.4](KiteStacks-Homelab-Documentation-v1.3.4.md) +- [v1.3.5](KiteStacks-Homelab-Documentation-v1.3.5.md) diff --git a/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.6.md b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.6.md new file mode 100644 index 0000000..796cac1 --- /dev/null +++ b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.6.md @@ -0,0 +1,55 @@ +# KiteStacks Homelab Documentation v1.3.6 + +**Version:** 1.3.6 +**Updated:** 2026-06-06 05:08:20 +**Previous:** [v1.3.5 docs](KiteStacks-Homelab-Documentation-v1.3.5.md) + +--- + +## Change Summary + +- [autosync] 2026-06-06 05:08:20 INFO Synced: apps/forgejo/data/gitea/gitea.db +- [autosync] 2026-06-06 05:08:20 INFO Removed: apps/kavita/config/kavita.db-shm +- [autosync] 2026-06-06 05:08:20 INFO Synced: apps/kavita/config/kavita.db +- [autosync] 2026-06-06 05:08:20 INFO Removed: apps/kavita/config/kavita.db-wal +- [autosync] 2026-06-06 05:08:20 INFO Removed: apps/forgejo/data/gitea/gitea.db-journal +- [autosync] 2026-06-06 05:08:20 INFO Synced: apps/linkding/data/tasks.sqlite3-wal +- apps/forgejo/data/gitea/gitea.db +- DELETED: apps/kavita/config/kavita.db-shm +- apps/kavita/config/kavita.db +- DELETED: apps/kavita/config/kavita.db-wal +- DELETED: apps/forgejo/data/gitea/gitea.db-journal +- apps/linkding/data/tasks.sqlite3-wal + +--- + +## Cluster + +| Component | Status | +|-----------|--------| +| K3s | Active | +| FluxCD | Planned | +| Longhorn | Planned | + +## Applications + +| App | Path | +|-----|------| +| Homepage | apps/homepage/ | +| Kavita | apps/kavita-docker-automation/ | +| Linkding | apps/linkding/ | +| Forgejo | apps/forgejo/ | +| Grafana | apps/grafana/ | +| Prometheus | apps/prometheus/ | +| Authentik | apps/authentik/ | +| Open WebUI | apps/open-webui/ | +| LiteLLM | apps/litellm/ | + +## All Documentation Versions + +- [v1.2](KiteStacks-Homelab-Documentation-v1.2.md) +- [v1.3](KiteStacks-Homelab-Documentation-v1.3.md) +- [v1.3.3](KiteStacks-Homelab-Documentation-v1.3.3.md) +- [v1.3.4](KiteStacks-Homelab-Documentation-v1.3.4.md) +- [v1.3.5](KiteStacks-Homelab-Documentation-v1.3.5.md) +- [v1.3.6](KiteStacks-Homelab-Documentation-v1.3.6.md) diff --git a/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.7.md b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.7.md new file mode 100644 index 0000000..0d79966 --- /dev/null +++ b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.7.md @@ -0,0 +1,48 @@ +# KiteStacks Homelab Documentation v1.3.7 + +**Version:** 1.3.7 +**Updated:** 2026-06-06 05:08:38 +**Previous:** [v1.3.6 docs](KiteStacks-Homelab-Documentation-v1.3.6.md) + +--- + +## Change Summary + +- [autosync] 2026-06-06 05:08:38 INFO Synced: apps/forgejo/data/gitea/gitea.db +- [autosync] 2026-06-06 05:08:38 INFO Removed: apps/forgejo/data/gitea/gitea.db-journal +- apps/forgejo/data/gitea/gitea.db +- DELETED: apps/forgejo/data/gitea/gitea.db-journal + +--- + +## Cluster + +| Component | Status | +|-----------|--------| +| K3s | Active | +| FluxCD | Planned | +| Longhorn | Planned | + +## Applications + +| App | Path | +|-----|------| +| Homepage | apps/homepage/ | +| Kavita | apps/kavita-docker-automation/ | +| Linkding | apps/linkding/ | +| Forgejo | apps/forgejo/ | +| Grafana | apps/grafana/ | +| Prometheus | apps/prometheus/ | +| Authentik | apps/authentik/ | +| Open WebUI | apps/open-webui/ | +| LiteLLM | apps/litellm/ | + +## All Documentation Versions + +- [v1.2](KiteStacks-Homelab-Documentation-v1.2.md) +- [v1.3](KiteStacks-Homelab-Documentation-v1.3.md) +- [v1.3.3](KiteStacks-Homelab-Documentation-v1.3.3.md) +- [v1.3.4](KiteStacks-Homelab-Documentation-v1.3.4.md) +- [v1.3.5](KiteStacks-Homelab-Documentation-v1.3.5.md) +- [v1.3.6](KiteStacks-Homelab-Documentation-v1.3.6.md) +- [v1.3.7](KiteStacks-Homelab-Documentation-v1.3.7.md) diff --git a/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.md b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.md new file mode 100644 index 0000000..98a43b0 --- /dev/null +++ b/autosync/docs/KiteStacks-Homelab-Documentation-v1.3.md @@ -0,0 +1,339 @@ +# KiteStacks Homelab Documentation v1.3 + +## Overview + +KiteStacks Homelab is a self-hosted infrastructure platform designed around Kubernetes, GitOps, observability, AI services, digital libraries, productivity applications, and identity management. + +The homelab is currently operating in a hybrid state: + +* Existing applications continue running in Docker +* Kubernetes (K3s) has been deployed successfully +* Forgejo serves as the private Git platform +* GitOps repository has been established +* Migration to Kubernetes will occur incrementally + +--- + +# Infrastructure + +## Primary Server + +Hostname: + +```text +assassin +``` + +Role: + +```text +Primary Homelab Server +Kubernetes Control Plane +Docker Host +GitOps Management Node +``` + +Operating System: + +```text +Debian 13 +``` + +--- + +# Kubernetes + +## Distribution + +```text +K3s +``` + +Version: + +```text +v1.35.5+k3s1 +``` + +Status: + +```text +Ready +``` + +Verification: + +```bash +kubectl get nodes +``` + +Expected Result: + +```text +assassin Ready control-plane +``` + +--- + +## Kubernetes Components + +Currently Running: + +* CoreDNS +* Metrics Server +* Local Path Provisioner +* Traefik Ingress Controller + +Future Components: + +* FluxCD +* Longhorn +* Cert-Manager +* Cloudflare Tunnel +* Authentik +* Prometheus Operator + +--- + +# GitOps + +## Git Platform + +```text +Forgejo +``` + +Repository: + +```text +https://gitforge.kitestacks.com/kenpat/kitestacks-homelab.git +``` + +Visibility: + +```text +Private +``` + +Purpose: + +* Infrastructure as Code +* Kubernetes manifests +* Documentation +* Application deployment +* Disaster recovery + +--- + +## Repository Structure + +```text +kitestacks-homelab +├── apps +├── clusters +│ └── assassin +├── docs +├── infrastructure +└── media +``` + +--- + +# Current Docker Applications + +## Dashboard + +* Homepage + +## Library Services + +* Kavita + +## Knowledge Management + +* Linkding + +## Source Control + +* Forgejo + +## Monitoring + +* Grafana +* Prometheus + +--- + +# Planned Services + +## Identity + +* Authentik + +## AI + +* Open WebUI +* LiteLLM + +## Productivity + +* Plane +* OpenProject (evaluation) + +## Media + +* Audiobookshelf + +--- + +# Kavita + +## Library Location + +```text +/home/kenpat/library/books +``` + +## Current Status + +Running in Docker. + +Future migration planned to Kubernetes. + +--- + +# Cloudflare + +## Domain + +```text +kitestacks.com +``` + +Current usage: + +* Reverse proxy +* Public application access +* DNS management + +Future usage: + +* Kubernetes ingress +* Cloudflare Tunnel +* Zero Trust + +--- + +# Monitoring Strategy + +Primary Monitoring: + +* Grafana + +Metrics Collection: + +* Prometheus + +Future Monitoring: + +* Kubernetes cluster metrics +* Longhorn metrics +* Application metrics +* Node metrics + +--- + +# Migration Roadmap + +## Phase 1 (Completed) + +* Docker Homelab +* Forgejo Deployment +* K3s Installation +* GitOps Repository Creation + +## Phase 2 (Current) + +* FluxCD Installation +* GitOps Bootstrap +* Longhorn Deployment + +## Phase 3 + +* Homepage Migration +* Linkding Migration + +## Phase 4 + +* Kavita Migration +* Forgejo Migration + +## Phase 5 + +* Grafana Migration +* Prometheus Migration + +## Phase 6 + +* Authentik Deployment +* Open WebUI Deployment +* LiteLLM Deployment + +--- + +# Backup Strategy + +Planned: + +* Git repository backups +* Application volume backups +* Longhorn snapshots +* Off-site backups + +--- + +# Version History + +## Version 1.1 + +Initial Homelab Documentation + +## Version 1.2 + +K3s Installation Milestone + +## Version 1.3 + +Forgejo GitOps Repository Established +K3s Operational +Documentation Baseline Created +Ready for FluxCD Deployment + +--- + +# Current Status + +Homelab State: + +```text +Operational +``` + +Kubernetes State: + +```text +Ready +``` + +GitOps State: + +```text +Repository Created +Awaiting FluxCD Integration +``` + +Next Milestone: + +```text +FluxCD Installation and Forgejo Integration +``` diff --git a/autosync/promote.sh b/autosync/promote.sh new file mode 100644 index 0000000..2ee45ef --- /dev/null +++ b/autosync/promote.sh @@ -0,0 +1,102 @@ +#!/bin/bash +# ============================================================================= +# promote.sh +# Flips the watcher from TEST repo → kenpat/kitestacks-homelab (main). +# Run after verifying the test repo looks correct in Forgejo. +# ============================================================================= + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CONFIG_FILE="$SCRIPT_DIR/config/settings.conf" +STATE_FILE="/opt/kitestacks-autosync/.active_target" +WORK_DIR="/opt/kitestacks-autosync" + +GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m' +info() { echo -e "${GREEN}[INFO]${NC} $1"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } + +[[ $EUID -ne 0 ]] && error "Run as root: sudo bash promote.sh" +source "$CONFIG_FILE" + +CURRENT="$(cat "$STATE_FILE" 2>/dev/null || echo "test")" +if [[ "$CURRENT" == "main" ]]; then + warn "Already targeting kenpat/kitestacks-homelab. Nothing to do." + exit 0 +fi + +echo "" +warn "┌──────────────────────────────────────────────────────────────┐" +warn "│ PROMOTE: test repo → kenpat/kitestacks-homelab │" +warn "│ │" +warn "│ From: ${FORGEJO_URL}/${FORGEJO_USER}/${TEST_REPO}" +warn "│ To : ${FORGEJO_URL}/${FORGEJO_USER}/${MAIN_REPO}" +warn "│ │" +warn "│ All future auto-commits will go to the MAIN repo. │" +warn "└──────────────────────────────────────────────────────────────┘" +echo "" +read -rp "Have you verified the test repo looks correct? Type 'promote' to confirm: " CONFIRM +[[ "$CONFIRM" != "promote" ]] && { info "Aborted."; exit 0; } + +# ── Set up remote prefix ────────────────────────────────────────────────────── +if [[ "$AUTH_METHOD" == "ssh" ]]; then + REMOTE_BASE="git@gitforge.kitestacks.com:${FORGEJO_USER}" +else + REMOTE_BASE="https://gitforge.kitestacks.com/${FORGEJO_USER}" +fi + +# ── Clone main repo if not already present ──────────────────────────────────── +MAIN_DIR="$WORK_DIR/$MAIN_REPO" +if [[ ! -d "$MAIN_DIR/.git" ]]; then + info "Cloning kenpat/kitestacks-homelab..." + git clone "${REMOTE_BASE}/${MAIN_REPO}.git" "$MAIN_DIR" +fi + +cd "$MAIN_DIR" +git config user.email "$GIT_EMAIL" +git config user.name "$GIT_NAME" +git pull --rebase origin HEAD 2>/dev/null || true + +# ── Add version tag to main README.md if not already there ─────────────────── +if ! grep -q '|}" "$MAIN_DIR/README.md" + + # Update the docs reference line + sed -i "s|docs/KiteStacks-Homelab-Documentation-v.*\.md|docs/KiteStacks-Homelab-Documentation-v${TEST_VER}.md|" "$MAIN_DIR/README.md" || true + + # Copy CHANGELOG.md and docs from test repo if main doesn't have them + if [[ ! -f "$MAIN_DIR/CHANGELOG.md" ]]; then + cp "$WORK_DIR/$TEST_REPO/CHANGELOG.md" "$MAIN_DIR/CHANGELOG.md" 2>/dev/null || true + fi + if [[ ! -d "$MAIN_DIR/docs" ]]; then + cp -r "$WORK_DIR/$TEST_REPO/docs" "$MAIN_DIR/docs" 2>/dev/null || true + fi + + git add -A + git commit -m "chore: inject autosync version tracking — promoted from test" + git push origin HEAD + info "Main repo prepared for autosync." +fi + +# ── Flip state ──────────────────────────────────────────────────────────────── +echo "main" > "$STATE_FILE" +info "Active target → main (kenpat/kitestacks-homelab)" + +# ── Restart service ─────────────────────────────────────────────────────────── +info "Restarting kitestacks-autosync service..." +systemctl restart kitestacks-autosync +sleep 2 +systemctl status kitestacks-autosync --no-pager + +echo "" +echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" +info "Promotion complete!" +info " Now watching → ${FORGEJO_URL}/${FORGEJO_USER}/${MAIN_REPO}" +echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}" diff --git a/autosync/scripts/kitestacks-watcher-sh b/autosync/scripts/kitestacks-watcher-sh new file mode 100644 index 0000000..16c7e27 --- /dev/null +++ b/autosync/scripts/kitestacks-watcher-sh @@ -0,0 +1,319 @@ +#!/bin/bash +# ============================================================================= +# kitestacks-watcher.sh +# Runs as a systemd service. Watches configured directories, then on change: +# 1. Pulls latest from Forgejo (avoid conflicts) +# 2. Copies changed files into the correct apps/ or clusters/ folder +# 3. Bumps the version in README.md and the docs/ changelog file +# 4. Commits with a descriptive message +# 5. Pushes to active repo (test first, then main after promote.sh) +# ============================================================================= + +set -euo pipefail + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CONFIG_FILE="$SCRIPT_DIR/../config/settings.conf" +STATE_FILE="/opt/kitestacks-autosync/.active_target" +WORK_DIR="/opt/kitestacks-autosync" + +log() { echo "[autosync] $(date '+%Y-%m-%d %H:%M:%S') INFO $*"; } +warn() { echo "[autosync] $(date '+%Y-%m-%d %H:%M:%S') WARN $*"; } +err() { echo "[autosync] $(date '+%Y-%m-%d %H:%M:%S') ERROR $*" >&2; } + +# ── Load config ────────────────────────────────────────────────────────────── +[[ ! -f "$CONFIG_FILE" ]] && { err "Config not found: $CONFIG_FILE"; exit 1; } +source "$CONFIG_FILE" + +# ── Helpers ─────────────────────────────────────────────────────────────────── +active_target() { cat "$STATE_FILE" 2>/dev/null || echo "test"; } + +active_repo() { + [[ "$(active_target)" == "main" ]] && echo "$MAIN_REPO" || echo "$TEST_REPO" +} + +repo_dir() { echo "$WORK_DIR/$(active_repo)"; } + +# ── Version management ──────────────────────────────────────────────────────── +read_version() { + local readme="$(repo_dir)/README.md" + # Look for a line like: or **Version:** 1.3.2 + local ver + ver=$(grep -oP '(?<=version:\s)[\d.]+' "$readme" 2>/dev/null | head -1) + [[ -z "$ver" ]] && ver=$(grep -oP '\d+\.\d+\.\d+' "$readme" 2>/dev/null | head -1) + echo "${ver:-$VERSION_SEED}" +} + +bump_version() { + local ver="$1" + IFS='.' read -ra p <<< "$ver" + local maj="${p[0]:-1}" min="${p[1]:-3}" pat="${p[2]:-0}" + case "${VERSION_BUMP:-patch}" in + major) echo "$((maj+1)).0.0" ;; + minor) echo "${maj}.$((min+1)).0" ;; + *) echo "${maj}.${min}.$((pat+1))" ;; + esac +} + +# ── README.md update ────────────────────────────────────────────────────────── +# Maintains the KiteStacks README.md format with version tracking. +update_readme() { + local dir="$1" new_ver="$2" old_ver="$3" + local readme="$dir/README.md" + local ts; ts="$(date '+%Y-%m-%d %H:%M:%S')" + + # If version comment tag exists, update it; otherwise append one after title + if grep -q '||" "$readme" + else + # Inject version tag after the first H1 line + sed -i "0,/^# /{s|^# \(.*\)|# \1\n\n|}" "$readme" + fi + + log "README.md version tag: $old_ver → $new_ver" +} + +# ── Docs changelog update ───────────────────────────────────────────────────── +# Updates docs/KiteStacks-Homelab-Documentation-v.md +# Creates a new versioned doc file and a CHANGELOG.md entry. +update_docs() { + local dir="$1" new_ver="$2" changed_files="$3" + local ts; ts="$(date '+%Y-%m-%d %H:%M:%S')" + local docs_dir="$dir/docs" + mkdir -p "$docs_dir" + + # ── New versioned doc file ──────────────────────────────────────────────── + local doc_file="$docs_dir/KiteStacks-Homelab-Documentation-v${new_ver}.md" + cat > "$doc_file" </dev/null \ + | sort -V \ + | while read f; do + v=$(basename "$f" .md | grep -oP '[\d.]+$') + echo "- [v${v}]($(basename "$f"))" + done) +EOF + + log "Created doc file: $(basename "$doc_file")" + + # ── CHANGELOG.md ───────────────────────────────────────────────────────── + local changelog="$dir/CHANGELOG.md" + if [[ ! -f "$changelog" ]]; then + echo -e "# Changelog\n\nAll notable changes to KiteStacks Homelab are documented here.\n" > "$changelog" + fi + + # Prepend new entry after the header (after line 3) + local entry + entry=$(cat < "$tmp" + echo "$entry" >> "$tmp" + tail -n +4 "$changelog" >> "$tmp" + mv "$tmp" "$changelog" + + log "CHANGELOG.md updated with v${new_ver}" +} + +# ── Map a filesystem path to a repo subfolder ───────────────────────────────── +# Files from ~/docker/homepage → apps/homepage/ +# Files from ~/docker/ → apps// +# Files from /etc/kitestacks/ → clusters/assassin/ +map_to_repo_path() { + local src="$1" + local rel="" + + for watch in $WATCH_DIRS; do + if [[ "$src" == "$watch"* ]]; then + rel="${src#$watch/}" + # Top-level dir under watch becomes the app folder + local top; top=$(echo "$rel" | cut -d'/' -f1) + if [[ "$watch" == *docker* ]]; then + echo "apps/${rel}" + else + echo "clusters/assassin/${rel}" + fi + return + fi + done + # Fallback + echo "server-files/${src#/}" +} + +# ── Sync changed files into the workspace ───────────────────────────────────── +sync_files() { + local repo="$1"; shift + local files=("$@") + local synced=() + + for src in "${files[@]}"; do + local dest_rel; dest_rel="$(map_to_repo_path "$src")" + local dest="$repo/$dest_rel" + mkdir -p "$(dirname "$dest")" + + if [[ -f "$src" ]]; then + cp -p "$src" "$dest" + synced+=("$dest_rel") + log "Synced: $dest_rel" + else + rm -f "$dest" + synced+=("DELETED: $dest_rel") + log "Removed: $dest_rel" + fi + done + + printf '%s\n' "${synced[@]}" +} + +# ── Commit and push ─────────────────────────────────────────────────────────── +commit_and_push() { + local dir="$1" version="$2" file_count="$3" + cd "$dir" + + git add -A + + if git diff --cached --quiet; then + log "Nothing to commit." + return 0 + fi + + local target; target="$(active_target)" + local msg="Automated update: $(date '+%Y-%m-%d %H:%M:%S')" + # Match the commit style already in your repo: "Automated update: YYYY-MM-DD HH:MM:SS" + + git commit -m "$msg" + + log "Pushing to ${target} repo ($(active_repo))..." + if git push origin HEAD 2>&1; then + log "✓ Push OK — v${version}" + else + err "Push failed. Will retry on next change." + return 1 + fi +} + +# ── Should this path be skipped? ───────────────────────────────────────────── +is_excluded() { + local path="$1" + for pat in $EXCLUDE_PATTERNS; do + case "$path" in $pat) return 0 ;; esac + done + return 1 +} + +# ════════════════════════════════════════════════════════════════════════════ +# MAIN +# ════════════════════════════════════════════════════════════════════════════ +mkdir -p "$WORK_DIR" +log "KiteStacks AutoSync starting up" +log "Active target : $(active_target) → $(active_repo)" +log "Watching : $WATCH_DIRS" +log "Debounce : ${DEBOUNCE_SECONDS}s" + +# Pull latest before we start watching +RDIR="$(repo_dir)" +if [[ -d "$RDIR/.git" ]]; then + cd "$RDIR" + git pull --rebase origin HEAD 2>/dev/null && log "Pulled latest from remote." || warn "Pull failed — continuing anyway." +fi + +declare -A PENDING +LAST_EVENT=0 + +# Build the inotifywait argument list from WATCH_DIRS +IFS=' ' read -ra WATCH_ARRAY <<< "$WATCH_DIRS" + +inotifywait -m -r \ + -e modify,create,delete,moved_to,moved_from \ + --format '%w%f' \ + --exclude '\.git' \ + "${WATCH_ARRAY[@]}" 2>/dev/null | + +while IFS= read -r changed; do + + is_excluded "$changed" && continue + PENDING["$changed"]=1 + LAST_EVENT=$(date +%s) + + # ── Debounce loop ───────────────────────────────────────────────────────── + while true; do + sleep 1 + ELAPSED=$(( $(date +%s) - LAST_EVENT )) + [[ $ELAPSED -ge ${DEBOUNCE_SECONDS:-15} ]] && break + + # Drain any additional events that arrived during sleep + while IFS= read -r -t 0.1 extra; do + is_excluded "$extra" && continue + PENDING["$extra"]=1 + LAST_EVENT=$(date +%s) + done + done + + [[ ${#PENDING[@]} -eq 0 ]] && continue + + log "━━ Batch of ${#PENDING[@]} change(s) detected ━━" + + RDIR="$(repo_dir)" + OLD_VER="$(read_version)" + NEW_VER="$(bump_version "$OLD_VER")" + + # Pull before committing + cd "$RDIR" + git pull --rebase origin HEAD 2>/dev/null || warn "Pre-commit pull failed." + + # Sync files and capture the list of repo-relative paths + CHANGED_LIST="$(sync_files "$RDIR" "${!PENDING[@]}")" + + update_readme "$RDIR" "$NEW_VER" "$OLD_VER" + update_docs "$RDIR" "$NEW_VER" "$CHANGED_LIST" + commit_and_push "$RDIR" "$NEW_VER" "${#PENDING[@]}" + + # Clear batch + unset PENDING + declare -A PENDING + +done diff --git a/autosync/setup.sh b/autosync/setup.sh new file mode 100644 index 0000000..16a1fd0 --- /dev/null +++ b/autosync/setup.sh @@ -0,0 +1,244 @@ +#!/bin/bash +# ============================================================================= +# KiteStacks HomelaB — Auto-Sync Setup +# Run once as root: sudo bash setup.sh +# ============================================================================= + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +CONFIG_FILE="$SCRIPT_DIR/config/settings.conf" +WORK_DIR="/opt/kitestacks-autosync" +STATE_FILE="$WORK_DIR/.active_target" + +GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; CYAN='\033[0;36m'; NC='\033[0m' +info() { echo -e "${GREEN}[INFO]${NC} $1"; } +warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } +error() { echo -e "${RED}[ERROR]${NC} $1"; exit 1; } +step() { echo -e "\n${CYAN}══ $1 ══${NC}"; } + +[[ $EUID -ne 0 ]] && error "Run as root: sudo bash setup.sh" + +# ── Config check ───────────────────────────────────────────────────────────── +if [[ ! -f "$CONFIG_FILE" ]]; then + info "Copying example config..." + cp "$SCRIPT_DIR/config/settings.conf.example" "$CONFIG_FILE" + warn "Please edit $CONFIG_FILE and set FORGEJO_TOKEN and WATCH_DIRS, then re-run." + exit 0 +fi + +source "$CONFIG_FILE" + +[[ "$FORGEJO_TOKEN" == "PASTE_YOUR_TOKEN_HERE" ]] && \ + error "You haven't set FORGEJO_TOKEN in config/settings.conf yet." +[[ -z "$FORGEJO_TOKEN" ]] && error "FORGEJO_TOKEN is empty in config/settings.conf." + +# ── Dependencies ───────────────────────────────────────────────────────────── +step "Installing dependencies" +apt-get update -qq +apt-get install -y -qq git inotify-tools curl jq +info "Dependencies installed." + +# ── Configure git credentials ───────────────────────────────────────────────── +step "Configuring git credentials" +if [[ "$AUTH_METHOD" == "ssh" ]]; then + if [[ ! -f "$SSH_KEY_PATH" ]]; then + info "Generating SSH key at $SSH_KEY_PATH..." + ssh-keygen -t ed25519 -C "kitestacks-autosync@$(hostname)" -f "$SSH_KEY_PATH" -N "" + echo "" + warn "Add this public key to Forgejo:" + warn " gitforge.kitestacks.com → User Settings → SSH / GPG Keys → Add Key" + echo "────────────────────────────────────────────────────────" + cat "${SSH_KEY_PATH}.pub" + echo "────────────────────────────────────────────────────────" + read -rp "Press Enter after adding the key to Forgejo..." + fi + REMOTE_BASE="git@gitforge.kitestacks.com:${FORGEJO_USER}" +else + # HTTPS token auth + git config --global credential.helper store + # Write credential (idempotent — grep prevents duplicates) + local CRED_LINE="https://${FORGEJO_USER}:${FORGEJO_TOKEN}@gitforge.kitestacks.com" + grep -qF "$CRED_LINE" ~/.git-credentials 2>/dev/null || echo "$CRED_LINE" >> ~/.git-credentials + REMOTE_BASE="https://gitforge.kitestacks.com/${FORGEJO_USER}" +fi +info "Credentials configured (method: $AUTH_METHOD)" + +# ── Verify Forgejo API ──────────────────────────────────────────────────────── +step "Verifying Forgejo connectivity" +HTTP=$(curl -s -o /dev/null -w "%{http_code}" --max-time 8 \ + -H "Authorization: token $FORGEJO_TOKEN" \ + "${FORGEJO_URL}/api/v1/user") +[[ "$HTTP" != "200" ]] && error "Forgejo API returned HTTP $HTTP — check FORGEJO_URL and FORGEJO_TOKEN." +info "Forgejo API reachable ✓" + +# ── Create test repo on Forgejo if needed ───────────────────────────────────── +step "Setting up test repo: $TEST_REPO" +HTTP=$(curl -s -o /dev/null -w "%{http_code}" \ + -H "Authorization: token $FORGEJO_TOKEN" \ + "${FORGEJO_URL}/api/v1/repos/${FORGEJO_USER}/${TEST_REPO}") + +if [[ "$HTTP" == "404" ]]; then + info "Creating test repo on Forgejo..." + RESULT=$(curl -s -X POST \ + -H "Authorization: token $FORGEJO_TOKEN" \ + -H "Content-Type: application/json" \ + -d "{ + \"name\": \"${TEST_REPO}\", + \"description\": \"AutoSync test — KiteStacks Homelab\", + \"private\": true, + \"auto_init\": true, + \"default_branch\": \"main\" + }" \ + "${FORGEJO_URL}/api/v1/user/repos") + URL=$(echo "$RESULT" | jq -r '.html_url // empty') + [[ -n "$URL" ]] && info "Test repo created: $URL" || warn "Repo creation response was unexpected — check Forgejo." +else + info "Test repo already exists." +fi + +# ── Clone repos ─────────────────────────────────────────────────────────────── +step "Cloning repos into $WORK_DIR" +mkdir -p "$WORK_DIR" + +# Test repo +TEST_DIR="$WORK_DIR/$TEST_REPO" +if [[ ! -d "$TEST_DIR/.git" ]]; then + info "Cloning test repo..." + git clone "${REMOTE_BASE}/${TEST_REPO}.git" "$TEST_DIR" +else + info "Test repo already cloned." +fi + +cd "$TEST_DIR" +git config user.email "$GIT_EMAIL" +git config user.name "$GIT_NAME" + +# ── Bootstrap README.md from main repo content ─────────────────────────────── +step "Bootstrapping README.md in test repo" +if [[ ! -f "$TEST_DIR/README.md" ]] || ! grep -q 'version:' "$TEST_DIR/README.md" 2>/dev/null; then + cat > "$TEST_DIR/README.md" <<'EOF' +# KiteStacks Homelab + + + +Private GitOps repository for the KiteStacks homelab. + +## Cluster + +- K3s +- FluxCD (planned) +- Longhorn (planned) + +## Applications + +- Homepage +- Kavita +- Linkding +- Forgejo +- Grafana +- Prometheus +- Authentik +- Open WebUI +- LiteLLM + +## Documentation + +docs/KiteStacks-Homelab-Documentation-v1.3.0.md +EOF + + mkdir -p "$TEST_DIR/docs" + cat > "$TEST_DIR/docs/KiteStacks-Homelab-Documentation-v1.3.0.md" <<'EOF' +# KiteStacks Homelab Documentation v1.3.0 + +**Version:** 1.3.0 +**Updated:** Initial autosync bootstrap + +--- + +## Cluster + +| Component | Status | +|-----------|--------| +| K3s | Active | +| FluxCD | Planned | +| Longhorn | Planned | + +## Applications + +| App | Path | +|-----|------| +| Homepage | apps/homepage/ | +| Kavita | apps/kavita-docker-automation/ | +| Linkding | apps/linkding/ | +| Forgejo | apps/forgejo/ | +| Grafana | apps/grafana/ | +| Prometheus | apps/prometheus/ | +| Authentik | apps/authentik/ | +| Open WebUI | apps/open-webui/ | +| LiteLLM | apps/litellm/ | +EOF + + cat > "$TEST_DIR/CHANGELOG.md" <<'EOF' +# Changelog + +All notable changes to KiteStacks Homelab are documented here. + +## [v1.3.0] — Initial autosync bootstrap + +- Automated sync system installed +EOF + + git add -A + git commit -m "chore: bootstrap autosync README and docs v1.3.0" + git push origin HEAD + info "Test repo bootstrapped with v1.3.0 content." +else + info "README.md already has version tag — skipping bootstrap." +fi + +# ── Set initial state to test ───────────────────────────────────────────────── +echo "test" > "$STATE_FILE" + +# ── Install systemd service ─────────────────────────────────────────────────── +step "Installing systemd service" +cat > /etc/systemd/system/kitestacks-autosync.service </dev/null || { echo "Config not found at $CONFIG_FILE"; exit 1; } + +echo -e "\n${BOLD}╔══ KiteStacks AutoSync Status ════════════════════════════════╗${NC}" + +# ── Service ─────────────────────────────────────────────────────────────────── +echo -e "\n${BOLD}Service${NC}" +if systemctl is-active --quiet kitestacks-autosync 2>/dev/null; then + ok "kitestacks-autosync is running" +else + fail "kitestacks-autosync is NOT running" + echo " → sudo systemctl start kitestacks-autosync" +fi +systemctl is-enabled --quiet kitestacks-autosync 2>/dev/null \ + && ok "Enabled at boot" || info "Not enabled at boot" + +# ── Active target ───────────────────────────────────────────────────────────── +echo -e "\n${BOLD}Active Target${NC}" +TARGET="$(cat "$STATE_FILE" 2>/dev/null || echo "test")" +if [[ "$TARGET" == "main" ]]; then + ok "→ MAIN: ${FORGEJO_URL}/${FORGEJO_USER}/${MAIN_REPO}" +else + info "→ TEST: ${FORGEJO_URL}/${FORGEJO_USER}/${TEST_REPO}" + info " (run 'sudo bash promote.sh' when you're happy with the test repo)" +fi + +# ── Workspace ───────────────────────────────────────────────────────────────── +echo -e "\n${BOLD}Workspace${NC}" +RNAME="$([[ "$TARGET" == "main" ]] && echo "$MAIN_REPO" || echo "$TEST_REPO")" +RDIR="$WORK_DIR/$RNAME" + +if [[ -d "$RDIR/.git" ]]; then + ok "Cloned: $RDIR" + VER=$(grep -oP '(?<=version:\s)[\d.]+' "$RDIR/README.md" 2>/dev/null | head -1 || echo "unknown") + info "Current version : $VER" + LAST=$(cd "$RDIR" && git log -1 --format="%h %s (%ar)" 2>/dev/null) + info "Last commit : $LAST" + DOC_COUNT=$(ls "$RDIR/docs/"KiteStacks-Homelab-Documentation-v*.md 2>/dev/null | wc -l) + info "Doc versions : $DOC_COUNT file(s) in docs/" +else + fail "Workspace not found — run setup.sh first" +fi + +# ── Forgejo API ─────────────────────────────────────────────────────────────── +echo -e "\n${BOLD}Forgejo Connectivity${NC}" +HTTP=$(curl -s -o /dev/null -w "%{http_code}" --max-time 5 \ + -H "Authorization: token $FORGEJO_TOKEN" \ + "${FORGEJO_URL}/api/v1/user" 2>/dev/null) +[[ "$HTTP" == "200" ]] && ok "API reachable ($FORGEJO_URL)" || fail "API returned HTTP $HTTP" + +# ── Watch dirs ──────────────────────────────────────────────────────────────── +echo -e "\n${BOLD}Watched Directories${NC}" +for d in $WATCH_DIRS; do + if [[ -d "$d" ]]; then + COUNT=$(find "$d" -type f 2>/dev/null | wc -l) + ok "$d ($COUNT files)" + else + fail "$d (does not exist)" + fi +done + +# ── Recent logs ─────────────────────────────────────────────────────────────── +echo -e "\n${BOLD}Recent Log Entries (last 10)${NC}" +journalctl -u kitestacks-autosync -n 10 --no-pager -q 2>/dev/null \ + | sed 's/^/ /' \ + || info "No journal entries yet." + +echo -e "\n${BOLD}╚══════════════════════════════════════════════════════════════╝${NC}" +echo -e " Live logs: ${CYAN}journalctl -u kitestacks-autosync -f${NC}\n" diff --git a/cloud-migration/.gitattributes b/cloud-migration/.gitattributes new file mode 100644 index 0000000..40c6411 --- /dev/null +++ b/cloud-migration/.gitattributes @@ -0,0 +1,2 @@ +archives/*.tar.gz filter=lfs diff=lfs merge=lfs -text +volume-exports/*.tar.gz filter=lfs diff=lfs merge=lfs -text diff --git a/cloud-migration/README.md b/cloud-migration/README.md new file mode 100644 index 0000000..825dbf6 --- /dev/null +++ b/cloud-migration/README.md @@ -0,0 +1,42 @@ +# KiteStacks Cloud Migration Backup + +Created for migrating the current KiteStacks host to Hetzner Cloud. + +## Contents + +- `archives/docker-bind-data.tar.gz` - `/home/kenpat/docker` bind-mounted service folders, including compose files, `.env` files, and bind-mounted app data. +- `archives/syncthing-shared.tar.gz` - `/home/kenpat/SyncthingShared`. +- `archives/kitestacks-scripts.tar.gz` - local KiteStacks automation/script folders. +- `archives/host-etc-subset.tar.gz` - selected host `/etc` configuration needed for migration context. +- `volume-exports/*.tar.gz` - Docker named volume exports. +- `inventory/*` - Docker, network, disk, config, and host inventory. +- `restore/RESTORE.md` - first-pass restore procedure. +- `SHA256SUMS` - checksums for all files in this backup. + +## Restoring Claude's Context on a New Machine + +This repo includes a snapshot of Claude Code's persistent memory in `claude-memory/` +(taken from `~/.claude/projects/-home-kenpat/memory/` on the original host). It +captures the homelab setup, this migration plan/status, and your working +preferences, so a fresh Claude session on the new machine doesn't start blank. + +To restore it: + +1. Clone this repo on the new machine. +2. Copy the contents of `claude-memory/` into Claude Code's memory directory for + your new home path, e.g.: + ```sh + mkdir -p ~/.claude/projects/-home-/memory + cp claude-memory/*.md ~/.claude/projects/-home-/memory/ + ``` +3. Start a Claude Code session in that project. It will automatically load + `MEMORY.md` and the linked memory files, and can pick up the migration + (and any other tracked work) where it left off. +4. Update `claude-memory/project-cloud-migration.md` as migration phases + progress, and re-copy it back into this repo so future restores stay current. + +## Important + +This repository contains secrets: `.env` files, tunnel tokens, app database data, and service credentials. Keep it private. + +The Docker bind-data archive was created from a live host. For databases with strict consistency requirements, prefer restoring service-native dumps when available, or stop services before taking a final cutover backup. diff --git a/cloud-migration/SHA256SUMS b/cloud-migration/SHA256SUMS new file mode 100644 index 0000000..284687f --- /dev/null +++ b/cloud-migration/SHA256SUMS @@ -0,0 +1,31 @@ +f188190cf1a5655916edc2192ceb778330a041082613ba3f8573a5f3bbfe64a0 ./README.md +d2f2128eed132b9e8a43f35f6f4e4bfdba3254c5117a0318a6bf137f55f41b1f ./archives/docker-bind-data.tar.gz +f865584c6d3548c073b5299cd6ba41b478610d221683238b4cd83b1420030549 ./archives/host-etc-subset.tar.gz +8748291a60e092bd389b8c50d16ae7613b6909138c4bdd06852eb41dc76dc07f ./archives/kitestacks-scripts.tar.gz +748e3f8decd1234dfbd1f9f81cb44222c40d3cfd827a9c46d1d3337b1643b58f ./archives/syncthing-shared.tar.gz +8a685bef70fd7a71cf439b8088e0930bfab93956a0e8fe9b3d17888c118814c2 ./inventory/config-files.txt +189c4fa043c3d7b67d1e2e5c923b10022977c84a751b6526a0b2ab3c89ce5c6b ./inventory/crontab.stderr +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ./inventory/crontab.txt +a71267fb60fd62a9924b9eed404e5f2c217cdf4c604962fc195c8db8050ec51d ./inventory/df-h.txt +a1f2d23e0f2b0a5b9bb76820ff2dbeaadcd059362d3791a90090fdb624f4a5e8 ./inventory/docker-container-inspect.json +15f1abf2e548b2fdce4852ff6da034b75d3664446c23672ddd00135b83a1afce ./inventory/docker-folder-sizes.txt +9d28d36f5ae776ad10080aa6b44292500b4963588c901847861890098a997803 ./inventory/docker-networks.txt +08939f14b26a7c0918dcc6cf4f852435f19ee05da34bd37a5e04e8c3e87efab3 ./inventory/docker-running.txt +0e58c8f5d09d2319ea38eee6b0a6ec923d621f187c51d2cf6381dadcccc8ffe9 ./inventory/docker-volume-inspect.json +9d3067d74156ce24c16822686f94c8897ec7d877df25eff643cf19937b89d2e4 ./inventory/docker-volumes.txt +659e639b4a93e08e868e133ab7c97898d419aec3056fcda012df686d52231f9e ./inventory/host-etc-tar-warnings.txt +dc6d9f9163deacf7ff8ca239c47d039581ef079172577ee418bd6fcb72ddc07a ./inventory/ip-addr.txt +e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ./inventory/kitestacks-scripts-tar-warnings.txt +00c76796663c6b278a91730c15531a559ed552ff65dea34424129fdb12b92587 ./inventory/uname.txt +dd93d026ddf76ea16896bf5faab9a2462275983e8c69ea6c07dc351864dce81c ./restore/RESTORE.md +2a5392e54eed3edb677ad52f419a27b1c1de387d3c1c512585c09cbd399ab08b ./volume-exports/95f721b2e8b90b4e17a3675d4905837933bc366e12c15d16bce1bd9d166c43f0.tar.gz +d37a2b35bd294d36aa0c3f96e477ee0203bc491f66d6d3cf122c81c29ba4b2c5 ./volume-exports/b11ac7c9fe060195954a46980f7ed85da9a62fea48d7cca5990aa54ec3d4cd8a.tar.gz +668ae10a5bb4a44864b788063610b43def6fdad2964181b5838e50388d8b4fbf ./volume-exports/b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111.tar.gz +44730b582fe275ae4a5daa7a03b5ae6ba77d55022df5b41e1183475d7a6e29fb ./volume-exports/b303d482950f666b37acae69c790f0f37e9d28735a4ea0b98a7961a8a400fa75.tar.gz +c492df2ba24d0f77ac6b9684de110a2cc96a843f6b1b4422473af6361407c68b ./volume-exports/kite-ai_open-webui.tar.gz +9b6410c6b71cd1f96157f3780de604a9c453abc2e5e23f4e5b2950f87098446e ./volume-exports/openproject_openproject_assets.tar.gz +bae148a7b41896039d6cab807d27860b2d8d7333b03f79a6c16f7770179e4a6e ./volume-exports/openproject_openproject_db_data.tar.gz +ba708e82a287f5c16f53afc1a885ca9837c0dfc44f92ab5ae2691090222dfdf1 ./volume-exports/openproject_openproject_logs.tar.gz +ae85ee17213163cbea636c5270a0a9152361ba2e26bb0781d0274fe9c6379b4f ./volume-exports/openproject_openproject_pgdata.tar.gz +7d7039b4dd710016ba2a447cb4ae82b24778544f6bdbd8fff07dc6ba87e5377c ./volume-exports/portainer_data.tar.gz +a6fa0fea172711ef20d9ac4bd8362c2a9544f93c5dd435c62abfc7cfe18b88bd ./volume-exports/uptime-kuma.tar.gz diff --git a/cloud-migration/archives/docker-bind-data.tar.gz b/cloud-migration/archives/docker-bind-data.tar.gz new file mode 100644 index 0000000..bde4310 --- /dev/null +++ b/cloud-migration/archives/docker-bind-data.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d2f2128eed132b9e8a43f35f6f4e4bfdba3254c5117a0318a6bf137f55f41b1f +size 1014475364 diff --git a/cloud-migration/archives/host-etc-subset.tar.gz b/cloud-migration/archives/host-etc-subset.tar.gz new file mode 100644 index 0000000..01ae2e2 --- /dev/null +++ b/cloud-migration/archives/host-etc-subset.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f865584c6d3548c073b5299cd6ba41b478610d221683238b4cd83b1420030549 +size 6942 diff --git a/cloud-migration/archives/kitestacks-scripts.tar.gz b/cloud-migration/archives/kitestacks-scripts.tar.gz new file mode 100644 index 0000000..89a0fa0 --- /dev/null +++ b/cloud-migration/archives/kitestacks-scripts.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8748291a60e092bd389b8c50d16ae7613b6909138c4bdd06852eb41dc76dc07f +size 11653300 diff --git a/cloud-migration/archives/syncthing-shared.tar.gz b/cloud-migration/archives/syncthing-shared.tar.gz new file mode 100644 index 0000000..c78af09 --- /dev/null +++ b/cloud-migration/archives/syncthing-shared.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:748e3f8decd1234dfbd1f9f81cb44222c40d3cfd827a9c46d1d3337b1643b58f +size 173123981 diff --git a/cloud-migration/claude-memory/MEMORY.md b/cloud-migration/claude-memory/MEMORY.md new file mode 100644 index 0000000..d64bb0b --- /dev/null +++ b/cloud-migration/claude-memory/MEMORY.md @@ -0,0 +1,7 @@ +# Memory Index + +- [User Profile](user-profile.md) — kenpat, homelab operator, kitestacks.com +- [Project: KiteStacks Homelab](project-kitestacks.md) — Docker Compose homelab, Cloudflare tunnels, autosync to Forgejo +- [Project: Authentik SSO](project-sso.md) — SSO setup in progress; what's done, what's pending +- [Feedback: Tool Confirmation](feedback_tool_confirmation.md) — don't pause for tool confirmation, keep going autonomously +- [Project: Cloud Migration](project-cloud-migration.md) — Phase 1 backup→Forgejo (done), Phase 2 Oracle VPS (planned), LFS/Cloudflare 413 gotcha diff --git a/cloud-migration/claude-memory/feedback_tool_confirmation.md b/cloud-migration/claude-memory/feedback_tool_confirmation.md new file mode 100644 index 0000000..d75d367 --- /dev/null +++ b/cloud-migration/claude-memory/feedback_tool_confirmation.md @@ -0,0 +1,13 @@ +--- +name: feedback_tool_confirmation +description: "User preference: don't pause for tool confirmation — keep going autonomously" +metadata: + node_type: memory + type: feedback + originSessionId: c435573b-6aff-4e43-a184-c17aa96ce348 +--- + +Don't pause and wait for the user to hit enter or confirm tool calls. Keep executing until the task is complete. + +**Why:** User wants uninterrupted autonomous execution. +**How to apply:** Only stop when the user must do something manually (UI action, testing) or when a decision genuinely requires their input. Never pause mid-task just to confirm a command. diff --git a/cloud-migration/claude-memory/project-cloud-migration.md b/cloud-migration/claude-memory/project-cloud-migration.md new file mode 100644 index 0000000..2156af2 --- /dev/null +++ b/cloud-migration/claude-memory/project-cloud-migration.md @@ -0,0 +1,28 @@ +--- +name: project-cloud-migration +description: "KiteStacks server migration plan — Phase 1 (Forgejo backup, restore to new desktop) and Phase 2 (Oracle Cloud VPS, always-on)" +metadata: + node_type: memory + type: project + originSessionId: 1d92780e-77c5-41ac-8887-daca0ea55e8b +--- + +**Phase 1 — STATUS: backup pushed & verified, restore not yet performed** + +Goal: be able to pull the backup repo onto a new (desktop) machine and physically relaunch the homelab from it. + +- Full server backup lives in Forgejo repo `kenpat/kitestacks-cloud-migration` (private), clone url `http://100.90.13.55:3006/kenpat/kitestacks-cloud-migration.git` (also reachable at `gitforge.kitestacks.com` for small files). +- Source backup: `/home/kenpat/kitestacks-cloud` (git repo, 1 commit `6ffcbea`, ~4.3GB). Contains `archives/*.tar.gz` (docker bind-data, syncthing-shared, scripts, host /etc subset), `volume-exports/*.tar.gz` (named Docker volumes), `inventory/`, `restore/RESTORE.md`, `SHA256SUMS`. +- 14 large files (~2.3GB) are tracked via **Git LFS** — required `apt-get install git-lfs` (no passwordless sudo on this host, user ran it manually) and `git lfs migrate import --include="archives/*.tar.gz,volume-exports/*.tar.gz"`. +- **Known gotcha**: Forgejo's public hostname `gitforge.kitestacks.com` (Cloudflare Tunnel) returns HTTP 413 for any LFS object >~100MB. The 3 big files (docker-bind-data.tar.gz ~967MB, kite-ai_open-webui.tar.gz ~963MB, syncthing-shared.tar.gz ~165MB) had to be PUT directly to `http://100.90.13.55:3006/kenpat/kitestacks-cloud-migration.git/info/lfs/objects//` (local Tailscale IP, bypasses Cloudflare). `git lfs pull` for these 3 files will need the same workaround — clone/pull via the local IP, not the public hostname. +- Verified: local HEAD == remote HEAD, all 15/15 LFS objects present server-side with sizes matching `SHA256SUMS` OIDs. +- Documented in `/home/kenpat/forgejo-repos/kitestacks-homelab/docs/KiteStacks-Homelab-Documentation-v1.3.922.md`. + +**Phase 1 remaining work**: actual restore-to-new-desktop has NOT been done/tested yet. When the user pulls a Claude session in on the new desktop, the workflow is: clone `kitestacks-cloud-migration` (via local IP for LFS), follow `restore/RESTORE.md`, restore Docker volumes from `volume-exports/`, restore bind-mounts from `archives/docker-bind-data.tar.gz`, bring stacks up via the compose files, re-point Cloudflare Tunnel. + +**Why**: User wants to migrate the KiteStacks homelab off the current desktop onto new hardware first (Phase 1), then to an always-on Oracle Cloud VPS (Phase 2) so services don't go down when the desktop sleeps/is off. + +**How to apply**: When the user says they're moving to a new desktop / starting the restore, walk through `restore/RESTORE.md` using this memory's notes (especially the LFS/Cloudflare gotcha). Once services are confirmed running on the new desktop, mark Phase 1 complete in this file, notify the user explicitly, and begin Phase 2 (Oracle Cloud VPS setup) — update this file with Phase 2 progress the same way. + +**Phase 2 — STATUS: not started** +Plan: provision an Oracle Cloud VPS, migrate the same stack there for always-on hosting (independent of desktop power state). No infra details yet — to be filled in once started. diff --git a/cloud-migration/claude-memory/project-kitestacks.md b/cloud-migration/claude-memory/project-kitestacks.md new file mode 100644 index 0000000..e0995db --- /dev/null +++ b/cloud-migration/claude-memory/project-kitestacks.md @@ -0,0 +1,19 @@ +--- +name: project-kitestacks +description: "KiteStacks homelab infrastructure — Docker Compose services, networking, autosync, Forgejo repo" +metadata: + node_type: memory + type: project + originSessionId: 301d23e2-6920-42b0-a27d-eba4e667b7f7 +--- + +All services run as Docker Compose stacks in `/home/kenpat/docker//`. +All containers join the `kitestacks` external Docker bridge network (172.18.0.0/16) — cloudflared uses container names as hostnames to route traffic. +Cloudflare Tunnel (token-based) routes `*.kitestacks.com` → containers on the kitestacks network. Tunnel ingress rules are configured in the Cloudflare Zero Trust dashboard (not in local files). + +**Autosync system:** A systemd service (`kitestacks-autosync`) watches `/home/kenpat/docker/` via inotify and pushes any file change to the Forgejo repo `kenpat/kitestacks-homelab` at `gitforge.kitestacks.com`. Working repo lives at `/opt/kitestacks-autosync/kitestacks-homelab/`. User's local clone is at `/home/kenpat/forgejo-repos/kitestacks-homelab/` (remote: `http://100.90.13.55:3006/kenpat/kitestacks-homelab.git`). Both point to the same Forgejo repo. + +**Versioned docs:** Autosync auto-creates `docs/KiteStacks-Homelab-Documentation-v1.3.NNN.md` on each change. Manual/feature docs use the next version number. Current version as of 2026-06-08: 1.3.884. + +**Why:** User always wants changes documented and pushed to Forgejo at the end of any task. +**How to apply:** After making file changes, write docs to `/home/kenpat/forgejo-repos/kitestacks-homelab/docs/`, update CHANGELOG.md and README.md version tag, commit, and push. Use direct IP remote (no TLS issues). diff --git a/cloud-migration/claude-memory/project-sso.md b/cloud-migration/claude-memory/project-sso.md new file mode 100644 index 0000000..ec9fa6b --- /dev/null +++ b/cloud-migration/claude-memory/project-sso.md @@ -0,0 +1,32 @@ +--- +name: project-sso +description: "Authentik SSO setup status for kitestacks.com — what's done vs pending" +metadata: + node_type: memory + type: project + originSessionId: 301d23e2-6920-42b0-a27d-eba4e667b7f7 +--- + +Authentik SSO configured 2026-06-08 to cover all kitestacks.com services. +Full reference: `docs/authentik-sso-setup.md` in the Forgejo repo. + +**Config files updated (done):** +- `apps/authentik/docker-compose.yml` — kitestacks network declared +- `apps/kavita/config/appsettings.json` — OIDC enabled, Authority set +- BookStack retired — not used, all books on Kavita +- `apps/openproject/docker-compose.yml` — OIDC env vars + network +- `apps/openproject/.env` — OPENPROJECT_OIDC_SECRET placeholder +- Grafana and OpenWebUI already had OIDC env vars (just need Authentik apps created) + +**Pending manual steps:** +1. Create Authentik OAuth2/OIDC providers + applications in admin UI for: Grafana, OpenWebUI, Kavita, OpenProject, Forgejo +2. Create Authentik Proxy Providers for: Shaarli, Uptime Kuma, LiteLLM; assign to Embedded Outpost +3. Configure Forgejo OAuth2 source via Forgejo admin UI (Site Admin → Auth Sources) +4. Fill client secrets in `.env` files and restart containers +5. Update Cloudflare tunnel routes: links.kitestacks.com → authentik:9000, status.kitestacks.com → authentik:9000, llm.kitestacks.com → authentik:9000 +6. After OpenProject container recreation (v13→v15 upgrade), update tunnel: tasks.kitestacks.com → openproject:80 + +**Excluded from SSO:** Portainer, Prometheus, Node Exporter, OpenRouter, BookStack (retired) + +**Why:** User requested Authentik SSO for all services; OpenRouter/Prometheus/node-exporter/Portainer excluded by user request. +**How to apply:** When user asks about SSO, check this memory for current status before suggesting next steps. diff --git a/cloud-migration/claude-memory/user-profile.md b/cloud-migration/claude-memory/user-profile.md new file mode 100644 index 0000000..ecc876c --- /dev/null +++ b/cloud-migration/claude-memory/user-profile.md @@ -0,0 +1,10 @@ +--- +name: user-profile +description: "kenpat's role, preferences, and homelab context" +metadata: + node_type: memory + type: user + originSessionId: 301d23e2-6920-42b0-a27d-eba4e667b7f7 +--- + +kenpat runs a self-hosted homelab at kitestacks.com. All services exposed via Cloudflare Tunnels. Comfortable with Docker Compose, Git/Forgejo. Wants Claude to document changes and push them to Forgejo as part of completing any task. diff --git a/cloud-migration/inventory/config-files.txt b/cloud-migration/inventory/config-files.txt new file mode 100644 index 0000000..e1d4c4d --- /dev/null +++ b/cloud-migration/inventory/config-files.txt @@ -0,0 +1,57 @@ +/home/kenpat/docker/kitestacks-portal/nginx.conf +/home/kenpat/docker/kitestacks-portal/docker-compose.yml +/home/kenpat/docker/openproject/docker-compose.yml +/home/kenpat/docker/openproject/.env +/home/kenpat/docker/authentik/docker-compose.yml +/home/kenpat/docker/authentik/.env +/home/kenpat/docker/cloudflared/docker-compose.yml +/home/kenpat/docker/prometheus/prometheus.yml +/home/kenpat/docker/prometheus/docker-compose.yml +/home/kenpat/docker/zammad/docker-compose.old.yml +/home/kenpat/docker/bookstack/docker-compose.yml +/home/kenpat/docker/kavita/config/appsettings.json +/home/kenpat/docker/kite-ai/docker-compose.yml +/home/kenpat/docker/kite-ai/litellm_config.yaml +/home/kenpat/docker/kite-ai/.env +/home/kenpat/docker/kitestacks-portal-test/nginx.conf +/home/kenpat/docker/kitestacks-portal-test/docker-compose.yml +/home/kenpat/docker/grafana/docker-compose.yml +/home/kenpat/docker/grafana/grafana-networkpolicy.yaml +/home/kenpat/docker/grafana/.env +/home/kenpat/docker/homepage/config-test/kubernetes.yaml +/home/kenpat/docker/homepage/config-test/settings.yaml +/home/kenpat/docker/karakeep/docker-compose.yml +/home/kenpat/docker/karakeep/.env +/home/kenpat/docker/forgejo/cronjob.yaml +/home/kenpat/docker/forgejo/configmap.yaml +/home/kenpat/docker/forgejo/docker-compose.yml +/home/kenpat/docker/forgejo/uptime-kuma/kitestacks-monitors.json +/home/kenpat/docker/forgejo/uptime-kuma/uptime-kuma-deployment.yaml +/home/kenpat/docker/forgejo/uptime-kuma/kitestacks-cron.yaml +/home/kenpat/docker/forgejo/uptime-kuma/uptime-kuma-ingress.yaml +/home/kenpat/docker/forgejo/uptime-kuma/configmap.yaml +/home/kenpat/docker/forgejo/uptime-kuma/gitrepository.yaml +/home/kenpat/docker/forgejo/gitrepository.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/kubernetes.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/bookmarks.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/proxmox.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/services.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/settings.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/widgets-live.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/settings-live.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/services-live.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/widgets.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config/docker.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/docker-compose.test.yml +/home/kenpat/docker/homepage-archived-2026-06-07/docker-compose.yml +/home/kenpat/docker/homepage-archived-2026-06-07/services.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/kubernetes.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/bookmarks.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/proxmox.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/services.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/settings.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/widgets-live.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/settings-live.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/services-live.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/widgets.yaml +/home/kenpat/docker/homepage-archived-2026-06-07/config-test/docker.yaml diff --git a/cloud-migration/inventory/crontab.stderr b/cloud-migration/inventory/crontab.stderr new file mode 100644 index 0000000..d2cc0ec --- /dev/null +++ b/cloud-migration/inventory/crontab.stderr @@ -0,0 +1 @@ +crontabs/kenpat/: fopen: Permission denied diff --git a/cloud-migration/inventory/crontab.txt b/cloud-migration/inventory/crontab.txt new file mode 100644 index 0000000..e69de29 diff --git a/cloud-migration/inventory/df-h.txt b/cloud-migration/inventory/df-h.txt new file mode 100644 index 0000000..8892109 --- /dev/null +++ b/cloud-migration/inventory/df-h.txt @@ -0,0 +1,17 @@ +Filesystem Size Used Avail Use% Mounted on +/dev/nvme0n1p2 226G 69G 146G 33% / +tmpfs 3.8G 0 3.8G 0% /dev +tmpfs 761M 6.5M 755M 1% /run +tmpfs 5.0M 12K 5.0M 1% /run/lock +tmpfs 1.0M 0 1.0M 0% /run/credentials/systemd-journald.service +tmpfs 761M 4.1M 757M 1% /run/user/1000 +efivarfs 246K 130K 112K 54% /sys/firmware/efi/efivars +tmpfs 3.8G 952K 3.8G 1% /tmp +/dev/nvme0n1p1 975M 8.8M 966M 1% /boot/efi +/dev/nvme0n1p2 226G 69G 146G 33% /home/kenpat +udev 3.7G 0 3.7G 0% /dev/tty +tmpfs 3.8G 0 3.8G 0% /tmp/.git +tmpfs 3.8G 0 3.8G 0% /tmp/.agents +tmpfs 3.8G 0 3.8G 0% /tmp/.codex +tmpfs 3.8G 0 3.8G 0% /home/kenpat/.git +tmpfs 3.8G 0 3.8G 0% /home/kenpat/.agents diff --git a/cloud-migration/inventory/docker-container-inspect.json b/cloud-migration/inventory/docker-container-inspect.json new file mode 100644 index 0000000..f485366 --- /dev/null +++ b/cloud-migration/inventory/docker-container-inspect.json @@ -0,0 +1,8324 @@ +[ + { + "Id": "726caf830b5cde4465c1447091771872a97d6d7ca52fa4244a36df7d6ea0fe7b", + "Created": "2026-06-09T18:36:40.142184915Z", + "Path": "tar", + "Args": [ + "-czf", + "/backup/kite-ai_open-webui.tar.gz", + "-C", + "/volume", + "." + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 1848209, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-09T18:36:40.698453474Z", + "FinishedAt": "0001-01-01T00:00:00Z" + }, + "Image": "sha256:043ffb2f8a33e1c5d811993cf956ca17a918e9cdb1d225cf8028160c3914c40f", + "ResolvConfPath": "/var/lib/docker/containers/726caf830b5cde4465c1447091771872a97d6d7ca52fa4244a36df7d6ea0fe7b/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/726caf830b5cde4465c1447091771872a97d6d7ca52fa4244a36df7d6ea0fe7b/hostname", + "HostsPath": "/var/lib/docker/containers/726caf830b5cde4465c1447091771872a97d6d7ca52fa4244a36df7d6ea0fe7b/hosts", + "LogPath": "/var/lib/docker/containers/726caf830b5cde4465c1447091771872a97d6d7ca52fa4244a36df7d6ea0fe7b/726caf830b5cde4465c1447091771872a97d6d7ca52fa4244a36df7d6ea0fe7b-json.log", + "Name": "/sweet_bartik", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "kite-ai_open-webui:/volume:ro", + "/home/kenpat/kitestacks-cloud/volume-exports:/backup" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": {}, + "RestartPolicy": { + "Name": "no", + "MaximumRetryCount": 0 + }, + "AutoRemove": true, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/a2be96d689065518001d5f2b5981e37c46dbb4bae6e34b6c4f7ba7faafa37de3-init/diff:/var/lib/docker/overlay2/cea38979c97d6fd27fb6f9cc8b75c53cb2a417519c95c22d6ab88db61173450f/diff:/var/lib/docker/overlay2/ec50c94b8d775c36e0f331f21d9bbd519b2b94c3c38df0ceb147f45f9f7f9af6/diff:/var/lib/docker/overlay2/5bad628096c10cfff9b5759197fd9962d5db2d52f716bb31e3a6b002f79d6c3c/diff:/var/lib/docker/overlay2/2f53a1474ac7235ecea895d1d5e3d20f010f134246e6dfbddcd8d0b5eccd8a50/diff:/var/lib/docker/overlay2/f05f2a532483bfe6e0fe0255c4c0f3b15f87d1363febbffd728e035a3afea99a/diff:/var/lib/docker/overlay2/c3a8e28b72ae024aaacab88b5c7fae753a7e012af6a8f66fc7be9e4f36625c01/diff:/var/lib/docker/overlay2/b162764bd8ba627291472e05cfe553e6122384218cc2bcd478e18e315ee20862/diff:/var/lib/docker/overlay2/f93b56f263803cd82df86451e8b10f2d268e5effd4403c63d399eaa6661577cb/diff:/var/lib/docker/overlay2/a4316f010afd14de77eaf2abec6682d65ebadc8fe48a9177df599cbdfa9b51fb/diff", + "MergedDir": "/var/lib/docker/overlay2/a2be96d689065518001d5f2b5981e37c46dbb4bae6e34b6c4f7ba7faafa37de3/merged", + "UpperDir": "/var/lib/docker/overlay2/a2be96d689065518001d5f2b5981e37c46dbb4bae6e34b6c4f7ba7faafa37de3/diff", + "WorkDir": "/var/lib/docker/overlay2/a2be96d689065518001d5f2b5981e37c46dbb4bae6e34b6c4f7ba7faafa37de3/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "volume", + "Name": "kite-ai_open-webui", + "Source": "/var/lib/docker/volumes/kite-ai_open-webui/_data", + "Destination": "/volume", + "Driver": "local", + "Mode": "ro", + "RW": false, + "Propagation": "" + }, + { + "Type": "bind", + "Source": "/home/kenpat/kitestacks-cloud/volume-exports", + "Destination": "/backup", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "volume", + "Name": "4e935c6eb337c5ace7ae2d4ac76bf4cd7fba2d6733b7a3ecd647e53052965524", + "Source": "/var/lib/docker/volumes/4e935c6eb337c5ace7ae2d4ac76bf4cd7fba2d6733b7a3ecd647e53052965524/_data", + "Destination": "/data", + "Driver": "local", + "Mode": "", + "RW": true, + "Propagation": "" + } + ], + "Config": { + "Hostname": "726caf830b5c", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "22/tcp": {}, + "3000/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "USER=git", + "GITEA_CUSTOM=/data/gitea" + ], + "Cmd": [ + "-czf", + "/backup/kite-ai_open-webui.tar.gz", + "-C", + "/volume", + "." + ], + "Image": "codeberg.org/forgejo/forgejo:11", + "Volumes": { + "/data": {} + }, + "WorkingDir": "/", + "Entrypoint": [ + "tar" + ], + "OnBuild": null, + "Labels": { + "maintainer": "contact@forgejo.org", + "org.opencontainers.image.authors": "Forgejo", + "org.opencontainers.image.description": "Forgejo is a self-hosted lightweight software forge. Easy to install and low maintenance, it just does the job.", + "org.opencontainers.image.documentation": "https://forgejo.org/download/#container-image", + "org.opencontainers.image.licenses": "GPL-3.0-or-later", + "org.opencontainers.image.source": "https://codeberg.org/forgejo/forgejo", + "org.opencontainers.image.title": "Forgejo. Beyond coding. We forge.", + "org.opencontainers.image.url": "https://forgejo.org", + "org.opencontainers.image.vendor": "Forgejo", + "org.opencontainers.image.version": "11.0.14" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "5e7301753b5971ba518a4745fb7a92a244039c8f5aa4302a5fc52f99796f4176", + "SandboxKey": "/var/run/docker/netns/5e7301753b59", + "Ports": { + "22/tcp": null, + "3000/tcp": null + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "e4b52230d9b5dcdd9ad47eed65cacc287d6bab9559f241e1f844231337752a11", + "Gateway": "172.17.0.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.5", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "MacAddress": "02:42:ac:11:00:05", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "02:42:ac:11:00:05", + "NetworkID": "f4d4e2fb72e14fd40db0f04cfe43e79b4afdd228a2593c24a0e36c832349ba48", + "EndpointID": "e4b52230d9b5dcdd9ad47eed65cacc287d6bab9559f241e1f844231337752a11", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.5", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + } + } + } + }, + { + "Id": "909decb9d08f7a263c2496bc9965b084c1acefe15efbae18562f25dde681ea94", + "Created": "2026-06-09T17:06:09.162696444Z", + "Path": "/init", + "Args": [], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 1768028, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-09T17:06:12.959054977Z", + "FinishedAt": "0001-01-01T00:00:00Z", + "Health": { + "Status": "healthy", + "FailingStreak": 0, + "Log": [ + { + "Start": "2026-06-09T13:35:17.124625976-05:00", + "End": "2026-06-09T13:35:17.212915605-05:00", + "ExitCode": 0, + "Output": "Karakeep
Karakeep
Karakeep
Karakeep
Karakeep
", + "org.opencontainers.image.source": "https://github.com/grafana/grafana" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "5fdafd1f86694945a527bfba041b1665e7f6cfd21cbc26ba511700fad8c10b0d", + "SandboxKey": "/var/run/docker/netns/5fdafd1f8669", + "Ports": { + "3000/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "3150" + }, + { + "HostIp": "::", + "HostPort": "3150" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "grafana_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "grafana", + "grafana" + ], + "MacAddress": "02:42:ac:16:00:02", + "NetworkID": "9e267d3240c9a44415a73d20a605862f1d3a0951dd2fb9056ea9c9cd2f01d629", + "EndpointID": "88c4feb1c79d3ae25e6dbcfb64f8577469cc108df0ac2cb5fade169942bca761", + "Gateway": "172.22.0.1", + "IPAddress": "172.22.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "grafana", + "b6db6023a320" + ] + }, + "kitestacks": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "grafana", + "grafana" + ], + "MacAddress": "02:42:ac:12:00:08", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "75028c9b9d2f680c95c54378132cef5115efe428b63605c196946e7e8f72141f", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.8", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "grafana", + "b6db6023a320" + ] + } + } + } + }, + { + "Id": "4e6c68a8117e8988a76c8eb901d2cf102f25248b339fdcce24e5074f09c819e2", + "Created": "2026-06-08T05:40:37.130154539Z", + "Path": "cloudflared", + "Args": [ + "--no-autoupdate", + "tunnel", + "--no-autoupdate", + "run" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 4569, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:51.422871425Z", + "FinishedAt": "2026-06-08T10:20:43.664080642Z" + }, + "Image": "sha256:97db6eb4ae40bde4fa6dda97c0dd0471bb6e64fb33989f5f30f062b03bc93da7", + "ResolvConfPath": "/var/lib/docker/containers/4e6c68a8117e8988a76c8eb901d2cf102f25248b339fdcce24e5074f09c819e2/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/4e6c68a8117e8988a76c8eb901d2cf102f25248b339fdcce24e5074f09c819e2/hostname", + "HostsPath": "/var/lib/docker/containers/4e6c68a8117e8988a76c8eb901d2cf102f25248b339fdcce24e5074f09c819e2/hosts", + "LogPath": "/var/lib/docker/containers/4e6c68a8117e8988a76c8eb901d2cf102f25248b339fdcce24e5074f09c819e2/4e6c68a8117e8988a76c8eb901d2cf102f25248b339fdcce24e5074f09c819e2-json.log", + "Name": "/cloudflared", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "cloudflared_default", + "PortBindings": {}, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/b6d00dabcedb9ec531c9f641c3c17c0fb0ea9c4e652a35208775dd8894d0e4d7-init/diff:/var/lib/docker/overlay2/61c1d5085b4ec9f9410f27a2da337566ab04e10d50f2841ea2eb9b65ce668547/diff:/var/lib/docker/overlay2/09412a9e704a15195adf3e3776120b09c49a7e669b381d137f7d885d84966d97/diff:/var/lib/docker/overlay2/f3a02802385d9bb35b5f8bbdedea1329b0de0a71745c9c6ebcfe3c9834547bae/diff:/var/lib/docker/overlay2/0f5cedd3cced33575a049b134004b5115b7865a54fb937214e846c1198c49512/diff:/var/lib/docker/overlay2/e376f3e34f47e3eec6ad0fbc830a620379829e047918fbbdcd9e4129e0a0b01c/diff:/var/lib/docker/overlay2/68f3411ff9e66f1164abd5fe78be3e6d3113e5d949328015a4fbe412a9511392/diff:/var/lib/docker/overlay2/dea403926f0d946bfc437e03e85887d92577c8a97f51e3232628d9b9d3a8b38a/diff:/var/lib/docker/overlay2/e41c028003011eccda817f37f33bb320055edb3495a24ea046f8723d3cac868d/diff:/var/lib/docker/overlay2/ad47e70994e1a965444a38d6edc884a01161696f507605399169ae7e96d8043d/diff:/var/lib/docker/overlay2/24866609d929c92c0f35cedde677436d5f1a5d7f5d2cebba1449873290fd7665/diff:/var/lib/docker/overlay2/3c3288cd91ac9161d063563d90dc17788efa96bbf13d5394523947b87f9861c9/diff:/var/lib/docker/overlay2/35c651090b31c1684b50f22430661cf9e28960026019cdc3e8971540d7e22b21/diff:/var/lib/docker/overlay2/18c582ea0994b50c4eeba69512f3e1e5067a6e876affc6d4a9f16de710401916/diff:/var/lib/docker/overlay2/3d0feb6cf1e220caae8a7040c2bdb9740223c833db738ab152033de282d866b1/diff:/var/lib/docker/overlay2/70948c173bea09ce0cc1695d2d38d3696ffae5ee9bfbc4c67a7852769559a3ec/diff:/var/lib/docker/overlay2/b7d03bd927955b100f7ebf84d595120d88ceda4311dca6bd84bc7aae7803328d/diff:/var/lib/docker/overlay2/80d9ac6039f2675a4c929f0e05efbf0a049619889b41637f16e44acbfa5667eb/diff:/var/lib/docker/overlay2/03859fd42d265543226381ed6c27b2301a12dc8523f7ba2dd32bafd872487fea/diff", + "MergedDir": "/var/lib/docker/overlay2/b6d00dabcedb9ec531c9f641c3c17c0fb0ea9c4e652a35208775dd8894d0e4d7/merged", + "UpperDir": "/var/lib/docker/overlay2/b6d00dabcedb9ec531c9f641c3c17c0fb0ea9c4e652a35208775dd8894d0e4d7/diff", + "WorkDir": "/var/lib/docker/overlay2/b6d00dabcedb9ec531c9f641c3c17c0fb0ea9c4e652a35208775dd8894d0e4d7/work" + }, + "Name": "overlay2" + }, + "Mounts": [], + "Config": { + "Hostname": "4e6c68a8117e", + "Domainname": "", + "User": "65532:65532", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "TUNNEL_TOKEN=eyJhIjoiZDBiYjc2NzMzMzNmY2Q3OTQ2MjI5NTZmMTY2MmY3ODUiLCJ0IjoiNWU2MGVhOGUtYTU0My00OWI2LWJhYjUtMzI1ZjM5NDQxZTAwIiwicyI6Ik56azRaamRrWXpjdE5tTm1PQzAwWVRobExUZ3dNR1V0T1RKbE5HVTVNakZtTUdVeU9EUm1NREEyTlRFdE9UWmtZeTAwWTJFMExUaGpaak10WXpneU9Ua3hNak0xWVRkaSJ9", + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt" + ], + "Cmd": [ + "tunnel", + "--no-autoupdate", + "run" + ], + "Image": "cloudflare/cloudflared:latest", + "Volumes": null, + "WorkingDir": "/home/nonroot", + "Entrypoint": [ + "cloudflared", + "--no-autoupdate" + ], + "OnBuild": null, + "Labels": { + "CI_BUILD_DATE": "2026-05-27 10:51:04.466593", + "CI_DOCKER_FROM": "gcr.io/distroless/base-debian13:nonroot", + "CI_DOCKER_VERSION": "{\"Platform\": {\"Name\": \"Docker Engine - Community\"}, \"Components\": [{\"Name\": \"Engine\", \"Version\": \"28.5.2\", \"Details\": {\"ApiVersion\": \"1.51\", \"Arch\": \"amd64\", \"BuildTime\": \"2025-11-05T14:43:25.000000000+00:00\", \"Experimental\": \"false\", \"GitCommit\": \"89c5e8f\", \"GoVersion\": \"go1.25.3\", \"KernelVersion\": \"6.12.58-cloudflare-2025.11.5\", \"MinAPIVersion\": \"1.24\", \"Os\": \"linux\"}}, {\"Name\": \"containerd\", \"Version\": \"v2.1.5\", \"Details\": {\"GitCommit\": \"fcd43222d6b07379a4be9786bda52438f0dd16a1\"}}, {\"Name\": \"runc\", \"Version\": \"1.3.3\", \"Details\": {\"GitCommit\": \"v1.3.3-0-gd842d771\"}}, {\"Name\": \"docker-init\", \"Version\": \"0.19.0\", \"Details\": {\"GitCommit\": \"de40ad0\"}}], \"Version\": \"28.5.2\", \"ApiVersion\": \"1.51\", \"MinAPIVersion\": \"1.24\", \"GitCommit\": \"89c5e8f\", \"GoVersion\": \"go1.25.3\", \"Os\": \"linux\", \"Arch\": \"amd64\", \"KernelVersion\": \"6.12.58-cloudflare-2025.11.5\", \"BuildTime\": \"2025-11-05T14:43:25.000000000+00:00\"}", + "CI_GIT_COMMIT": "0e84636de9450d9e73c1e28932ed2bd62cb33e10", + "CI_GIT_REMOTE": "https://gitlab.cfdata.org/cloudflare/tun/cloudflared.git", + "CI_TEAMCITY_BUILDCONF": "", + "CI_TEAMCITY_BUILD_NUMBER": "", + "IMAGE_TYPE": "distroless", + "com.docker.compose.config-hash": "54e57b198cf337bdbfd08ef09c0d22b4c634d24005d6d0def3b6ffe189e1ecf8", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:97db6eb4ae40bde4fa6dda97c0dd0471bb6e64fb33989f5f30f062b03bc93da7", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "cloudflared", + "com.docker.compose.project.config_files": "/home/kenpat/docker/cloudflared/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/cloudflared", + "com.docker.compose.replace": "3637d90585f0d66d973c20a18938c29de510d1d795fdbca85631edaa4815a084", + "com.docker.compose.service": "cloudflared", + "com.docker.compose.version": "2.26.1", + "org.opencontainers.image.source": "https://github.com/cloudflare/cloudflared" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "21f7fd453c254c1bd7802a09442ea867fd214312ef0a9c24d8677600c9000973", + "SandboxKey": "/var/run/docker/netns/21f7fd453c25", + "Ports": {}, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "cloudflared_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "cloudflared", + "cloudflared" + ], + "MacAddress": "02:42:ac:1a:00:02", + "NetworkID": "70ba1bd90717a817fecfcd8591ed04ae1cad9c35a361d93d02eb209adc2cda03", + "EndpointID": "a0060e1a5115b7afd846af6d0885bdcc19da048141cf9ac498c0a7650f0746f6", + "Gateway": "172.26.0.1", + "IPAddress": "172.26.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "cloudflared", + "4e6c68a8117e" + ] + }, + "kitestacks": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "cloudflared", + "cloudflared" + ], + "MacAddress": "02:42:ac:12:00:07", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "0230f7880948799fd36664390ebc38989de2d1b3341b5fdbbf5240924cad9385", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.7", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "cloudflared", + "4e6c68a8117e" + ] + } + } + } + }, + { + "Id": "33fa2312ac22c8dbeabeb7534ca8829feee8307cf334e99cecdc0574034420b9", + "Created": "2026-06-08T04:38:28.011739852Z", + "Path": "cloudflared", + "Args": [ + "--no-autoupdate", + "tunnel", + "--no-autoupdate", + "run", + "--token", + "eyJhIjoiZDBiYjc2NzMzMzNmY2Q3OTQ2MjI5NTZmMTY2MmY3ODUiLCJ0IjoiNWU2MGVhOGUtYTU0My00OWI2LWJhYjUtMzI1ZjM5NDQxZTAwIiwicyI6Ik1UWTRNR0UxTm1VdFlUZGtZUzAwWXpRd0xXSTBPR010TVdVM05URTVPRFJtT0RaaU9EQTJabUl4T1RndE9ESm1NeTAwWVdJMExUZ3laRFF0WkRaa1pHTmxPRFJpWVRBMyJ9" + ], + "State": { + "Status": "exited", + "Running": false, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 0, + "ExitCode": 2, + "Error": "", + "StartedAt": "2026-06-08T04:38:28.38566899Z", + "FinishedAt": "2026-06-08T05:20:39.556061974Z" + }, + "Image": "sha256:97db6eb4ae40bde4fa6dda97c0dd0471bb6e64fb33989f5f30f062b03bc93da7", + "ResolvConfPath": "/var/lib/docker/containers/33fa2312ac22c8dbeabeb7534ca8829feee8307cf334e99cecdc0574034420b9/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/33fa2312ac22c8dbeabeb7534ca8829feee8307cf334e99cecdc0574034420b9/hostname", + "HostsPath": "/var/lib/docker/containers/33fa2312ac22c8dbeabeb7534ca8829feee8307cf334e99cecdc0574034420b9/hosts", + "LogPath": "/var/lib/docker/containers/33fa2312ac22c8dbeabeb7534ca8829feee8307cf334e99cecdc0574034420b9/33fa2312ac22c8dbeabeb7534ca8829feee8307cf334e99cecdc0574034420b9-json.log", + "Name": "/focused_mendeleev", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": {}, + "RestartPolicy": { + "Name": "no", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 41, + 61 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/a90391342e86680f710e6fc4be4ffc61e36b648b4122ca3210c0b61bf84857dd-init/diff:/var/lib/docker/overlay2/61c1d5085b4ec9f9410f27a2da337566ab04e10d50f2841ea2eb9b65ce668547/diff:/var/lib/docker/overlay2/09412a9e704a15195adf3e3776120b09c49a7e669b381d137f7d885d84966d97/diff:/var/lib/docker/overlay2/f3a02802385d9bb35b5f8bbdedea1329b0de0a71745c9c6ebcfe3c9834547bae/diff:/var/lib/docker/overlay2/0f5cedd3cced33575a049b134004b5115b7865a54fb937214e846c1198c49512/diff:/var/lib/docker/overlay2/e376f3e34f47e3eec6ad0fbc830a620379829e047918fbbdcd9e4129e0a0b01c/diff:/var/lib/docker/overlay2/68f3411ff9e66f1164abd5fe78be3e6d3113e5d949328015a4fbe412a9511392/diff:/var/lib/docker/overlay2/dea403926f0d946bfc437e03e85887d92577c8a97f51e3232628d9b9d3a8b38a/diff:/var/lib/docker/overlay2/e41c028003011eccda817f37f33bb320055edb3495a24ea046f8723d3cac868d/diff:/var/lib/docker/overlay2/ad47e70994e1a965444a38d6edc884a01161696f507605399169ae7e96d8043d/diff:/var/lib/docker/overlay2/24866609d929c92c0f35cedde677436d5f1a5d7f5d2cebba1449873290fd7665/diff:/var/lib/docker/overlay2/3c3288cd91ac9161d063563d90dc17788efa96bbf13d5394523947b87f9861c9/diff:/var/lib/docker/overlay2/35c651090b31c1684b50f22430661cf9e28960026019cdc3e8971540d7e22b21/diff:/var/lib/docker/overlay2/18c582ea0994b50c4eeba69512f3e1e5067a6e876affc6d4a9f16de710401916/diff:/var/lib/docker/overlay2/3d0feb6cf1e220caae8a7040c2bdb9740223c833db738ab152033de282d866b1/diff:/var/lib/docker/overlay2/70948c173bea09ce0cc1695d2d38d3696ffae5ee9bfbc4c67a7852769559a3ec/diff:/var/lib/docker/overlay2/b7d03bd927955b100f7ebf84d595120d88ceda4311dca6bd84bc7aae7803328d/diff:/var/lib/docker/overlay2/80d9ac6039f2675a4c929f0e05efbf0a049619889b41637f16e44acbfa5667eb/diff:/var/lib/docker/overlay2/03859fd42d265543226381ed6c27b2301a12dc8523f7ba2dd32bafd872487fea/diff", + "MergedDir": "/var/lib/docker/overlay2/a90391342e86680f710e6fc4be4ffc61e36b648b4122ca3210c0b61bf84857dd/merged", + "UpperDir": "/var/lib/docker/overlay2/a90391342e86680f710e6fc4be4ffc61e36b648b4122ca3210c0b61bf84857dd/diff", + "WorkDir": "/var/lib/docker/overlay2/a90391342e86680f710e6fc4be4ffc61e36b648b4122ca3210c0b61bf84857dd/work" + }, + "Name": "overlay2" + }, + "Mounts": [], + "Config": { + "Hostname": "33fa2312ac22", + "Domainname": "", + "User": "65532:65532", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt" + ], + "Cmd": [ + "tunnel", + "--no-autoupdate", + "run", + "--token", + "eyJhIjoiZDBiYjc2NzMzMzNmY2Q3OTQ2MjI5NTZmMTY2MmY3ODUiLCJ0IjoiNWU2MGVhOGUtYTU0My00OWI2LWJhYjUtMzI1ZjM5NDQxZTAwIiwicyI6Ik1UWTRNR0UxTm1VdFlUZGtZUzAwWXpRd0xXSTBPR010TVdVM05URTVPRFJtT0RaaU9EQTJabUl4T1RndE9ESm1NeTAwWVdJMExUZ3laRFF0WkRaa1pHTmxPRFJpWVRBMyJ9" + ], + "Image": "cloudflare/cloudflared:latest", + "Volumes": null, + "WorkingDir": "/home/nonroot", + "Entrypoint": [ + "cloudflared", + "--no-autoupdate" + ], + "OnBuild": null, + "Labels": { + "CI_BUILD_DATE": "2026-05-27 10:51:04.466593", + "CI_DOCKER_FROM": "gcr.io/distroless/base-debian13:nonroot", + "CI_DOCKER_VERSION": "{\"Platform\": {\"Name\": \"Docker Engine - Community\"}, \"Components\": [{\"Name\": \"Engine\", \"Version\": \"28.5.2\", \"Details\": {\"ApiVersion\": \"1.51\", \"Arch\": \"amd64\", \"BuildTime\": \"2025-11-05T14:43:25.000000000+00:00\", \"Experimental\": \"false\", \"GitCommit\": \"89c5e8f\", \"GoVersion\": \"go1.25.3\", \"KernelVersion\": \"6.12.58-cloudflare-2025.11.5\", \"MinAPIVersion\": \"1.24\", \"Os\": \"linux\"}}, {\"Name\": \"containerd\", \"Version\": \"v2.1.5\", \"Details\": {\"GitCommit\": \"fcd43222d6b07379a4be9786bda52438f0dd16a1\"}}, {\"Name\": \"runc\", \"Version\": \"1.3.3\", \"Details\": {\"GitCommit\": \"v1.3.3-0-gd842d771\"}}, {\"Name\": \"docker-init\", \"Version\": \"0.19.0\", \"Details\": {\"GitCommit\": \"de40ad0\"}}], \"Version\": \"28.5.2\", \"ApiVersion\": \"1.51\", \"MinAPIVersion\": \"1.24\", \"GitCommit\": \"89c5e8f\", \"GoVersion\": \"go1.25.3\", \"Os\": \"linux\", \"Arch\": \"amd64\", \"KernelVersion\": \"6.12.58-cloudflare-2025.11.5\", \"BuildTime\": \"2025-11-05T14:43:25.000000000+00:00\"}", + "CI_GIT_COMMIT": "0e84636de9450d9e73c1e28932ed2bd62cb33e10", + "CI_GIT_REMOTE": "https://gitlab.cfdata.org/cloudflare/tun/cloudflared.git", + "CI_TEAMCITY_BUILDCONF": "", + "CI_TEAMCITY_BUILD_NUMBER": "", + "IMAGE_TYPE": "distroless", + "org.opencontainers.image.source": "https://github.com/cloudflare/cloudflared" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "9819af379b1b29c64b3755ab7a68e39cb4e50c7b9d5f8c106ba5819a80a2a260", + "SandboxKey": "/var/run/docker/netns/9819af379b1b", + "Ports": {}, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "", + "NetworkID": "bd53da6c8fe087a8e53ff7d169a8006c2c1339aefa0dfa1062a89083b0aaf54b", + "EndpointID": "", + "Gateway": "", + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + } + } + } + }, + { + "Id": "79993e080094f302d61c6741904fc6489760798124873d8051770ced1392274c", + "Created": "2026-06-08T02:53:42.876343392Z", + "Path": "uvicorn", + "Args": [ + "main:app", + "--host", + "0.0.0.0", + "--port", + "8000" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 3196, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:49.080320492Z", + "FinishedAt": "2026-06-08T10:20:43.674362925Z" + }, + "Image": "sha256:135674737bb03baacf124a4fbd2d99da63bee2fec0f145ccfab0946e6b6fa85e", + "ResolvConfPath": "/var/lib/docker/containers/79993e080094f302d61c6741904fc6489760798124873d8051770ced1392274c/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/79993e080094f302d61c6741904fc6489760798124873d8051770ced1392274c/hostname", + "HostsPath": "/var/lib/docker/containers/79993e080094f302d61c6741904fc6489760798124873d8051770ced1392274c/hosts", + "LogPath": "/var/lib/docker/containers/79993e080094f302d61c6741904fc6489760798124873d8051770ced1392274c/79993e080094f302d61c6741904fc6489760798124873d8051770ced1392274c-json.log", + "Name": "/kitestacks-metrics-api", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/etc/localtime:/host/etc/localtime:ro", + "/:/host:ro", + "/var/run/docker.sock:/var/run/docker.sock", + "/proc:/host/proc:ro", + "/sys:/host/sys:ro", + "/etc/os-release:/host/etc/os-release:ro", + "/etc/hostname:/host/etc/hostname:ro" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "host", + "PortBindings": {}, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/c18b4a685cca327ed43d93e04df36fff7e813c5fd496743029c9709a3b568af3-init/diff:/var/lib/docker/overlay2/4ztgrx8w4edag9c1lncb9gqo5/diff:/var/lib/docker/overlay2/tyzqadfyzbkujr4bhc3w5fwos/diff:/var/lib/docker/overlay2/rtc1epg9zkabrr0gz5vrbizzf/diff:/var/lib/docker/overlay2/8uuln2fo0yhz6st6e60adatz2/diff:/var/lib/docker/overlay2/ujf70c9r2t1r7qihjulvpdh16/diff:/var/lib/docker/overlay2/135f7ac9d59b62b1c0de44d992794c040748a8f10f0652341efd98d0ddbf8044/diff:/var/lib/docker/overlay2/714d76a8003276fac13a9f897dc53319ac561a75fd7ac81e1bb41f08505eb648/diff:/var/lib/docker/overlay2/45ea1779ebd7224d0b6474fc76059f4326d3babce76ec6c127b1f1de015c325d/diff:/var/lib/docker/overlay2/a531c4e6aa2d167a1e5ab5fcbb1aecf0f11ca4fc537e738351502f2059fa215e/diff", + "MergedDir": "/var/lib/docker/overlay2/c18b4a685cca327ed43d93e04df36fff7e813c5fd496743029c9709a3b568af3/merged", + "UpperDir": "/var/lib/docker/overlay2/c18b4a685cca327ed43d93e04df36fff7e813c5fd496743029c9709a3b568af3/diff", + "WorkDir": "/var/lib/docker/overlay2/c18b4a685cca327ed43d93e04df36fff7e813c5fd496743029c9709a3b568af3/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/etc/hostname", + "Destination": "/host/etc/hostname", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/etc/localtime", + "Destination": "/host/etc/localtime", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/etc/os-release", + "Destination": "/host/etc/os-release", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/proc", + "Destination": "/host/proc", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/sys", + "Destination": "/host/sys", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/var/run/docker.sock", + "Destination": "/var/run/docker.sock", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/", + "Destination": "/host", + "Mode": "ro", + "RW": false, + "Propagation": "rslave" + } + ], + "Config": { + "Hostname": "Assassin", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "ExposedPorts": { + "8000/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "HOST_ETC=/host/etc", + "HOST_PROC=/host/proc", + "FORGEJO_API_BASE=http://127.0.0.1:3006", + "FORGEJO_BASE=https://gitforge.kitestacks.com", + "HOST_SYS=/host/sys", + "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "LANG=C.UTF-8", + "GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305", + "PYTHON_VERSION=3.12.13", + "PYTHON_SHA256=c08bc65a81971c1dd5783182826503369466c7e67374d1646519adf05207b684" + ], + "Cmd": [ + "uvicorn", + "main:app", + "--host", + "0.0.0.0", + "--port", + "8000" + ], + "Image": "kitestacks-portal-test-metrics-api:latest", + "Volumes": null, + "WorkingDir": "/app", + "Entrypoint": null, + "OnBuild": null, + "Labels": {} + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "6d3648e9dd2e1106c9aa019c1caeec69153177d7b110d8ac16b872a550beba88", + "SandboxKey": "/var/run/docker/netns/default", + "Ports": {}, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "host": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "", + "NetworkID": "30a58a132ea6a1fada6e3804d8b83c5f13a89884bee22d3e6b0ce46f06bf713d", + "EndpointID": "9a59142244f8ed527c7bce07ffadcae6e84279e3b73ae42fa3d2294946f34db8", + "Gateway": "", + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + } + } + } + }, + { + "Id": "d9c3fac96217ff685e08cde5b66615a83ca6e2329640eb5288ff6ef04bc418ec", + "Created": "2026-06-07T06:57:16.366913784Z", + "Path": "/docker-entrypoint.sh", + "Args": [ + "nginx", + "-g", + "daemon off;" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 5287, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:52.229902746Z", + "FinishedAt": "2026-06-08T10:20:43.664140012Z" + }, + "Image": "sha256:da954fb959a34e2195e6bf622e6396bf338f99e0fe6d8e641b302d9aaa1f0645", + "ResolvConfPath": "/var/lib/docker/containers/d9c3fac96217ff685e08cde5b66615a83ca6e2329640eb5288ff6ef04bc418ec/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/d9c3fac96217ff685e08cde5b66615a83ca6e2329640eb5288ff6ef04bc418ec/hostname", + "HostsPath": "/var/lib/docker/containers/d9c3fac96217ff685e08cde5b66615a83ca6e2329640eb5288ff6ef04bc418ec/hosts", + "LogPath": "/var/lib/docker/containers/d9c3fac96217ff685e08cde5b66615a83ca6e2329640eb5288ff6ef04bc418ec/d9c3fac96217ff685e08cde5b66615a83ca6e2329640eb5288ff6ef04bc418ec-json.log", + "Name": "/homepage", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/kitestacks-portal/public:/usr/share/nginx/html:ro", + "/home/kenpat/docker/kitestacks-portal/nginx.conf:/etc/nginx/conf.d/default.conf:ro" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "kitestacks-portal_default", + "PortBindings": { + "3000/tcp": [ + { + "HostIp": "", + "HostPort": "3005" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [ + "host.docker.internal:host-gateway" + ], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/ac81ff9ff3059c5f438fdf55d159148f95d267dcd285e925c522d70743f69324-init/diff:/var/lib/docker/overlay2/18b9f44b1153bae05a46b44856d4e5acb9795e7fbe778fb7f79a7b022895fb28/diff:/var/lib/docker/overlay2/b8e13bf5f6dbfb2c2eef95d8d0805894b00109a9bfd5c181e8fe9b98b9383994/diff:/var/lib/docker/overlay2/ece87c048242e2b82d38b54ee2836c12a5b4adc377edcb86de19ce5b252a76a7/diff:/var/lib/docker/overlay2/1d1f56957402b5ac17fb38db779d9ca1f91b899cceae18fbf845b83abbf404e4/diff:/var/lib/docker/overlay2/e559fd74bc74db1f7bd2dbf4f19eea84f9fa783c6164575e7d5357d23c436ea6/diff:/var/lib/docker/overlay2/cb0395d4b52ab42891ee490333b1eb4a548414edf01de8850a6229a302599d94/diff:/var/lib/docker/overlay2/fe3e5d44aa3db883b95484256be25702e63e0f179e4c259fdd45ba11cd6d1f04/diff:/var/lib/docker/overlay2/fa4d33981d81cbdd953516681c9d561c405310e34772e86b30630651aec81407/diff", + "MergedDir": "/var/lib/docker/overlay2/ac81ff9ff3059c5f438fdf55d159148f95d267dcd285e925c522d70743f69324/merged", + "UpperDir": "/var/lib/docker/overlay2/ac81ff9ff3059c5f438fdf55d159148f95d267dcd285e925c522d70743f69324/diff", + "WorkDir": "/var/lib/docker/overlay2/ac81ff9ff3059c5f438fdf55d159148f95d267dcd285e925c522d70743f69324/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/kitestacks-portal/nginx.conf", + "Destination": "/etc/nginx/conf.d/default.conf", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/home/kenpat/docker/kitestacks-portal/public", + "Destination": "/usr/share/nginx/html", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "d9c3fac96217", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "3000/tcp": {}, + "80/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "NGINX_VERSION=1.31.1", + "PKG_RELEASE=1", + "DYNPKG_RELEASE=1", + "NJS_VERSION=0.9.9", + "NJS_RELEASE=1", + "ACME_VERSION=0.4.1" + ], + "Cmd": [ + "nginx", + "-g", + "daemon off;" + ], + "Image": "nginx:alpine", + "Volumes": null, + "WorkingDir": "/", + "Entrypoint": [ + "/docker-entrypoint.sh" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "31ec4170679a39fddd2207df0a095a9143f7d930508bbbd103e92dc91c0a304a", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:da954fb959a34e2195e6bf622e6396bf338f99e0fe6d8e641b302d9aaa1f0645", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "kitestacks-portal", + "com.docker.compose.project.config_files": "/home/kenpat/docker/kitestacks-portal/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/kitestacks-portal", + "com.docker.compose.replace": "f45ab6789af51c8d7b2ea86d007b26e5bb5d62902dec49e5f3d3aa56db3cf6ad", + "com.docker.compose.service": "homepage", + "com.docker.compose.version": "2.26.1", + "maintainer": "NGINX Docker Maintainers " + }, + "StopSignal": "SIGQUIT" + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "a55a6e28be3b83bca6abf45d787288e289ccc61adb3699f66fc3b7be5c2b11c4", + "SandboxKey": "/var/run/docker/netns/a55a6e28be3b", + "Ports": { + "3000/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "3005" + }, + { + "HostIp": "::", + "HostPort": "3005" + } + ], + "80/tcp": null + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "kitestacks": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "homepage", + "homepage" + ], + "MacAddress": "02:42:ac:12:00:0b", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "63322bc51f7d72dc111832194d4187be6a4705e72b0748f05b74e916406ad24e", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.11", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "homepage", + "d9c3fac96217" + ] + }, + "kitestacks-portal_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "homepage", + "homepage" + ], + "MacAddress": "02:42:c0:a8:30:02", + "NetworkID": "fa41b0d19f8e8feb1e3416483c8bd82edcd7f9d9e4e3175016ee152d1cf33614", + "EndpointID": "8298a6dbbb7818b7d94b2aef81b6cfab212e31b17960c81e7e7a34335c23e0ee", + "Gateway": "192.168.48.1", + "IPAddress": "192.168.48.2", + "IPPrefixLen": 20, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "homepage", + "d9c3fac96217" + ] + } + } + } + }, + { + "Id": "0e2203883f5bffa7ebfe36240b5760a50de41b812489db39f69b5630ddc86971", + "Created": "2026-06-07T06:34:44.502495298Z", + "Path": "/docker-entrypoint.sh", + "Args": [ + "nginx", + "-g", + "daemon off;" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 3635, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:50.165248339Z", + "FinishedAt": "2026-06-08T10:20:43.674358604Z" + }, + "Image": "sha256:da954fb959a34e2195e6bf622e6396bf338f99e0fe6d8e641b302d9aaa1f0645", + "ResolvConfPath": "/var/lib/docker/containers/0e2203883f5bffa7ebfe36240b5760a50de41b812489db39f69b5630ddc86971/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/0e2203883f5bffa7ebfe36240b5760a50de41b812489db39f69b5630ddc86971/hostname", + "HostsPath": "/var/lib/docker/containers/0e2203883f5bffa7ebfe36240b5760a50de41b812489db39f69b5630ddc86971/hosts", + "LogPath": "/var/lib/docker/containers/0e2203883f5bffa7ebfe36240b5760a50de41b812489db39f69b5630ddc86971/0e2203883f5bffa7ebfe36240b5760a50de41b812489db39f69b5630ddc86971-json.log", + "Name": "/kitestacks-portal-test", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/kitestacks-portal-test/public:/usr/share/nginx/html:ro", + "/home/kenpat/docker/kitestacks-portal-test/nginx.conf:/etc/nginx/conf.d/default.conf:ro" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "kitestacks-portal-test_default", + "PortBindings": { + "80/tcp": [ + { + "HostIp": "", + "HostPort": "3008" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [ + "host.docker.internal:host-gateway" + ], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/4003a9842b0be327dcda5fc72bc1f81f403799cc4ab3b8e73cd08f67f928b404-init/diff:/var/lib/docker/overlay2/18b9f44b1153bae05a46b44856d4e5acb9795e7fbe778fb7f79a7b022895fb28/diff:/var/lib/docker/overlay2/b8e13bf5f6dbfb2c2eef95d8d0805894b00109a9bfd5c181e8fe9b98b9383994/diff:/var/lib/docker/overlay2/ece87c048242e2b82d38b54ee2836c12a5b4adc377edcb86de19ce5b252a76a7/diff:/var/lib/docker/overlay2/1d1f56957402b5ac17fb38db779d9ca1f91b899cceae18fbf845b83abbf404e4/diff:/var/lib/docker/overlay2/e559fd74bc74db1f7bd2dbf4f19eea84f9fa783c6164575e7d5357d23c436ea6/diff:/var/lib/docker/overlay2/cb0395d4b52ab42891ee490333b1eb4a548414edf01de8850a6229a302599d94/diff:/var/lib/docker/overlay2/fe3e5d44aa3db883b95484256be25702e63e0f179e4c259fdd45ba11cd6d1f04/diff:/var/lib/docker/overlay2/fa4d33981d81cbdd953516681c9d561c405310e34772e86b30630651aec81407/diff", + "MergedDir": "/var/lib/docker/overlay2/4003a9842b0be327dcda5fc72bc1f81f403799cc4ab3b8e73cd08f67f928b404/merged", + "UpperDir": "/var/lib/docker/overlay2/4003a9842b0be327dcda5fc72bc1f81f403799cc4ab3b8e73cd08f67f928b404/diff", + "WorkDir": "/var/lib/docker/overlay2/4003a9842b0be327dcda5fc72bc1f81f403799cc4ab3b8e73cd08f67f928b404/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/kitestacks-portal-test/nginx.conf", + "Destination": "/etc/nginx/conf.d/default.conf", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/home/kenpat/docker/kitestacks-portal-test/public", + "Destination": "/usr/share/nginx/html", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "0e2203883f5b", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "80/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "NGINX_VERSION=1.31.1", + "PKG_RELEASE=1", + "DYNPKG_RELEASE=1", + "NJS_VERSION=0.9.9", + "NJS_RELEASE=1", + "ACME_VERSION=0.4.1" + ], + "Cmd": [ + "nginx", + "-g", + "daemon off;" + ], + "Image": "nginx:alpine", + "Volumes": null, + "WorkingDir": "/", + "Entrypoint": [ + "/docker-entrypoint.sh" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "fc5d0b92aeb6b628773f9a9b75dcd407c6371a08795e38e9ac4ad2210f35a139", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "metrics-api:service_started:false", + "com.docker.compose.image": "sha256:da954fb959a34e2195e6bf622e6396bf338f99e0fe6d8e641b302d9aaa1f0645", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "kitestacks-portal-test", + "com.docker.compose.project.config_files": "/home/kenpat/docker/kitestacks-portal-test/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/kitestacks-portal-test", + "com.docker.compose.replace": "eed6b0dd103383c5365270ef2c61be58926abb7d30350972885d687cd9e2151d", + "com.docker.compose.service": "kitestacks-portal-test", + "com.docker.compose.version": "2.26.1", + "maintainer": "NGINX Docker Maintainers " + }, + "StopSignal": "SIGQUIT" + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "a4f1b07c8190fd3292d7b43fffc7120e1b915187636d19239cf9ef9f3f292b37", + "SandboxKey": "/var/run/docker/netns/a4f1b07c8190", + "Ports": { + "80/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "3008" + }, + { + "HostIp": "::", + "HostPort": "3008" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "kitestacks-portal-test_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "kitestacks-portal-test", + "kitestacks-portal-test" + ], + "MacAddress": "02:42:c0:a8:20:02", + "NetworkID": "7530729ebfae3e27e9b33b73d26e946098e15e1483420791acec7f28435cda0c", + "EndpointID": "b0f9b9841bfe7ca4dee0a6b64186b0f2ad97a7593be2c60fdfc0dbc1eb271913", + "Gateway": "192.168.32.1", + "IPAddress": "192.168.32.2", + "IPPrefixLen": 20, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "kitestacks-portal-test", + "0e2203883f5b" + ] + } + } + } + }, + { + "Id": "c0541a4ee788a3e1437cf620fb9bc50fe9083a1ebdd2778316301c5b4475d88e", + "Created": "2026-06-07T02:20:56.593091592Z", + "Path": "docker-entrypoint.sh", + "Args": [ + "node", + "server.js" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 3663, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:50.188883051Z", + "FinishedAt": "2026-06-08T10:20:43.677663864Z", + "Health": { + "Status": "healthy", + "FailingStreak": 0, + "Log": [ + { + "Start": "2026-06-09T13:36:45.248895297-05:00", + "End": "2026-06-09T13:36:45.314788958-05:00", + "ExitCode": 0, + "Output": "Connecting to 127.0.0.1:3000 (127.0.0.1:3000)\nremote file exists\n" + }, + { + "Start": "2026-06-09T13:36:55.315984623-05:00", + "End": "2026-06-09T13:36:55.383058556-05:00", + "ExitCode": 0, + "Output": "Connecting to 127.0.0.1:3000 (127.0.0.1:3000)\nremote file exists\n" + }, + { + "Start": "2026-06-09T13:37:05.383929308-05:00", + "End": "2026-06-09T13:37:05.472818702-05:00", + "ExitCode": 0, + "Output": "Connecting to 127.0.0.1:3000 (127.0.0.1:3000)\nremote file exists\n" + }, + { + "Start": "2026-06-09T13:37:15.474120035-05:00", + "End": "2026-06-09T13:37:15.553477445-05:00", + "ExitCode": 0, + "Output": "Connecting to 127.0.0.1:3000 (127.0.0.1:3000)\nremote file exists\n" + }, + { + "Start": "2026-06-09T13:37:25.554316294-05:00", + "End": "2026-06-09T13:37:25.620173182-05:00", + "ExitCode": 0, + "Output": "Connecting to 127.0.0.1:3000 (127.0.0.1:3000)\nremote file exists\n" + } + ] + } + }, + "Image": "sha256:d3ab993a116ddb4965aa2762af3ac1fb484f6ad853cf785705e6cc1e0aca33d8", + "ResolvConfPath": "/var/lib/docker/containers/c0541a4ee788a3e1437cf620fb9bc50fe9083a1ebdd2778316301c5b4475d88e/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/c0541a4ee788a3e1437cf620fb9bc50fe9083a1ebdd2778316301c5b4475d88e/hostname", + "HostsPath": "/var/lib/docker/containers/c0541a4ee788a3e1437cf620fb9bc50fe9083a1ebdd2778316301c5b4475d88e/hosts", + "LogPath": "/var/lib/docker/containers/c0541a4ee788a3e1437cf620fb9bc50fe9083a1ebdd2778316301c5b4475d88e/c0541a4ee788a3e1437cf620fb9bc50fe9083a1ebdd2778316301c5b4475d88e-json.log", + "Name": "/homepage-test", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/homepage/config-test:/app/config:rw", + "/var/run/docker.sock:/var/run/docker.sock:ro" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "homepage_default", + "PortBindings": { + "3000/tcp": [ + { + "HostIp": "", + "HostPort": "3007" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/1e526d3a162d93ef1d7dc6b3b82b8aea5c5b3903bb0da3189e82e754e9401f58-init/diff:/var/lib/docker/overlay2/2bb730c7061551ee555d3037a02b77644cdccb58a384c2e9074e55b115b1e7a8/diff:/var/lib/docker/overlay2/7162208df0fd47d10eebfa3f869cd8fa1ad0e26f1503fabd88e0282a8cf08c6f/diff:/var/lib/docker/overlay2/f96cbf33dd67806c37956e44d57b8ec829b8b4ef493d85ed7cd06be01eaaadb1/diff:/var/lib/docker/overlay2/3897089ee14a73a2411505c3aa74a18a9d2b8b5636e601e803396123f963869a/diff:/var/lib/docker/overlay2/d487d9a65dc992631cca4054cc9d1107ae8e6ff382a93e41d17d4b1654d11a63/diff:/var/lib/docker/overlay2/6c5aa57bd6dcd89511bf99f86f9e8211617903f329bccb276c393609b4f34364/diff:/var/lib/docker/overlay2/e150b5ea481343ddd282ea551f9de56988917ff2bb2dae01a2c50cf0a3bff686/diff:/var/lib/docker/overlay2/b56160cfdf62a154877767bb786ba739779704d84eec5bc9e667ee338102298e/diff:/var/lib/docker/overlay2/199ef59e953956bd211ec2c44a7315e759597fabb2926575def781619d45d710/diff:/var/lib/docker/overlay2/fa4d33981d81cbdd953516681c9d561c405310e34772e86b30630651aec81407/diff", + "MergedDir": "/var/lib/docker/overlay2/1e526d3a162d93ef1d7dc6b3b82b8aea5c5b3903bb0da3189e82e754e9401f58/merged", + "UpperDir": "/var/lib/docker/overlay2/1e526d3a162d93ef1d7dc6b3b82b8aea5c5b3903bb0da3189e82e754e9401f58/diff", + "WorkDir": "/var/lib/docker/overlay2/1e526d3a162d93ef1d7dc6b3b82b8aea5c5b3903bb0da3189e82e754e9401f58/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/homepage/config-test", + "Destination": "/app/config", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/var/run/docker.sock", + "Destination": "/var/run/docker.sock", + "Mode": "ro", + "RW": false, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "c0541a4ee788", + "Domainname": "", + "User": "root", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "3000/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "HOMEPAGE_ALLOWED_HOSTS=localhost:3007,192.168.1.205:3007,www.kitestacks.test.com,kitestacks.test.com", + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "NODE_VERSION=22.22.2", + "YARN_VERSION=1.22.22", + "NODE_ENV=production", + "HOSTNAME=::", + "PORT=3000" + ], + "Cmd": [ + "node", + "server.js" + ], + "Healthcheck": { + "Test": [ + "CMD-SHELL", + "wget --no-verbose --tries=1 --spider http://127.0.0.1:$PORT/api/healthcheck || exit 1" + ], + "Interval": 10000000000, + "Timeout": 3000000000, + "StartPeriod": 20000000000 + }, + "Image": "ghcr.io/gethomepage/homepage:latest", + "Volumes": null, + "WorkingDir": "/app", + "Entrypoint": [ + "docker-entrypoint.sh" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "a0231dca1f2379dce9b766cfdbdfa731ee2cdfc43911c4c37722f4aa255eefa9", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:d3ab993a116ddb4965aa2762af3ac1fb484f6ad853cf785705e6cc1e0aca33d8", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "homepage", + "com.docker.compose.project.config_files": "/home/kenpat/docker/homepage/docker-compose.test.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/homepage", + "com.docker.compose.service": "homepage-test", + "com.docker.compose.version": "2.26.1", + "org.opencontainers.image.created": "2026-05-11T15:46:40.557Z", + "org.opencontainers.image.description": "A highly customizable homepage (or startpage / application dashboard) with Docker and service API integrations.", + "org.opencontainers.image.documentation": "https://github.com/gethomepage/homepage/wiki", + "org.opencontainers.image.licenses": "GPL-3.0", + "org.opencontainers.image.revision": "233721cc905be3a1eeb995963de14cd8d2a0d614", + "org.opencontainers.image.source": "https://github.com/gethomepage/homepage", + "org.opencontainers.image.title": "homepage", + "org.opencontainers.image.url": "https://github.com/gethomepage/homepage", + "org.opencontainers.image.version": "v1.13.1" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "42a68a334d9c3eac24db38fe88068ef5a0cb109ff7c4832c73852309d8aa1fbf", + "SandboxKey": "/var/run/docker/netns/42a68a334d9c", + "Ports": { + "3000/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "3007" + }, + { + "HostIp": "::", + "HostPort": "3007" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "homepage_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "homepage-test", + "homepage-test" + ], + "MacAddress": "02:42:ac:1b:00:02", + "NetworkID": "30777ab296b8cf2226521c1e33c3c79b253fc0cd338145e6ada169143a5f3f66", + "EndpointID": "f2f29c93c9f7c7e78c108aa6e97a4cc748c7cb171589a548e2b2c54d67a5f614", + "Gateway": "172.27.0.1", + "IPAddress": "172.27.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "homepage-test", + "c0541a4ee788" + ] + } + } + } + }, + { + "Id": "5531806b8fefb3a88101c3923d2435e5ad465fdab9f508cffecc5719502e89cf", + "Created": "2026-06-06T07:30:44.159740875Z", + "Path": "./bootstrap.sh", + "Args": [], + "State": { + "Status": "exited", + "Running": false, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 0, + "ExitCode": 255, + "Error": "", + "StartedAt": "2026-06-06T07:30:44.421153718Z", + "FinishedAt": "2026-06-06T17:59:18.360903108Z", + "Health": { + "Status": "starting", + "FailingStreak": 0, + "Log": [] + } + }, + "Image": "sha256:e1e2d91e0b7f38c8e4bb9eb09549126cbbb3fea8d9521e2ed3595c35408b2bf1", + "ResolvConfPath": "/var/lib/docker/containers/5531806b8fefb3a88101c3923d2435e5ad465fdab9f508cffecc5719502e89cf/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/5531806b8fefb3a88101c3923d2435e5ad465fdab9f508cffecc5719502e89cf/hostname", + "HostsPath": "/var/lib/docker/containers/5531806b8fefb3a88101c3923d2435e5ad465fdab9f508cffecc5719502e89cf/hosts", + "LogPath": "/var/lib/docker/containers/5531806b8fefb3a88101c3923d2435e5ad465fdab9f508cffecc5719502e89cf/5531806b8fefb3a88101c3923d2435e5ad465fdab9f508cffecc5719502e89cf-json.log", + "Name": "/linkding", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/linkding/data:/etc/linkding/data" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": { + "9090/tcp": [ + { + "HostIp": "192.168.1.205", + "HostPort": "9095" + } + ] + }, + "RestartPolicy": { + "Name": "no", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 41, + 58 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/7f4d3e45cb885801acd518e94e79646a00637bb3e4f1271002147b2e07d6ae26-init/diff:/var/lib/docker/overlay2/b5c788816693618a8f33793abbc989351fac5ee041adec4aaed4a331d33038c2/diff:/var/lib/docker/overlay2/c598ceb577fa30b7110f86bdf83374a1c25de9d5786e352414d1682a7d807d90/diff:/var/lib/docker/overlay2/f560f92b7e96ec184fbc4ef0445826b3b304d30e435f2b7fbbb9cf07bef2b274/diff:/var/lib/docker/overlay2/25115ba4d0581eaaf1d3264662a4c383632dee1dfb002f83d31f02562cc9c3f6/diff:/var/lib/docker/overlay2/75d4d60a93e6e3dae806e25b46bdfc2b96c44c4ef23a621184914104d2e1bc11/diff:/var/lib/docker/overlay2/b262f1bd26ebecd8e170b8cf59ac8e857af64822621011ff1a765397067df15f/diff:/var/lib/docker/overlay2/aeb424fd08813c9d498039a3ab6be8bc530801f4d5c2a9e954ba0f0d6078ebe2/diff:/var/lib/docker/overlay2/929b640b4b6a9c91fe9e43e9f9c339482da7cfdb7fd59156018f5c46ef09ea91/diff:/var/lib/docker/overlay2/18e5da136f05efa4feb53a912498ca72ceeb815676c9ea8f07c7bb7fa7d66e34/diff:/var/lib/docker/overlay2/d1bd20e5dce77783517658f58e0d0e37c435d88de7e73c8c8fdad748fe243c84/diff:/var/lib/docker/overlay2/0ea941a1fb7a77fafea0688a968543606ca03aab7a0542bb490bc3f850c4f557/diff:/var/lib/docker/overlay2/66e0592296bd00879a862aafe1a1b648ca857a442e48c5395dd6ab6b6a15e298/diff", + "MergedDir": "/var/lib/docker/overlay2/7f4d3e45cb885801acd518e94e79646a00637bb3e4f1271002147b2e07d6ae26/merged", + "UpperDir": "/var/lib/docker/overlay2/7f4d3e45cb885801acd518e94e79646a00637bb3e4f1271002147b2e07d6ae26/diff", + "WorkDir": "/var/lib/docker/overlay2/7f4d3e45cb885801acd518e94e79646a00637bb3e4f1271002147b2e07d6ae26/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/linkding/data", + "Destination": "/etc/linkding/data", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "5531806b8fef", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "ExposedPorts": { + "9090/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "LINKDING_ADMIN_USER=admin", + "LINKDING_ADMIN_PASSWORD=kite.link.p12217177", + "PATH=/etc/linkding/.venv/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305", + "PYTHON_VERSION=3.13.7", + "PYTHON_SHA256=5462f9099dfd30e238def83c71d91897d8caa5ff6ebc7a50f14d4802cdaaa79a", + "VIRTUAL_ENV=/etc/linkding/.venv", + "UWSGI_MAX_FD=4096" + ], + "Cmd": [ + "./bootstrap.sh" + ], + "Healthcheck": { + "Test": [ + "CMD-SHELL", + "curl -f http://localhost:${LD_SERVER_PORT:-9090}/${LD_CONTEXT_PATH}health || exit 1" + ], + "Interval": 30000000000, + "Timeout": 1000000000, + "Retries": 3 + }, + "Image": "sissbruecker/linkding:latest", + "Volumes": null, + "WorkingDir": "/etc/linkding", + "Entrypoint": null, + "OnBuild": null, + "Labels": { + "org.opencontainers.image.source": "https://github.com/sissbruecker/linkding" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "dddf53318ac099dc16feb041adaba24ceb81c265a4dd2af839015f912fc0f8f6", + "SandboxKey": "/var/run/docker/netns/dddf53318ac0", + "Ports": { + "9090/tcp": [ + { + "HostIp": "192.168.1.205", + "HostPort": "9095" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "e2a5c46fae52630936ef12313945465c8cd91a1e2fba0fba836edaf7698ca9e9", + "Gateway": "172.17.0.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.7", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "MacAddress": "02:42:ac:11:00:07", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "02:42:ac:11:00:07", + "NetworkID": "214fe3c67fdd934445372245c74e724358856729bcb3ff73d966e788cbcb15c6", + "EndpointID": "e2a5c46fae52630936ef12313945465c8cd91a1e2fba0fba836edaf7698ca9e9", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.7", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + } + } + } + }, + { + "Id": "cc6b0dfca579d634e3ee187ae479df4e892410c77e1b876bcf5c5018abdacb82", + "Created": "2026-06-05T04:50:31.059448229Z", + "Path": "docker/prod_entrypoint.sh", + "Args": [ + "--config", + "/app/config.yaml", + "--port", + "4000" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 5279, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:52.207377341Z", + "FinishedAt": "2026-06-08T10:20:43.663264232Z" + }, + "Image": "sha256:5cfceb7aa09ccc2951886f277392fd9e9cacb7ff8b17ac8bea93b2f0fc646b0f", + "ResolvConfPath": "/var/lib/docker/containers/cc6b0dfca579d634e3ee187ae479df4e892410c77e1b876bcf5c5018abdacb82/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/cc6b0dfca579d634e3ee187ae479df4e892410c77e1b876bcf5c5018abdacb82/hostname", + "HostsPath": "/var/lib/docker/containers/cc6b0dfca579d634e3ee187ae479df4e892410c77e1b876bcf5c5018abdacb82/hosts", + "LogPath": "/var/lib/docker/containers/cc6b0dfca579d634e3ee187ae479df4e892410c77e1b876bcf5c5018abdacb82/cc6b0dfca579d634e3ee187ae479df4e892410c77e1b876bcf5c5018abdacb82-json.log", + "Name": "/kite-litellm", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/kite-ai/litellm_config.yaml:/app/config.yaml:rw" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "kite-ai_default", + "PortBindings": { + "4000/tcp": [ + { + "HostIp": "", + "HostPort": "4000" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/5f1615a158c4fbd858eeaa9565b070fa8373784a57c2eb9435f7cf3c2a08aa08-init/diff:/var/lib/docker/overlay2/82f6bf89478c045deaf2c9c341736095dabe5de3e9d6ea9329f15034d82769b8/diff:/var/lib/docker/overlay2/e357df4bbccc53208ae5615d411fd2b3b82be5d51362fbbb2ce9fae492fdfddf/diff:/var/lib/docker/overlay2/5a7909eedbfaef34200bf2809822510b8894900696ee90f2f580f03621e294c8/diff:/var/lib/docker/overlay2/ef0c5366a7efad092a6fd699284457dce4621d68f9a09756aa90db6c2767944d/diff:/var/lib/docker/overlay2/7b0dc02b53a708814402a675654c60b262d21b260b829f68fe4a1eb8936ab6dc/diff:/var/lib/docker/overlay2/32c583a6884cea66da2436c3cc6afebcd290a19df082ea91738c2bb7873a57e8/diff:/var/lib/docker/overlay2/307a4ef369c31fd6c797e8bb219ba0039b2b1cfea0097a68b804f7d1589ce4d9/diff:/var/lib/docker/overlay2/668dccccef1156b9a346ece527127952ef708486015673448cd429aff2b5e536/diff:/var/lib/docker/overlay2/2362ba7b98310d699154b6b62718f30ee93e04dd3a7f8205dcecf6b6d8acd4bd/diff:/var/lib/docker/overlay2/98c5946170ae6e1c83da359db9d709413a3eeb9bca13a7fb319d6355669a2c57/diff:/var/lib/docker/overlay2/625b94c1196ee78cf6875a14f507b25372fe74eae6babfb02b8f9359c0c9dea8/diff:/var/lib/docker/overlay2/9e7d08d34d3e05ea4176b5e62539baad2f18639ca24e88ee2321c5728229e822/diff:/var/lib/docker/overlay2/ae3f3e8d8a9fa729afce1d12811f316672912cbe6a0f4f0696d565b3effbeabf/diff:/var/lib/docker/overlay2/df5f710a91d948909a7ee0d9d650c26e030a876bbeb2d5d9fda758810c51340b/diff:/var/lib/docker/overlay2/48b81185027f3b46120df5639f8cb6f55d144490d6d93a556f735375afce48e6/diff:/var/lib/docker/overlay2/f1c50aeb4f520132170070f4f88dcd166e0df2889084e1953e8fac1cb49ecaf9/diff:/var/lib/docker/overlay2/b9e71380f4069f53cdf9aa7e07413271e0f2f920af13c7baa9fc1cababe5bf94/diff:/var/lib/docker/overlay2/feb66f4218f65fba56ba531ce1d807f7923b4d26e698cb0c7bec1ef8b300aefa/diff:/var/lib/docker/overlay2/2fb0ba089db08b2a4ff289d5b788ed72257b838e121aa601dfecb7a3132733a4/diff:/var/lib/docker/overlay2/afa2ecf42d6ba76870f5636a5901a92b770d6f12efef66d76d082099d4af8396/diff:/var/lib/docker/overlay2/f71cf3fc492e27997d2aedfb7d56b8d6f0d2fb784791caa4de0af6cc68d697ca/diff:/var/lib/docker/overlay2/5371c9c17db52442f4d2ac6601a9f73d0d653c87e1497607629158c53bc2aa0e/diff:/var/lib/docker/overlay2/95baacfebc1e92f2149de35c73812ddca40332ebfd9fad83a48842555a61cc0f/diff:/var/lib/docker/overlay2/6643b74e46212b77e597ee3e0fd5739da00ecca5de00b4d5c819359ef9c298d2/diff:/var/lib/docker/overlay2/eddc5f59acbab511bd5ca037a50fe07033c725ee8abe3ade22764e9e3341784b/diff:/var/lib/docker/overlay2/109552bad28bd81ee999c6e9273a41e9d45343c5173935deb60215c6b7567234/diff:/var/lib/docker/overlay2/1d24cffcb6a27cde7ca05ea16e73267e222389c2a39206bf1cabe92006cc3570/diff", + "MergedDir": "/var/lib/docker/overlay2/5f1615a158c4fbd858eeaa9565b070fa8373784a57c2eb9435f7cf3c2a08aa08/merged", + "UpperDir": "/var/lib/docker/overlay2/5f1615a158c4fbd858eeaa9565b070fa8373784a57c2eb9435f7cf3c2a08aa08/diff", + "WorkDir": "/var/lib/docker/overlay2/5f1615a158c4fbd858eeaa9565b070fa8373784a57c2eb9435f7cf3c2a08aa08/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/kite-ai/litellm_config.yaml", + "Destination": "/app/config.yaml", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "cc6b0dfca579", + "Domainname": "", + "User": "root", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "4000/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "LITELLM_MASTER_KEY=sk-kite-ai-change-this-long-password", + "WEBUI_SECRET_KEY=change-this-to-a-long-random-secret", + "OPENROUTER_API_KEY=PASTE_YOUR_OPENROUTER_KEY_HERE", + "PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin", + "SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt" + ], + "Cmd": [ + "--config", + "/app/config.yaml", + "--port", + "4000" + ], + "Image": "ghcr.io/berriai/litellm:main-latest", + "Volumes": null, + "WorkingDir": "/app", + "Entrypoint": [ + "docker/prod_entrypoint.sh" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "ffba38e55145c2f642741f17cb1a8f8c3f74ea57701645de817bdfa8e8c53887", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:5cfceb7aa09ccc2951886f277392fd9e9cacb7ff8b17ac8bea93b2f0fc646b0f", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "kite-ai", + "com.docker.compose.project.config_files": "/home/kenpat/docker/kite-ai/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/kite-ai", + "com.docker.compose.service": "litellm", + "com.docker.compose.version": "2.26.1", + "dev.chainguard.image.title": "wolfi-base", + "dev.chainguard.package.main": "", + "org.opencontainers.image.authors": "Chainguard Team https://www.chainguard.dev/", + "org.opencontainers.image.created": "2026-03-22T06:36:26.734Z", + "org.opencontainers.image.description": "Python SDK, Proxy Server (AI Gateway) to call 100+ LLM APIs in OpenAI (or native) format, with cost tracking, guardrails, loadbalancing and logging. [Bedrock, Azure, OpenAI, VertexAI, Cohere, Anthropic, Sagemaker, HuggingFace, VLLM, NVIDIA NIM]", + "org.opencontainers.image.licenses": "NOASSERTION", + "org.opencontainers.image.revision": "f5194b5ce32a937a5bca7605e5085b80f69f4347", + "org.opencontainers.image.source": "https://github.com/BerriAI/litellm", + "org.opencontainers.image.title": "litellm", + "org.opencontainers.image.url": "https://github.com/BerriAI/litellm", + "org.opencontainers.image.vendor": "Chainguard", + "org.opencontainers.image.version": "main" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "ad69fe0bad6aab84cc5aa28004131e54dcab4a0f0731266fb173e3ce9d3c4c4f", + "SandboxKey": "/var/run/docker/netns/ad69fe0bad6a", + "Ports": { + "4000/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "4000" + }, + { + "HostIp": "::", + "HostPort": "4000" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "kite-ai_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "kite-litellm", + "litellm" + ], + "MacAddress": "02:42:c0:a8:a0:03", + "NetworkID": "5a4a35faa802ee5f61aeb699a4a7c3a1429bc318ee215e6730c887fd8ee68c39", + "EndpointID": "59c559d52ac16d954a24482026d88f3c61e55db070f0ba523055109c0120b4d4", + "Gateway": "192.168.160.1", + "IPAddress": "192.168.160.3", + "IPPrefixLen": 20, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "kite-litellm", + "litellm", + "cc6b0dfca579" + ] + }, + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:0e", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "cb8f963e0d7c62ad28995e734f6aee70264d79caa50063c207fecaf7da24790a", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.14", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "kite-litellm", + "cc6b0dfca579" + ] + } + } + } + }, + { + "Id": "dc086fe557ea7b6170c7556ae531d73c027315a5e0d07a0aadc7e2c1096493cd", + "Created": "2026-06-05T00:47:31.320543386Z", + "Path": "/init", + "Args": [], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 4966, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:52.358309816Z", + "FinishedAt": "2026-06-08T10:20:43.663582467Z" + }, + "Image": "sha256:92c9fed9884d6c0ef0fc28efef6599a4487a745264158268181b6f83ab85f708", + "ResolvConfPath": "/var/lib/docker/containers/dc086fe557ea7b6170c7556ae531d73c027315a5e0d07a0aadc7e2c1096493cd/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/dc086fe557ea7b6170c7556ae531d73c027315a5e0d07a0aadc7e2c1096493cd/hostname", + "HostsPath": "/var/lib/docker/containers/dc086fe557ea7b6170c7556ae531d73c027315a5e0d07a0aadc7e2c1096493cd/hosts", + "LogPath": "/var/lib/docker/containers/dc086fe557ea7b6170c7556ae531d73c027315a5e0d07a0aadc7e2c1096493cd/dc086fe557ea7b6170c7556ae531d73c027315a5e0d07a0aadc7e2c1096493cd-json.log", + "Name": "/bookstack", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/bookstack/bookstack:/config:rw" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bookstack_default", + "PortBindings": { + "80/tcp": [ + { + "HostIp": "", + "HostPort": "6875" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/01c3bf5fa834a4ef0880080928e59c34ad33e41d06d99b098d945e86331a6e27-init/diff:/var/lib/docker/overlay2/76dc4802fb94d0f92a5da4688d78c19aa93a9fd1895eea851ce90a691ae2b905/diff:/var/lib/docker/overlay2/e0bac4e8ff02c5af68dcc2d18850ffb72927bf72c2ee8ca4734705deaba22299/diff:/var/lib/docker/overlay2/6c90d3bab233110ce7d0bef7f625896882a12746cf736f8149f509ebd7e11a0a/diff:/var/lib/docker/overlay2/4b906e9cae97d45a6ee5cd9e2dbe926077d8486d37222977c4eeaa1799fb4a3b/diff:/var/lib/docker/overlay2/e0a9a2b60c74cfb38d6fa48202cb54081402b947e9d4c7948e8ab3018c9dff59/diff:/var/lib/docker/overlay2/e6fbc90bdd88dc71ac87190ca0f58650b7ff3e9824159481732af22915c59df5/diff:/var/lib/docker/overlay2/a5e691abb51d14c3cbbfb14b0482c1467c99fd95c52d2bfeb431eecad6487210/diff:/var/lib/docker/overlay2/89d61e19ec6eb5f6c97e8e7fa804eb514b7c965ff3277ae1b0d94511d91eafdb/diff:/var/lib/docker/overlay2/332e714cce866f5d116408305097b5098072921ef92b2e18a05f6253b75af012/diff:/var/lib/docker/overlay2/ae88bf50aab8d9535ae23dd6d16ff5ace4c0f0c33beec4b523ca151adf8a8455/diff:/var/lib/docker/overlay2/31bed6c04aaa9dc2142c9d44312260509876148d85bdf8b85731a925b8487f15/diff", + "MergedDir": "/var/lib/docker/overlay2/01c3bf5fa834a4ef0880080928e59c34ad33e41d06d99b098d945e86331a6e27/merged", + "UpperDir": "/var/lib/docker/overlay2/01c3bf5fa834a4ef0880080928e59c34ad33e41d06d99b098d945e86331a6e27/diff", + "WorkDir": "/var/lib/docker/overlay2/01c3bf5fa834a4ef0880080928e59c34ad33e41d06d99b098d945e86331a6e27/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/bookstack/bookstack", + "Destination": "/config", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "dc086fe557ea", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "443/tcp": {}, + "80/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "DB_DATABASE=bookstackapp", + "TZ=America/Chicago", + "APP_URL=http://192.168.1.205:6875", + "DB_USERNAME=bookstack", + "PUID=1000", + "DB_PASSWORD=bookstackpassword", + "PGID=1000", + "DB_PORT=3306", + "DB_HOST=bookstack-db", + "PATH=/lsiopy/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "PS1=$(whoami)@$(hostname):$(pwd)\\$ ", + "HOME=/root", + "TERM=xterm", + "S6_CMD_WAIT_FOR_SERVICES_MAXTIME=0", + "S6_VERBOSITY=1", + "S6_STAGE2_HOOK=/init-hook", + "VIRTUAL_ENV=/lsiopy", + "PHP_INI_SCAN_DIR=:/config/php", + "LSIO_FIRST_PARTY=true" + ], + "Cmd": null, + "Image": "lscr.io/linuxserver/bookstack:latest", + "Volumes": { + "/config": {} + }, + "WorkingDir": "/", + "Entrypoint": [ + "/init" + ], + "OnBuild": null, + "Labels": { + "build_version": "Linuxserver.io version:- v26.05-ls265 Build-date:- 2026-06-01T21:39:12+00:00", + "com.docker.compose.config-hash": "edc444b472c1a93dcf16b59dfb908792cff413e3b0ee577bbd782e12db334a88", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "bookstack-db:service_started:false", + "com.docker.compose.image": "sha256:92c9fed9884d6c0ef0fc28efef6599a4487a745264158268181b6f83ab85f708", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "bookstack", + "com.docker.compose.project.config_files": "/home/kenpat/docker/bookstack/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/bookstack", + "com.docker.compose.service": "bookstack", + "com.docker.compose.version": "2.26.1", + "maintainer": "thespad", + "org.opencontainers.image.authors": "linuxserver.io", + "org.opencontainers.image.created": "2026-06-01T21:39:12+00:00", + "org.opencontainers.image.description": "[Bookstack](https://codeberg.org/bookstack/bookstack) is a free and open source Wiki designed for creating beautiful documentation. Featuring a simple, but powerful WYSIWYG editor it allows for teams to create detailed and useful documentation with ease. Powered by SQL and including a Markdown editor for those who prefer it, BookStack is geared towards making documentation more of a pleasure than a chore. For more information on BookStack visit their website and check it out: https://www.bookstackapp.com ", + "org.opencontainers.image.documentation": "https://docs.linuxserver.io/images/docker-bookstack", + "org.opencontainers.image.licenses": "GPL-3.0-only", + "org.opencontainers.image.ref.name": "147c0ccff6e547d76a10f272de53384238f0ac2f", + "org.opencontainers.image.revision": "147c0ccff6e547d76a10f272de53384238f0ac2f", + "org.opencontainers.image.source": "https://github.com/linuxserver/docker-bookstack", + "org.opencontainers.image.title": "Bookstack", + "org.opencontainers.image.url": "https://github.com/linuxserver/docker-bookstack/packages", + "org.opencontainers.image.vendor": "linuxserver.io", + "org.opencontainers.image.version": "v26.05-ls265" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "e699f05d1971481d9a3f0b968cbdc22672e40d2635e9934612c374da7f50ced4", + "SandboxKey": "/var/run/docker/netns/e699f05d1971", + "Ports": { + "443/tcp": null, + "80/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "6875" + }, + { + "HostIp": "::", + "HostPort": "6875" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "bookstack_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "bookstack", + "bookstack" + ], + "MacAddress": "02:42:ac:1e:00:03", + "NetworkID": "49d3d5da502cd2f7d83c4d8d4663ef1ecbb6b6307726abb14f9a7d4f40ce631f", + "EndpointID": "081c949dace75ab95a2f22cc8e9612881694c286c29322146f09af126eb89bd8", + "Gateway": "172.30.0.1", + "IPAddress": "172.30.0.3", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "bookstack", + "dc086fe557ea" + ] + }, + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:0a", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "97cb89038808409385e8e6f3dffaf7e1a226c433f09c409b0dcb4aa873e05840", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.10", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "bookstack", + "dc086fe557ea" + ] + } + } + } + }, + { + "Id": "b9b9ef74e12edfafaf76a7a4d448714aabba47516ceb5ac20ad7375769c38d17", + "Created": "2026-06-05T00:47:31.235493641Z", + "Path": "docker-entrypoint.sh", + "Args": [ + "mariadbd" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 3682, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:50.024718983Z", + "FinishedAt": "2026-06-08T10:20:43.674302346Z" + }, + "Image": "sha256:068cbf783463efa481f20561812878dbae91d3dc6e9649999bb986a7fc3334b2", + "ResolvConfPath": "/var/lib/docker/containers/b9b9ef74e12edfafaf76a7a4d448714aabba47516ceb5ac20ad7375769c38d17/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/b9b9ef74e12edfafaf76a7a4d448714aabba47516ceb5ac20ad7375769c38d17/hostname", + "HostsPath": "/var/lib/docker/containers/b9b9ef74e12edfafaf76a7a4d448714aabba47516ceb5ac20ad7375769c38d17/hosts", + "LogPath": "/var/lib/docker/containers/b9b9ef74e12edfafaf76a7a4d448714aabba47516ceb5ac20ad7375769c38d17/b9b9ef74e12edfafaf76a7a4d448714aabba47516ceb5ac20ad7375769c38d17-json.log", + "Name": "/bookstack-db", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/bookstack/db:/var/lib/mysql:rw" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bookstack_default", + "PortBindings": {}, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/d4ac539ccecb65ba3d714b5e266c18d583f020ef368b1be2b2317d99cf1c348a-init/diff:/var/lib/docker/overlay2/a19ce08dcf70820738a09d465a4544acd40d310da119ddb8e6c2af1bce9048e6/diff:/var/lib/docker/overlay2/b0225ff90389a67128cc347a39d1b6291c82a87328f26783bf392380f248c0fc/diff:/var/lib/docker/overlay2/b97adf194be8c2e0800959afa39d28967290c811c14b2ddfbca7896d3f840cb7/diff:/var/lib/docker/overlay2/e29347b8b9dbd5bb9fcb53e6d87b0220a9da2a6faf5aa2094802645cf9b74b7b/diff:/var/lib/docker/overlay2/4b8ff563bf2d8d3e5b47c5ebf3e91e6fcbd1679bfb66a5ea6f14be445c3ec5d2/diff:/var/lib/docker/overlay2/1709e15f5443dd2ff783bf354129c2a7494d1e13f75ec601343ba7e487e32690/diff:/var/lib/docker/overlay2/89409263c0834c33eb89820d0b02a2fae2e936d37ab8b4f9e4279375352a7fcc/diff:/var/lib/docker/overlay2/64f1a50934272e8dbba00cbc0008a1ebbffef3597693089ed5f7b10deb132f9f/diff", + "MergedDir": "/var/lib/docker/overlay2/d4ac539ccecb65ba3d714b5e266c18d583f020ef368b1be2b2317d99cf1c348a/merged", + "UpperDir": "/var/lib/docker/overlay2/d4ac539ccecb65ba3d714b5e266c18d583f020ef368b1be2b2317d99cf1c348a/diff", + "WorkDir": "/var/lib/docker/overlay2/d4ac539ccecb65ba3d714b5e266c18d583f020ef368b1be2b2317d99cf1c348a/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/bookstack/db", + "Destination": "/var/lib/mysql", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "b9b9ef74e12e", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "3306/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "MYSQL_DATABASE=bookstackapp", + "MYSQL_USER=bookstack", + "MYSQL_PASSWORD=bookstackpassword", + "MYSQL_ROOT_PASSWORD=supersecretrootpassword", + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "GOSU_VERSION=1.19", + "LANG=C.UTF-8", + "MARIADB_VERSION=1:11.8.8+maria~ubu2404" + ], + "Cmd": [ + "mariadbd" + ], + "Image": "mariadb:11", + "Volumes": { + "/var/lib/mysql": {} + }, + "WorkingDir": "", + "Entrypoint": [ + "docker-entrypoint.sh" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "b50fdcdc7c6a448dda4241d84e5fabaac0d2f1a10ca7082f7406571deb747b89", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:068cbf783463efa481f20561812878dbae91d3dc6e9649999bb986a7fc3334b2", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "bookstack", + "com.docker.compose.project.config_files": "/home/kenpat/docker/bookstack/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/bookstack", + "com.docker.compose.service": "bookstack-db", + "com.docker.compose.version": "2.26.1", + "org.opencontainers.image.authors": "MariaDB Community", + "org.opencontainers.image.base.name": "docker.io/library/ubuntu:noble", + "org.opencontainers.image.description": "MariaDB Database for relational SQL", + "org.opencontainers.image.documentation": "https://hub.docker.com/_/mariadb/", + "org.opencontainers.image.licenses": "GPL-2.0", + "org.opencontainers.image.source": "https://github.com/MariaDB/mariadb-docker", + "org.opencontainers.image.title": "MariaDB Database", + "org.opencontainers.image.url": "https://github.com/MariaDB/mariadb-docker", + "org.opencontainers.image.vendor": "MariaDB Community", + "org.opencontainers.image.version": "11.8.8" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "98b967532c1958ed8808deda4d1b8b8d3d3564c26b604f5d18b8d9438d626026", + "SandboxKey": "/var/run/docker/netns/98b967532c19", + "Ports": { + "3306/tcp": null + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "bookstack_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "bookstack-db", + "bookstack-db" + ], + "MacAddress": "02:42:ac:1e:00:02", + "NetworkID": "49d3d5da502cd2f7d83c4d8d4663ef1ecbb6b6307726abb14f9a7d4f40ce631f", + "EndpointID": "f53a2b4a08728ef94ac709954820edac83b6f64291d5732880a364ef72941d66", + "Gateway": "172.30.0.1", + "IPAddress": "172.30.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "bookstack-db", + "b9b9ef74e12e" + ] + } + } + } + }, + { + "Id": "bb8e8660eb89db1932627f6f1fef1e35ce405a437fa02a77991cfcace042431c", + "Created": "2026-06-04T23:52:46.28223318Z", + "Path": "dumb-init", + "Args": [ + "--", + "ak", + "server" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 4948, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:51.621132485Z", + "FinishedAt": "2026-06-08T10:20:43.674259802Z", + "Health": { + "Status": "healthy", + "FailingStreak": 0, + "Log": [ + { + "Start": "2026-06-09T13:35:02.42652127-05:00", + "End": "2026-06-09T13:35:02.743280345-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"server\",\"timestamp\":\"2026-06-09T18:35:02Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"inbuilt-default\",\"timestamp\":\"2026-06-09T18:35:02Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"/authentik/lib/default.yml\",\"timestamp\":\"2026-06-09T18:35:02Z\"}\n{\"event\":\"Loaded config from environment\",\"level\":\"debug\",\"timestamp\":\"2026-06-09T18:35:02Z\"}\n" + }, + { + "Start": "2026-06-09T13:35:32.743782224-05:00", + "End": "2026-06-09T13:35:33.100013916-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"server\",\"timestamp\":\"2026-06-09T18:35:33Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"inbuilt-default\",\"timestamp\":\"2026-06-09T18:35:33Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"/authentik/lib/default.yml\",\"timestamp\":\"2026-06-09T18:35:33Z\"}\n{\"event\":\"Loaded config from environment\",\"level\":\"debug\",\"timestamp\":\"2026-06-09T18:35:33Z\"}\n" + }, + { + "Start": "2026-06-09T13:36:03.100458546-05:00", + "End": "2026-06-09T13:36:03.363461368-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"server\",\"timestamp\":\"2026-06-09T18:36:03Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"inbuilt-default\",\"timestamp\":\"2026-06-09T18:36:03Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"/authentik/lib/default.yml\",\"timestamp\":\"2026-06-09T18:36:03Z\"}\n{\"event\":\"Loaded config from environment\",\"level\":\"debug\",\"timestamp\":\"2026-06-09T18:36:03Z\"}\n" + }, + { + "Start": "2026-06-09T13:36:33.364110406-05:00", + "End": "2026-06-09T13:36:33.888852277-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"server\",\"timestamp\":\"2026-06-09T18:36:33Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"inbuilt-default\",\"timestamp\":\"2026-06-09T18:36:33Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"/authentik/lib/default.yml\",\"timestamp\":\"2026-06-09T18:36:33Z\"}\n{\"event\":\"Loaded config from environment\",\"level\":\"debug\",\"timestamp\":\"2026-06-09T18:36:33Z\"}\n" + }, + { + "Start": "2026-06-09T13:37:03.889896419-05:00", + "End": "2026-06-09T13:37:04.571910264-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"server\",\"timestamp\":\"2026-06-09T18:37:04Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"inbuilt-default\",\"timestamp\":\"2026-06-09T18:37:04Z\"}\n{\"event\":\"Loaded config\",\"level\":\"debug\",\"path\":\"/authentik/lib/default.yml\",\"timestamp\":\"2026-06-09T18:37:04Z\"}\n{\"event\":\"Loaded config from environment\",\"level\":\"debug\",\"timestamp\":\"2026-06-09T18:37:04Z\"}\n" + } + ] + } + }, + "Image": "sha256:e3c993bbf4f6bb9b2bc28f8e81e04ded7fb2e01543ecf0a4777dd7021ce6cc30", + "ResolvConfPath": "/var/lib/docker/containers/bb8e8660eb89db1932627f6f1fef1e35ce405a437fa02a77991cfcace042431c/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/bb8e8660eb89db1932627f6f1fef1e35ce405a437fa02a77991cfcace042431c/hostname", + "HostsPath": "/var/lib/docker/containers/bb8e8660eb89db1932627f6f1fef1e35ce405a437fa02a77991cfcace042431c/hosts", + "LogPath": "/var/lib/docker/containers/bb8e8660eb89db1932627f6f1fef1e35ce405a437fa02a77991cfcace042431c/bb8e8660eb89db1932627f6f1fef1e35ce405a437fa02a77991cfcace042431c-json.log", + "Name": "/authentik", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/authentik/media:/media:rw", + "/home/kenpat/docker/authentik/custom-templates:/templates:rw" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "authentik_default", + "PortBindings": { + "9000/tcp": [ + { + "HostIp": "", + "HostPort": "9001" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/9da2d472e327cb8d47648ed472feddf965a9a5788c052d0417e0c902268f7534-init/diff:/var/lib/docker/overlay2/447cc49b72a39cf3b918b7e684b82453fa931eefa104c6d342c0867d0a92470a/diff:/var/lib/docker/overlay2/6f020f9922f172bfcd8b30bd0a7c5572256091ecfa8129bd71dc994996cc0c16/diff:/var/lib/docker/overlay2/735b819f1c2980641fa9e32ec627418b527e86637d89509c8bff71891f256ce1/diff:/var/lib/docker/overlay2/83269148e5e0032fa986afc0e9a95b12c872fce180e9d4a59e66d3045090be7c/diff:/var/lib/docker/overlay2/32891e83885f46910335ac694571c2c29d878808641a52d0913efaf6034ac3a5/diff:/var/lib/docker/overlay2/624f791c5c67a3b93785275d05bde8aea7a6a85f5c0e2a7205742985cbf0e953/diff:/var/lib/docker/overlay2/dea8d604d4d16a6d19db0f690a434912082c5bab3e5fc2eb6f47429c9c49a0d4/diff:/var/lib/docker/overlay2/148e703940a33f95123b9bfad008622dc1d6286282682dda369460f87c8b98bd/diff:/var/lib/docker/overlay2/17e6dd6bf9d8e606868a98c2ecf68d0b80ac98de903f32baf9d489b56b71ea60/diff:/var/lib/docker/overlay2/9e32c0474a47815b44e20ce658f017cef70ce1342e3fb98d646f7de40a9c6baa/diff:/var/lib/docker/overlay2/790594a9593df0ec18b6af3b57eb3f4ea2e0acfd01660d39efdc93437613b285/diff:/var/lib/docker/overlay2/bc86e1df6a14c3e31077dfa07775ebce9a864dec5182cdf367924fcbb99028fd/diff:/var/lib/docker/overlay2/ff9da34f564675d6bfeac1ef58dc3968c524b114aecdedeac20348bd0f3de4ab/diff:/var/lib/docker/overlay2/07559b38a363c4c5a33493b726d38b90ecb4fdba4c7547d16b86cf5d0118a133/diff:/var/lib/docker/overlay2/d6a8b176cf9c1b264ef46f83351c599c62c1309a128a4e79a3a8d19adaa65420/diff:/var/lib/docker/overlay2/8ba41a174729facb5b87e2280b67a787135e70f64c33a30410701e0ca4c172c2/diff:/var/lib/docker/overlay2/5aef72097f2df1d2076a369d97994aa7984230331a2a32f92c0584399e33dae6/diff:/var/lib/docker/overlay2/1e4c84d919e705f1bbe088a15d082ae382c713cc7da650050e9efafe2d188c87/diff:/var/lib/docker/overlay2/5fb3ddfbc1c323513c9447987cd5f325879d5832482fecd786975745eda6b91e/diff:/var/lib/docker/overlay2/cab3a6d2aa46fc361df577eed691a6e3070b1f9bbe52df8ae94c7927f899d86e/diff:/var/lib/docker/overlay2/4bdd4f98407190a72fe4618bba7c226127d356cb3463a12485a614d2ff9c6c4e/diff:/var/lib/docker/overlay2/6a16f910e4a2d0a931fafd53a93205a582c85fd5fb1138f8add55016023f45f1/diff:/var/lib/docker/overlay2/c2ee5c724c65b05500fb5c59e6ebd496cf488f33d5e4fba4005db9d77c9720d5/diff:/var/lib/docker/overlay2/055b866abb5de94a918a5de3c60f6ea0081284ec3ea65a8770902a28f287a021/diff:/var/lib/docker/overlay2/9acc399b032430e6738b6773a650a27094aa3d3b5be13b966177b339008a76e1/diff:/var/lib/docker/overlay2/2b26d8013cba73dcb886c7e531912d30e549aef6339c91b3752e4b10607b492a/diff", + "MergedDir": "/var/lib/docker/overlay2/9da2d472e327cb8d47648ed472feddf965a9a5788c052d0417e0c902268f7534/merged", + "UpperDir": "/var/lib/docker/overlay2/9da2d472e327cb8d47648ed472feddf965a9a5788c052d0417e0c902268f7534/diff", + "WorkDir": "/var/lib/docker/overlay2/9da2d472e327cb8d47648ed472feddf965a9a5788c052d0417e0c902268f7534/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/authentik/media", + "Destination": "/media", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/home/kenpat/docker/authentik/custom-templates", + "Destination": "/templates", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "bb8e8660eb89", + "Domainname": "", + "User": "1000", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "9000/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "AUTHENTIK_POSTGRESQL__PASSWORD=qavW42esnbvT5aXLEZ02afcl1k3y1tnKxvw2X8hJpbI=", + "AUTHENTIK_SECRET_KEY=B7lLkU5fwywMhekZvapLorRYbnTH8SE/mVmi/yXTDlJ6/NpLvceF5KGABU2rB01A", + "AUTHENTIK_REDIS__HOST=redis", + "AUTHENTIK_POSTGRESQL__HOST=postgresql", + "AUTHENTIK_POSTGRESQL__USER=authentik", + "AUTHENTIK_POSTGRESQL__NAME=authentik", + "PATH=/ak-root/venv/bin:/lifecycle:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "build_root=/build", + "SSL_CERT_DIR=/etc/ssl/certs", + "LANG=C.UTF-8", + "GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305", + "PYTHON_PIP_VERSION=24.1.1", + "PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/def4aec84b261b939137dd1c69eff0aabb4a7bf4/public/get-pip.py", + "PYTHON_GET_PIP_SHA256=bc37786ec99618416cc0a0ca32833da447f4d91ab51d2c138dd15b7af21e8e9a", + "GIT_BUILD_HASH=", + "TMPDIR=/dev/shm/", + "PYTHONDONTWRITEBYTECODE=1", + "PYTHONUNBUFFERED=1", + "VENV_PATH=/ak-root/venv", + "POETRY_VIRTUALENVS_CREATE=false", + "GOFIPS=1" + ], + "Cmd": [ + "server" + ], + "Healthcheck": { + "Test": [ + "CMD", + "ak", + "healthcheck" + ], + "Interval": 30000000000, + "Timeout": 30000000000, + "StartPeriod": 60000000000, + "Retries": 3 + }, + "Image": "ghcr.io/goauthentik/server:latest", + "Volumes": null, + "WorkingDir": "/", + "Entrypoint": [ + "dumb-init", + "--", + "ak" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "f5427d04860e0b08b8ba590e77c8a3a5d0341295fab3fddaa7c50d2cb279d7a8", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "postgresql:service_started:false,redis:service_started:false", + "com.docker.compose.image": "sha256:e3c993bbf4f6bb9b2bc28f8e81e04ded7fb2e01543ecf0a4777dd7021ce6cc30", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "authentik", + "com.docker.compose.project.config_files": "/home/kenpat/docker/authentik/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/authentik", + "com.docker.compose.service": "authentik", + "com.docker.compose.version": "2.26.1", + "org.opencontainers.image.description": "goauthentik.io Main server image, see https://goauthentik.io for more info.", + "org.opencontainers.image.revision": "", + "org.opencontainers.image.source": "https://github.com/goauthentik/authentik", + "org.opencontainers.image.url": "https://goauthentik.io", + "org.opencontainers.image.version": "refs/tags/version/2025.2.4" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "c7a54983ec92e4ed1917842f253d311e4e8a4e8a47ade9eee9dd27a49bfa88f3", + "SandboxKey": "/var/run/docker/netns/c7a54983ec92", + "Ports": { + "9000/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "9001" + }, + { + "HostIp": "::", + "HostPort": "9001" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "authentik_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "authentik", + "authentik" + ], + "MacAddress": "02:42:ac:1d:00:05", + "NetworkID": "be1a91b20dc851ae2cd93fd94f7f086d1ca096d3beea9981e33e774c3164b5a0", + "EndpointID": "99fd24abd8eb669c20528eb120537e8d2a1e00a5fb1b9827e64787356f6ac10a", + "Gateway": "172.29.0.1", + "IPAddress": "172.29.0.5", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "authentik", + "bb8e8660eb89" + ] + }, + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:05", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "1f0e297d51ad6eddba8c2f012ec0c6323dd5bd7dd0c2c7b0167e271f503abf99", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.5", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "authentik", + "bb8e8660eb89" + ] + } + } + } + }, + { + "Id": "1ee62b8248a876840dc878e32b7b577dbe8d676f7c5dba002d336d3e0f746fd3", + "Created": "2026-06-04T23:52:46.282209297Z", + "Path": "dumb-init", + "Args": [ + "--", + "ak", + "worker" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 4903, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:52.196993495Z", + "FinishedAt": "2026-06-08T10:20:43.663013893Z", + "Health": { + "Status": "healthy", + "FailingStreak": 0, + "Log": [ + { + "Start": "2026-06-09T13:35:02.425138648-05:00", + "End": "2026-06-09T13:35:02.740442403-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"worker\",\"timestamp\":\"2026-06-09T18:35:02Z\"}\n" + }, + { + "Start": "2026-06-09T13:35:32.741399022-05:00", + "End": "2026-06-09T13:35:33.098861327-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"worker\",\"timestamp\":\"2026-06-09T18:35:33Z\"}\n" + }, + { + "Start": "2026-06-09T13:36:03.100374249-05:00", + "End": "2026-06-09T13:36:03.36314196-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"worker\",\"timestamp\":\"2026-06-09T18:36:03Z\"}\n" + }, + { + "Start": "2026-06-09T13:36:33.36413025-05:00", + "End": "2026-06-09T13:36:33.885679038-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"worker\",\"timestamp\":\"2026-06-09T18:36:33Z\"}\n" + }, + { + "Start": "2026-06-09T13:37:03.886950359-05:00", + "End": "2026-06-09T13:37:04.562089496-05:00", + "ExitCode": 0, + "Output": "{\"event\":\"checking health\",\"level\":\"debug\",\"mode\":\"worker\",\"timestamp\":\"2026-06-09T18:37:04Z\"}\n" + } + ] + } + }, + "Image": "sha256:e3c993bbf4f6bb9b2bc28f8e81e04ded7fb2e01543ecf0a4777dd7021ce6cc30", + "ResolvConfPath": "/var/lib/docker/containers/1ee62b8248a876840dc878e32b7b577dbe8d676f7c5dba002d336d3e0f746fd3/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/1ee62b8248a876840dc878e32b7b577dbe8d676f7c5dba002d336d3e0f746fd3/hostname", + "HostsPath": "/var/lib/docker/containers/1ee62b8248a876840dc878e32b7b577dbe8d676f7c5dba002d336d3e0f746fd3/hosts", + "LogPath": "/var/lib/docker/containers/1ee62b8248a876840dc878e32b7b577dbe8d676f7c5dba002d336d3e0f746fd3/1ee62b8248a876840dc878e32b7b577dbe8d676f7c5dba002d336d3e0f746fd3-json.log", + "Name": "/authentik-worker", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/authentik/media:/media:rw", + "/home/kenpat/docker/authentik/custom-templates:/templates:rw" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "authentik_default", + "PortBindings": {}, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/a3cf46e3ad442a2ec0f2feada775b793d5274479d9c3231f61b35dce678d46e6-init/diff:/var/lib/docker/overlay2/447cc49b72a39cf3b918b7e684b82453fa931eefa104c6d342c0867d0a92470a/diff:/var/lib/docker/overlay2/6f020f9922f172bfcd8b30bd0a7c5572256091ecfa8129bd71dc994996cc0c16/diff:/var/lib/docker/overlay2/735b819f1c2980641fa9e32ec627418b527e86637d89509c8bff71891f256ce1/diff:/var/lib/docker/overlay2/83269148e5e0032fa986afc0e9a95b12c872fce180e9d4a59e66d3045090be7c/diff:/var/lib/docker/overlay2/32891e83885f46910335ac694571c2c29d878808641a52d0913efaf6034ac3a5/diff:/var/lib/docker/overlay2/624f791c5c67a3b93785275d05bde8aea7a6a85f5c0e2a7205742985cbf0e953/diff:/var/lib/docker/overlay2/dea8d604d4d16a6d19db0f690a434912082c5bab3e5fc2eb6f47429c9c49a0d4/diff:/var/lib/docker/overlay2/148e703940a33f95123b9bfad008622dc1d6286282682dda369460f87c8b98bd/diff:/var/lib/docker/overlay2/17e6dd6bf9d8e606868a98c2ecf68d0b80ac98de903f32baf9d489b56b71ea60/diff:/var/lib/docker/overlay2/9e32c0474a47815b44e20ce658f017cef70ce1342e3fb98d646f7de40a9c6baa/diff:/var/lib/docker/overlay2/790594a9593df0ec18b6af3b57eb3f4ea2e0acfd01660d39efdc93437613b285/diff:/var/lib/docker/overlay2/bc86e1df6a14c3e31077dfa07775ebce9a864dec5182cdf367924fcbb99028fd/diff:/var/lib/docker/overlay2/ff9da34f564675d6bfeac1ef58dc3968c524b114aecdedeac20348bd0f3de4ab/diff:/var/lib/docker/overlay2/07559b38a363c4c5a33493b726d38b90ecb4fdba4c7547d16b86cf5d0118a133/diff:/var/lib/docker/overlay2/d6a8b176cf9c1b264ef46f83351c599c62c1309a128a4e79a3a8d19adaa65420/diff:/var/lib/docker/overlay2/8ba41a174729facb5b87e2280b67a787135e70f64c33a30410701e0ca4c172c2/diff:/var/lib/docker/overlay2/5aef72097f2df1d2076a369d97994aa7984230331a2a32f92c0584399e33dae6/diff:/var/lib/docker/overlay2/1e4c84d919e705f1bbe088a15d082ae382c713cc7da650050e9efafe2d188c87/diff:/var/lib/docker/overlay2/5fb3ddfbc1c323513c9447987cd5f325879d5832482fecd786975745eda6b91e/diff:/var/lib/docker/overlay2/cab3a6d2aa46fc361df577eed691a6e3070b1f9bbe52df8ae94c7927f899d86e/diff:/var/lib/docker/overlay2/4bdd4f98407190a72fe4618bba7c226127d356cb3463a12485a614d2ff9c6c4e/diff:/var/lib/docker/overlay2/6a16f910e4a2d0a931fafd53a93205a582c85fd5fb1138f8add55016023f45f1/diff:/var/lib/docker/overlay2/c2ee5c724c65b05500fb5c59e6ebd496cf488f33d5e4fba4005db9d77c9720d5/diff:/var/lib/docker/overlay2/055b866abb5de94a918a5de3c60f6ea0081284ec3ea65a8770902a28f287a021/diff:/var/lib/docker/overlay2/9acc399b032430e6738b6773a650a27094aa3d3b5be13b966177b339008a76e1/diff:/var/lib/docker/overlay2/2b26d8013cba73dcb886c7e531912d30e549aef6339c91b3752e4b10607b492a/diff", + "MergedDir": "/var/lib/docker/overlay2/a3cf46e3ad442a2ec0f2feada775b793d5274479d9c3231f61b35dce678d46e6/merged", + "UpperDir": "/var/lib/docker/overlay2/a3cf46e3ad442a2ec0f2feada775b793d5274479d9c3231f61b35dce678d46e6/diff", + "WorkDir": "/var/lib/docker/overlay2/a3cf46e3ad442a2ec0f2feada775b793d5274479d9c3231f61b35dce678d46e6/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/authentik/media", + "Destination": "/media", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/home/kenpat/docker/authentik/custom-templates", + "Destination": "/templates", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "1ee62b8248a8", + "Domainname": "", + "User": "1000", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "AUTHENTIK_REDIS__HOST=redis", + "AUTHENTIK_POSTGRESQL__HOST=postgresql", + "AUTHENTIK_POSTGRESQL__USER=authentik", + "AUTHENTIK_POSTGRESQL__NAME=authentik", + "AUTHENTIK_POSTGRESQL__PASSWORD=qavW42esnbvT5aXLEZ02afcl1k3y1tnKxvw2X8hJpbI=", + "AUTHENTIK_SECRET_KEY=B7lLkU5fwywMhekZvapLorRYbnTH8SE/mVmi/yXTDlJ6/NpLvceF5KGABU2rB01A", + "PATH=/ak-root/venv/bin:/lifecycle:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "build_root=/build", + "SSL_CERT_DIR=/etc/ssl/certs", + "LANG=C.UTF-8", + "GPG_KEY=7169605F62C751356D054A26A821E680E5FA6305", + "PYTHON_PIP_VERSION=24.1.1", + "PYTHON_GET_PIP_URL=https://github.com/pypa/get-pip/raw/def4aec84b261b939137dd1c69eff0aabb4a7bf4/public/get-pip.py", + "PYTHON_GET_PIP_SHA256=bc37786ec99618416cc0a0ca32833da447f4d91ab51d2c138dd15b7af21e8e9a", + "GIT_BUILD_HASH=", + "TMPDIR=/dev/shm/", + "PYTHONDONTWRITEBYTECODE=1", + "PYTHONUNBUFFERED=1", + "VENV_PATH=/ak-root/venv", + "POETRY_VIRTUALENVS_CREATE=false", + "GOFIPS=1" + ], + "Cmd": [ + "worker" + ], + "Healthcheck": { + "Test": [ + "CMD", + "ak", + "healthcheck" + ], + "Interval": 30000000000, + "Timeout": 30000000000, + "StartPeriod": 60000000000, + "Retries": 3 + }, + "Image": "ghcr.io/goauthentik/server:latest", + "Volumes": null, + "WorkingDir": "/", + "Entrypoint": [ + "dumb-init", + "--", + "ak" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "222de6638374ad75c0e8de4df4ff9e8565661978be72573cc88e855c73bce128", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "redis:service_started:false,postgresql:service_started:false", + "com.docker.compose.image": "sha256:e3c993bbf4f6bb9b2bc28f8e81e04ded7fb2e01543ecf0a4777dd7021ce6cc30", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "authentik", + "com.docker.compose.project.config_files": "/home/kenpat/docker/authentik/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/authentik", + "com.docker.compose.service": "authentik-worker", + "com.docker.compose.version": "2.26.1", + "org.opencontainers.image.description": "goauthentik.io Main server image, see https://goauthentik.io for more info.", + "org.opencontainers.image.revision": "", + "org.opencontainers.image.source": "https://github.com/goauthentik/authentik", + "org.opencontainers.image.url": "https://goauthentik.io", + "org.opencontainers.image.version": "refs/tags/version/2025.2.4" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "b460f8170b765117f2ddae1387e9415211a785b7d383d5af92d3ee98fdc33abf", + "SandboxKey": "/var/run/docker/netns/b460f8170b76", + "Ports": {}, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "authentik_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "authentik-worker", + "authentik-worker" + ], + "MacAddress": "02:42:ac:1d:00:03", + "NetworkID": "be1a91b20dc851ae2cd93fd94f7f086d1ca096d3beea9981e33e774c3164b5a0", + "EndpointID": "3fbc936fc7d802ea4f66018c2ac25c5bde5541644324b34d6a6f27e36b6aa82a", + "Gateway": "172.29.0.1", + "IPAddress": "172.29.0.3", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "authentik-worker", + "1ee62b8248a8" + ] + }, + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:09", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "d49e3a68d0a6ad9f803aa4e980f070082d472d8563348667dd37eea08dc3a304", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.9", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "authentik-worker", + "1ee62b8248a8" + ] + } + } + } + }, + { + "Id": "bc35f13e03c8c6253daaeee76d0088991d3b3b5d9e5c2c7f5405eb01ecf3c0da", + "Created": "2026-06-04T23:52:46.222872017Z", + "Path": "docker-entrypoint.sh", + "Args": [ + "postgres" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 3985, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:50.456026881Z", + "FinishedAt": "2026-06-08T10:20:43.678135599Z" + }, + "Image": "sha256:fff3594bf464bea0f502788874403882d8bbbe618b3250f8649e7e42fd118020", + "ResolvConfPath": "/var/lib/docker/containers/bc35f13e03c8c6253daaeee76d0088991d3b3b5d9e5c2c7f5405eb01ecf3c0da/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/bc35f13e03c8c6253daaeee76d0088991d3b3b5d9e5c2c7f5405eb01ecf3c0da/hostname", + "HostsPath": "/var/lib/docker/containers/bc35f13e03c8c6253daaeee76d0088991d3b3b5d9e5c2c7f5405eb01ecf3c0da/hosts", + "LogPath": "/var/lib/docker/containers/bc35f13e03c8c6253daaeee76d0088991d3b3b5d9e5c2c7f5405eb01ecf3c0da/bc35f13e03c8c6253daaeee76d0088991d3b3b5d9e5c2c7f5405eb01ecf3c0da-json.log", + "Name": "/authentik-postgres", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/authentik/postgres:/var/lib/postgresql/data:rw" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "authentik_default", + "PortBindings": {}, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/22524f1c114332d4777d5decfa6be50bdfdebe5a84a23aaa8bd2dd2f8adda72e-init/diff:/var/lib/docker/overlay2/9b603e2ff2f15a6f5aac2f6d5e397dfd9fdedf05c6d1b8cad373a7b5da31c4b9/diff:/var/lib/docker/overlay2/ea00bc5cac8bb9f4bcf8fcc4ca5bef2e8dc974ddbac6354d9b217eff582ffd2a/diff:/var/lib/docker/overlay2/d41d0ed81dbd16e17ccf1f5d55370dcf1b6b96934b7d11e0a81a6260b9748310/diff:/var/lib/docker/overlay2/f4b12e89406cc6dc6ac3d030ba543aaea0124c88c4d454c67bca9a1b168f5a2b/diff:/var/lib/docker/overlay2/05a4584647ba1f6dce47e51e2485369dcc9fd6271a46c6f11dc6d98eda82e929/diff:/var/lib/docker/overlay2/a6d29c813eb5789b44937ab64e923554267baea91ee3a59685148a3c3468dd93/diff:/var/lib/docker/overlay2/4f7a44f2f9c9b2a18697076007b47c9db588534e9a23d6094eac0de474937ec2/diff:/var/lib/docker/overlay2/485077e041d7d3a0b204a3eb55d5bd7a966262c83fcea0f1fb79ae20833fdd78/diff:/var/lib/docker/overlay2/cbd0678e59f89f2bc5ad8821cba63aafe42671950d69e245687ee02dcf9262cd/diff:/var/lib/docker/overlay2/434e39ccc10128d6eb17b458c524a3077124fa5ae613e9bd3f985eef4dc12b0e/diff:/var/lib/docker/overlay2/fa4d33981d81cbdd953516681c9d561c405310e34772e86b30630651aec81407/diff", + "MergedDir": "/var/lib/docker/overlay2/22524f1c114332d4777d5decfa6be50bdfdebe5a84a23aaa8bd2dd2f8adda72e/merged", + "UpperDir": "/var/lib/docker/overlay2/22524f1c114332d4777d5decfa6be50bdfdebe5a84a23aaa8bd2dd2f8adda72e/diff", + "WorkDir": "/var/lib/docker/overlay2/22524f1c114332d4777d5decfa6be50bdfdebe5a84a23aaa8bd2dd2f8adda72e/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/authentik/postgres", + "Destination": "/var/lib/postgresql/data", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "bc35f13e03c8", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "5432/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "POSTGRES_DB=authentik", + "POSTGRES_PASSWORD=qavW42esnbvT5aXLEZ02afcl1k3y1tnKxvw2X8hJpbI=", + "POSTGRES_USER=authentik", + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "GOSU_VERSION=1.19", + "LANG=en_US.utf8", + "PG_MAJOR=16", + "PG_VERSION=16.14", + "PG_SHA256=f6d077142737920858ce958ccdb75c6ee137a63b5b0853c70693d401ac7e3471", + "DOCKER_PG_LLVM_DEPS=llvm19-dev \t\tclang19", + "PGDATA=/var/lib/postgresql/data" + ], + "Cmd": [ + "postgres" + ], + "Image": "postgres:16-alpine", + "Volumes": { + "/var/lib/postgresql/data": {} + }, + "WorkingDir": "/", + "Entrypoint": [ + "docker-entrypoint.sh" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "09de22f02d7a652cf4c40b7d165da4f603c456d9ca0a5d26d1133c80512a0785", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:fff3594bf464bea0f502788874403882d8bbbe618b3250f8649e7e42fd118020", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "authentik", + "com.docker.compose.project.config_files": "/home/kenpat/docker/authentik/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/authentik", + "com.docker.compose.service": "postgresql", + "com.docker.compose.version": "2.26.1" + }, + "StopSignal": "SIGINT" + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "6ad623f304d721d1c73d7b747ea5a77bf0e83af7879a6aa90582b7bc02ca74db", + "SandboxKey": "/var/run/docker/netns/6ad623f304d7", + "Ports": { + "5432/tcp": null + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "authentik_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "authentik-postgres", + "postgresql" + ], + "MacAddress": "02:42:ac:1d:00:04", + "NetworkID": "be1a91b20dc851ae2cd93fd94f7f086d1ca096d3beea9981e33e774c3164b5a0", + "EndpointID": "99cbd21bed3a151cadda6cf4eb50fc45716b023d900ea1c2d6ce3f975de369cd", + "Gateway": "172.29.0.1", + "IPAddress": "172.29.0.4", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "authentik-postgres", + "postgresql", + "bc35f13e03c8" + ] + } + } + } + }, + { + "Id": "2e83f5f1d9883d5e790bc68545ffb2f3d4fff2ec23819958c8db60be8513a574", + "Created": "2026-06-04T23:52:46.22271922Z", + "Path": "docker-entrypoint.sh", + "Args": [ + "redis-server" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 3634, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:50.183000075Z", + "FinishedAt": "2026-06-08T10:20:43.678178497Z" + }, + "Image": "sha256:3a02d38405dc12092032737fdadd513729a81efca8439d1d7eef883e6e67e26e", + "ResolvConfPath": "/var/lib/docker/containers/2e83f5f1d9883d5e790bc68545ffb2f3d4fff2ec23819958c8db60be8513a574/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/2e83f5f1d9883d5e790bc68545ffb2f3d4fff2ec23819958c8db60be8513a574/hostname", + "HostsPath": "/var/lib/docker/containers/2e83f5f1d9883d5e790bc68545ffb2f3d4fff2ec23819958c8db60be8513a574/hosts", + "LogPath": "/var/lib/docker/containers/2e83f5f1d9883d5e790bc68545ffb2f3d4fff2ec23819958c8db60be8513a574/2e83f5f1d9883d5e790bc68545ffb2f3d4fff2ec23819958c8db60be8513a574-json.log", + "Name": "/authentik-redis", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "authentik_default", + "PortBindings": {}, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/ca6d6cd858995aba49d0e6087b564beb980e22835a62c071edc55e67daefba7e-init/diff:/var/lib/docker/overlay2/f5407119a6e94cfa03711f06d7533de5ee3d5e27874f7c9aabb711b3819ecae4/diff:/var/lib/docker/overlay2/60b2c5d6178731929406171df62106f1b094afe0f1826c4bb8cf1146ef80e496/diff:/var/lib/docker/overlay2/27a42105b7b9f5a81974e75b3dc3a6f6f669bdf3185603e148c2ef25de065352/diff:/var/lib/docker/overlay2/60d313c0fad3734a5d441aced5e4b6d9b66d6e7d4eb5f832307e36fd8accbad9/diff:/var/lib/docker/overlay2/26608da1c5680c4770ffb034f4a44c1caf2e9771f6757b1d3e4efb31623d32e8/diff:/var/lib/docker/overlay2/52bbcf8983394816905f9dd880464dcd3ca79c7f2f9a622771b176778329e9d0/diff:/var/lib/docker/overlay2/fa4d33981d81cbdd953516681c9d561c405310e34772e86b30630651aec81407/diff", + "MergedDir": "/var/lib/docker/overlay2/ca6d6cd858995aba49d0e6087b564beb980e22835a62c071edc55e67daefba7e/merged", + "UpperDir": "/var/lib/docker/overlay2/ca6d6cd858995aba49d0e6087b564beb980e22835a62c071edc55e67daefba7e/diff", + "WorkDir": "/var/lib/docker/overlay2/ca6d6cd858995aba49d0e6087b564beb980e22835a62c071edc55e67daefba7e/work" + }, + "Name": "overlay2" + }, + "Mounts": [], + "Config": { + "Hostname": "2e83f5f1d988", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "6379/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "REDIS_VERSION=8.8.0" + ], + "Cmd": [ + "redis-server" + ], + "Image": "redis:alpine", + "Volumes": null, + "WorkingDir": "/data", + "Entrypoint": [ + "docker-entrypoint.sh" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "d3182390ff09e7fd29331dc2e8ba8fb62a1059adb0643196f8040bf414dee184", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:3a02d38405dc12092032737fdadd513729a81efca8439d1d7eef883e6e67e26e", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "authentik", + "com.docker.compose.project.config_files": "/home/kenpat/docker/authentik/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/authentik", + "com.docker.compose.service": "redis", + "com.docker.compose.version": "2.26.1" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "d78eef0fb26803f4360afc752581b0f3a438309b0e41873e4670153f33f1e11b", + "SandboxKey": "/var/run/docker/netns/d78eef0fb268", + "Ports": { + "6379/tcp": null + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "authentik_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "authentik-redis", + "redis" + ], + "MacAddress": "02:42:ac:1d:00:02", + "NetworkID": "be1a91b20dc851ae2cd93fd94f7f086d1ca096d3beea9981e33e774c3164b5a0", + "EndpointID": "66ee7e431cf4eeaf1bd4d42c4a87010331797ad9866aa083c80409d356f178c4", + "Gateway": "172.29.0.1", + "IPAddress": "172.29.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "authentik-redis", + "redis", + "2e83f5f1d988" + ] + } + } + } + }, + { + "Id": "b6a2efaa71552e156a1a93c75d8d9886cf10ae9f9b0d1e6163daa3999b2b562a", + "Created": "2026-06-04T18:22:29.38323893Z", + "Path": "cloudflared", + "Args": [ + "--no-autoupdate", + "tunnel", + "--no-autoupdate", + "run", + "--token", + "cloudflared.exe", + "service", + "install", + "eyJhIjoiZDBiYjc2NzMzMzNmY2Q3OTQ2MjI5NTZmMTY2MmY3ODUiLCJ0IjoiNWU2MGVhOGUtYTU0My00OWI2LWJhYjUtMzI1ZjM5NDQxZTAwIiwicyI6Ik1ESTBPVEV5WVRNdFl6WmlOaTAwWTJNeUxUa3pPRE10T1RRME1tTmlOV1ZsTVRZNCJ9" + ], + "State": { + "Status": "exited", + "Running": false, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 0, + "ExitCode": 255, + "Error": "", + "StartedAt": "2026-06-04T18:22:29.664467013Z", + "FinishedAt": "2026-06-04T18:22:29.777353212Z" + }, + "Image": "sha256:97db6eb4ae40bde4fa6dda97c0dd0471bb6e64fb33989f5f30f062b03bc93da7", + "ResolvConfPath": "/var/lib/docker/containers/b6a2efaa71552e156a1a93c75d8d9886cf10ae9f9b0d1e6163daa3999b2b562a/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/b6a2efaa71552e156a1a93c75d8d9886cf10ae9f9b0d1e6163daa3999b2b562a/hostname", + "HostsPath": "/var/lib/docker/containers/b6a2efaa71552e156a1a93c75d8d9886cf10ae9f9b0d1e6163daa3999b2b562a/hosts", + "LogPath": "/var/lib/docker/containers/b6a2efaa71552e156a1a93c75d8d9886cf10ae9f9b0d1e6163daa3999b2b562a/b6a2efaa71552e156a1a93c75d8d9886cf10ae9f9b0d1e6163daa3999b2b562a-json.log", + "Name": "/quizzical_knuth", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": {}, + "RestartPolicy": { + "Name": "no", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 41, + 49 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/13b65971c21648eac6929275e2eaacc9add8f40e70a50bde6ea3eaf9593a113d-init/diff:/var/lib/docker/overlay2/61c1d5085b4ec9f9410f27a2da337566ab04e10d50f2841ea2eb9b65ce668547/diff:/var/lib/docker/overlay2/09412a9e704a15195adf3e3776120b09c49a7e669b381d137f7d885d84966d97/diff:/var/lib/docker/overlay2/f3a02802385d9bb35b5f8bbdedea1329b0de0a71745c9c6ebcfe3c9834547bae/diff:/var/lib/docker/overlay2/0f5cedd3cced33575a049b134004b5115b7865a54fb937214e846c1198c49512/diff:/var/lib/docker/overlay2/e376f3e34f47e3eec6ad0fbc830a620379829e047918fbbdcd9e4129e0a0b01c/diff:/var/lib/docker/overlay2/68f3411ff9e66f1164abd5fe78be3e6d3113e5d949328015a4fbe412a9511392/diff:/var/lib/docker/overlay2/dea403926f0d946bfc437e03e85887d92577c8a97f51e3232628d9b9d3a8b38a/diff:/var/lib/docker/overlay2/e41c028003011eccda817f37f33bb320055edb3495a24ea046f8723d3cac868d/diff:/var/lib/docker/overlay2/ad47e70994e1a965444a38d6edc884a01161696f507605399169ae7e96d8043d/diff:/var/lib/docker/overlay2/24866609d929c92c0f35cedde677436d5f1a5d7f5d2cebba1449873290fd7665/diff:/var/lib/docker/overlay2/3c3288cd91ac9161d063563d90dc17788efa96bbf13d5394523947b87f9861c9/diff:/var/lib/docker/overlay2/35c651090b31c1684b50f22430661cf9e28960026019cdc3e8971540d7e22b21/diff:/var/lib/docker/overlay2/18c582ea0994b50c4eeba69512f3e1e5067a6e876affc6d4a9f16de710401916/diff:/var/lib/docker/overlay2/3d0feb6cf1e220caae8a7040c2bdb9740223c833db738ab152033de282d866b1/diff:/var/lib/docker/overlay2/70948c173bea09ce0cc1695d2d38d3696ffae5ee9bfbc4c67a7852769559a3ec/diff:/var/lib/docker/overlay2/b7d03bd927955b100f7ebf84d595120d88ceda4311dca6bd84bc7aae7803328d/diff:/var/lib/docker/overlay2/80d9ac6039f2675a4c929f0e05efbf0a049619889b41637f16e44acbfa5667eb/diff:/var/lib/docker/overlay2/03859fd42d265543226381ed6c27b2301a12dc8523f7ba2dd32bafd872487fea/diff", + "MergedDir": "/var/lib/docker/overlay2/13b65971c21648eac6929275e2eaacc9add8f40e70a50bde6ea3eaf9593a113d/merged", + "UpperDir": "/var/lib/docker/overlay2/13b65971c21648eac6929275e2eaacc9add8f40e70a50bde6ea3eaf9593a113d/diff", + "WorkDir": "/var/lib/docker/overlay2/13b65971c21648eac6929275e2eaacc9add8f40e70a50bde6ea3eaf9593a113d/work" + }, + "Name": "overlay2" + }, + "Mounts": [], + "Config": { + "Hostname": "b6a2efaa7155", + "Domainname": "", + "User": "65532:65532", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt" + ], + "Cmd": [ + "tunnel", + "--no-autoupdate", + "run", + "--token", + "cloudflared.exe", + "service", + "install", + "eyJhIjoiZDBiYjc2NzMzMzNmY2Q3OTQ2MjI5NTZmMTY2MmY3ODUiLCJ0IjoiNWU2MGVhOGUtYTU0My00OWI2LWJhYjUtMzI1ZjM5NDQxZTAwIiwicyI6Ik1ESTBPVEV5WVRNdFl6WmlOaTAwWTJNeUxUa3pPRE10T1RRME1tTmlOV1ZsTVRZNCJ9" + ], + "Image": "cloudflare/cloudflared:latest", + "Volumes": null, + "WorkingDir": "/home/nonroot", + "Entrypoint": [ + "cloudflared", + "--no-autoupdate" + ], + "OnBuild": null, + "Labels": { + "CI_BUILD_DATE": "2026-05-27 10:51:04.466593", + "CI_DOCKER_FROM": "gcr.io/distroless/base-debian13:nonroot", + "CI_DOCKER_VERSION": "{\"Platform\": {\"Name\": \"Docker Engine - Community\"}, \"Components\": [{\"Name\": \"Engine\", \"Version\": \"28.5.2\", \"Details\": {\"ApiVersion\": \"1.51\", \"Arch\": \"amd64\", \"BuildTime\": \"2025-11-05T14:43:25.000000000+00:00\", \"Experimental\": \"false\", \"GitCommit\": \"89c5e8f\", \"GoVersion\": \"go1.25.3\", \"KernelVersion\": \"6.12.58-cloudflare-2025.11.5\", \"MinAPIVersion\": \"1.24\", \"Os\": \"linux\"}}, {\"Name\": \"containerd\", \"Version\": \"v2.1.5\", \"Details\": {\"GitCommit\": \"fcd43222d6b07379a4be9786bda52438f0dd16a1\"}}, {\"Name\": \"runc\", \"Version\": \"1.3.3\", \"Details\": {\"GitCommit\": \"v1.3.3-0-gd842d771\"}}, {\"Name\": \"docker-init\", \"Version\": \"0.19.0\", \"Details\": {\"GitCommit\": \"de40ad0\"}}], \"Version\": \"28.5.2\", \"ApiVersion\": \"1.51\", \"MinAPIVersion\": \"1.24\", \"GitCommit\": \"89c5e8f\", \"GoVersion\": \"go1.25.3\", \"Os\": \"linux\", \"Arch\": \"amd64\", \"KernelVersion\": \"6.12.58-cloudflare-2025.11.5\", \"BuildTime\": \"2025-11-05T14:43:25.000000000+00:00\"}", + "CI_GIT_COMMIT": "0e84636de9450d9e73c1e28932ed2bd62cb33e10", + "CI_GIT_REMOTE": "https://gitlab.cfdata.org/cloudflare/tun/cloudflared.git", + "CI_TEAMCITY_BUILDCONF": "", + "CI_TEAMCITY_BUILD_NUMBER": "", + "IMAGE_TYPE": "distroless", + "org.opencontainers.image.source": "https://github.com/cloudflare/cloudflared" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "6611648d2a8a775cc3b8c355e0e9e1ca52273faf20a349e4b20a24b0de1fb623", + "SandboxKey": "/var/run/docker/netns/6611648d2a8a", + "Ports": {}, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "", + "NetworkID": "3e4902b1094ea2ba44c971d4f2506b2bbb27bc3ca63018dae16dc9ccec96c1f9", + "EndpointID": "", + "Gateway": "", + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + } + } + } + }, + { + "Id": "ade30f6b99e156bca6b00272b8a044b3be319dae169e1ac10d4eed2bcd55dd62", + "Created": "2026-06-04T18:20:50.999775256Z", + "Path": "cloudflared", + "Args": [ + "--no-autoupdate", + "tunnel", + "--no-autoupdate", + "run", + "--token", + "eyJh..." + ], + "State": { + "Status": "exited", + "Running": false, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 0, + "ExitCode": 255, + "Error": "", + "StartedAt": "2026-06-04T18:20:51.297185813Z", + "FinishedAt": "2026-06-04T18:20:51.409556275Z" + }, + "Image": "sha256:97db6eb4ae40bde4fa6dda97c0dd0471bb6e64fb33989f5f30f062b03bc93da7", + "ResolvConfPath": "/var/lib/docker/containers/ade30f6b99e156bca6b00272b8a044b3be319dae169e1ac10d4eed2bcd55dd62/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/ade30f6b99e156bca6b00272b8a044b3be319dae169e1ac10d4eed2bcd55dd62/hostname", + "HostsPath": "/var/lib/docker/containers/ade30f6b99e156bca6b00272b8a044b3be319dae169e1ac10d4eed2bcd55dd62/hosts", + "LogPath": "/var/lib/docker/containers/ade30f6b99e156bca6b00272b8a044b3be319dae169e1ac10d4eed2bcd55dd62/ade30f6b99e156bca6b00272b8a044b3be319dae169e1ac10d4eed2bcd55dd62-json.log", + "Name": "/amazing_mayer", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": {}, + "RestartPolicy": { + "Name": "no", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 41, + 49 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/bcb1c9d9e74b36f38eeff2b5e3534671c4fd28266f4b409c403c005cd44d8a40-init/diff:/var/lib/docker/overlay2/61c1d5085b4ec9f9410f27a2da337566ab04e10d50f2841ea2eb9b65ce668547/diff:/var/lib/docker/overlay2/09412a9e704a15195adf3e3776120b09c49a7e669b381d137f7d885d84966d97/diff:/var/lib/docker/overlay2/f3a02802385d9bb35b5f8bbdedea1329b0de0a71745c9c6ebcfe3c9834547bae/diff:/var/lib/docker/overlay2/0f5cedd3cced33575a049b134004b5115b7865a54fb937214e846c1198c49512/diff:/var/lib/docker/overlay2/e376f3e34f47e3eec6ad0fbc830a620379829e047918fbbdcd9e4129e0a0b01c/diff:/var/lib/docker/overlay2/68f3411ff9e66f1164abd5fe78be3e6d3113e5d949328015a4fbe412a9511392/diff:/var/lib/docker/overlay2/dea403926f0d946bfc437e03e85887d92577c8a97f51e3232628d9b9d3a8b38a/diff:/var/lib/docker/overlay2/e41c028003011eccda817f37f33bb320055edb3495a24ea046f8723d3cac868d/diff:/var/lib/docker/overlay2/ad47e70994e1a965444a38d6edc884a01161696f507605399169ae7e96d8043d/diff:/var/lib/docker/overlay2/24866609d929c92c0f35cedde677436d5f1a5d7f5d2cebba1449873290fd7665/diff:/var/lib/docker/overlay2/3c3288cd91ac9161d063563d90dc17788efa96bbf13d5394523947b87f9861c9/diff:/var/lib/docker/overlay2/35c651090b31c1684b50f22430661cf9e28960026019cdc3e8971540d7e22b21/diff:/var/lib/docker/overlay2/18c582ea0994b50c4eeba69512f3e1e5067a6e876affc6d4a9f16de710401916/diff:/var/lib/docker/overlay2/3d0feb6cf1e220caae8a7040c2bdb9740223c833db738ab152033de282d866b1/diff:/var/lib/docker/overlay2/70948c173bea09ce0cc1695d2d38d3696ffae5ee9bfbc4c67a7852769559a3ec/diff:/var/lib/docker/overlay2/b7d03bd927955b100f7ebf84d595120d88ceda4311dca6bd84bc7aae7803328d/diff:/var/lib/docker/overlay2/80d9ac6039f2675a4c929f0e05efbf0a049619889b41637f16e44acbfa5667eb/diff:/var/lib/docker/overlay2/03859fd42d265543226381ed6c27b2301a12dc8523f7ba2dd32bafd872487fea/diff", + "MergedDir": "/var/lib/docker/overlay2/bcb1c9d9e74b36f38eeff2b5e3534671c4fd28266f4b409c403c005cd44d8a40/merged", + "UpperDir": "/var/lib/docker/overlay2/bcb1c9d9e74b36f38eeff2b5e3534671c4fd28266f4b409c403c005cd44d8a40/diff", + "WorkDir": "/var/lib/docker/overlay2/bcb1c9d9e74b36f38eeff2b5e3534671c4fd28266f4b409c403c005cd44d8a40/work" + }, + "Name": "overlay2" + }, + "Mounts": [], + "Config": { + "Hostname": "ade30f6b99e1", + "Domainname": "", + "User": "65532:65532", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt" + ], + "Cmd": [ + "tunnel", + "--no-autoupdate", + "run", + "--token", + "eyJh..." + ], + "Image": "cloudflare/cloudflared:latest", + "Volumes": null, + "WorkingDir": "/home/nonroot", + "Entrypoint": [ + "cloudflared", + "--no-autoupdate" + ], + "OnBuild": null, + "Labels": { + "CI_BUILD_DATE": "2026-05-27 10:51:04.466593", + "CI_DOCKER_FROM": "gcr.io/distroless/base-debian13:nonroot", + "CI_DOCKER_VERSION": "{\"Platform\": {\"Name\": \"Docker Engine - Community\"}, \"Components\": [{\"Name\": \"Engine\", \"Version\": \"28.5.2\", \"Details\": {\"ApiVersion\": \"1.51\", \"Arch\": \"amd64\", \"BuildTime\": \"2025-11-05T14:43:25.000000000+00:00\", \"Experimental\": \"false\", \"GitCommit\": \"89c5e8f\", \"GoVersion\": \"go1.25.3\", \"KernelVersion\": \"6.12.58-cloudflare-2025.11.5\", \"MinAPIVersion\": \"1.24\", \"Os\": \"linux\"}}, {\"Name\": \"containerd\", \"Version\": \"v2.1.5\", \"Details\": {\"GitCommit\": \"fcd43222d6b07379a4be9786bda52438f0dd16a1\"}}, {\"Name\": \"runc\", \"Version\": \"1.3.3\", \"Details\": {\"GitCommit\": \"v1.3.3-0-gd842d771\"}}, {\"Name\": \"docker-init\", \"Version\": \"0.19.0\", \"Details\": {\"GitCommit\": \"de40ad0\"}}], \"Version\": \"28.5.2\", \"ApiVersion\": \"1.51\", \"MinAPIVersion\": \"1.24\", \"GitCommit\": \"89c5e8f\", \"GoVersion\": \"go1.25.3\", \"Os\": \"linux\", \"Arch\": \"amd64\", \"KernelVersion\": \"6.12.58-cloudflare-2025.11.5\", \"BuildTime\": \"2025-11-05T14:43:25.000000000+00:00\"}", + "CI_GIT_COMMIT": "0e84636de9450d9e73c1e28932ed2bd62cb33e10", + "CI_GIT_REMOTE": "https://gitlab.cfdata.org/cloudflare/tun/cloudflared.git", + "CI_TEAMCITY_BUILDCONF": "", + "CI_TEAMCITY_BUILD_NUMBER": "", + "IMAGE_TYPE": "distroless", + "org.opencontainers.image.source": "https://github.com/cloudflare/cloudflared" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "59804ba2fc0be6d187f736b35a0b73374ff8deb2b8739eb1d7f7363303050c39", + "SandboxKey": "/var/run/docker/netns/59804ba2fc0b", + "Ports": {}, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "", + "NetworkID": "3e4902b1094ea2ba44c971d4f2506b2bbb27bc3ca63018dae16dc9ccec96c1f9", + "EndpointID": "", + "Gateway": "", + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + } + } + } + }, + { + "Id": "1a39989383f124c0db468b3fe73677fa1876e9686c54540ff78b09b9cbaee301", + "Created": "2026-06-04T16:38:44.952917773Z", + "Path": "/bin/bash", + "Args": [ + "/entrypoint.sh" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 1842432, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-09T18:30:04.315041049Z", + "FinishedAt": "2026-06-09T18:30:03.307109079Z", + "Health": { + "Status": "healthy", + "FailingStreak": 0, + "Log": [ + { + "Start": "2026-06-09T13:35:05.498282555-05:00", + "End": "2026-06-09T13:35:05.619405422-05:00", + "ExitCode": 0, + "Output": "Ok" + }, + { + "Start": "2026-06-09T13:35:35.620617431-05:00", + "End": "2026-06-09T13:35:35.69926398-05:00", + "ExitCode": 0, + "Output": "Ok" + }, + { + "Start": "2026-06-09T13:36:05.700596138-05:00", + "End": "2026-06-09T13:36:05.817697021-05:00", + "ExitCode": 0, + "Output": "Ok" + }, + { + "Start": "2026-06-09T13:36:35.818679285-05:00", + "End": "2026-06-09T13:36:35.958056426-05:00", + "ExitCode": 0, + "Output": "Ok" + }, + { + "Start": "2026-06-09T13:37:05.959002241-05:00", + "End": "2026-06-09T13:37:06.06903508-05:00", + "ExitCode": 0, + "Output": "Ok" + } + ] + } + }, + "Image": "sha256:12ac333d6fde07c087a135dd23fa5b930a96e2a3fde9cfbb281214f040b4cbba", + "ResolvConfPath": "/var/lib/docker/containers/1a39989383f124c0db468b3fe73677fa1876e9686c54540ff78b09b9cbaee301/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/1a39989383f124c0db468b3fe73677fa1876e9686c54540ff78b09b9cbaee301/hostname", + "HostsPath": "/var/lib/docker/containers/1a39989383f124c0db468b3fe73677fa1876e9686c54540ff78b09b9cbaee301/hosts", + "LogPath": "/var/lib/docker/containers/1a39989383f124c0db468b3fe73677fa1876e9686c54540ff78b09b9cbaee301/1a39989383f124c0db468b3fe73677fa1876e9686c54540ff78b09b9cbaee301-json.log", + "Name": "/kavita", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/kavita/config:/kavita/config", + "/home/kenpat/library/books:/books" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": { + "5000/tcp": [ + { + "HostIp": "", + "HostPort": "5000" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 41, + 49 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/a59ab0def3b601a154ab28449fe97eafa3900d53c7b5ee61f440b8a5ef17c3db-init/diff:/var/lib/docker/overlay2/1fec1b2568561cd8c3f5bd704757f12db3b2b4833b9c1bad3300a79b60b90dc9/diff:/var/lib/docker/overlay2/6c4f82fc0f4a1672e1de72727e2f24b088e7575a51810a0eca264d6461d6b8a4/diff:/var/lib/docker/overlay2/5946962204e4d1976bcbd8ad1a3f20deeee69fd96e740ef2d7182e734e869a3c/diff:/var/lib/docker/overlay2/b8fd4d1596c6aa937b0ace6c13cafd4b019bce7533d4a0e29972c4e9a73dd85e/diff:/var/lib/docker/overlay2/3c066e6c72ef1102326bf5aa064e9b994b9bcdc8d2c4235c71f3f366ef7cddca/diff:/var/lib/docker/overlay2/346b886afe06b279700999087d431061a441e05c67356e6727436d63227ceba2/diff:/var/lib/docker/overlay2/21361d08b29e9462facb646288c58c51b737838bef0e71f2a8b8f74998164dfc/diff:/var/lib/docker/overlay2/3c4ad4e37ed8c682bea266e7d1c490c22f649d6dca9cad14876554e70de67776/diff", + "MergedDir": "/var/lib/docker/overlay2/a59ab0def3b601a154ab28449fe97eafa3900d53c7b5ee61f440b8a5ef17c3db/merged", + "UpperDir": "/var/lib/docker/overlay2/a59ab0def3b601a154ab28449fe97eafa3900d53c7b5ee61f440b8a5ef17c3db/diff", + "WorkDir": "/var/lib/docker/overlay2/a59ab0def3b601a154ab28449fe97eafa3900d53c7b5ee61f440b8a5ef17c3db/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/library/books", + "Destination": "/books", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "bind", + "Source": "/home/kenpat/docker/kavita/config", + "Destination": "/kavita/config", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "1a39989383f1", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "ExposedPorts": { + "5000/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "DEBIAN_FRONTEND=noninteractive", + "DOTNET_RUNNING_IN_CONTAINER=true", + "TZ=UTC" + ], + "Cmd": [ + "/entrypoint.sh" + ], + "Healthcheck": { + "Test": [ + "CMD-SHELL", + "curl -fsS http://localhost:5000/api/health || exit 1" + ], + "Interval": 30000000000, + "Timeout": 15000000000, + "StartPeriod": 30000000000, + "Retries": 3 + }, + "Image": "ghcr.io/kareadita/kavita:latest", + "Volumes": null, + "WorkingDir": "/kavita", + "Entrypoint": [ + "/bin/bash" + ], + "OnBuild": null, + "Labels": { + "org.opencontainers.image.version": "24.04" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "9e5ac13e206ae5b1a7180f1eb471cc15141b6db17d2ec35b2b8ce9c1d98a1250", + "SandboxKey": "/var/run/docker/netns/9e5ac13e206a", + "Ports": { + "5000/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "5000" + }, + { + "HostIp": "::", + "HostPort": "5000" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "7362fb15aacda64d6e18ce003f821f8d69097088eca456e51abc7ccbd8f08514", + "Gateway": "172.17.0.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.4", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "MacAddress": "02:42:ac:11:00:04", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "02:42:ac:11:00:04", + "NetworkID": "f4d4e2fb72e14fd40db0f04cfe43e79b4afdd228a2593c24a0e36c832349ba48", + "EndpointID": "7362fb15aacda64d6e18ce003f821f8d69097088eca456e51abc7ccbd8f08514", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.4", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + }, + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:02", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "23afcb3fa30a8f5e9bc7d8849a904e64aa328c854200e6755ea85fced1c4e9f3", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "kavita", + "1a39989383f1" + ] + } + } + } + }, + { + "Id": "241fd732ac790c46f7ad600087bc66cc0b153efea5b2cc69a263c70665096075", + "Created": "2026-06-04T16:27:53.078449329Z", + "Path": "/portainer", + "Args": [], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 3716, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:49.916199917Z", + "FinishedAt": "2026-06-08T10:20:43.663968738Z" + }, + "Image": "sha256:e7d34cd852e61ac1df2a257ec3e03b1b489d5209895c0e991358d8dc66fa528c", + "ResolvConfPath": "/var/lib/docker/containers/241fd732ac790c46f7ad600087bc66cc0b153efea5b2cc69a263c70665096075/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/241fd732ac790c46f7ad600087bc66cc0b153efea5b2cc69a263c70665096075/hostname", + "HostsPath": "/var/lib/docker/containers/241fd732ac790c46f7ad600087bc66cc0b153efea5b2cc69a263c70665096075/hosts", + "LogPath": "/var/lib/docker/containers/241fd732ac790c46f7ad600087bc66cc0b153efea5b2cc69a263c70665096075/241fd732ac790c46f7ad600087bc66cc0b153efea5b2cc69a263c70665096075-json.log", + "Name": "/portainer", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "portainer_data:/data", + "/var/run/docker.sock:/var/run/docker.sock" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": { + "9443/tcp": [ + { + "HostIp": "", + "HostPort": "9443" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 41, + 49 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/be7c00a91125394c303dc316468e2e1b579717b5b2ea660c242fca568f465722-init/diff:/var/lib/docker/overlay2/0b5eed9c964db6fcb228f64c0401eff995d5ea7cb77438623322e396ff93048e/diff:/var/lib/docker/overlay2/f739be968fd42a572afcb71221911c3ef1a7f85960351163b9a0983aa2f97d80/diff:/var/lib/docker/overlay2/0beec8a875aa296c829d88b6f974fd797a000c0638df74d361fb7b0c5de9dc79/diff:/var/lib/docker/overlay2/2e563910b3ca5b40592157c3085e92bf730d6617f2e35e009b19f530ab2c21b2/diff:/var/lib/docker/overlay2/1679997505ce6be8075bd7785ffa59269aca3742db0b58fba0d9fada61278f16/diff:/var/lib/docker/overlay2/a24ff6edf6d229f13b6e6c7d8b2236daeaebf01031bfd9f3c6145d113f4b15fa/diff:/var/lib/docker/overlay2/fe8a7527a16d4db26b423e380bc1dbda5c47fdea618877da78923d33fa69c67a/diff:/var/lib/docker/overlay2/49a49ffadbb6b93273a5082afed2b770291fb4b0d01babe4c82cf4f664abc1a8/diff", + "MergedDir": "/var/lib/docker/overlay2/be7c00a91125394c303dc316468e2e1b579717b5b2ea660c242fca568f465722/merged", + "UpperDir": "/var/lib/docker/overlay2/be7c00a91125394c303dc316468e2e1b579717b5b2ea660c242fca568f465722/diff", + "WorkDir": "/var/lib/docker/overlay2/be7c00a91125394c303dc316468e2e1b579717b5b2ea660c242fca568f465722/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "volume", + "Name": "portainer_data", + "Source": "/var/lib/docker/volumes/portainer_data/_data", + "Destination": "/data", + "Driver": "local", + "Mode": "z", + "RW": true, + "Propagation": "" + }, + { + "Type": "bind", + "Source": "/var/run/docker.sock", + "Destination": "/var/run/docker.sock", + "Mode": "", + "RW": true, + "Propagation": "rprivate" + } + ], + "Config": { + "Hostname": "241fd732ac79", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "ExposedPorts": { + "8000/tcp": {}, + "9000/tcp": {}, + "9443/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "Cmd": null, + "Image": "portainer/portainer-ce:latest", + "Volumes": { + "/data": {} + }, + "WorkingDir": "/", + "Entrypoint": [ + "/portainer" + ], + "OnBuild": null, + "Labels": { + "com.docker.desktop.extension.api.version": ">= 0.2.2", + "com.docker.desktop.extension.icon": "https://portainer-io-assets.sfo2.cdn.digitaloceanspaces.com/logos/portainer.png", + "com.docker.extension.additional-urls": "[{\"title\":\"Website\",\"url\":\"https://www.portainer.io?utm_campaign=DockerCon&utm_source=DockerDesktop\"},{\"title\":\"Documentation\",\"url\":\"https://docs.portainer.io\"},{\"title\":\"Support\",\"url\":\"https://join.slack.com/t/portainer/shared_invite/zt-txh3ljab-52QHTyjCqbe5RibC2lcjKA\"}]", + "com.docker.extension.detailed-description": "

Portainer’s Docker Desktop extension gives you access to all of Portainer’s rich management functionality within your docker desktop experience.

With Portainer you can:

  • See all your running containers
  • Easily view all of your container logs
  • Console into containers
  • Easily deploy your code into containers using a simple form
  • Turn your YAML into custom templates for easy reuse

About Portainer 

Portainer is the worlds’ most popular universal container management platform with more than 650,000 active monthly users. Portainer can be used to manage Docker Standalone, Kubernetes and Docker Swarm environments through a single common interface. It includes a simple GitOps automation engine and a Kube API. 

Portainer Business Edition is our fully supported commercial grade product for business-wide use. It includes all the functionality that businesses need to manage containers at scale. Visit Portainer.io to learn more about Portainer Business and get 3 free nodes.

", + "com.docker.extension.publisher-url": "https://www.portainer.io", + "com.docker.extension.screenshots": "[{\"alt\": \"screenshot one\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-1.png\"},{\"alt\": \"screenshot two\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-2.png\"},{\"alt\": \"screenshot three\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-3.png\"},{\"alt\": \"screenshot four\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-4.png\"},{\"alt\": \"screenshot five\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-5.png\"},{\"alt\": \"screenshot six\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-6.png\"},{\"alt\": \"screenshot seven\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-7.png\"},{\"alt\": \"screenshot eight\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-8.png\"},{\"alt\": \"screenshot nine\", \"url\": \"https://portainer-io-assets.sfo2.digitaloceanspaces.com/screenshots/docker-extension-9.png\"}]", + "git_commit": "e1de8b4", + "io.portainer.server": "true", + "org.opencontainers.image.created": "2026-06-03T22:13:55Z", + "org.opencontainers.image.description": "Portainer Community Edition server.", + "org.opencontainers.image.documentation": "https://docs.portainer.io", + "org.opencontainers.image.revision": "e1de8b4", + "org.opencontainers.image.title": "Portainer CE", + "org.opencontainers.image.url": "https://www.portainer.io", + "org.opencontainers.image.vendor": "Portainer.io" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "54a8f3c15849f17db5bfe6591361713ba704808e318243741cc50118e20ba84d", + "SandboxKey": "/var/run/docker/netns/54a8f3c15849", + "Ports": { + "8000/tcp": null, + "9000/tcp": null, + "9443/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "9443" + }, + { + "HostIp": "::", + "HostPort": "9443" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "26ef0a511da6a7efd50bcaba591c0f4fc738feee21447a6d5a19d2ec123427db", + "Gateway": "172.17.0.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "MacAddress": "02:42:ac:11:00:02", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "02:42:ac:11:00:02", + "NetworkID": "f4d4e2fb72e14fd40db0f04cfe43e79b4afdd228a2593c24a0e36c832349ba48", + "EndpointID": "26ef0a511da6a7efd50bcaba591c0f4fc738feee21447a6d5a19d2ec123427db", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + } + } + } + }, + { + "Id": "c489889ed02ae1999b204c0afb230880bd6bf15bc6699a563cdecc32aa92bab8", + "Created": "2026-06-04T16:22:48.461021507Z", + "Path": "/bin/prometheus", + "Args": [ + "--config.file=/etc/prometheus/prometheus.yml", + "--storage.tsdb.path=/prometheus" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 4568, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:51.490232127Z", + "FinishedAt": "2026-06-08T10:20:43.674374233Z" + }, + "Image": "sha256:d2f7aaa363e1c220487d776f21a5d7a3416834826038c1d2b38f1adb9079ed93", + "ResolvConfPath": "/var/lib/docker/containers/c489889ed02ae1999b204c0afb230880bd6bf15bc6699a563cdecc32aa92bab8/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/c489889ed02ae1999b204c0afb230880bd6bf15bc6699a563cdecc32aa92bab8/hostname", + "HostsPath": "/var/lib/docker/containers/c489889ed02ae1999b204c0afb230880bd6bf15bc6699a563cdecc32aa92bab8/hosts", + "LogPath": "/var/lib/docker/containers/c489889ed02ae1999b204c0afb230880bd6bf15bc6699a563cdecc32aa92bab8/c489889ed02ae1999b204c0afb230880bd6bf15bc6699a563cdecc32aa92bab8-json.log", + "Name": "/prometheus", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "/home/kenpat/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:rw" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "prometheus_default", + "PortBindings": { + "9090/tcp": [ + { + "HostIp": "", + "HostPort": "9090" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/8fe754193caab1cde5709de6f2b18f0bfc6227b887985087073e36464ca6a705-init/diff:/var/lib/docker/overlay2/e1cddc6a4ce81bac5360ac0aeb5037e372a4bcf72ee8273ec6eb71475b161d15/diff:/var/lib/docker/overlay2/19a53cf289443f80d9dc7933ddb1b36aa26524121c767d5b8769083c18a79ede/diff:/var/lib/docker/overlay2/8e03a0f89b2f0925112c3ff7e2507e7b12aaa0cea76968f31c848b13bc06d089/diff:/var/lib/docker/overlay2/740f1a70afc682b147250c3ca5045944ec1ef9e2489c6e61f4ba8ce4bbb77e14/diff:/var/lib/docker/overlay2/2645653e3eaef23bb647759845b97dd0c912cc6b87c3c85fd6e55420ec99b072/diff:/var/lib/docker/overlay2/43b3d39ff606bbe677fcb9b46d6f84e0fbab2449e46a721bd71657e3618f9324/diff:/var/lib/docker/overlay2/b1f43fe688e23dd31edb4b1d3e7360e52578b9fcdf223d06c8e5872834ba1f28/diff:/var/lib/docker/overlay2/fe2f795f1579c2a5e83ec711a91c418c1215e60ed4ea4b6a7eee6a4d17090ea1/diff:/var/lib/docker/overlay2/b2e124405ef456cb00f05bc734fc93fa2d23211ba408f163be8139e983211590/diff:/var/lib/docker/overlay2/88c96063b952e1e779c4c219efa792e948de17604bc4bf3d8481494482dddc90/diff", + "MergedDir": "/var/lib/docker/overlay2/8fe754193caab1cde5709de6f2b18f0bfc6227b887985087073e36464ca6a705/merged", + "UpperDir": "/var/lib/docker/overlay2/8fe754193caab1cde5709de6f2b18f0bfc6227b887985087073e36464ca6a705/diff", + "WorkDir": "/var/lib/docker/overlay2/8fe754193caab1cde5709de6f2b18f0bfc6227b887985087073e36464ca6a705/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "bind", + "Source": "/home/kenpat/docker/prometheus/prometheus.yml", + "Destination": "/etc/prometheus/prometheus.yml", + "Mode": "rw", + "RW": true, + "Propagation": "rprivate" + }, + { + "Type": "volume", + "Name": "b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111", + "Source": "/var/lib/docker/volumes/b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111/_data", + "Destination": "/prometheus", + "Driver": "local", + "Mode": "", + "RW": true, + "Propagation": "" + } + ], + "Config": { + "Hostname": "c489889ed02a", + "Domainname": "", + "User": "nobody", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "9090/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "Cmd": [ + "--config.file=/etc/prometheus/prometheus.yml", + "--storage.tsdb.path=/prometheus" + ], + "Image": "prom/prometheus", + "Volumes": { + "/prometheus": {} + }, + "WorkingDir": "/prometheus", + "Entrypoint": [ + "/bin/prometheus" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "9ff4936b617817f1d4123ae551fc1cbacd68039f12467966801a4ab47eb018bb", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:d2f7aaa363e1c220487d776f21a5d7a3416834826038c1d2b38f1adb9079ed93", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "prometheus", + "com.docker.compose.project.config_files": "/home/kenpat/docker/prometheus/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/prometheus", + "com.docker.compose.service": "prometheus", + "com.docker.compose.version": "2.26.1", + "io.prometheus.image.variant": "busybox", + "maintainer": "The Prometheus Authors ", + "org.opencontainers.image.authors": "The Prometheus Authors", + "org.opencontainers.image.description": "The Prometheus monitoring system and time series database", + "org.opencontainers.image.documentation": "https://prometheus.io/docs", + "org.opencontainers.image.licenses": "Apache License 2.0", + "org.opencontainers.image.source": "https://github.com/prometheus/prometheus", + "org.opencontainers.image.title": "Prometheus", + "org.opencontainers.image.url": "https://github.com/prometheus/prometheus", + "org.opencontainers.image.vendor": "Prometheus" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "1779556a62107702f0f1065a22efa69b5e0cc7c8cc3b8274f7e2fa29092a360c", + "SandboxKey": "/var/run/docker/netns/1779556a6210", + "Ports": { + "9090/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "9090" + }, + { + "HostIp": "::", + "HostPort": "9090" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:06", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "e060821970cfac0162c6681cf84fd4bf63f6822c7d62d44603a9821b738811d8", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.6", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "prometheus", + "c489889ed02a" + ] + }, + "prometheus_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "prometheus", + "prometheus" + ], + "MacAddress": "02:42:ac:13:00:02", + "NetworkID": "bffe9441e56d9c241b7e5649654ad2a5de1f857cd7cde125e2ae5aca6af5884f", + "EndpointID": "21feb8c8c3591ebfcf42c37db6a132ef915a3ce60049e3ff2c51a8114c34ffeb", + "Gateway": "172.19.0.1", + "IPAddress": "172.19.0.2", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "prometheus", + "c489889ed02a" + ] + } + } + } + }, + { + "Id": "5f5c39886d3cc11d2f5e43bc4ad5961fc72eecfe8f2e41ec98e2d42d6375935b", + "Created": "2026-06-04T16:22:48.460900246Z", + "Path": "/bin/node_exporter", + "Args": [], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 4234, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:50.826856661Z", + "FinishedAt": "2026-06-08T10:20:43.677617098Z" + }, + "Image": "sha256:47509d7f7c15a729686d9d5eccec66abd4b2495d9ae01f637f63e6375fe93f8b", + "ResolvConfPath": "/var/lib/docker/containers/5f5c39886d3cc11d2f5e43bc4ad5961fc72eecfe8f2e41ec98e2d42d6375935b/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/5f5c39886d3cc11d2f5e43bc4ad5961fc72eecfe8f2e41ec98e2d42d6375935b/hostname", + "HostsPath": "/var/lib/docker/containers/5f5c39886d3cc11d2f5e43bc4ad5961fc72eecfe8f2e41ec98e2d42d6375935b/hosts", + "LogPath": "/var/lib/docker/containers/5f5c39886d3cc11d2f5e43bc4ad5961fc72eecfe8f2e41ec98e2d42d6375935b/5f5c39886d3cc11d2f5e43bc4ad5961fc72eecfe8f2e41ec98e2d42d6375935b-json.log", + "Name": "/node-exporter", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "prometheus_default", + "PortBindings": { + "9100/tcp": [ + { + "HostIp": "", + "HostPort": "9100" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 0, + 0 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": [], + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": null, + "BlkioDeviceReadBps": null, + "BlkioDeviceWriteBps": null, + "BlkioDeviceReadIOps": null, + "BlkioDeviceWriteIOps": null, + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": null, + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": null, + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/e0835cfad37dceb6dc93ff8cc125815c34c0c6c97fc779fce48d4ef773c7762b-init/diff:/var/lib/docker/overlay2/d6f09b244ff1673c32e4fd50adc3b62f65ebaf4bf311aff3457e58179163c85d/diff:/var/lib/docker/overlay2/41c145a04136aefc33ee6eafc57a1ebcb40cdccd7762fadeac1dd0723e124124/diff:/var/lib/docker/overlay2/fa87fa2e92a1ce111cbb6c2936cc4e206c04d00e8b559aac34be8540e127cf9b/diff", + "MergedDir": "/var/lib/docker/overlay2/e0835cfad37dceb6dc93ff8cc125815c34c0c6c97fc779fce48d4ef773c7762b/merged", + "UpperDir": "/var/lib/docker/overlay2/e0835cfad37dceb6dc93ff8cc125815c34c0c6c97fc779fce48d4ef773c7762b/diff", + "WorkDir": "/var/lib/docker/overlay2/e0835cfad37dceb6dc93ff8cc125815c34c0c6c97fc779fce48d4ef773c7762b/work" + }, + "Name": "overlay2" + }, + "Mounts": [], + "Config": { + "Hostname": "5f5c39886d3c", + "Domainname": "", + "User": "nobody", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "ExposedPorts": { + "9100/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "Cmd": null, + "Image": "prom/node-exporter", + "Volumes": null, + "WorkingDir": "", + "Entrypoint": [ + "/bin/node_exporter" + ], + "OnBuild": null, + "Labels": { + "com.docker.compose.config-hash": "8e0bb74663b226abbda03e1597e12147509e9cbdbfc894655d0040e83ed6c9a8", + "com.docker.compose.container-number": "1", + "com.docker.compose.depends_on": "", + "com.docker.compose.image": "sha256:47509d7f7c15a729686d9d5eccec66abd4b2495d9ae01f637f63e6375fe93f8b", + "com.docker.compose.oneoff": "False", + "com.docker.compose.project": "prometheus", + "com.docker.compose.project.config_files": "/home/kenpat/docker/prometheus/docker-compose.yml", + "com.docker.compose.project.working_dir": "/home/kenpat/docker/prometheus", + "com.docker.compose.service": "node-exporter", + "com.docker.compose.version": "2.26.1", + "io.prometheus.image.variant": "busybox", + "maintainer": "The Prometheus Authors ", + "org.opencontainers.image.authors": "The Prometheus Authors", + "org.opencontainers.image.description": "Prometheus exporter for hardware and OS metrics exposed by *NIX kernels", + "org.opencontainers.image.documentation": "https://github.com/prometheus/node_exporter", + "org.opencontainers.image.licenses": "Apache License 2.0", + "org.opencontainers.image.source": "https://github.com/prometheus/node_exporter", + "org.opencontainers.image.title": "node_exporter", + "org.opencontainers.image.url": "https://github.com/prometheus/node_exporter", + "org.opencontainers.image.vendor": "Prometheus" + } + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "2a93a3235019d83a0d293e740cb3edbda25d339ccdba473018316d9b569ede06", + "SandboxKey": "/var/run/docker/netns/2a93a3235019", + "Ports": { + "9100/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "9100" + }, + { + "HostIp": "::", + "HostPort": "9100" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:04", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "7187e04f67e3afc0ce3e551663fcc7721a809487309ca45d2d6c331e2c485f69", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.4", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "node-exporter", + "5f5c39886d3c" + ] + }, + "prometheus_default": { + "IPAMConfig": null, + "Links": null, + "Aliases": [ + "node-exporter", + "node-exporter" + ], + "MacAddress": "02:42:ac:13:00:03", + "NetworkID": "bffe9441e56d9c241b7e5649654ad2a5de1f857cd7cde125e2ae5aca6af5884f", + "EndpointID": "3c2c7402c65fd66aafa02b347ff966830f7539888e7f1fdda2bf2ef784319e6b", + "Gateway": "172.19.0.1", + "IPAddress": "172.19.0.3", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": [ + "node-exporter", + "5f5c39886d3c" + ] + } + } + } + }, + { + "Id": "9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c", + "Created": "2026-06-04T15:51:50.956146487Z", + "Path": "/usr/bin/dumb-init", + "Args": [ + "--", + "extra/entrypoint.sh", + "node", + "server/server.js" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 5263, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:52.463566079Z", + "FinishedAt": "2026-06-08T10:20:43.666763869Z", + "Health": { + "Status": "healthy", + "FailingStreak": 0, + "Log": [ + { + "Start": "2026-06-09T13:32:39.230864414-05:00", + "End": "2026-06-09T13:32:39.293596386-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:32:39 Checking http://127.0.0.1:3001\n2026/06/09 18:32:39 Health Check OK [Res Code: 200]\n" + }, + { + "Start": "2026-06-09T13:33:39.294974636-05:00", + "End": "2026-06-09T13:33:39.386020711-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:33:39 Checking http://127.0.0.1:3001\n2026/06/09 18:33:39 Health Check OK [Res Code: 200]\n" + }, + { + "Start": "2026-06-09T13:34:39.387516537-05:00", + "End": "2026-06-09T13:34:39.582395564-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:34:39 Checking http://127.0.0.1:3001\n2026/06/09 18:34:39 Health Check OK [Res Code: 200]\n" + }, + { + "Start": "2026-06-09T13:35:39.596511098-05:00", + "End": "2026-06-09T13:35:39.727123444-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:35:39 Checking http://127.0.0.1:3001\n2026/06/09 18:35:39 Health Check OK [Res Code: 200]\n" + }, + { + "Start": "2026-06-09T13:36:39.728420401-05:00", + "End": "2026-06-09T13:36:39.827964251-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:36:39 Checking http://127.0.0.1:3001\n2026/06/09 18:36:39 Health Check OK [Res Code: 200]\n" + } + ] + } + }, + "Image": "sha256:f48d816cb7460cd3b7bb15ed393968b0ae0da4c690443b778b6a5db6b09f527e", + "ResolvConfPath": "/var/lib/docker/containers/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c/hostname", + "HostsPath": "/var/lib/docker/containers/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c/hosts", + "LogPath": "/var/lib/docker/containers/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c-json.log", + "Name": "/uptime-kuma", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "uptime-kuma:/app/data" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": { + "3001/tcp": [ + { + "HostIp": "", + "HostPort": "3001" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 26, + 80 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/a9ccf55f6f463815b92b71dcf70142bc29e46f15a9f379793794f9e2dc9202e2-init/diff:/var/lib/docker/overlay2/484ebda4c7653a5aece44f036a066cf6a8eb822181ba22bae6908d16a629819c/diff:/var/lib/docker/overlay2/6f26b9d89fa702369832639624a9ed0ea1c5b47ca6fb349bc8c401df7eaf6d54/diff:/var/lib/docker/overlay2/5fece3c11be6f920ed0ac2bca96519fcc6b37a8c7e1d4012a9aef5989df017ee/diff:/var/lib/docker/overlay2/59e052c7119808723ca72a872dc04903cf46eae560e6cb078abeb99cb09cde7b/diff:/var/lib/docker/overlay2/a15d41f7bc54190c511f40a5677a79744aafe316725054e6dbf25a52372b756b/diff:/var/lib/docker/overlay2/252278bc5048f2b29878b86d0f585a399f13abec6902c3399d50f40245ce458e/diff:/var/lib/docker/overlay2/8b63000845eefb70e35349605be767cc7bc122d530605a042caabb249a61c16a/diff:/var/lib/docker/overlay2/83089265605c9e5dc2cee6afb5c6d65fb018f3b7b699e4a88c874b29d8582394/diff:/var/lib/docker/overlay2/5e82af76259ba2a3d365c0a46804925e2cbe0bfdaa4bf7c6bd174c6c95748321/diff:/var/lib/docker/overlay2/43d5816b7d853b6c652fdf2805bae68e7cc3881058052a3a8ca2a0ea912decf3/diff:/var/lib/docker/overlay2/3f2031c2ab4999a3c459c490542ef5bb9de6568f6ee4ba3d2a4e951e5627ecba/diff:/var/lib/docker/overlay2/9bbabaccb55a7612c7d2c275644d80565cb7f20b22f9243a78b3732d002a1b60/diff:/var/lib/docker/overlay2/6360813a2de43dd1d216d9a17945d9836403a018bdeb91754458768731788736/diff", + "MergedDir": "/var/lib/docker/overlay2/a9ccf55f6f463815b92b71dcf70142bc29e46f15a9f379793794f9e2dc9202e2/merged", + "UpperDir": "/var/lib/docker/overlay2/a9ccf55f6f463815b92b71dcf70142bc29e46f15a9f379793794f9e2dc9202e2/diff", + "WorkDir": "/var/lib/docker/overlay2/a9ccf55f6f463815b92b71dcf70142bc29e46f15a9f379793794f9e2dc9202e2/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "volume", + "Name": "uptime-kuma", + "Source": "/var/lib/docker/volumes/uptime-kuma/_data", + "Destination": "/app/data", + "Driver": "local", + "Mode": "z", + "RW": true, + "Propagation": "" + } + ], + "Config": { + "Hostname": "9a8ff52b78b4", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "ExposedPorts": { + "3001/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "NODE_VERSION=18.20.3", + "YARN_VERSION=1.22.19", + "UPTIME_KUMA_IS_CONTAINER=1" + ], + "Cmd": [ + "node", + "server/server.js" + ], + "Healthcheck": { + "Test": [ + "CMD-SHELL", + "extra/healthcheck" + ], + "Interval": 60000000000, + "Timeout": 30000000000, + "StartPeriod": 180000000000, + "Retries": 5 + }, + "Image": "louislam/uptime-kuma:latest", + "Volumes": { + "/app/data": {} + }, + "WorkingDir": "/app", + "Entrypoint": [ + "/usr/bin/dumb-init", + "--", + "extra/entrypoint.sh" + ], + "OnBuild": null, + "Labels": {} + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "be33e50dd494b136bd0c4093411afca8264ab29e20b3c9bde92c87db15cb5383", + "SandboxKey": "/var/run/docker/netns/be33e50dd494", + "Ports": { + "3001/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "3001" + }, + { + "HostIp": "::", + "HostPort": "3001" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "febf33e9a0277267dae9c51c79c42e824dbb520c8fe0a471374398d6024788bb", + "Gateway": "172.17.0.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.3", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "MacAddress": "02:42:ac:11:00:03", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "02:42:ac:11:00:03", + "NetworkID": "f4d4e2fb72e14fd40db0f04cfe43e79b4afdd228a2593c24a0e36c832349ba48", + "EndpointID": "febf33e9a0277267dae9c51c79c42e824dbb520c8fe0a471374398d6024788bb", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.3", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + }, + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:0d", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "6c0340601e5b36aa8af525c8a8dd1048be951be5cec6f802273dd3d13f8e2470", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.13", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "uptime-kuma", + "9a8ff52b78b4" + ] + } + } + } + }, + { + "Id": "1132e6f030f056168606c12312bbe5a25f4a8501080c223c3e7b42e7d5cf8c44", + "Created": "2026-06-04T15:44:11.767449892Z", + "Path": "/hello", + "Args": [], + "State": { + "Status": "exited", + "Running": false, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 0, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-04T15:44:12.080202867Z", + "FinishedAt": "2026-06-04T15:44:12.081541567Z" + }, + "Image": "sha256:e2ac70e7319a02c5a477f5825259bd118b94e8b02c279c67afa63adab6d8685b", + "ResolvConfPath": "/var/lib/docker/containers/1132e6f030f056168606c12312bbe5a25f4a8501080c223c3e7b42e7d5cf8c44/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/1132e6f030f056168606c12312bbe5a25f4a8501080c223c3e7b42e7d5cf8c44/hostname", + "HostsPath": "/var/lib/docker/containers/1132e6f030f056168606c12312bbe5a25f4a8501080c223c3e7b42e7d5cf8c44/hosts", + "LogPath": "/var/lib/docker/containers/1132e6f030f056168606c12312bbe5a25f4a8501080c223c3e7b42e7d5cf8c44/1132e6f030f056168606c12312bbe5a25f4a8501080c223c3e7b42e7d5cf8c44-json.log", + "Name": "/unruffled_mcnulty", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": null, + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": {}, + "RestartPolicy": { + "Name": "no", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 24, + 80 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/7ef59fe4d473e540635b11ba1e97f4b55c0c6b3a86e4dc7d2658087d607533c4-init/diff:/var/lib/docker/overlay2/869a847089b5768c152083733f46dde74b4ff495fb30bb293ac38c3af714e4e9/diff", + "MergedDir": "/var/lib/docker/overlay2/7ef59fe4d473e540635b11ba1e97f4b55c0c6b3a86e4dc7d2658087d607533c4/merged", + "UpperDir": "/var/lib/docker/overlay2/7ef59fe4d473e540635b11ba1e97f4b55c0c6b3a86e4dc7d2658087d607533c4/diff", + "WorkDir": "/var/lib/docker/overlay2/7ef59fe4d473e540635b11ba1e97f4b55c0c6b3a86e4dc7d2658087d607533c4/work" + }, + "Name": "overlay2" + }, + "Mounts": [], + "Config": { + "Hostname": "1132e6f030f0", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": true, + "AttachStderr": true, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" + ], + "Cmd": [ + "/hello" + ], + "Image": "hello-world", + "Volumes": null, + "WorkingDir": "/", + "Entrypoint": null, + "OnBuild": null, + "Labels": {} + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "f5c903786ced42ecca6d11d61185f02cbaa9a456c781a3214f19d0af18e93b83", + "SandboxKey": "/var/run/docker/netns/f5c903786ced", + "Ports": {}, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "", + "Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "MacAddress": "", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "", + "NetworkID": "3e4902b1094ea2ba44c971d4f2506b2bbb27bc3ca63018dae16dc9ccec96c1f9", + "EndpointID": "", + "Gateway": "", + "IPAddress": "", + "IPPrefixLen": 0, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + } + } + } + } +] diff --git a/cloud-migration/inventory/docker-folder-sizes.txt b/cloud-migration/inventory/docker-folder-sizes.txt new file mode 100644 index 0000000..6b85be2 --- /dev/null +++ b/cloud-migration/inventory/docker-folder-sizes.txt @@ -0,0 +1,22 @@ +4.0K /home/kenpat/docker/audiobookshelf +4.0K /home/kenpat/docker/plane +4.0K /home/kenpat/docker/portainer +4.0K /home/kenpat/docker/postgres +4.0K /home/kenpat/docker/uptime-kuma +8.0K /home/kenpat/docker/zammad +12K /home/kenpat/docker/openproject +16K /home/kenpat/docker/kite-ai +16K /home/kenpat/docker/prometheus +20K /home/kenpat/docker/cloudflared +24K /home/kenpat/docker/homepage +32K /home/kenpat/docker/authentik +2.5M /home/kenpat/docker/homepage-backup-pre-cyberpunk-2026-06-07-0152.tar.gz +2.7M /home/kenpat/docker/homepage-archived-2026-06-07 +3.1M /home/kenpat/docker/kitestacks-portal +3.2M /home/kenpat/docker/kitestacks-portal-test +4.4M /home/kenpat/docker/linkding +42M /home/kenpat/docker/kavita +63M /home/kenpat/docker/karakeep +155M /home/kenpat/docker/bookstack +156M /home/kenpat/docker/grafana +839M /home/kenpat/docker/forgejo diff --git a/cloud-migration/inventory/docker-networks.txt b/cloud-migration/inventory/docker-networks.txt new file mode 100644 index 0000000..c218f6d --- /dev/null +++ b/cloud-migration/inventory/docker-networks.txt @@ -0,0 +1,19 @@ +NAME DRIVER SCOPE +authentik_default bridge local +bookstack_default bridge local +bridge bridge local +calibre-web_default bridge local +cloudflared_default bridge local +forgejo_default bridge local +grafana_default bridge local +homepage_default bridge local +host host local +karakeep_internal bridge local +kite-ai_default bridge local +kitestacks bridge local +kitestacks-portal-test_default bridge local +kitestacks-portal_default bridge local +none null local +openproject_default bridge local +openproject_openproject-net bridge local +prometheus_default bridge local diff --git a/cloud-migration/inventory/docker-running.txt b/cloud-migration/inventory/docker-running.txt new file mode 100644 index 0000000..b64998b --- /dev/null +++ b/cloud-migration/inventory/docker-running.txt @@ -0,0 +1,25 @@ +NAMES IMAGE STATUS PORTS +karakeep ghcr.io/karakeep-app/karakeep:release Up About an hour (healthy) 3000/tcp +karakeep-meilisearch getmeili/meilisearch:v1.41.0 Up 2 hours 7700/tcp +karakeep-chrome gcr.io/zenika-hub/alpine-chrome:124 Up 2 hours +openproject openproject/openproject:15 Up 18 hours 0.0.0.0:80->80/tcp, :::80->80/tcp +forgejo codeberg.org/forgejo/forgejo:11 Up 16 hours 0.0.0.0:2222->22/tcp, :::2222->22/tcp, 0.0.0.0:3006->3000/tcp, :::3006->3000/tcp +kite-openwebui ghcr.io/open-webui/open-webui:main Up 32 hours (healthy) 0.0.0.0:3100->8080/tcp, :::3100->8080/tcp +grafana grafana/grafana-oss Up 32 hours 0.0.0.0:3150->3000/tcp, :::3150->3000/tcp +cloudflared cloudflare/cloudflared:latest Up 32 hours +kitestacks-metrics-api kitestacks-portal-test-metrics-api:latest Up 32 hours +homepage nginx:alpine Up 32 hours 80/tcp, 0.0.0.0:3005->3000/tcp, :::3005->3000/tcp +kitestacks-portal-test nginx:alpine Up 32 hours 0.0.0.0:3008->80/tcp, :::3008->80/tcp +homepage-test ghcr.io/gethomepage/homepage:latest Up 32 hours (healthy) 0.0.0.0:3007->3000/tcp, :::3007->3000/tcp +kite-litellm ghcr.io/berriai/litellm:main-latest Up 32 hours 0.0.0.0:4000->4000/tcp, :::4000->4000/tcp +bookstack lscr.io/linuxserver/bookstack:latest Up 32 hours 443/tcp, 0.0.0.0:6875->80/tcp, :::6875->80/tcp +bookstack-db mariadb:11 Up 32 hours 3306/tcp +authentik ghcr.io/goauthentik/server:latest Up 32 hours (healthy) 0.0.0.0:9001->9000/tcp, :::9001->9000/tcp +authentik-worker ghcr.io/goauthentik/server:latest Up 32 hours (healthy) +authentik-postgres postgres:16-alpine Up 32 hours 5432/tcp +authentik-redis redis:alpine Up 32 hours 6379/tcp +kavita ghcr.io/kareadita/kavita:latest Up 8 minutes (healthy) 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp +portainer portainer/portainer-ce:latest Up 32 hours 8000/tcp, 9000/tcp, 0.0.0.0:9443->9443/tcp, :::9443->9443/tcp +prometheus prom/prometheus Up 32 hours 0.0.0.0:9090->9090/tcp, :::9090->9090/tcp +node-exporter prom/node-exporter Up 32 hours 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp +uptime-kuma louislam/uptime-kuma:latest Up 32 hours (healthy) 0.0.0.0:3001->3001/tcp, :::3001->3001/tcp diff --git a/cloud-migration/inventory/docker-volume-inspect.json b/cloud-migration/inventory/docker-volume-inspect.json new file mode 100644 index 0000000..1c73844 --- /dev/null +++ b/cloud-migration/inventory/docker-volume-inspect.json @@ -0,0 +1,439 @@ +[ + { + "CreatedAt": "2026-06-09T13:36:40-05:00", + "Driver": "local", + "Labels": { + "com.docker.volume.anonymous": "" + }, + "Mountpoint": "/var/lib/docker/volumes/4e935c6eb337c5ace7ae2d4ac76bf4cd7fba2d6733b7a3ecd647e53052965524/_data", + "Name": "4e935c6eb337c5ace7ae2d4ac76bf4cd7fba2d6733b7a3ecd647e53052965524", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-06T02:50:40-05:00", + "Driver": "local", + "Labels": { + "com.docker.volume.anonymous": "" + }, + "Mountpoint": "/var/lib/docker/volumes/95f721b2e8b90b4e17a3675d4905837933bc366e12c15d16bce1bd9d166c43f0/_data", + "Name": "95f721b2e8b90b4e17a3675d4905837933bc366e12c15d16bce1bd9d166c43f0", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-04T11:22:48-05:00", + "Driver": "local", + "Labels": { + "com.docker.volume.anonymous": "" + }, + "Mountpoint": "/var/lib/docker/volumes/b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111/_data", + "Name": "b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-06T02:50:40-05:00", + "Driver": "local", + "Labels": { + "com.docker.volume.anonymous": "" + }, + "Mountpoint": "/var/lib/docker/volumes/b11ac7c9fe060195954a46980f7ed85da9a62fea48d7cca5990aa54ec3d4cd8a/_data", + "Name": "b11ac7c9fe060195954a46980f7ed85da9a62fea48d7cca5990aa54ec3d4cd8a", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-05T14:51:34-05:00", + "Driver": "local", + "Labels": { + "com.docker.volume.anonymous": "" + }, + "Mountpoint": "/var/lib/docker/volumes/b303d482950f666b37acae69c790f0f37e9d28735a4ea0b98a7961a8a400fa75/_data", + "Name": "b303d482950f666b37acae69c790f0f37e9d28735a4ea0b98a7961a8a400fa75", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-04T23:47:29-05:00", + "Driver": "local", + "Labels": { + "com.docker.compose.project": "kite-ai", + "com.docker.compose.version": "2.26.1", + "com.docker.compose.volume": "open-webui" + }, + "Mountpoint": "/var/lib/docker/volumes/kite-ai_open-webui/_data", + "Name": "kite-ai_open-webui", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-04T21:54:45-05:00", + "Driver": "local", + "Labels": { + "com.docker.compose.project": "openproject", + "com.docker.compose.version": "2.26.1", + "com.docker.compose.volume": "openproject_assets" + }, + "Mountpoint": "/var/lib/docker/volumes/openproject_openproject_assets/_data", + "Name": "openproject_openproject_assets", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-05T14:38:15-05:00", + "Driver": "local", + "Labels": { + "com.docker.compose.project": "openproject", + "com.docker.compose.version": "2.26.1", + "com.docker.compose.volume": "openproject_db_data" + }, + "Mountpoint": "/var/lib/docker/volumes/openproject_openproject_db_data/_data", + "Name": "openproject_openproject_db_data", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-05T14:38:15-05:00", + "Driver": "local", + "Labels": { + "com.docker.compose.project": "openproject", + "com.docker.compose.version": "2.26.1", + "com.docker.compose.volume": "openproject_logs" + }, + "Mountpoint": "/var/lib/docker/volumes/openproject_openproject_logs/_data", + "Name": "openproject_openproject_logs", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-04T21:54:45-05:00", + "Driver": "local", + "Labels": { + "com.docker.compose.project": "openproject", + "com.docker.compose.version": "2.26.1", + "com.docker.compose.volume": "openproject_pgdata" + }, + "Mountpoint": "/var/lib/docker/volumes/openproject_openproject_pgdata/_data", + "Name": "openproject_openproject_pgdata", + "Options": null, + "Scope": "local" + }, + { + "CreatedAt": "2026-06-04T11:27:46-05:00", + "Driver": "local", + "Labels": null, + "Mountpoint": "/var/lib/docker/volumes/portainer_data/_data", + "Name": "portainer_data", + "Options": null, + "Scope": "local" + }, + { + "Id": "9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c", + "Created": "2026-06-04T15:51:50.956146487Z", + "Path": "/usr/bin/dumb-init", + "Args": [ + "--", + "extra/entrypoint.sh", + "node", + "server/server.js" + ], + "State": { + "Status": "running", + "Running": true, + "Paused": false, + "Restarting": false, + "OOMKilled": false, + "Dead": false, + "Pid": 5263, + "ExitCode": 0, + "Error": "", + "StartedAt": "2026-06-08T10:20:52.463566079Z", + "FinishedAt": "2026-06-08T10:20:43.666763869Z", + "Health": { + "Status": "healthy", + "FailingStreak": 0, + "Log": [ + { + "Start": "2026-06-09T13:32:39.230864414-05:00", + "End": "2026-06-09T13:32:39.293596386-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:32:39 Checking http://127.0.0.1:3001\n2026/06/09 18:32:39 Health Check OK [Res Code: 200]\n" + }, + { + "Start": "2026-06-09T13:33:39.294974636-05:00", + "End": "2026-06-09T13:33:39.386020711-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:33:39 Checking http://127.0.0.1:3001\n2026/06/09 18:33:39 Health Check OK [Res Code: 200]\n" + }, + { + "Start": "2026-06-09T13:34:39.387516537-05:00", + "End": "2026-06-09T13:34:39.582395564-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:34:39 Checking http://127.0.0.1:3001\n2026/06/09 18:34:39 Health Check OK [Res Code: 200]\n" + }, + { + "Start": "2026-06-09T13:35:39.596511098-05:00", + "End": "2026-06-09T13:35:39.727123444-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:35:39 Checking http://127.0.0.1:3001\n2026/06/09 18:35:39 Health Check OK [Res Code: 200]\n" + }, + { + "Start": "2026-06-09T13:36:39.728420401-05:00", + "End": "2026-06-09T13:36:39.827964251-05:00", + "ExitCode": 0, + "Output": "2026/06/09 18:36:39 Checking http://127.0.0.1:3001\n2026/06/09 18:36:39 Health Check OK [Res Code: 200]\n" + } + ] + } + }, + "Image": "sha256:f48d816cb7460cd3b7bb15ed393968b0ae0da4c690443b778b6a5db6b09f527e", + "ResolvConfPath": "/var/lib/docker/containers/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c/resolv.conf", + "HostnamePath": "/var/lib/docker/containers/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c/hostname", + "HostsPath": "/var/lib/docker/containers/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c/hosts", + "LogPath": "/var/lib/docker/containers/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c/9a8ff52b78b4009bfd1871f7ecabc87a03048027aeb928a93795c49cc63ecc8c-json.log", + "Name": "/uptime-kuma", + "RestartCount": 0, + "Driver": "overlay2", + "Platform": "linux", + "MountLabel": "", + "ProcessLabel": "", + "AppArmorProfile": "docker-default", + "ExecIDs": null, + "HostConfig": { + "Binds": [ + "uptime-kuma:/app/data" + ], + "ContainerIDFile": "", + "LogConfig": { + "Type": "json-file", + "Config": {} + }, + "NetworkMode": "bridge", + "PortBindings": { + "3001/tcp": [ + { + "HostIp": "", + "HostPort": "3001" + } + ] + }, + "RestartPolicy": { + "Name": "unless-stopped", + "MaximumRetryCount": 0 + }, + "AutoRemove": false, + "VolumeDriver": "", + "VolumesFrom": null, + "ConsoleSize": [ + 26, + 80 + ], + "CapAdd": null, + "CapDrop": null, + "CgroupnsMode": "private", + "Dns": [], + "DnsOptions": [], + "DnsSearch": [], + "ExtraHosts": null, + "GroupAdd": null, + "IpcMode": "private", + "Cgroup": "", + "Links": null, + "OomScoreAdj": 0, + "PidMode": "", + "Privileged": false, + "PublishAllPorts": false, + "ReadonlyRootfs": false, + "SecurityOpt": null, + "UTSMode": "", + "UsernsMode": "", + "ShmSize": 67108864, + "Runtime": "runc", + "Isolation": "", + "CpuShares": 0, + "Memory": 0, + "NanoCpus": 0, + "CgroupParent": "", + "BlkioWeight": 0, + "BlkioWeightDevice": [], + "BlkioDeviceReadBps": [], + "BlkioDeviceWriteBps": [], + "BlkioDeviceReadIOps": [], + "BlkioDeviceWriteIOps": [], + "CpuPeriod": 0, + "CpuQuota": 0, + "CpuRealtimePeriod": 0, + "CpuRealtimeRuntime": 0, + "CpusetCpus": "", + "CpusetMems": "", + "Devices": [], + "DeviceCgroupRules": null, + "DeviceRequests": null, + "MemoryReservation": 0, + "MemorySwap": 0, + "MemorySwappiness": null, + "OomKillDisable": null, + "PidsLimit": null, + "Ulimits": [], + "CpuCount": 0, + "CpuPercent": 0, + "IOMaximumIOps": 0, + "IOMaximumBandwidth": 0, + "MaskedPaths": [ + "/proc/asound", + "/proc/acpi", + "/proc/kcore", + "/proc/keys", + "/proc/latency_stats", + "/proc/timer_list", + "/proc/timer_stats", + "/proc/sched_debug", + "/proc/scsi", + "/sys/firmware", + "/sys/devices/virtual/powercap" + ], + "ReadonlyPaths": [ + "/proc/bus", + "/proc/fs", + "/proc/irq", + "/proc/sys", + "/proc/sysrq-trigger" + ] + }, + "GraphDriver": { + "Data": { + "LowerDir": "/var/lib/docker/overlay2/a9ccf55f6f463815b92b71dcf70142bc29e46f15a9f379793794f9e2dc9202e2-init/diff:/var/lib/docker/overlay2/484ebda4c7653a5aece44f036a066cf6a8eb822181ba22bae6908d16a629819c/diff:/var/lib/docker/overlay2/6f26b9d89fa702369832639624a9ed0ea1c5b47ca6fb349bc8c401df7eaf6d54/diff:/var/lib/docker/overlay2/5fece3c11be6f920ed0ac2bca96519fcc6b37a8c7e1d4012a9aef5989df017ee/diff:/var/lib/docker/overlay2/59e052c7119808723ca72a872dc04903cf46eae560e6cb078abeb99cb09cde7b/diff:/var/lib/docker/overlay2/a15d41f7bc54190c511f40a5677a79744aafe316725054e6dbf25a52372b756b/diff:/var/lib/docker/overlay2/252278bc5048f2b29878b86d0f585a399f13abec6902c3399d50f40245ce458e/diff:/var/lib/docker/overlay2/8b63000845eefb70e35349605be767cc7bc122d530605a042caabb249a61c16a/diff:/var/lib/docker/overlay2/83089265605c9e5dc2cee6afb5c6d65fb018f3b7b699e4a88c874b29d8582394/diff:/var/lib/docker/overlay2/5e82af76259ba2a3d365c0a46804925e2cbe0bfdaa4bf7c6bd174c6c95748321/diff:/var/lib/docker/overlay2/43d5816b7d853b6c652fdf2805bae68e7cc3881058052a3a8ca2a0ea912decf3/diff:/var/lib/docker/overlay2/3f2031c2ab4999a3c459c490542ef5bb9de6568f6ee4ba3d2a4e951e5627ecba/diff:/var/lib/docker/overlay2/9bbabaccb55a7612c7d2c275644d80565cb7f20b22f9243a78b3732d002a1b60/diff:/var/lib/docker/overlay2/6360813a2de43dd1d216d9a17945d9836403a018bdeb91754458768731788736/diff", + "MergedDir": "/var/lib/docker/overlay2/a9ccf55f6f463815b92b71dcf70142bc29e46f15a9f379793794f9e2dc9202e2/merged", + "UpperDir": "/var/lib/docker/overlay2/a9ccf55f6f463815b92b71dcf70142bc29e46f15a9f379793794f9e2dc9202e2/diff", + "WorkDir": "/var/lib/docker/overlay2/a9ccf55f6f463815b92b71dcf70142bc29e46f15a9f379793794f9e2dc9202e2/work" + }, + "Name": "overlay2" + }, + "Mounts": [ + { + "Type": "volume", + "Name": "uptime-kuma", + "Source": "/var/lib/docker/volumes/uptime-kuma/_data", + "Destination": "/app/data", + "Driver": "local", + "Mode": "z", + "RW": true, + "Propagation": "" + } + ], + "Config": { + "Hostname": "9a8ff52b78b4", + "Domainname": "", + "User": "", + "AttachStdin": false, + "AttachStdout": false, + "AttachStderr": false, + "ExposedPorts": { + "3001/tcp": {} + }, + "Tty": false, + "OpenStdin": false, + "StdinOnce": false, + "Env": [ + "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", + "NODE_VERSION=18.20.3", + "YARN_VERSION=1.22.19", + "UPTIME_KUMA_IS_CONTAINER=1" + ], + "Cmd": [ + "node", + "server/server.js" + ], + "Healthcheck": { + "Test": [ + "CMD-SHELL", + "extra/healthcheck" + ], + "Interval": 60000000000, + "Timeout": 30000000000, + "StartPeriod": 180000000000, + "Retries": 5 + }, + "Image": "louislam/uptime-kuma:latest", + "Volumes": { + "/app/data": {} + }, + "WorkingDir": "/app", + "Entrypoint": [ + "/usr/bin/dumb-init", + "--", + "extra/entrypoint.sh" + ], + "OnBuild": null, + "Labels": {} + }, + "NetworkSettings": { + "Bridge": "", + "SandboxID": "be33e50dd494b136bd0c4093411afca8264ab29e20b3c9bde92c87db15cb5383", + "SandboxKey": "/var/run/docker/netns/be33e50dd494", + "Ports": { + "3001/tcp": [ + { + "HostIp": "0.0.0.0", + "HostPort": "3001" + }, + { + "HostIp": "::", + "HostPort": "3001" + } + ] + }, + "HairpinMode": false, + "LinkLocalIPv6Address": "", + "LinkLocalIPv6PrefixLen": 0, + "SecondaryIPAddresses": null, + "SecondaryIPv6Addresses": null, + "EndpointID": "febf33e9a0277267dae9c51c79c42e824dbb520c8fe0a471374398d6024788bb", + "Gateway": "172.17.0.1", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "IPAddress": "172.17.0.3", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "MacAddress": "02:42:ac:11:00:03", + "Networks": { + "bridge": { + "IPAMConfig": null, + "Links": null, + "Aliases": null, + "MacAddress": "02:42:ac:11:00:03", + "NetworkID": "f4d4e2fb72e14fd40db0f04cfe43e79b4afdd228a2593c24a0e36c832349ba48", + "EndpointID": "febf33e9a0277267dae9c51c79c42e824dbb520c8fe0a471374398d6024788bb", + "Gateway": "172.17.0.1", + "IPAddress": "172.17.0.3", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": null, + "DNSNames": null + }, + "kitestacks": { + "IPAMConfig": {}, + "Links": null, + "Aliases": [], + "MacAddress": "02:42:ac:12:00:0d", + "NetworkID": "72143bca8d6382130e8e1698bf60fb53ff93f944102372d2cc7dc8e32aee0758", + "EndpointID": "6c0340601e5b36aa8af525c8a8dd1048be951be5cec6f802273dd3d13f8e2470", + "Gateway": "172.18.0.1", + "IPAddress": "172.18.0.13", + "IPPrefixLen": 16, + "IPv6Gateway": "", + "GlobalIPv6Address": "", + "GlobalIPv6PrefixLen": 0, + "DriverOpts": {}, + "DNSNames": [ + "uptime-kuma", + "9a8ff52b78b4" + ] + } + } + } + } +] diff --git a/cloud-migration/inventory/docker-volumes.txt b/cloud-migration/inventory/docker-volumes.txt new file mode 100644 index 0000000..df5f460 --- /dev/null +++ b/cloud-migration/inventory/docker-volumes.txt @@ -0,0 +1,11 @@ +95f721b2e8b90b4e17a3675d4905837933bc366e12c15d16bce1bd9d166c43f0 +b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111 +b11ac7c9fe060195954a46980f7ed85da9a62fea48d7cca5990aa54ec3d4cd8a +b303d482950f666b37acae69c790f0f37e9d28735a4ea0b98a7961a8a400fa75 +kite-ai_open-webui +openproject_openproject_assets +openproject_openproject_db_data +openproject_openproject_logs +openproject_openproject_pgdata +portainer_data +uptime-kuma diff --git a/cloud-migration/inventory/host-etc-tar-warnings.txt b/cloud-migration/inventory/host-etc-tar-warnings.txt new file mode 100644 index 0000000..f862e0f --- /dev/null +++ b/cloud-migration/inventory/host-etc-tar-warnings.txt @@ -0,0 +1,2 @@ +tar: etc/systemd/system/k3s.service.env: Cannot open: Permission denied +tar: Exiting with failure status due to previous errors diff --git a/cloud-migration/inventory/ip-addr.txt b/cloud-migration/inventory/ip-addr.txt new file mode 100644 index 0000000..396df0c --- /dev/null +++ b/cloud-migration/inventory/ip-addr.txt @@ -0,0 +1,350 @@ +1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 + link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 + inet 127.0.0.1/8 scope host lo + valid_lft forever preferred_lft forever + inet6 ::1/128 scope host noprefixroute + valid_lft forever preferred_lft forever +2: enp0s31f6: mtu 1500 qdisc fq_codel state DOWN group default qlen 1000 + link/ether 54:05:db:c5:c4:4a brd ff:ff:ff:ff:ff:ff + altname enx5405dbc5c44a +3: wlp0s20f3: mtu 1500 qdisc noqueue state UP group default qlen 1000 + link/ether 8c:8d:28:c4:e1:9f brd ff:ff:ff:ff:ff:ff + altname wlx8c8d28c4e19f + inet 192.168.1.205/24 brd 192.168.1.255 scope global dynamic noprefixroute wlp0s20f3 + valid_lft 57571sec preferred_lft 57571sec + inet6 2600:1702:5730:50b0:af17:2be8:9ef7:f714/64 scope global temporary dynamic + valid_lft 3523sec preferred_lft 3523sec + inet6 2600:1702:5730:50b0::40/128 scope global dynamic noprefixroute + valid_lft 2878sec preferred_lft 2878sec + inet6 2600:1702:5730:50b0:9c92:ac42:9751:b5c0/64 scope global temporary deprecated dynamic + valid_lft 3523sec preferred_lft 0sec + inet6 2600:1702:5730:50b0:8e8d:28ff:fec4:e19f/64 scope global dynamic mngtmpaddr noprefixroute + valid_lft 3523sec preferred_lft 3523sec + inet6 fe80::8e8d:28ff:fec4:e19f/64 scope link noprefixroute + valid_lft forever preferred_lft forever +4: tailscale0: mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 500 + link/none + inet 100.90.13.55/32 scope global tailscale0 + valid_lft forever preferred_lft forever + inet6 fd7a:115c:a1e0::b139:d38/128 scope global + valid_lft forever preferred_lft forever + inet6 fe80::3a3d:6f43:b3d1:6e3a/64 scope link stable-privacy proto kernel_ll + valid_lft forever preferred_lft forever +5: br-5a4a35faa802: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:19:cd:38:a4 brd ff:ff:ff:ff:ff:ff + inet 192.168.160.1/20 brd 192.168.175.255 scope global br-5a4a35faa802 + valid_lft forever preferred_lft forever + inet6 fe80::42:19ff:fecd:38a4/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +6: br-9e267d3240c9: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:bc:f6:1a:bd brd ff:ff:ff:ff:ff:ff + inet 172.22.0.1/16 brd 172.22.255.255 scope global br-9e267d3240c9 + valid_lft forever preferred_lft forever + inet6 fe80::42:bcff:fef6:1abd/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +7: br-fa41b0d19f8e: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:56:3c:ac:24 brd ff:ff:ff:ff:ff:ff + inet 192.168.48.1/20 brd 192.168.63.255 scope global br-fa41b0d19f8e + valid_lft forever preferred_lft forever + inet6 fe80::42:56ff:fe3c:ac24/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +8: br-70ba1bd90717: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:ac:13:4a:a6 brd ff:ff:ff:ff:ff:ff + inet 172.26.0.1/16 brd 172.26.255.255 scope global br-70ba1bd90717 + valid_lft forever preferred_lft forever + inet6 fe80::42:acff:fe13:4aa6/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +9: br-72143bca8d63: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:91:a3:2d:1f brd ff:ff:ff:ff:ff:ff + inet 172.18.0.1/16 brd 172.18.255.255 scope global br-72143bca8d63 + valid_lft forever preferred_lft forever + inet6 fe80::42:91ff:fea3:2d1f/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +11: br-bffe9441e56d: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:66:ef:dd:4f brd ff:ff:ff:ff:ff:ff + inet 172.19.0.1/16 brd 172.19.255.255 scope global br-bffe9441e56d + valid_lft forever preferred_lft forever + inet6 fe80::42:66ff:feef:dd4f/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +12: br-2a6267f1d942: mtu 1500 qdisc noqueue state DOWN group default + link/ether 02:42:7b:5b:ed:9e brd ff:ff:ff:ff:ff:ff + inet 172.21.0.1/16 brd 172.21.255.255 scope global br-2a6267f1d942 + valid_lft forever preferred_lft forever + inet6 fe80::42:7bff:fe5b:ed9e/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +13: br-7530729ebfae: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:b7:e0:17:4f brd ff:ff:ff:ff:ff:ff + inet 192.168.32.1/20 brd 192.168.47.255 scope global br-7530729ebfae + valid_lft forever preferred_lft forever + inet6 fe80::42:b7ff:fee0:174f/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +14: br-a8e208276d2f: mtu 1500 qdisc noqueue state DOWN group default + link/ether 02:42:59:9f:c6:22 brd ff:ff:ff:ff:ff:ff + inet 172.20.0.1/16 brd 172.20.255.255 scope global br-a8e208276d2f + valid_lft forever preferred_lft forever +15: br-bb1a116b6f77: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:69:eb:0c:b9 brd ff:ff:ff:ff:ff:ff + inet 172.25.0.1/16 brd 172.25.255.255 scope global br-bb1a116b6f77 + valid_lft forever preferred_lft forever + inet6 fe80::42:69ff:feeb:cb9/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +17: docker0: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:37:8a:ab:2f brd ff:ff:ff:ff:ff:ff + inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 + valid_lft forever preferred_lft forever + inet6 fe80::42:37ff:fe8a:ab2f/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +18: br-be1a91b20dc8: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:cd:7e:51:db brd ff:ff:ff:ff:ff:ff + inet 172.29.0.1/16 brd 172.29.255.255 scope global br-be1a91b20dc8 + valid_lft forever preferred_lft forever + inet6 fe80::42:cdff:fe7e:51db/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +19: br-30777ab296b8: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:af:5f:6f:f2 brd ff:ff:ff:ff:ff:ff + inet 172.27.0.1/16 brd 172.27.255.255 scope global br-30777ab296b8 + valid_lft forever preferred_lft forever + inet6 fe80::42:afff:fe5f:6ff2/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +20: br-49d3d5da502c: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:9f:ae:96:94 brd ff:ff:ff:ff:ff:ff + inet 172.30.0.1/16 brd 172.30.255.255 scope global br-49d3d5da502c + valid_lft forever preferred_lft forever + inet6 fe80::42:9fff:feae:9694/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +24: vethf4816dc@if23: mtu 1500 qdisc noqueue master br-fa41b0d19f8e state UP group default + link/ether b6:a6:ed:49:bd:fe brd ff:ff:ff:ff:ff:ff link-netnsid 16 + inet6 fe80::b4a6:edff:fe49:bdfe/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +26: veth1987749@if25: mtu 1500 qdisc noqueue master br-9e267d3240c9 state UP group default + link/ether 36:c0:50:3d:b1:96 brd ff:ff:ff:ff:ff:ff link-netnsid 13 + inet6 fe80::34c0:50ff:fe3d:b196/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +30: veth85fe678@if29: mtu 1500 qdisc noqueue master br-30777ab296b8 state UP group default + link/ether 8a:f3:42:ef:e1:6b brd ff:ff:ff:ff:ff:ff link-netnsid 4 + inet6 fe80::88f3:42ff:feef:e16b/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +32: vethd5b37cc@if31: mtu 1500 qdisc noqueue master br-bffe9441e56d state UP group default + link/ether 3e:99:51:e7:ec:ef brd ff:ff:ff:ff:ff:ff link-netnsid 10 + inet6 fe80::3c99:51ff:fee7:ecef/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +34: vetha6e4b9a@if33: mtu 1500 qdisc noqueue master br-5a4a35faa802 state UP group default + link/ether ba:e5:82:e3:18:d4 brd ff:ff:ff:ff:ff:ff link-netnsid 21 + inet6 fe80::b8e5:82ff:fee3:18d4/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +36: veth58ed7ba@if35: mtu 1500 qdisc noqueue master docker0 state UP group default + link/ether 2a:09:5b:4b:75:ef brd ff:ff:ff:ff:ff:ff link-netnsid 0 + inet6 fe80::2809:5bff:fe4b:75ef/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +38: vethec42d32@if37: mtu 1500 qdisc noqueue master br-be1a91b20dc8 state UP group default + link/ether 3e:47:cf:ef:85:dd brd ff:ff:ff:ff:ff:ff link-netnsid 3 + inet6 fe80::3c47:cfff:feef:85dd/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +40: vethbfda3d6@if39: mtu 1500 qdisc noqueue master br-70ba1bd90717 state UP group default + link/ether 8e:b3:04:4c:20:24 brd ff:ff:ff:ff:ff:ff link-netnsid 9 + inet6 fe80::8cb3:4ff:fe4c:2024/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +42: veth3b113fe@if41: mtu 1500 qdisc noqueue master br-49d3d5da502c state UP group default + link/ether 02:10:8b:04:57:f2 brd ff:ff:ff:ff:ff:ff link-netnsid 1 + inet6 fe80::10:8bff:fe04:57f2/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +44: vethfaaa84d@if43: mtu 1500 qdisc noqueue master br-7530729ebfae state UP group default + link/ether 32:39:e5:7c:f2:c8 brd ff:ff:ff:ff:ff:ff link-netnsid 2 + inet6 fe80::3039:e5ff:fe7c:f2c8/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +46: veth34136f6@if45: mtu 1500 qdisc noqueue master br-49d3d5da502c state UP group default + link/ether 2e:db:db:40:b3:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 15 + inet6 fe80::2cdb:dbff:fe40:b3f3/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +48: vethd05d87a@if47: mtu 1500 qdisc noqueue master br-be1a91b20dc8 state UP group default + link/ether 4e:8c:a7:c5:c2:86 brd ff:ff:ff:ff:ff:ff link-netnsid 14 + inet6 fe80::4c8c:a7ff:fec5:c286/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +50: vethd0baa49@if49: mtu 1500 qdisc noqueue master docker0 state UP group default + link/ether 06:13:ff:e9:a6:60 brd ff:ff:ff:ff:ff:ff link-netnsid 19 + inet6 fe80::413:ffff:fee9:a660/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +52: vethdceb901@if51: mtu 1500 qdisc noqueue master br-be1a91b20dc8 state UP group default + link/ether 5e:4a:e7:57:f9:74 brd ff:ff:ff:ff:ff:ff link-netnsid 6 + inet6 fe80::5c4a:e7ff:fe57:f974/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +54: vethff5574b@if53: mtu 1500 qdisc noqueue master br-5a4a35faa802 state UP group default + link/ether 56:35:0f:70:e5:bf brd ff:ff:ff:ff:ff:ff link-netnsid 18 + inet6 fe80::5435:fff:fe70:e5bf/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +62: vethce624b6@if61: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether ce:38:5d:fb:bc:ce brd ff:ff:ff:ff:ff:ff link-netnsid 8 + inet6 fe80::cc38:5dff:fefb:bcce/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +66: vethe7b822b@if65: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 2a:eb:3b:03:d5:35 brd ff:ff:ff:ff:ff:ff link-netnsid 12 + inet6 fe80::28eb:3bff:fe03:d535/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +70: vethb0d7c1a@if69: mtu 1500 qdisc noqueue master br-bffe9441e56d state UP group default + link/ether 16:32:ce:d0:92:8d brd ff:ff:ff:ff:ff:ff link-netnsid 8 + inet6 fe80::1432:ceff:fed0:928d/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +72: vethdf62a27@if71: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether e2:f4:b0:c1:a2:49 brd ff:ff:ff:ff:ff:ff link-netnsid 10 + inet6 fe80::e0f4:b0ff:fec1:a249/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +74: vethb919b92@if73: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 62:7b:50:e0:bb:ea brd ff:ff:ff:ff:ff:ff link-netnsid 9 + inet6 fe80::607b:50ff:fee0:bbea/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +76: veth0737587@if75: mtu 1500 qdisc noqueue master br-be1a91b20dc8 state UP group default + link/ether ae:a1:02:ef:6e:09 brd ff:ff:ff:ff:ff:ff link-netnsid 12 + inet6 fe80::aca1:2ff:feef:6e09/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +78: veth8613011@if77: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 3a:54:4d:77:fa:63 brd ff:ff:ff:ff:ff:ff link-netnsid 13 + inet6 fe80::3854:4dff:fe77:fa63/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +80: veth6c24951@if79: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 9a:4e:c2:9d:5b:5d brd ff:ff:ff:ff:ff:ff link-netnsid 14 + inet6 fe80::984e:c2ff:fe9d:5b5d/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +82: veth621784b@if81: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 76:b9:09:4c:ea:5b brd ff:ff:ff:ff:ff:ff link-netnsid 15 + inet6 fe80::74b9:9ff:fe4c:ea5b/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +84: vethb8d844d@if83: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 26:5b:4a:c1:06:99 brd ff:ff:ff:ff:ff:ff link-netnsid 16 + inet6 fe80::245b:4aff:fec1:699/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +86: vethe73ee17@if85: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 32:3c:06:a1:7b:c3 brd ff:ff:ff:ff:ff:ff link-netnsid 21 + inet6 fe80::303c:6ff:fea1:7bc3/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +88: vetheb0e29b@if87: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 2a:ed:74:96:5b:5b brd ff:ff:ff:ff:ff:ff link-netnsid 19 + inet6 fe80::28ed:74ff:fe96:5b5b/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +90: veth5614959@if89: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 6e:ad:c1:cb:fd:62 brd ff:ff:ff:ff:ff:ff link-netnsid 18 + inet6 fe80::6cad:c1ff:fecb:fd62/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +95: flannel.1: mtu 1450 qdisc noqueue state UNKNOWN group default + link/ether 86:22:0a:4d:90:00 brd ff:ff:ff:ff:ff:ff + inet 10.42.0.0/32 scope global flannel.1 + valid_lft forever preferred_lft forever + inet6 fe80::8422:aff:fe4d:9000/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +96: cni0: mtu 1450 qdisc noqueue state UP group default qlen 1000 + link/ether 12:c6:0d:7d:dd:9c brd ff:ff:ff:ff:ff:ff + inet 10.42.0.1/24 brd 10.42.0.255 scope global cni0 + valid_lft forever preferred_lft forever + inet6 fe80::10c6:dff:fe7d:dd9c/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +97: veth445f8110@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether 4a:31:e4:e9:f7:a3 brd ff:ff:ff:ff:ff:ff link-netns cni-81ae1f26-1017-c5d6-4493-ed9bb16fb501 + inet6 fe80::4831:e4ff:fee9:f7a3/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +98: veth736cde43@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether 02:df:78:e8:c2:27 brd ff:ff:ff:ff:ff:ff link-netns cni-c2221a39-e9f7-e155-eeb0-39b9fd4c1d66 + inet6 fe80::df:78ff:fee8:c227/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +99: vethc04aa9e2@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether fa:33:2f:6a:c4:f2 brd ff:ff:ff:ff:ff:ff link-netns cni-6c852b61-9f8e-638e-1071-aef368406551 + inet6 fe80::f833:2fff:fe6a:c4f2/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +100: veth033b45e8@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether de:90:ff:6b:d3:94 brd ff:ff:ff:ff:ff:ff link-netns cni-e2f9d769-bab1-5b91-4110-f56e53d38d37 + inet6 fe80::dc90:ffff:fe6b:d394/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +101: veth4ad49488@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether 56:33:f1:1d:fd:48 brd ff:ff:ff:ff:ff:ff link-netns cni-39c366c4-cbab-952a-bb8b-b611d518dab2 + inet6 fe80::5433:f1ff:fe1d:fd48/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +102: vethbf1d0e0b@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether ae:05:8b:90:7d:d7 brd ff:ff:ff:ff:ff:ff link-netns cni-1f683513-3a91-70e3-87a9-c4292acaedb9 + inet6 fe80::ac05:8bff:fe90:7dd7/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +103: vethbdf19ef0@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether 26:07:7e:9c:d3:77 brd ff:ff:ff:ff:ff:ff link-netns cni-a42e0f60-d58d-f377-8811-001b64d3726d + inet6 fe80::2407:7eff:fe9c:d377/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +105: veth7feaf739@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether 26:7d:bc:ba:a8:ca brd ff:ff:ff:ff:ff:ff link-netns cni-41f4ceb5-6cb8-8f92-953b-95864e9e7cf1 + inet6 fe80::247d:bcff:feba:a8ca/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +106: veth0d598c9d@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether be:31:2d:cb:aa:84 brd ff:ff:ff:ff:ff:ff link-netns cni-ec30b8aa-5ede-4f67-9c31-77aebc74579c + inet6 fe80::bc31:2dff:fecb:aa84/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +108: veth612e159c@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether 6e:ec:c7:4c:0d:e3 brd ff:ff:ff:ff:ff:ff link-netns cni-0ec5bdaa-3575-8063-bb3b-08ac819b3189 + inet6 fe80::6cec:c7ff:fe4c:de3/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +109: veth93eeb514@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether 4e:79:3f:e1:81:48 brd ff:ff:ff:ff:ff:ff link-netns cni-cb3547f5-7c92-bb53-0589-3f4e3d74bd27 + inet6 fe80::4c79:3fff:fee1:8148/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +110: veth1bd4228f@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether 1a:29:c8:84:d9:c5 brd ff:ff:ff:ff:ff:ff link-netns cni-ff5b8f46-6411-8fd9-b1e6-512e439595df + inet6 fe80::1829:c8ff:fe84:d9c5/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +111: veth18e1f9d7@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether b2:d2:3c:7f:a8:8c brd ff:ff:ff:ff:ff:ff link-netns cni-279ef32e-3c53-9c4f-519d-47333ad178fc + inet6 fe80::b0d2:3cff:fe7f:a88c/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +572: br-2c51db061b99: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:9e:6a:3e:9b brd ff:ff:ff:ff:ff:ff + inet 172.24.0.1/16 brd 172.24.255.255 scope global br-2c51db061b99 + valid_lft forever preferred_lft forever + inet6 fe80::42:9eff:fe6a:3e9b/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +574: vethdb48521@if573: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 36:6b:7a:5b:6f:ad brd ff:ff:ff:ff:ff:ff link-netnsid 5 + inet6 fe80::346b:7aff:fe5b:6fad/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +576: vethdb77b7c@if575: mtu 1500 qdisc noqueue master br-2c51db061b99 state UP group default + link/ether 9e:93:de:92:ff:8b brd ff:ff:ff:ff:ff:ff link-netnsid 5 + inet6 fe80::9c93:deff:fe92:ff8b/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +636: veth77e5e8e@if635: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 76:bd:07:8c:8d:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 11 + inet6 fe80::74bd:7ff:fe8c:8df1/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +638: veth01be747@if637: mtu 1500 qdisc noqueue master br-bb1a116b6f77 state UP group default + link/ether 12:3c:22:cc:04:d7 brd ff:ff:ff:ff:ff:ff link-netnsid 11 + inet6 fe80::103c:22ff:fecc:4d7/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1100: br-fefc2ce50c94: mtu 1500 qdisc noqueue state UP group default + link/ether 02:42:03:65:11:bf brd ff:ff:ff:ff:ff:ff + inet 172.28.0.1/16 brd 172.28.255.255 scope global br-fefc2ce50c94 + valid_lft forever preferred_lft forever + inet6 fe80::42:3ff:fe65:11bf/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1102: veth5d48e8b@if1101: mtu 1500 qdisc noqueue master br-fefc2ce50c94 state UP group default + link/ether 2e:36:d3:de:71:70 brd ff:ff:ff:ff:ff:ff link-netnsid 32 + inet6 fe80::2c36:d3ff:fede:7170/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1106: veth813ef74@if1105: mtu 1500 qdisc noqueue master br-fefc2ce50c94 state UP group default + link/ether ca:bd:7b:23:ee:7d brd ff:ff:ff:ff:ff:ff link-netnsid 29 + inet6 fe80::c8bd:7bff:fe23:ee7d/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1160: vethe7aa1c2@if1159: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether 46:c8:27:6d:21:aa brd ff:ff:ff:ff:ff:ff link-netnsid 7 + inet6 fe80::44c8:27ff:fe6d:21aa/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1162: veth5b67937@if1161: mtu 1500 qdisc noqueue master br-fefc2ce50c94 state UP group default + link/ether 02:4a:ca:26:ff:10 brd ff:ff:ff:ff:ff:ff link-netnsid 7 + inet6 fe80::4a:caff:fe26:ff10/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1208: veth3c71fd4@if1207: mtu 1500 qdisc noqueue master docker0 state UP group default + link/ether b6:43:00:76:43:22 brd ff:ff:ff:ff:ff:ff link-netnsid 17 + inet6 fe80::b443:ff:fe76:4322/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1210: veth8f5c212@if1209: mtu 1500 qdisc noqueue master br-72143bca8d63 state UP group default + link/ether f6:b0:30:80:4e:52 brd ff:ff:ff:ff:ff:ff link-netnsid 17 + inet6 fe80::f4b0:30ff:fe80:4e52/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1215: veth2cd00be8@if2: mtu 1450 qdisc noqueue master cni0 state UP group default + link/ether de:83:da:54:0d:ad brd ff:ff:ff:ff:ff:ff link-netns cni-0b8ed978-d1dc-2353-3e39-95be7b63e661 + inet6 fe80::dc83:daff:fe54:dad/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever +1225: veth0e83a05@if1224: mtu 1500 qdisc noqueue master docker0 state UP group default + link/ether 6e:ce:17:da:09:69 brd ff:ff:ff:ff:ff:ff link-netnsid 20 + inet6 fe80::6cce:17ff:feda:969/64 scope link proto kernel_ll + valid_lft forever preferred_lft forever diff --git a/cloud-migration/inventory/kitestacks-scripts-tar-warnings.txt b/cloud-migration/inventory/kitestacks-scripts-tar-warnings.txt new file mode 100644 index 0000000..e69de29 diff --git a/cloud-migration/inventory/uname.txt b/cloud-migration/inventory/uname.txt new file mode 100644 index 0000000..3c9a640 --- /dev/null +++ b/cloud-migration/inventory/uname.txt @@ -0,0 +1 @@ +Linux Assassin 6.12.90+deb13.1-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.12.90-2 (2026-05-27) x86_64 GNU/Linux diff --git a/cloud-migration/restore/RESTORE.md b/cloud-migration/restore/RESTORE.md new file mode 100644 index 0000000..3417d26 --- /dev/null +++ b/cloud-migration/restore/RESTORE.md @@ -0,0 +1,77 @@ +# Restore Outline + +This is the high-level restore path for a new Hetzner Cloud host. + +## 1. Prepare Host + +Install Docker and Docker Compose plugin. + +```bash +sudo apt update +sudo apt install -y docker.io docker-compose-plugin git tar gzip +sudo usermod -aG docker "$USER" +``` + +Log out and back in after adding the Docker group. + +## 2. Clone Backup + +```bash +git clone https://gitforge.kitestacks.com/kenpat/kitestacks-cloud.git +cd kitestacks-cloud +sha256sum -c SHA256SUMS +``` + +## 3. Restore Bind-Mounted Data + +```bash +mkdir -p /home/kenpat +tar -xzf archives/docker-bind-data.tar.gz -C /home/kenpat +tar -xzf archives/syncthing-shared.tar.gz -C /home/kenpat +tar -xzf archives/kitestacks-scripts.tar.gz -C /home/kenpat +``` + +## 4. Restore Named Docker Volumes + +Create the external network used by the stack: + +```bash +docker network create kitestacks +``` + +For each file in `volume-exports`, create and restore the volume: + +```bash +for archive in volume-exports/*.tar.gz; do + volume="$(basename "$archive" .tar.gz)" + docker volume create "$volume" + docker run --rm \ + -v "$volume:/volume" \ + -v "$PWD/volume-exports:/backup:ro" \ + alpine \ + sh -c "tar -xzf /backup/$volume.tar.gz -C /volume" +done +``` + +## 5. Start Services + +Start core services in dependency order. Example: + +```bash +cd /home/kenpat/docker/authentik && docker compose up -d +cd /home/kenpat/docker/forgejo && docker compose up -d +cd /home/kenpat/docker/cloudflared && docker compose up -d +``` + +Then start the remaining service folders under `/home/kenpat/docker`. + +## 6. DNS and Tunnel Cutover + +Review: + +- `inventory/docker-running.txt` +- `inventory/docker-networks.txt` +- `/home/kenpat/docker/cloudflared/docker-compose.yml` +- Cloudflare tunnel credentials under the restored cloudflared folder + +Move DNS/tunnel targets to the Hetzner host after services are healthy. diff --git a/cloud-migration/volume-exports/95f721b2e8b90b4e17a3675d4905837933bc366e12c15d16bce1bd9d166c43f0.tar.gz b/cloud-migration/volume-exports/95f721b2e8b90b4e17a3675d4905837933bc366e12c15d16bce1bd9d166c43f0.tar.gz new file mode 100644 index 0000000..45af49c --- /dev/null +++ b/cloud-migration/volume-exports/95f721b2e8b90b4e17a3675d4905837933bc366e12c15d16bce1bd9d166c43f0.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a5392e54eed3edb677ad52f419a27b1c1de387d3c1c512585c09cbd399ab08b +size 3122 diff --git a/cloud-migration/volume-exports/b11ac7c9fe060195954a46980f7ed85da9a62fea48d7cca5990aa54ec3d4cd8a.tar.gz b/cloud-migration/volume-exports/b11ac7c9fe060195954a46980f7ed85da9a62fea48d7cca5990aa54ec3d4cd8a.tar.gz new file mode 100644 index 0000000..a2eef19 --- /dev/null +++ b/cloud-migration/volume-exports/b11ac7c9fe060195954a46980f7ed85da9a62fea48d7cca5990aa54ec3d4cd8a.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d37a2b35bd294d36aa0c3f96e477ee0203bc491f66d6d3cf122c81c29ba4b2c5 +size 658 diff --git a/cloud-migration/volume-exports/b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111.tar.gz b/cloud-migration/volume-exports/b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111.tar.gz new file mode 100644 index 0000000..7e455f0 --- /dev/null +++ b/cloud-migration/volume-exports/b1a99e9e271f6dbb1e693aabd2508fbae9973a82c5c1778fdad099054754f111.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:668ae10a5bb4a44864b788063610b43def6fdad2964181b5838e50388d8b4fbf +size 34394780 diff --git a/cloud-migration/volume-exports/b303d482950f666b37acae69c790f0f37e9d28735a4ea0b98a7961a8a400fa75.tar.gz b/cloud-migration/volume-exports/b303d482950f666b37acae69c790f0f37e9d28735a4ea0b98a7961a8a400fa75.tar.gz new file mode 100644 index 0000000..74755d3 --- /dev/null +++ b/cloud-migration/volume-exports/b303d482950f666b37acae69c790f0f37e9d28735a4ea0b98a7961a8a400fa75.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44730b582fe275ae4a5daa7a03b5ae6ba77d55022df5b41e1183475d7a6e29fb +size 896275 diff --git a/cloud-migration/volume-exports/kite-ai_open-webui.tar.gz b/cloud-migration/volume-exports/kite-ai_open-webui.tar.gz new file mode 100644 index 0000000..fe1d695 --- /dev/null +++ b/cloud-migration/volume-exports/kite-ai_open-webui.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c492df2ba24d0f77ac6b9684de110a2cc96a843f6b1b4422473af6361407c68b +size 1009893971 diff --git a/cloud-migration/volume-exports/openproject_openproject_assets.tar.gz b/cloud-migration/volume-exports/openproject_openproject_assets.tar.gz new file mode 100644 index 0000000..06f3109 --- /dev/null +++ b/cloud-migration/volume-exports/openproject_openproject_assets.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b6410c6b71cd1f96157f3780de604a9c453abc2e5e23f4e5b2950f87098446e +size 896290 diff --git a/cloud-migration/volume-exports/openproject_openproject_db_data.tar.gz b/cloud-migration/volume-exports/openproject_openproject_db_data.tar.gz new file mode 100644 index 0000000..da2ed44 --- /dev/null +++ b/cloud-migration/volume-exports/openproject_openproject_db_data.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bae148a7b41896039d6cab807d27860b2d8d7333b03f79a6c16f7770179e4a6e +size 12098987 diff --git a/cloud-migration/volume-exports/openproject_openproject_logs.tar.gz b/cloud-migration/volume-exports/openproject_openproject_logs.tar.gz new file mode 100644 index 0000000..e5c1626 --- /dev/null +++ b/cloud-migration/volume-exports/openproject_openproject_logs.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba708e82a287f5c16f53afc1a885ca9837c0dfc44f92ab5ae2691090222dfdf1 +size 87 diff --git a/cloud-migration/volume-exports/openproject_openproject_pgdata.tar.gz b/cloud-migration/volume-exports/openproject_openproject_pgdata.tar.gz new file mode 100644 index 0000000..a64b787 --- /dev/null +++ b/cloud-migration/volume-exports/openproject_openproject_pgdata.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae85ee17213163cbea636c5270a0a9152361ba2e26bb0781d0274fe9c6379b4f +size 12085557 diff --git a/cloud-migration/volume-exports/portainer_data.tar.gz b/cloud-migration/volume-exports/portainer_data.tar.gz new file mode 100644 index 0000000..2a9eebd --- /dev/null +++ b/cloud-migration/volume-exports/portainer_data.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d7039b4dd710016ba2a447cb4ae82b24778544f6bdbd8fff07dc6ba87e5377c +size 110345 diff --git a/cloud-migration/volume-exports/uptime-kuma.tar.gz b/cloud-migration/volume-exports/uptime-kuma.tar.gz new file mode 100644 index 0000000..c4e88e4 --- /dev/null +++ b/cloud-migration/volume-exports/uptime-kuma.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a6fa0fea172711ef20d9ac4bd8362c2a9544f93c5dd435c62abfc7cfe18b88bd +size 1262681 diff --git a/cloud/README.md b/cloud/README.md new file mode 100644 index 0000000..22612a8 --- /dev/null +++ b/cloud/README.md @@ -0,0 +1,5 @@ +# KiteStacks Cloud + +This folder is reserved for cloud-specific configurations. + +For the main homelab setup, see the root of this repository. diff --git a/osticket/CHANGELOG.md b/osticket/CHANGELOG.md new file mode 100644 index 0000000..62c4337 --- /dev/null +++ b/osticket/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +This file explains what changed in simple words. + +## 2026-06-08 +- Started Phase 1: OSTicketSystem. +- Created separate files for runbook, debug notes, and change history. diff --git a/osticket/DEBUG-DOCUMENTATION.md b/osticket/DEBUG-DOCUMENTATION.md new file mode 100644 index 0000000..c019994 --- /dev/null +++ b/osticket/DEBUG-DOCUMENTATION.md @@ -0,0 +1,3 @@ +# Debug Documentation + +This file is for errors, fixes, broken commands, and troubleshooting notes. diff --git a/osticket/README.md b/osticket/README.md new file mode 100644 index 0000000..ad92fd8 --- /dev/null +++ b/osticket/README.md @@ -0,0 +1,5 @@ +# OSTicketSystem + +This is Phase 1 of the training project. + +Goal: Build a custom ticket system where classmates can log in, claim tickets, complete tasks, and close tickets. diff --git a/osticket/RUNBOOK.md b/osticket/RUNBOOK.md new file mode 100644 index 0000000..3560595 --- /dev/null +++ b/osticket/RUNBOOK.md @@ -0,0 +1,5 @@ +# OSTicketSystem Runbook + +This file explains how to build and use the project from start to finish. + +No debugging notes go here.