From b89a31a0682b0321412f56d67da33416471ce04f Mon Sep 17 00:00:00 2001 From: kodi Date: Wed, 25 Feb 2026 13:16:53 +0100 Subject: [PATCH] feat(api): Codex: add /health endpoint with podman + systemd checks --- AGENTS.md | 173 ++++++++++++++++++++++++++++++++++++++ CODEOWNERS | 10 +++ PR_RULES.md | 51 +++++++++++ SAFE_FILES.md | 87 +++++++++++++++++++ contracts/API_GOLDEN.md | 181 ++++++++++++++++++++++++++++++++++++++++ control/app.py | 30 +++++++ st.txt | 4 + 7 files changed, 536 insertions(+) create mode 100644 AGENTS.md create mode 100644 CODEOWNERS create mode 100644 PR_RULES.md create mode 100644 SAFE_FILES.md create mode 100644 contracts/API_GOLDEN.md create mode 100644 st.txt diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..7016c01 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,173 @@ +# AGENTS.md — podman-mvp (WebUI + API) + +## Goal +Primary goal: extend functionality and evolve the platform. + +Feature development is the default workflow. + +Refactoring is allowed when: +- it improves maintainability, OR +- it is required to implement a feature. + +Refactoring must always: +- be proposed first, +- remain backward compatible, +- not change existing behaviour or API contracts without agreement. + +--- + +## Repository structure + +Backend (FastAPI) +- control/app.py (main API) +- control/app_images.py + +WebUI (static Apache) +- webui/html/index.html +- webui/html/assets/js/tabs/ +- webui/conf/httpd.conf + +--- + +## Runtime architecture (IMPORTANT) + +Application runs inside a Podman pod. + +Pod created with: + +podman pod create \ + --name mvp-pod \ + -p 8080:8000 \ + -p 8081:8081 \ + --userns=keep-id + + +### Backend container + +Runs FastAPI control API with Podman access. + +Created with: + +podman run -d --pod mvp-pod \ + --name mvp-backend \ + --ipc=host \ + --pid=host \ + -e XDG_RUNTIME_DIR=/run/user/1000 \ + -e DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus \ + -v /run/user/1000:/run/user/1000:rw \ + -v /run/user/1000/podman/podman.sock:/run/user/1000/podman/podman.sock:rw \ + -v /home/kodi/.config/containers:/app/workloads:rw \ + mvp-control:latest + + +Important notes: +- Backend communicates with Podman through unix socket. +- User-session Podman is used (not root). +- DBus access is required. +- Host PID/IPC namespaces are intentional. + +Do NOT change these assumptions without proposal. + +--- + +### WebUI container + +Static Apache frontend. + +podman run -d --pod mvp-pod \ + --name mvp-webui \ + -v $HOME/.config/podman-mvp/webui/html:/usr/local/apache2/htdocs:ro \ + -v $HOME/.config/podman-mvp/webui/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf:ro \ + docker.io/library/httpd:2.4 + +Frontend is static JS calling API through proxy. + +--- + +## Access + +WebUI: +http://127.0.0.1:8081/ + +API (via proxy): +http://127.0.0.1:8081/api/ + +--- + +## Testing workflow (REQUIRED) + +Always validate changes using curl. + +Example: + +curl -s http://127.0.0.1:8081/api/... + +Before proposing implementation: +1. Analyse existing endpoints. +2. Confirm available data using curl tests. +3. Propose minimal change. +4. Provide verification curl commands. + +--- + +## Contract rules (HARD) + +- Never break existing API responses. +- Never rename or remove JSON keys. +- Maintain backward compatibility. + +New functionality must be added via: +- new endpoints, OR +- optional response fields. + +Security rules: +- No shell=True +- subprocess must be explicit and safe +- Respect allowed_units.txt +- Never assume systemd states. + +--- + +## Change policy + +Preferred workflow: + +1. Analyse existing behaviour. +2. Propose small implementation plan. +3. Identify affected files. +4. Provide curl validation tests. +5. Implement after agreement. + +Avoid: +- large rewrites +- structural changes without need +- hidden refactors. +All significant changes must follow PR_RULES.md workflow. +--- + +## UI direction + +Target style: +Portainer-like dashboard UI. + +Guidelines: +- tables and overview panels +- container status badges +- row-level actions +- minimalistic professional layout + +Do NOT introduce large frontend frameworks without agreement. + +--- + +## Coding style + +Follow existing structure and conventions of each file. + +Do not reformat unrelated code. + +Minimize diff size whenever possible. + +## Safety boundaries + +Follow SAFE_FILES.md before modifying infrastructure or core files. diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 0000000..52603f7 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,10 @@ +# Core runtime / infra: altijd extra voorzichtig +^control/Dockerfile$ @kodi +^webui/conf/httpd\.conf$ @kodi + +# Core API files +^control/app\.py$ @kodi +^control/app_images\.py$ @kodi + +# Frontend entry +^webui/html/index\.html$ @kodi diff --git a/PR_RULES.md b/PR_RULES.md new file mode 100644 index 0000000..e286eb0 --- /dev/null +++ b/PR_RULES.md @@ -0,0 +1,51 @@ +# Change / PR Rules — podman-mvp + +All non-trivial changes must follow this workflow. + +## Step 1 — Scope +Describe: + +- What feature is added or improved +- Which files are touched + +## Step 2 — Contract safety check + +Must remain TRUE: + +- Existing API responses unchanged +- No JSON keys removed or renamed +- Backward compatibility maintained +- allowed_units.txt respected + +If not certain → STOP and propose first. + +## Step 3 — Runtime safety + +Do NOT change without agreement: + +- Pod structure +- Podman socket mounts +- DBus configuration +- host PID/IPC usage + +## Step 4 — Verification (required) + +Provide curl validation commands. + +Example: + +curl -s http://127.0.0.1:8081/api/... + +Explain what should change in output. + +## Step 5 — Refactoring + +Allowed only when: + +- required for feature OR +- clearly improves maintainability + +Refactor must: +- keep behaviour identical +- minimize diff size +- be proposed first. diff --git a/SAFE_FILES.md b/SAFE_FILES.md new file mode 100644 index 0000000..2454a4b --- /dev/null +++ b/SAFE_FILES.md @@ -0,0 +1,87 @@ +# SAFE FILES — podman-mvp + +These files and runtime assumptions are considered infrastructure-critical. + +Changes are NOT forbidden, but must ALWAYS be proposed first +and explicitly approved before implementation. + +--- + +## Runtime architecture (critical) + +Do not change without agreement: + +- Pod name: mvp-pod +- Port mappings: + - 8080 → backend + - 8081 → webui proxy +- userns=keep-id + +Backend runtime assumptions: + +- DBUS_SESSION_BUS_ADDRESS usage +- XDG_RUNTIME_DIR mounts +- Podman unix socket access +- /run/user/1000 mounts +- host PID namespace +- host IPC namespace + +Reason: +Backend communicates with user-session Podman and systemd. + +--- + +## Infrastructure sensitive files + +High risk files: + +control/Dockerfile +webui/conf/httpd.conf + +Changes must be proposed first. + +--- + +## Core API stability + +Files requiring caution: + +control/app.py +control/app_images.py + +Rules: +- Never rewrite structure without agreement. +- Extend endpoints instead of replacing logic. + +--- + +## Frontend stability + +Files: + +webui/html/index.html + +Avoid: +- framework migrations +- large UI rewrites + +Prefer incremental improvements. + +--- + +## Allowed improvements + +Safe changes include: + +- new API endpoints +- optional JSON response fields +- new UI tabs +- bug fixes +- performance improvements + +--- + +## Goal + +System stability has priority over architectural perfection. +Prefer minimal and predictable changes. diff --git a/contracts/API_GOLDEN.md b/contracts/API_GOLDEN.md new file mode 100644 index 0000000..46d6700 --- /dev/null +++ b/contracts/API_GOLDEN.md @@ -0,0 +1,181 @@ +# API_GOLDEN.md — podman-mvp + +Purpose: +Freeze existing API response contracts used by the WebUI. +Existing response structures MUST remain backward compatible. + +Rules: +- Existing JSON keys MUST NOT be removed. +- Existing JSON keys MUST NOT be renamed. +- Data types of listed keys MUST NOT change. +- New optional fields are allowed. +- New endpoints are allowed. +- Podman passthrough responses must remain raw Podman responses. + +API accessed via proxy: +http://127.0.0.1:8081/api + + +================================================== +GET /api/containers-dashboard +================================================== + +Curl: +curl -s http://127.0.0.1:8081/api/containers-dashboard + +Response type: +Array of container objects. + +Golden keys per item: +- Names +- Image +- State +- Status +- Ports +- PodName +- _dashboard_source +- _dashboard_published_ports +- _dashboard_unit +- _dashboard_def_path + +Golden example: +[ + { + "Names": ["mvp-webui"], + "Image": "docker.io/library/httpd:2.4", + "State": "running", + "Status": "", + "Ports": [], + "PodName": "mvp-pod", + "_dashboard_source": "podman", + "_dashboard_published_ports": [ + "8080:8000/tcp", + "8081:8081/tcp" + ], + "_dashboard_unit": null, + "_dashboard_def_path": null + } +] + + +================================================== +GET /api/pods-dashboard +================================================== + +Curl: +curl -s http://127.0.0.1:8081/api/pods-dashboard + +Response type: +Array of pod dashboard objects. + +Golden keys per item: +- Name +- Status +- Containers +- Unit +- Source + +Golden example: +[ + { + "Name": "mvp-pod", + "Status": "Running", + "Containers": [ + "mvp-backend", + "mvp-webui" + ], + "Unit": "pod-mvp-pod.service", + "Source": "podman" + } +] + + +================================================== +GET /api/images +================================================== + +Curl: +curl -s http://127.0.0.1:8081/api/images + +Response type: +Array of Podman image objects. + +Golden keys per item: +- RepoTags +- RepoDigests +- Created +- Size +- Containers +- Digest +- Arch +- Os + +Golden example: +[ + { + "RepoTags": [ + "docker.io/library/httpd:2.4" + ], + "RepoDigests": [ + "docker.io/library/httpd@sha256:..." + ], + "Created": 1770085385, + "Size": 120210217, + "Containers": 1, + "Digest": "sha256:...", + "Arch": "amd64", + "Os": "linux" + } +] + + +================================================== +GET /api/networks/meta +================================================== + +Curl: +curl -s http://127.0.0.1:8081/api/networks/meta + +Golden keys: +- networkBackend +- rootless +- infoEndpoint + +Golden example: +{ + "networkBackend": "netavark", + "rootless": true, + "infoEndpoint": "http+unix://%2Frun%2Fuser%2F1000%2Fpodman%2Fpodman.sock/v5.4.2/libpod/info" +} + + +================================================== +GET /api/openapi.json +================================================== + +Curl: +curl -s http://127.0.0.1:8081/api/openapi.json + +Contract: +OpenAPI schema must remain available for tooling and inspection. + +Required top-level keys: +- openapi +- info +- paths + + +================================================== +GENERAL BACKWARD COMPATIBILITY RULE +================================================== + +The following dashboard endpoints are considered UI-critical: + +- /containers-dashboard +- /pods-dashboard +- /images +- /networks/meta + +Changes affecting these endpoints must be proposed before implementation. + +System stability has priority over structural refactoring. diff --git a/control/app.py b/control/app.py index e8d35c6..13130a7 100644 --- a/control/app.py +++ b/control/app.py @@ -52,6 +52,36 @@ def _run_systemctl_action(action: str, unit: str): cmd = ["systemctl", "--user", action, unit] return _systemctl(cmd) +@app.get("/health") +def health(): + podman_ok = False + try: + r = SESSION.get(f"{PODMAN_API_BASE}/libpod/info", timeout=2) + if r.status_code == 200: + try: + r.json() + podman_ok = True + except Exception: + podman_ok = False + except Exception: + podman_ok = False + + systemd_reachable = False + try: + res = subprocess.run( + ["systemctl", "--user", "list-units", "--no-pager", "--no-legend"], + capture_output=True, + text=True, + check=False, + timeout=2, + ) + systemd_reachable = (res.returncode == 0) + except Exception: + systemd_reachable = False + + ok = podman_ok and systemd_reachable + return {"ok": ok, "podman": {"ok": podman_ok}, "systemd_user": {"reachable": systemd_reachable}} + # --- MODELS --- class FileContent(BaseModel): diff --git a/st.txt b/st.txt new file mode 100644 index 0000000..11cf755 --- /dev/null +++ b/st.txt @@ -0,0 +1,4 @@ +kodi@kodidebian:~/.config/podman-mvp$ curl -fsS http://127.0.0.1:8081/api/pods-dashboard | head +[{"Name":"mvp-pod","Status":"Running","Containers":["5718096812b9-infra","mvp-webui","mvp-backend"],"Unit":"mvp-pod.service","Source":"podman"},{"Name":"podmediaserver","Status":"Running","Containers":["01a7e1679c49-infra","podmediaserver-vpn-gateway","podmediaserver-flaresolverr","podmediaserver-jackett","podmediaserver-qbittorrent"],"Unit":"mediaserver.service","Source":"podman"}]kodi@kodidebian:~/.config/podman-mvp$ curl -fsS http://127.0.0.1:8081/api/containers-dashboard | head curl -fsS http://127.0.0.1:8081/api/containers-dashboard | head +[{"AutoRemove":false,"Command":null,"Created":"2026-02-16T08:03:22.712258827+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":1771239786,"ExitCode":0,"ExposedPorts":null,"Id":"1bed73604cbc9075edfada1cc6c053a307929a1b58d09763627ccc38095a9c77","Image":"localhost/podman-pause:5.4.2-1766335321","ImageID":"dfd874f5c4086c63645acc7985de67de4ddd2ea18ca921dc0b52a49b10fdcccd","IsInfra":true,"Labels":{"io.buildah.version":"1.39.3"},"Mounts":[],"Names":["5718096812b9-infra"],"Namespaces":{},"Networks":[],"Pid":2537,"Pod":"5718096812b9ed6d4f19c9bd44d691ec8bd634f6af81b6574eb56c3a1811898d","PodName":"mvp-pod","Ports":[{"host_ip":"","container_port":8000,"host_port":8080,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":8081,"host_port":8081,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771239953,"State":"running","Status":"","_dashboard_published_ports":["8080:8000/tcp","8081:8081/tcp"],"_dashboard_source":"podman"},{"AutoRemove":false,"Command":["httpd-foreground"],"Created":"2026-02-16T08:06:18.590667394+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":1771872671,"ExitCode":0,"ExposedPorts":{"80":["tcp"]},"Id":"5b2987b7dfe7f93609cc8b3c5ff9f98b6bc68669eb4bc233ee6f01cc7bf1b524","Image":"docker.io/library/httpd:2.4","ImageID":"d2825031e94c68c5437ae2f479a1e2e1b2e0a26990c506e17deee19590546735","IsInfra":false,"Labels":null,"Mounts":["/usr/local/apache2/htdocs","/usr/local/apache2/conf/httpd.conf"],"Names":["mvp-webui"],"Namespaces":{},"Networks":[],"Pid":1601718,"Pod":"5718096812b9ed6d4f19c9bd44d691ec8bd634f6af81b6574eb56c3a1811898d","PodName":"mvp-pod","Ports":[{"host_ip":"","container_port":8000,"host_port":8080,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":8081,"host_port":8081,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771872671,"State":"running","Status":"","_dashboard_published_ports":["8080:8000/tcp","8081:8081/tcp"],"_dashboard_source":"podman"},{"AutoRemove":true,"Command":["postgres"],"Created":"2026-02-16T15:40:48.196527585+01:00","CreatedAt":"","CIDFile":"/run/user/1000/postgres-db.cid","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"5432":["tcp"]},"Id":"3bcb2930996214a51f757e8f01faa056bbd58f83e790169e57e212e19e12ad81","Image":"docker.io/library/postgres:16","ImageID":"b8c80b87c813a2ee26748ce49686844942f297bcc19b6cca3d49cd2fe0a87808","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"postgres-db.service"},"Mounts":["/docker-entrypoint-initdb.d","/var/lib/postgresql/data"],"Names":["postgres-db"],"Namespaces":{},"Networks":["pgnet"],"Pid":30257,"Pod":"","PodName":"","Ports":[{"host_ip":"127.0.0.1","container_port":5432,"host_port":5432,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771252848,"State":"running","Status":"","_dashboard_published_ports":["127.0.0.1:5432:5432/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"postgres-db.service","_dashboard_def_path":"systemd/postgresqlserver/postgres-db.container"},{"AutoRemove":true,"Command":null,"Created":"2026-02-16T15:42:01.822664418+01:00","CreatedAt":"","CIDFile":"/run/user/1000/n8n.cid","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"5678":["tcp"]},"Id":"7c8c8e76a2a2b0961414dba19943b910735af2fa1e3495c98feed475ec2eb254","Image":"docker.n8n.io/n8nio/n8n:latest","ImageID":"e78f4103dee6428d15be5c04659035953306d86dc6d5710d1aa4f62a97caff3a","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"n8n.service","com.docker.dhi.chain-id":"sha256:ee90d364f250e6b715b0b7b88e67b19a76c7adabad9e253bad24ed1ed473b61f","com.docker.dhi.compliance":"cis","com.docker.dhi.created":"2026-01-23T15:43:22Z","com.docker.dhi.date.end-of-life":"2027-04-30","com.docker.dhi.date.release":"2024-04-24","com.docker.dhi.definition":"image/node/alpine-3.22/22-dev","com.docker.dhi.distro":"alpine-3.22","com.docker.dhi.flavor":"","com.docker.dhi.name":"dhi/node","com.docker.dhi.package-manager":"apk","com.docker.dhi.shell":"busybox","com.docker.dhi.title":"Node.js 22.x (dev)","com.docker.dhi.url":"https://dhi.io/catalog/node","com.docker.dhi.variant":"dev","com.docker.dhi.version":"22.22.0-alpine3.22-dev","org.opencontainers.image.description":"Workflow Automation Tool","org.opencontainers.image.source":"https://github.com/n8n-io/n8n","org.opencontainers.image.title":"n8n","org.opencontainers.image.url":"https://n8n.io","org.opencontainers.image.version":"2.7.5"},"Mounts":["/home/node/.n8n"],"Names":["n8n"],"Namespaces":{},"Networks":["pgnet","playwright"],"Pid":30499,"Pod":"","PodName":"","Ports":[{"host_ip":"","container_port":5678,"host_port":5678,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771252921,"State":"running","Status":"","_dashboard_published_ports":["5678:5678/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"n8n.service","_dashboard_def_path":"systemd/n8n/n8n.container"},{"AutoRemove":true,"Command":["/usr/bin/s6-svscan","/etc/s6"],"Created":"2026-02-18T07:46:05.670045977+01:00","CreatedAt":"","CIDFile":"/run/user/1000/gitea.cid","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"22":["tcp"],"3000":["tcp"]},"Id":"3cd843d1973d3516aa1c904194074a1539aa58abd365f13377c9dd8d3f5dc4d2","Image":"docker.io/gitea/gitea:latest","ImageID":"4c697a48a247ebf96c658dd1c90841075995201856d1f324502a8de392994621","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"gitea.service","io.containers.autoupdate":"registry","maintainer":"maintainers@gitea.io","org.opencontainers.image.created":"2026-01-22T01:03:39.624Z","org.opencontainers.image.description":"Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"369830bada2fd8826a5135cb2fc66660a9bef708","org.opencontainers.image.source":"https://github.com/go-gitea/gitea","org.opencontainers.image.title":"gitea","org.opencontainers.image.url":"https://github.com/go-gitea/gitea","org.opencontainers.image.version":"1.25.4"},"Mounts":["/data"],"Names":["gitea"],"Namespaces":{},"Networks":[],"Pid":173313,"Pod":"","PodName":"","Ports":[{"host_ip":"","container_port":22,"host_port":2222,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":3000,"host_port":9098,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771397165,"State":"running","Status":"","_dashboard_published_ports":["2222:22/tcp","9098:3000/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"gitea.service","_dashboard_def_path":"systemd/gitea/gitea.container"},{"AutoRemove":true,"Command":null,"Created":"2026-02-18T19:32:17.320283588+01:00","CreatedAt":"","CIDFile":"/run/user/1000/sonarr.cid","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"8989":["tcp"]},"Id":"e71096acfec3a44061db068dd9e09acb64bbc3cc46226d435e231c7b9d58d816","Image":"lscr.io/linuxserver/sonarr:latest","ImageID":"8a7ac3e8cd085edf70cd87651f51570412028a857e18f1eda08dc05f226c391e","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"sonarr.service","build_version":"Linuxserver.io version:- 4.0.16.2944-ls303 Build-date:- 2026-02-13T23:56:17+00:00","io.containers.autoupdate":"registry","maintainer":"thespad","org.opencontainers.image.authors":"linuxserver.io","org.opencontainers.image.created":"2026-02-13T23:56:17+00:00","org.opencontainers.image.description":"[Sonarr](https://sonarr.tv/) (formerly NZBdrone) is a PVR for usenet and bittorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. ","org.opencontainers.image.documentation":"https://docs.linuxserver.io/images/docker-sonarr","org.opencontainers.image.licenses":"GPL-3.0-only","org.opencontainers.image.ref.name":"e3d276543a0d64e7c98cfb365c8ba67d79c6e07c","org.opencontainers.image.revision":"e3d276543a0d64e7c98cfb365c8ba67d79c6e07c","org.opencontainers.image.source":"https://github.com/linuxserver/docker-sonarr","org.opencontainers.image.title":"Sonarr","org.opencontainers.image.url":"https://github.com/linuxserver/docker-sonarr/packages","org.opencontainers.image.vendor":"linuxserver.io","org.opencontainers.image.version":"4.0.16.2944-ls303"},"Mounts":["/config","/Volumes/8TB","/Volumes/8TB_RAID1"],"Names":["sonarr"],"Namespaces":{},"Networks":[],"Pid":294976,"Pod":"","PodName":"","Ports":[{"host_ip":"","container_port":8989,"host_port":8989,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771439537,"State":"running","Status":"","_dashboard_published_ports":["8989:8989/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"sonarr.service","_dashboard_def_path":"systemd/sonarr/sonarr.container"},{"AutoRemove":false,"Command":["uvicorn","app:app","--host","0.0.0.0","--port","8000"],"Created":"2026-02-22T11:37:03.118839878+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":null,"Id":"df276057ec0c689cd88d04a684cf187bc452740c89168e9368eb3681f617b0e2","Image":"localhost/mvp-control:latest","ImageID":"814b7994e00f4fa572a175a4e4cbdd3f63da8866f15b14f35237eaa3b49e0242","IsInfra":false,"Labels":{"io.buildah.version":"1.39.3"},"Mounts":["/run/user/1000/podman/podman.sock","/app/workloads","/run/user/1000"],"Names":["mvp-backend"],"Namespaces":{},"Networks":[],"Pid":1470363,"Pod":"5718096812b9ed6d4f19c9bd44d691ec8bd634f6af81b6574eb56c3a1811898d","PodName":"mvp-pod","Ports":[{"host_ip":"","container_port":8000,"host_port":8080,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":8081,"host_port":8081,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771756632,"State":"running","Status":"","_dashboard_published_ports":["8080:8000/tcp","8081:8081/tcp"],"_dashboard_source":"podman"},{"AutoRemove":true,"Command":null,"Created":"2026-02-22T14:25:34.154908936+01:00","CreatedAt":"","CIDFile":"/run/user/1000/dozzle.cid","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"8080":["tcp"]},"Id":"91e510485499ec261f56d780a09616b5c383e084288ab1fb775cde1ed49b22e5","Image":"docker.io/amir20/dozzle:latest","ImageID":"575e9f201aed88bf0230c1bbc2d19947aee41995abcaf16338f1cb15a6f27130","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"dozzle.service","org.opencontainers.image.created":"2026-02-14T18:41:47.130Z","org.opencontainers.image.description":"Realtime log viewer for containers. Supports Docker, Swarm and K8s.","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"00132ef1cf20f20df1383819249b1fdb98e3f09c","org.opencontainers.image.source":"https://github.com/amir20/dozzle","org.opencontainers.image.title":"dozzle","org.opencontainers.image.url":"https://github.com/amir20/dozzle","org.opencontainers.image.version":"v10.0.2"},"Mounts":["/var/run/docker.sock"],"Names":["dozzle"],"Namespaces":{},"Networks":[],"Pid":1482067,"Pod":"","PodName":"","Ports":[{"host_ip":"","container_port":8080,"host_port":9999,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771766734,"State":"running","Status":"","_dashboard_published_ports":["9999:8080/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"dozzle.service","_dashboard_def_path":"systemd/dozzle/dozzle.container"},{"AutoRemove":true,"Command":["/entrypoint.sh"],"Created":"2026-02-24T13:35:01.902176289+01:00","CreatedAt":"","CIDFile":"/run/user/1000/playwright.cid","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":null,"Id":"04980b50774c31e4e41066f95c577b9f629af43a9627d0ded49e6954da80c2e2","Image":"localhost/playwright:latest","ImageID":"fe83936becff261f98edf47e200d6a10d06f33ce0f4e32b35a8c8c42a2fbf9ad","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"playwright.service","io.buildah.version":"1.39.3","org.opencontainers.image.ref.name":"ubuntu","org.opencontainers.image.version":"24.04"},"Mounts":["/app"],"Names":["playwright"],"Namespaces":{},"Networks":["playwright"],"Pid":1702408,"Pod":"","PodName":"","Ports":[{"host_ip":"","container_port":5901,"host_port":5901,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771936502,"State":"running","Status":"","_dashboard_published_ports":["5901:5901/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"playwright.service","_dashboard_def_path":"systemd/playwright/playwright.container"},{"AutoRemove":false,"Command":null,"Created":"2026-02-24T14:07:41.349884789+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":null,"Id":"aa9082a8065ec51d822114252c5d1b04db30abcee554e5551848e95525ba9cbd","Image":"localhost/podman-pause:5.4.2-1766335321","ImageID":"dfd874f5c4086c63645acc7985de67de4ddd2ea18ca921dc0b52a49b10fdcccd","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"mediaserver.service"},"Mounts":[],"Names":["fed4a10cecfe-service"],"Namespaces":{},"Networks":[],"Pid":1709460,"Pod":"","PodName":"","Ports":null,"Restarts":0,"Size":null,"StartedAt":1771938493,"State":"running","Status":"","_dashboard_published_ports":[],"_dashboard_source":"podman"},{"AutoRemove":false,"Command":null,"Created":"2026-02-24T14:07:41.389953795+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":null,"Id":"f281c8a5c221f287a3a0e825203559d1c88599178657ec943449b84ff88e617f","Image":"localhost/podman-pause:5.4.2-1766335321","ImageID":"dfd874f5c4086c63645acc7985de67de4ddd2ea18ca921dc0b52a49b10fdcccd","IsInfra":true,"Labels":{"PODMAN_SYSTEMD_UNIT":"mediaserver.service","io.buildah.version":"1.39.3"},"Mounts":[],"Names":["01a7e1679c49-infra"],"Namespaces":{},"Networks":["mediaserver"],"Pid":1709468,"Pod":"01a7e1679c49c5da7b983a0499be0180e05c17a4b41256ec54eac1d3c6e76cbb","PodName":"podmediaserver","Ports":[{"host_ip":"","container_port":9092,"host_port":9092,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":9117,"host_port":9117,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771938493,"State":"running","Status":"","_dashboard_published_ports":["9092:9092/tcp","9117:9117/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"mediaserver.service"},{"AutoRemove":false,"Command":null,"Created":"2026-02-24T14:07:44.323862009+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"8000":["tcp"],"8388":["udp","tcp"],"8888":["tcp"]},"Id":"dfe1ddbff17af9664727893fa37762255324198fbc4c0cc42c75b3d0482a4439","Image":"ghcr.io/qdm12/gluetun:latest","ImageID":"44cd27a465822da9f2a51ed805e7f8aab29b8faa151093c37133bd94735423e0","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"mediaserver.service","org.opencontainers.image.authors":"quentin.mcgaw@gmail.com","org.opencontainers.image.created":"2026-02-24T12:42:44.611Z","org.opencontainers.image.description":"VPN client in a thin Docker container for multiple VPN providers, written in Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers built-in.","org.opencontainers.image.documentation":"https://github.com/qdm12/gluetun","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"01487b5caf2b94946a5e3721d3c2c69e76ea1d8c","org.opencontainers.image.source":"https://github.com/qdm12/gluetun","org.opencontainers.image.title":"gluetun","org.opencontainers.image.url":"https://github.com/qdm12/gluetun","org.opencontainers.image.version":"latest"},"Mounts":[],"Names":["podmediaserver-vpn-gateway"],"Namespaces":{},"Networks":[],"Pid":1709639,"Pod":"01a7e1679c49c5da7b983a0499be0180e05c17a4b41256ec54eac1d3c6e76cbb","PodName":"podmediaserver","Ports":[{"host_ip":"","container_port":9092,"host_port":9092,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":9117,"host_port":9117,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771938493,"State":"running","Status":"","_dashboard_published_ports":["9092:9092/tcp","9117:9117/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"mediaserver.service"},{"AutoRemove":false,"Command":["/usr/local/bin/python","-u","/app/flaresolverr.py"],"Created":"2026-02-24T14:07:46.086907347+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"8191":["tcp"],"8192":["tcp"]},"Id":"6c8f3a08cbd40251f301933731fcd48dae3b0cc360eacb5d60e03f575732093e","Image":"ghcr.io/flaresolverr/flaresolverr:latest","ImageID":"2c9df6fe79644081e5146209e936ca21f56426531a457cba1124802d7ac0da6e","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"mediaserver.service","org.opencontainers.image.created":"2025-11-29T02:43:01.748Z","org.opencontainers.image.description":"Proxy server to bypass Cloudflare protection","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"ff65b7cc6861b64b9558dcc9b5449aada88ff48a","org.opencontainers.image.source":"https://github.com/FlareSolverr/FlareSolverr","org.opencontainers.image.title":"FlareSolverr","org.opencontainers.image.url":"https://github.com/FlareSolverr/FlareSolverr","org.opencontainers.image.version":"v3.4.6"},"Mounts":["/config"],"Names":["podmediaserver-flaresolverr"],"Namespaces":{},"Networks":[],"Pid":1709680,"Pod":"01a7e1679c49c5da7b983a0499be0180e05c17a4b41256ec54eac1d3c6e76cbb","PodName":"podmediaserver","Ports":[{"host_ip":"","container_port":9092,"host_port":9092,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":9117,"host_port":9117,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771938493,"State":"running","Status":"","_dashboard_published_ports":["9092:9092/tcp","9117:9117/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"mediaserver.service"},{"AutoRemove":false,"Command":null,"Created":"2026-02-24T14:08:00.375641772+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"9117":["tcp"]},"Id":"5596ab1cfcb55353400b1b3169c953cf096b14e152393ad3affacea683779ff5","Image":"lscr.io/linuxserver/jackett:latest","ImageID":"f6f764cc2714257d20d6eca26ab38b034e20a1d7ee68b62acca0b6d622b6ab56","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"mediaserver.service","build_version":"Linuxserver.io version:- v0.24.1193-ls322 Build-date:- 2026-02-24T06:39:10+00:00","maintainer":"thelamer","org.opencontainers.image.authors":"linuxserver.io","org.opencontainers.image.created":"2026-02-24T06:39:10+00:00","org.opencontainers.image.description":"[Jackett](https://github.com/Jackett/Jackett) works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.","org.opencontainers.image.documentation":"https://docs.linuxserver.io/images/docker-jackett","org.opencontainers.image.licenses":"GPL-3.0-only","org.opencontainers.image.ref.name":"393764d3786fb1f5431e179c872240603d00312a","org.opencontainers.image.revision":"393764d3786fb1f5431e179c872240603d00312a","org.opencontainers.image.source":"https://github.com/linuxserver/docker-jackett","org.opencontainers.image.title":"Jackett","org.opencontainers.image.url":"https://github.com/linuxserver/docker-jackett/packages","org.opencontainers.image.vendor":"linuxserver.io","org.opencontainers.image.version":"v0.24.1193-ls322"},"Mounts":["/config","/downloads"],"Names":["podmediaserver-jackett"],"Namespaces":{},"Networks":[],"Pid":1709505,"Pod":"01a7e1679c49c5da7b983a0499be0180e05c17a4b41256ec54eac1d3c6e76cbb","PodName":"podmediaserver","Ports":[{"host_ip":"","container_port":9092,"host_port":9092,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":9117,"host_port":9117,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771938493,"State":"running","Status":"","_dashboard_published_ports":["9092:9092/tcp","9117:9117/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"mediaserver.service"},{"AutoRemove":false,"Command":["echo \"Waiting for VPN health server...\";\nuntil nc -z 127.0.0.1 9999; do sleep 2; done;\necho \"VPN ready, starting qbittorrent\";\nexec /init\n"],"Created":"2026-02-24T14:08:10.482564449+01:00","CreatedAt":"","CIDFile":"","Exited":false,"ExitedAt":-62135596800,"ExitCode":0,"ExposedPorts":{"6881":["tcp","udp"],"8080":["tcp"]},"Id":"24c47e54a67d82bb4eab962fd040385cb77bdacd768863209cf907ca522b0055","Image":"lscr.io/linuxserver/qbittorrent:latest","ImageID":"58acede726d085614039d6607c601016c15bc9396b2d9e63aa64f04e3d1ffcb2","IsInfra":false,"Labels":{"PODMAN_SYSTEMD_UNIT":"mediaserver.service","build_version":"Linuxserver.io version:- 5.1.4-r2-ls442 Build-date:- 2026-02-22T07:28:22+00:00","io.containers.autoupdate":"registry","maintainer":"thespad","org.opencontainers.image.authors":"linuxserver.io","org.opencontainers.image.created":"2026-02-22T07:28:22+00:00","org.opencontainers.image.description":"The [Qbittorrent](https://www.qbittorrent.org/) project aims to provide an open-source software alternative to µTorrent. qBittorrent is based on the Qt toolkit and libtorrent-rasterbar library.","org.opencontainers.image.documentation":"https://docs.linuxserver.io/images/docker-qbittorrent","org.opencontainers.image.licenses":"GPL-3.0-only","org.opencontainers.image.ref.name":"264d4fefe09bd60ea574a64132eca13df5ddeda6","org.opencontainers.image.revision":"264d4fefe09bd60ea574a64132eca13df5ddeda6","org.opencontainers.image.source":"https://github.com/linuxserver/docker-qbittorrent","org.opencontainers.image.title":"Qbittorrent","org.opencontainers.image.url":"https://github.com/linuxserver/docker-qbittorrent/packages","org.opencontainers.image.vendor":"linuxserver.io","org.opencontainers.image.version":"5.1.4-r2-ls442"},"Mounts":["/config","/Volumes/8TB/Shared_Folders/Downloads"],"Names":["podmediaserver-qbittorrent"],"Namespaces":{},"Networks":[],"Pid":1709551,"Pod":"01a7e1679c49c5da7b983a0499be0180e05c17a4b41256ec54eac1d3c6e76cbb","PodName":"podmediaserver","Ports":[{"host_ip":"","container_port":9092,"host_port":9092,"range":1,"protocol":"tcp"},{"host_ip":"","container_port":9117,"host_port":9117,"range":1,"protocol":"tcp"}],"Restarts":0,"Size":null,"StartedAt":1771938493,"State":"running","Status":"","_dashboard_published_ports":["9092:9092/tcp","9117:9117/tcp"],"_dashboard_source":"systemd","_dashboard_unit":"mediaserver.service"}]kodi@kodidebian:~/.config/podman-mvp$ curl -curl -fsS http://127.0.0.1:8081/api/images | head +[{"Id":"dfd874f5c4086c63645acc7985de67de4ddd2ea18ca921dc0b52a49b10fdcccd","ParentId":"","RepoTags":["localhost/podman-pause:5.4.2-1766335321"],"RepoDigests":["localhost/podman-pause@sha256:25b673ee8de51228b2fe7e66dde72de6a4bb316ff776f97b49528176d9771184"],"Created":1771225402,"Size":1473167,"SharedSize":0,"VirtualSize":1473167,"Labels":{"io.buildah.version":"1.39.3"},"Containers":3,"Arch":"amd64","Digest":"sha256:25b673ee8de51228b2fe7e66dde72de6a4bb316ff776f97b49528176d9771184","History":["localhost/podman-pause:5.4.2-1766335321"],"IsManifestList":false,"Names":["localhost/podman-pause:5.4.2-1766335321"],"Os":"linux"},{"Id":"d2825031e94c68c5437ae2f479a1e2e1b2e0a26990c506e17deee19590546735","ParentId":"","RepoTags":["docker.io/library/httpd:2.4"],"RepoDigests":["docker.io/library/httpd@sha256:60a9de5582b60c45a649018786180bf75d57f43d6fefe799670d5acae8462799","docker.io/library/httpd@sha256:b89c19a390514d6767e8c62f29375d0577190be448f63b24f5f11d6b03f7bf18"],"Created":1770085385,"Size":120210217,"SharedSize":0,"VirtualSize":120210217,"Labels":null,"Containers":1,"Arch":"amd64","Digest":"sha256:b89c19a390514d6767e8c62f29375d0577190be448f63b24f5f11d6b03f7bf18","History":["docker.io/library/httpd:2.4"],"IsManifestList":false,"Names":["docker.io/library/httpd:2.4"],"Os":"linux"},{"Id":"2c9df6fe79644081e5146209e936ca21f56426531a457cba1124802d7ac0da6e","ParentId":"","RepoTags":["ghcr.io/flaresolverr/flaresolverr:latest"],"RepoDigests":["ghcr.io/flaresolverr/flaresolverr@sha256:524715c5b5d045ff77ae409ffa1d6c0fcf9f23a2e5e957eb44da4f2fc53e6876","ghcr.io/flaresolverr/flaresolverr@sha256:7962759d99d7e125e108e0f5e7f3cdbcd36161776d058d1d9b7153b92ef1af9e"],"Created":1764384255,"Size":690355587,"SharedSize":0,"VirtualSize":690355587,"Labels":{"org.opencontainers.image.created":"2025-11-29T02:43:01.748Z","org.opencontainers.image.description":"Proxy server to bypass Cloudflare protection","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"ff65b7cc6861b64b9558dcc9b5449aada88ff48a","org.opencontainers.image.source":"https://github.com/FlareSolverr/FlareSolverr","org.opencontainers.image.title":"FlareSolverr","org.opencontainers.image.url":"https://github.com/FlareSolverr/FlareSolverr","org.opencontainers.image.version":"v3.4.6"},"Containers":1,"Arch":"amd64","Digest":"sha256:7962759d99d7e125e108e0f5e7f3cdbcd36161776d058d1d9b7153b92ef1af9e","History":["ghcr.io/flaresolverr/flaresolverr:latest"],"IsManifestList":false,"Names":["ghcr.io/flaresolverr/flaresolverr:latest"],"Os":"linux"},{"Id":"8a7ac3e8cd085edf70cd87651f51570412028a857e18f1eda08dc05f226c391e","ParentId":"","RepoTags":["lscr.io/linuxserver/sonarr:latest"],"RepoDigests":["lscr.io/linuxserver/sonarr@sha256:37be832b78548e3f55f69c45b50e3b14d18df1b6def2a4994258217e67efb1a1","lscr.io/linuxserver/sonarr@sha256:9a4c65d24dac6f1fb5f98de73d20fc1ebf76719f7e99ceb3887f5ba8c2977093"],"Created":1771027088,"Size":208022480,"SharedSize":0,"VirtualSize":208022480,"Labels":{"build_version":"Linuxserver.io version:- 4.0.16.2944-ls303 Build-date:- 2026-02-13T23:56:17+00:00","maintainer":"thespad","org.opencontainers.image.authors":"linuxserver.io","org.opencontainers.image.created":"2026-02-13T23:56:17+00:00","org.opencontainers.image.description":"[Sonarr](https://sonarr.tv/) (formerly NZBdrone) is a PVR for usenet and bittorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available. ","org.opencontainers.image.documentation":"https://docs.linuxserver.io/images/docker-sonarr","org.opencontainers.image.licenses":"GPL-3.0-only","org.opencontainers.image.ref.name":"e3d276543a0d64e7c98cfb365c8ba67d79c6e07c","org.opencontainers.image.revision":"e3d276543a0d64e7c98cfb365c8ba67d79c6e07c","org.opencontainers.image.source":"https://github.com/linuxserver/docker-sonarr","org.opencontainers.image.title":"Sonarr","org.opencontainers.image.url":"https://github.com/linuxserver/docker-sonarr/packages","org.opencontainers.image.vendor":"linuxserver.io","org.opencontainers.image.version":"4.0.16.2944-ls303"},"Containers":1,"Arch":"amd64","Digest":"sha256:37be832b78548e3f55f69c45b50e3b14d18df1b6def2a4994258217e67efb1a1","History":["lscr.io/linuxserver/sonarr:latest"],"IsManifestList":false,"Names":["lscr.io/linuxserver/sonarr:latest"],"Os":"linux"},{"Id":"b8c80b87c813a2ee26748ce49686844942f297bcc19b6cca3d49cd2fe0a87808","ParentId":"","RepoTags":["docker.io/library/postgres:16"],"RepoDigests":["docker.io/library/postgres@sha256:671edd2067af03a22235546817d0367bc5c4cc834efdebed50d0f445ad9e7bed","docker.io/library/postgres@sha256:e4842c8a99ca99339e1693e6fe5fe62c7becb31991f066f989047dfb2fbf47af"],"Created":1770930287,"Size":458070507,"SharedSize":0,"VirtualSize":458070507,"Labels":null,"Containers":1,"Arch":"amd64","Digest":"sha256:e4842c8a99ca99339e1693e6fe5fe62c7becb31991f066f989047dfb2fbf47af","History":["docker.io/library/postgres:16"],"IsManifestList":false,"Names":["docker.io/library/postgres:16"],"Os":"linux"},{"Id":"e78f4103dee6428d15be5c04659035953306d86dc6d5710d1aa4f62a97caff3a","ParentId":"","RepoTags":["docker.n8n.io/n8nio/n8n:latest"],"RepoDigests":["docker.n8n.io/n8nio/n8n@sha256:6b35a08cbebe1750cf068f3990a41818a8b3a127c04185872af2f3d1ce0bb404","docker.n8n.io/n8nio/n8n@sha256:9220846479a40e3df1bc12e673cf38d33d0800afbea68b9bc90109babf594547"],"Created":1771003461,"Size":1154540677,"SharedSize":0,"VirtualSize":1154540677,"Labels":{"com.docker.dhi.chain-id":"sha256:ee90d364f250e6b715b0b7b88e67b19a76c7adabad9e253bad24ed1ed473b61f","com.docker.dhi.compliance":"cis","com.docker.dhi.created":"2026-01-23T15:43:22Z","com.docker.dhi.date.end-of-life":"2027-04-30","com.docker.dhi.date.release":"2024-04-24","com.docker.dhi.definition":"image/node/alpine-3.22/22-dev","com.docker.dhi.distro":"alpine-3.22","com.docker.dhi.flavor":"","com.docker.dhi.name":"dhi/node","com.docker.dhi.package-manager":"apk","com.docker.dhi.shell":"busybox","com.docker.dhi.title":"Node.js 22.x (dev)","com.docker.dhi.url":"https://dhi.io/catalog/node","com.docker.dhi.variant":"dev","com.docker.dhi.version":"22.22.0-alpine3.22-dev","org.opencontainers.image.description":"Workflow Automation Tool","org.opencontainers.image.source":"https://github.com/n8n-io/n8n","org.opencontainers.image.title":"n8n","org.opencontainers.image.url":"https://n8n.io","org.opencontainers.image.version":"2.7.5"},"Containers":1,"Arch":"amd64","Digest":"sha256:9220846479a40e3df1bc12e673cf38d33d0800afbea68b9bc90109babf594547","History":["docker.n8n.io/n8nio/n8n:latest"],"IsManifestList":false,"Names":["docker.n8n.io/n8nio/n8n:latest"],"Os":"linux"},{"Id":"4c697a48a247ebf96c658dd1c90841075995201856d1f324502a8de392994621","ParentId":"","RepoTags":["docker.io/gitea/gitea:latest"],"RepoDigests":["docker.io/gitea/gitea@sha256:17d18218be2dad1f8ed402a4f906989505c90ab8b66ee9befcecfb5d470133e7","docker.io/gitea/gitea@sha256:fd917399b5bbde18348d52eda18b3690d75ae1c108630c6dc3a2bf10a3e0c353"],"Created":1769044714,"Size":181726107,"SharedSize":0,"VirtualSize":181726107,"Labels":{"maintainer":"maintainers@gitea.io","org.opencontainers.image.created":"2026-01-22T01:03:39.624Z","org.opencontainers.image.description":"Git with a cup of tea! Painless self-hosted all-in-one software development service, including Git hosting, code review, team collaboration, package registry and CI/CD","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"369830bada2fd8826a5135cb2fc66660a9bef708","org.opencontainers.image.source":"https://github.com/go-gitea/gitea","org.opencontainers.image.title":"gitea","org.opencontainers.image.url":"https://github.com/go-gitea/gitea","org.opencontainers.image.version":"1.25.4"},"Containers":1,"Arch":"amd64","Digest":"sha256:17d18218be2dad1f8ed402a4f906989505c90ab8b66ee9befcecfb5d470133e7","History":["docker.io/gitea/gitea:latest"],"IsManifestList":false,"Names":["docker.io/gitea/gitea:latest"],"Os":"linux"},{"Id":"575e9f201aed88bf0230c1bbc2d19947aee41995abcaf16338f1cb15a6f27130","ParentId":"","RepoTags":["docker.io/amir20/dozzle:latest"],"RepoDigests":["docker.io/amir20/dozzle@sha256:4d39ae7e046ab0cdd4b1d67a70cf9836396b69b0fff7402b70fbc6a9bc0d122b","docker.io/amir20/dozzle@sha256:f1f82c27077f39c0a563f24e9929d36f23bdf9c1590217794a08ea49677201cf"],"Created":1771094718,"Size":57888799,"SharedSize":0,"VirtualSize":57888799,"Labels":{"org.opencontainers.image.created":"2026-02-14T18:41:47.130Z","org.opencontainers.image.description":"Realtime log viewer for containers. Supports Docker, Swarm and K8s.","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"00132ef1cf20f20df1383819249b1fdb98e3f09c","org.opencontainers.image.source":"https://github.com/amir20/dozzle","org.opencontainers.image.title":"dozzle","org.opencontainers.image.url":"https://github.com/amir20/dozzle","org.opencontainers.image.version":"v10.0.2"},"Containers":1,"Arch":"amd64","Digest":"sha256:f1f82c27077f39c0a563f24e9929d36f23bdf9c1590217794a08ea49677201cf","History":["docker.io/amir20/dozzle:latest"],"IsManifestList":false,"Names":["docker.io/amir20/dozzle:latest"],"Os":"linux"},{"Id":"814b7994e00f4fa572a175a4e4cbdd3f63da8866f15b14f35237eaa3b49e0242","ParentId":"","RepoTags":["localhost/mvp-control:latest"],"RepoDigests":["localhost/mvp-control@sha256:68b55ab501c33eaa85e69692a2b50778620c4e59a2296bdb200834fe51c68c64"],"Created":1771756608,"Size":210921984,"SharedSize":0,"VirtualSize":210921984,"Labels":{"io.buildah.version":"1.39.3"},"Containers":1,"Arch":"amd64","Digest":"sha256:68b55ab501c33eaa85e69692a2b50778620c4e59a2296bdb200834fe51c68c64","History":["localhost/mvp-control:latest"],"IsManifestList":false,"Names":["localhost/mvp-control:latest"],"Os":"linux"},{"Id":"fe83936becff261f98edf47e200d6a10d06f33ce0f4e32b35a8c8c42a2fbf9ad","ParentId":"","RepoTags":["localhost/playwright:latest"],"RepoDigests":["localhost/playwright@sha256:06528efbcb8a6af68affef95882175741114fbb407618786a2ba512bc110b03c"],"Created":1771872820,"Size":2916171987,"SharedSize":0,"VirtualSize":2916171987,"Labels":{"io.buildah.version":"1.39.3","org.opencontainers.image.ref.name":"ubuntu","org.opencontainers.image.version":"24.04"},"Containers":1,"Arch":"amd64","Digest":"sha256:06528efbcb8a6af68affef95882175741114fbb407618786a2ba512bc110b03c","History":["localhost/playwright:latest"],"IsManifestList":false,"Names":["localhost/playwright:latest"],"Os":"linux"},{"Id":"44cd27a465822da9f2a51ed805e7f8aab29b8faa151093c37133bd94735423e0","ParentId":"","RepoTags":["ghcr.io/qdm12/gluetun:latest"],"RepoDigests":["ghcr.io/qdm12/gluetun@sha256:4f62e8cfcffb43c0cddf55ef7e65b50e3a4a6deadca3a88d65f8d7f9988a30b0","ghcr.io/qdm12/gluetun@sha256:784b5f1ba64f613510669a682390a97f6403b43e9ce8be0d8ffc12e534a0d89b"],"Created":1771937135,"Size":67454396,"SharedSize":0,"VirtualSize":67454396,"Labels":{"org.opencontainers.image.authors":"quentin.mcgaw@gmail.com","org.opencontainers.image.created":"2026-02-24T12:42:44.611Z","org.opencontainers.image.description":"VPN client in a thin Docker container for multiple VPN providers, written in Go, and using OpenVPN or Wireguard, DNS over TLS, with a few proxy servers built-in.","org.opencontainers.image.documentation":"https://github.com/qdm12/gluetun","org.opencontainers.image.licenses":"MIT","org.opencontainers.image.revision":"01487b5caf2b94946a5e3721d3c2c69e76ea1d8c","org.opencontainers.image.source":"https://github.com/qdm12/gluetun","org.opencontainers.image.title":"gluetun","org.opencontainers.image.url":"https://github.com/qdm12/gluetun","org.opencontainers.image.version":"latest"},"Containers":1,"Arch":"amd64","Digest":"sha256:784b5f1ba64f613510669a682390a97f6403b43e9ce8be0d8ffc12e534a0d89b","History":["ghcr.io/qdm12/gluetun:latest"],"IsManifestList":false,"Names":["ghcr.io/qdm12/gluetun:latest"],"Os":"linux"},{"Id":"f6f764cc2714257d20d6eca26ab38b034e20a1d7ee68b62acca0b6d622b6ab56","ParentId":"","RepoTags":["lscr.io/linuxserver/jackett:latest"],"RepoDigests":["lscr.io/linuxserver/jackett@sha256:0cc4483a72cc3dd7f67d739523ff5ee0a2d63580bfa91e560932fc77d3874bfc","lscr.io/linuxserver/jackett@sha256:f2e811e6ed87fb4953b5b3c127594ab7ce3bfe05e831631fce0c9ade120c50b5"],"Created":1771915251,"Size":189855622,"SharedSize":0,"VirtualSize":189855622,"Labels":{"build_version":"Linuxserver.io version:- v0.24.1193-ls322 Build-date:- 2026-02-24T06:39:10+00:00","maintainer":"thelamer","org.opencontainers.image.authors":"linuxserver.io","org.opencontainers.image.created":"2026-02-24T06:39:10+00:00","org.opencontainers.image.description":"[Jackett](https://github.com/Jackett/Jackett) works as a proxy server: it translates queries from apps (Sonarr, SickRage, CouchPotato, Mylar, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software. This allows for getting recent uploads (like RSS) and performing searches. Jackett is a single repository of maintained indexer scraping & translation logic - removing the burden from other apps.","org.opencontainers.image.documentation":"https://docs.linuxserver.io/images/docker-jackett","org.opencontainers.image.licenses":"GPL-3.0-only","org.opencontainers.image.ref.name":"393764d3786fb1f5431e179c872240603d00312a","org.opencontainers.image.revision":"393764d3786fb1f5431e179c872240603d00312a","org.opencontainers.image.source":"https://github.com/linuxserver/docker-jackett","org.opencontainers.image.title":"Jackett","org.opencontainers.image.url":"https://github.com/linuxserver/docker-jackett/packages","org.opencontainers.image.vendor":"linuxserver.io","org.opencontainers.image.version":"v0.24.1193-ls322"},"Containers":1,"Arch":"amd64","Digest":"sha256:f2e811e6ed87fb4953b5b3c127594ab7ce3bfe05e831631fce0c9ade120c50b5","History":["lscr.io/linuxserver/jackett:latest"],"IsManifestList":false,"Names":["lscr.io/linuxserver/jackett:latest"],"Os":"linux"},{"Id":"58acede726d085614039d6607c601016c15bc9396b2d9e63aa64f04e3d1ffcb2","ParentId":"","RepoTags":["lscr.io/linuxserver/qbittorrent:latest"],"RepoDigests":["lscr.io/linuxserver/qbittorrent@sha256:065792d2b11f0facff340210fc1cf13623b029a94ecdf08b02d06d922205f618","lscr.io/linuxserver/qbittorrent@sha256:95941f2d9663f841c5fa595d7b904403838dc29dbe20eb7646b02cda82eb16b7"],"Created":1771745403,"Size":201464366,"SharedSize":0,"VirtualSize":201464366,"Labels":{"build_version":"Linuxserver.io version:- 5.1.4-r2-ls442 Build-date:- 2026-02-22T07:28:22+00:00","maintainer":"thespad","org.opencontainers.image.authors":"linuxserver.io","org.opencontainers.image.created":"2026-02-22T07:28:22+00:00","org.opencontainers.image.description":"The [Qbittorrent](https://www.qbittorrent.org/) project aims to provide an open-source software alternative to µTorrent. qBittorrent is based on the Qt toolkit and libtorrent-rasterbar library.","org.opencontainers.image.documentation":"https://docs.linuxserver.io/images/docker-qbittorrent","org.opencontainers.image.licenses":"GPL-3.0-only","org.opencontainers.image.ref.name":"264d4fefe09bd60ea574a64132eca13df5ddeda6","org.opencontainers.image.revision":"264d4fefe09bd60ea574a64132eca13df5ddeda6","org.opencontainers.image.source":"https://github.com/linuxserver/docker-qbittorrent","org.opencontainers.image.title":"Qbittorrent","org.opencontainers.image.url":"https://github.com/linuxserver/docker-qbittorrent/packages","org.opencontainers.image.vendor":"linuxserver.io","org.opencontainers.image.version":"5.1.4-r2-ls442"},"Containers":1,"Arch":"amd64","Digest":"sha256:065792d2b11f0facff340210fc1cf13623b029a94ecdf08b02d06d922205f618","History":["lscr.io/linuxserver/qbittorrent:latest"],"IsManifestList":false,"Names":["lscr.io/linuxserver/qbittorrent:latest"],"Os":"linux"}]kodi@kodidebian:~/.config/podman-mvp$