# Exchange config (inside ansible container)

**Live container:** `taler-hacktivism-exchange-ansible`  
**Image:** `localhost/taler-hacktivism-exchange-ansible:landing`  
**Deploy tree on host:** `~/ansible-taler-exchange/` → see **`configs/taler-exchange-ansible/`**

This directory mirrors **exchange software config** (overrides, coins, terms), not the Ansible wrapper itself.

Container: **`taler-hacktivism-exchange-ansible`** · image tags `localhost/taler-hacktivism-exchange-ansible-live:9011` (live) and optional snapshot  
Host port: **9011** (pasta) · public: **https://exchange.hacktivism.ch/** (Caddy → 9011)

**Snapshot + restore (local tar, no registry):**  
→ [`2026/2026-07-09--exchange-snapshot-and-restore.md`](../../2026/2026-07-09--exchange-snapshot-and-restore.md)

## Terms of service (wallets)

Wallets require a working `/terms` (and usually `/privacy`) with a
`Taler-Terms-Version` header. If missing, many apps hang on accept /
`isPending` during the first withdraw QR.

This site uses **minimal stubs** — no formal legal ToS:

| Config | Value |
|--------|--------|
| `TERMS_ETAG` | `no-terms-v0` |
| `PRIVACY_ETAG` | `no-privacy-v0` |
| files | `/var/lib/taler-exchange/terms/en/no-terms-v0.{html,txt,md}` etc. |

Install / refresh inside the exchange container as root:

```bash
/usr/local/bin/install_no_terms.sh
# ensure exchange-overrides.conf has TERMS_ETAG / PRIVACY_ETAG (see above)
runuser -u taler-exchange-httpd -- /usr/local/bin/start_exchange.sh --restart
curl -sS -D- http://127.0.0.1:9011/terms | head
```

Sources: `configs/taler-exchange/terms-src/` and
`scripts/taler-exchange/install_no_terms.sh`.

## Secrets

`ATTRIBUTE_ENCRYPTION_KEY` and wire/DB credentials are **not** in this tree.  
See repo-root `SECRETS.md` and `koopa-admin-secrets/containers/taler-exchange/secrets/`.
