# Live inventory — koopa (2026-07-13)

Snapshot of **what runs on host koopa** (openSUSE Tumbleweed). No secrets.

Refresh command ideas:

```bash
hostname; date -R
podman ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}'
systemctl is-active caddy
systemctl --user is-active container-koopa-tor-relay
systemctl --user is-active container-koopa-nym
ss -lntp | grep -E '90[0-9]{2}|9200|8080|9080|1789'
```

## Host

| Item | Value |
|------|--------|
| Hostname | `koopa` |
| Role | App host behind VeciGate (WAN :80→9000, :443→9001) |
| Edge | Caddy **9000/9001**, systemd socket proxies **80/443** |
| Tor | **podman `koopa-tor-relay`** (host net) ORPort **8080** dual-stack, ControlPort **127.0.0.1:9051** — not host `tor.service` |

## Running podman containers

| Name | Image | Ports (host) | Public site |
|------|--------|--------------|-------------|
| `taler-hacktivism` | `localhost/taler-hacktivism-live:landing` | **9010**, **9015** | `taler.hacktivism.ch` |
| **`taler-hacktivism-exchange-ansible`** | `localhost/taler-hacktivism-exchange-ansible:landing` | **9011**, **9014** | `exchange.hacktivism.ch` |
| `taler-hacktivism-bank` | **`localhost/taler-hacktivism-banking:live`** | **9012**, **9013** | `bank.hacktivism.ch` |
| `koopa-castopod` (+ mariadb, redis) | `castopod/castopod:1` | **9020** | `castopod.hacktivism.ch` |
| `koopa-bonfire` (+ postgres) | `bonfire:1.0.5-social-amd64` | **9021** | `bonfire.hacktivism.ch` |
| `koopa-prime-jellyfin` | `linuxserver/jellyfin:10.10.7` | **9022** | `prime.hacktivism.ch` |
| `koopa-prime-qbittorrent` | `linuxserver/qbittorrent:5.0.4` | **9023**, **6881** | `bt.hacktivism.ch` |
| `koopa-forgejo` (+ postgres) | `forgejo:11-rootless` | **9024**, **9200** | `git.hacktivism.ch` |
| **`koopa-paivana`** (+ upstream) | `localhost/koopa-paivana:latest` | **9025** | `paivana.hacktivism.ch` |
| `koopa-lemmy-proxy` (+ lemmy, ui, pictrs, db) | `lemmy:0.19.20` | **9026** | `lemmy.hacktivism.ch` |
| **`koopa-tor-relay`** | `localhost/koopa-tor-relay:latest` | **8080**, **9051** (host net) | Tor OR (non-exit) |
| **`koopa-nym`** | `localhost/koopa-nym:latest` | **9080**, **1789**, **1790** (+ opt. WG) | Nym mixnet node (nym.com) |
| `koopa-tops-ng1` | `nginx` | **9090** | `tops.ng1.hacktivism.ch` |
| `koopa-tops-ng2` | `nginx` | **9091** | `tops.ng2.hacktivism.ch` |
| `koopa-tops-ng3` | `nginx` | **9092** | `tops.ng3.hacktivism.ch` |

### Naming note (exchange)

Live exchange container is **`taler-hacktivism-exchange-ansible`** (not `taler-hacktivism-exchange-ansible` / not without `-ansible`).  
Managed from **`/home/hernani/ansible-taler-exchange/`** (see `configs/taler-exchange-ansible/`).

## Caddy vhosts → backends

| Host | Backend |
|------|---------|
| `taler.hacktivism.ch` | 9010 (API) + 9015 (`/intro`) |
| `exchange.hacktivism.ch` | 9011 + 9014 (`/intro`) |
| `bank.hacktivism.ch` | 9012 + 9013 (`/intro`, terms, privacy) |
| `castopod.hacktivism.ch` | 9020 |
| `bonfire.hacktivism.ch` | 9021 |
| `prime.hacktivism.ch` | 9022 |
| `bt.hacktivism.ch` | 9023 |
| `git.hacktivism.ch` | 9024 (HTTP); git-SSH **9200** host-direct |
| `paivana.hacktivism.ch` | 9025 (paivana-httpd GOA paywall) |
| `lemmy.hacktivism.ch` | 9026 |
| `tops.ng1.hacktivism.ch` | 9090 |
| `tops.ng2.hacktivism.ch` | 9091 |
| `tops.ng3.hacktivism.ch` | 9092 |

Config: `/etc/caddy/Caddyfile` (mirror `configs/caddy/Caddyfile`).

## Paths on host (`hernani`)

| Path | Role |
|------|------|
| `~/ansible-taler-exchange/` | Ansible + scripts for exchange-ansible container |
| `~/koopa-castopod/` | Castopod compose |
| `~/koopa-lemmy/` | Lemmy compose |
| `~/koopa-bonfire/` | Bonfire compose + gitbot |
| `~/koopa-prime/` | Jellyfin + qBittorrent |
| `~/koopa-forgejo/` | Forgejo rootless |
| `~/koopa-paivana/` | Paivana paywall (`koopa-paivana`) |
| `~/koopa-tops/` | tops.ng1–ng3 (`koopa-tops-ng*`) |
| `~/koopa-caddy/` | Caddyfile working tree on host |
| `~/koopa-tor-relay/` | Tor relay container (torrc, data/identity, log) |
| `~/koopa-nym/` | Nym nym-node (nym.com mixnet / NymVPN network) |

## Start models

| Stack | How |
|-------|-----|
| Taler merchant/bank | root `start_base_services_*` → service user → `/usr/local/bin/start_*.sh` |
| Exchange (GOA) | `~/ansible-taler-exchange/run-container-koopa.sh` then `deploy-hacktivism-goa.sh` |
| User apps | `cd ~/koopa-* && podman-compose up -d` |
| tops (ng1–ng3) | user unit `container-koopa-tops.service` (linger) |

## Config mirrors in this repo (`configs/`)

| Live container | Git path |
|----------------|----------|
| `taler-hacktivism` | `configs/taler-hacktivism/` |
| `taler-hacktivism-bank` (image **…-banking**) | `configs/taler-hacktivism-bank/` |
| `taler-hacktivism-exchange-ansible` | `configs/taler-exchange-ansible/` + conf in `configs/taler-exchange/` |
| `koopa-tops-ng1` … `ng3` | `configs/tops/` |

## Related docs in this repo

| Topic | Doc |
|-------|-----|
| Ports | `configs/ports.md` |
| Diagram | `host/overview/services.md` |
| Exchange Ansible (koopa) | `configs/taler-exchange-ansible/` |
| Forgejo | `2026/2026-07-10--forgejo-rootless.md` |
| Bonfire public feeds | `configs/bonfire/public-feeds.md` |
| Castopod content | `2026/2026-07-09--castopod-content.md` |
