Install the wallet
+Android, iOS, or browser extension from the official wallet portal.
+ +diff --git a/configs/taler-ops-ng/README.md b/configs/taler-ops-ng/README.md new file mode 100644 index 0000000..dc1d6a9 --- /dev/null +++ b/configs/taler-ops-ng/README.md @@ -0,0 +1,121 @@ +# Taler Operations WWW — design previews (koopa) + +Experimental **static** previews for a redesign of [taler-ops.ch](https://taler-ops.ch/). +Content is inspired by **`taler-ops-www`** (`git.taler.net/taler-ops-www`). + +## Source branches (`taler-ops-www`) + +| Branch | Meaning | +|--------|---------| +| **`stable`** | **Stable website** (classic production-oriented tree) | +| **`master`** | Ongoing development | + +This preview stack **does not build** `taler-ops-www` (Jinja/Parcel). +If the upstream tree is old, incomplete, or fails to build — **we do not build it**. +- **ng1 / ng2**: hand-crafted static HTML in this repo +- **ng3**: optional **HTTP mirror** of live classic site (or a tiny fallback page) + +## Ports (9090+) + +| Host | Variant | Port | Container | +|------|---------|------|-----------| +| `tops.ng1.hacktivism.ch` | Taler DD 90 branding (Montserrat, `#0042B3`) | **9090** | `koopa-tops-ng1` | +| `tops.ng2.hacktivism.ch` | DD 90 + step/amount sliders | **9091** | `koopa-tops-ng2` | +| `tops.ng3.hacktivism.ch` | Classic / stable-era look | **9092** | `koopa-tops-ng3` | + +## FINMA + +ng1 and ng2 keep a **sticky, always-visible** FINMA disclaimer (not supervised by FINMA; escrow not deposit-insured; segregated account). +ng3 uses the classic site wording when mirrored, or the same disclaimer on the fallback page. + +## Deploy on koopa + +Copy this tree to the host, then run the script (rootless podman as `hernani`): + +```bash +# from your laptop (example) +scp -r configs/taler-ops-ng hernani@koopa:~/koopa-tops + +# on koopa +cd ~/koopa-tops +chmod +x bin/up.sh +./bin/up.sh # start :9090 :9091 :9092 +./bin/up.sh status +./bin/up.sh --refresh-classic # re-mirror live taler-ops.ch → ng3 (no build) +./bin/up.sh down +``` + +Smoke without Caddy: + +```bash +curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9090/ +curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9091/ +curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9092/ +``` + +## Caddy (host) + +Snippet: `deploy/Caddyfile.snippet` + +```caddy +# 9090 tops ng1 | 9091 tops ng2 | 9092 tops ng3 + +tops.ng1.hacktivism.ch { + header Alt-Svc "clear" + reverse_proxy 127.0.0.1:9090 { + header_up Host {host} + header_up X-Forwarded-For {remote_host} + header_up X-Forwarded-Proto {scheme} + } +} + +tops.ng2.hacktivism.ch { + header Alt-Svc "clear" + reverse_proxy 127.0.0.1:9091 { + header_up Host {host} + header_up X-Forwarded-For {remote_host} + header_up X-Forwarded-Proto {scheme} + } +} + +tops.ng3.hacktivism.ch { + header Alt-Svc "clear" + reverse_proxy 127.0.0.1:9092 { + header_up Host {host} + header_up X-Forwarded-For {remote_host} + header_up X-Forwarded-Proto {scheme} + } +} +``` + +Also add the three hostnames to the existing HTTP→HTTPS redirect site list, then: + +```bash +sudo caddy validate --config /etc/caddy/Caddyfile +sudo systemctl reload caddy +``` + +DNS: `tops.ng1`, `tops.ng2`, `tops.ng3` under `hacktivism.ch` → koopa (same as other public vhosts). + +## Layout + +``` +configs/taler-ops-ng/ + README.md ← this file + bin/up.sh ← run on koopa + deploy/compose.yml ← podman compose + deploy/Caddyfile.snippet + ng1/index.html ← design preview + ng1/CHANGES/index.html ← /CHANGES + ng2/… · ng3/… ← same; ng3 also mirror/fallback +``` + +## /CHANGES + +Each preview serves a short change log at **`/CHANGES/`** (ng1, ng2, ng3). + +## Design notes + +- **ng1**: GNU Taler branding per [DD 90](https://docs.taler.net/design-documents/090-branding.html) / [DD 66](https://docs.taler.net/design-documents/066-wallet-color-scheme.html) (Montserrat, primary `#0042B3`, official logo). +- **ng2**: same DD 90 tokens as ng1; step carousel + amount range slider + topic tabs. +- **ng3**: classic production look via mirror; no Parcel/Jinja build pipeline. diff --git a/configs/taler-ops-ng/bin/up.sh b/configs/taler-ops-ng/bin/up.sh new file mode 100755 index 0000000..dd0fc0e --- /dev/null +++ b/configs/taler-ops-ng/bin/up.sh @@ -0,0 +1,190 @@ +#!/usr/bin/env bash +# Install / refresh Taler Operations design previews on koopa. +# Ports: 9090 (ng1), 9091 (ng2), 9092 (ng3 classic). +# +# Run ON koopa as hernani (rootless podman): +# ~/koopa-tops/bin/up.sh +# ~/koopa-tops/bin/up.sh --refresh-classic # re-mirror taler-ops.ch into ng3 +# ~/koopa-tops/bin/up.sh --down +# +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")/.." && pwd)" +cd "$ROOT" + +COMPOSE=(podman compose -f deploy/compose.yml) +# older podman-compose fallback +if ! podman compose version >/dev/null 2>&1; then + if command -v podman-compose >/dev/null 2>&1; then + COMPOSE=(podman-compose -f deploy/compose.yml) + fi +fi + +log() { printf '[tops] %s\n' "$*"; } + +ensure_dirs() { + mkdir -p ng1 ng2 ng3 + if [ ! -f ng1/index.html ]; then + log "ERROR: ng1/index.html missing — copy configs/taler-ops-ng from koopa-admin-log first" + exit 1 + fi + if [ ! -f ng2/index.html ]; then + log "ERROR: ng2/index.html missing" + exit 1 + fi + # nginx container user must read bind mounts + chmod -R a+rX ng1 ng2 ng3 2>/dev/null || true +} + +# Classic / stable-era site: HTTP mirror of production only. +# Do NOT build taler-ops-www (Jinja/Parcel) — if upstream is old/broken, we skip builds. +# Branch note: git.taler.net/taler-ops-www **stable** = stable website source; master = dev. +mirror_classic() { + log "mirroring classic site → ng3/ (from https://taler-ops.ch/) — no source build" + log "taler-ops-www: branch 'stable' = stable site; we never run make/parcel here" + local tmp + tmp=$(mktemp -d) + # shellcheck disable=SC2064 + trap "rm -rf '$tmp'" RETURN + + if command -v wget >/dev/null 2>&1; then + wget -q -r -np -nH --cut-dirs=0 -E -p -k \ + --directory-prefix="$tmp" \ + --domains=taler-ops.ch \ + --timeout=20 --tries=2 \ + https://taler-ops.ch/en/index.html \ + https://taler-ops.ch/de/index.html \ + https://taler-ops.ch/fr/index.html \ + 2>/dev/null || true + # flatten: prefer mirrored en as index if present + if [ -d "$tmp" ]; then + rm -rf ng3/* + # wget often creates host dir + if [ -d "$tmp/taler-ops.ch" ]; then + cp -a "$tmp/taler-ops.ch/." ng3/ 2>/dev/null || true + else + cp -a "$tmp/." ng3/ 2>/dev/null || true + fi + fi + fi + + # Fallback / ensure something serves if mirror thin + if [ ! -f ng3/index.html ] && [ ! -f ng3/en/index.html ]; then + log "mirror incomplete — writing ng3 fallback index (points at live + FINMA text)" + cat >ng3/index.html <<'HTML' + + +
+ + +
+ This preview is meant to serve the stable / classic Taler Operations website.
+ Source: taler-ops-www branch stable; production:
+ https://taler-ops.ch/
+
Mirror failed on this host — open production for the full classic UI, or re-run
+ ./bin/up.sh --refresh-classic with network + wget.
Classic mirror. FINMA disclaimer on main site. Branch stable = stable website. Port 9092.
' >ng3/CHANGES/index.html + fi + chmod -R a+rX ng3 2>/dev/null || true + log "ng3 ready ($(du -sh ng3 | awk '{print $1}'))" +} + +cmd_up() { + ensure_dirs + if [ ! -f ng3/index.html ] && [ ! -f ng3/en/index.html ]; then + mirror_classic + fi + log "pulling nginx image…" + podman pull docker.io/library/nginx:1.27-alpine + log "starting containers on :9090 :9091 :9092 …" + "${COMPOSE[@]}" up -d --force-recreate + sleep 1 + cmd_status + cat <<'EOF' + +=== Caddy (on host) === +Add vhosts from deploy/Caddyfile.snippet then: + sudo caddy validate --config /etc/caddy/Caddyfile + sudo systemctl reload caddy # or however you reload + +DNS: tops.ng1/ng2/ng3.hacktivism.ch → this host + +Local smoke (no Caddy): + curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9090/ + curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9091/ + curl -sS -o /dev/null -w "%{http_code}\n" http://127.0.0.1:9092/ +EOF +} + +cmd_down() { + log "stopping…" + "${COMPOSE[@]}" down || true +} + +cmd_status() { + podman ps --filter name=koopa-tops --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' || true + for p in 9090 9091 9092; do + code=$(curl -sS -m 3 -o /dev/null -w '%{http_code}' "http://127.0.0.1:${p}/" 2>/dev/null || echo fail) + log "port $p → HTTP $code" + done +} + +cmd_refresh_classic() { + mirror_classic + "${COMPOSE[@]}" up -d --force-recreate tops-ng3 + cmd_status +} + +case "${1:-up}" in + up|start) cmd_up ;; + down|stop) cmd_down ;; + status|ps) cmd_status ;; + --refresh-classic|refresh-classic) cmd_refresh_classic ;; + -h|--help) + sed -n '2,12p' "$0" | sed 's/^# \?//' + ;; + *) + log "unknown arg: $1 (try up|down|status|--refresh-classic)" + exit 2 + ;; +esac diff --git a/configs/taler-ops-ng/deploy/CHANGES-ng3.html b/configs/taler-ops-ng/deploy/CHANGES-ng3.html new file mode 100644 index 0000000..b1c4dbf --- /dev/null +++ b/configs/taler-ops-ng/deploy/CHANGES-ng3.html @@ -0,0 +1,39 @@ + + + + + +taler-ops-www — nur HTTP-Mirror / Fallbacknginx:1.27-alpine, rootless Podman · bin/up.sh (+ optional --refresh-classic)reverse_proxy → 127.0.0.1:9092taler-full.svg (GNU Taler)#0042B3, Secondary #A4C9FF / #586A88, Frame #F1F1F4taler-ops-www)nginx:1.27-alpine, rootless Podman · bin/up.sh + deploy/compose.ymlreverse_proxy → 127.0.0.1:9090+ The Taler Wallet is your digital purse. Withdraw electronic cash from your Swiss bank account, + then pay with QR code or NFC — standard bank transfer times apply. +
+CH+41 to receive P2P paymentsAndroid, iOS, or browser extension from the official wallet portal.
+ +Tap “Withdraw CHF”, enter an amount, confirm the bank transfer. Processing follows Swiss bank transfer times.
+Scan a merchant QR code or use NFC — confirm once. Only spend what you withdrew.
++ Pay in person where eCHF with Taler is accepted. + Full merchant map and onboarding: + taler-ops.ch map · + become a merchant. +
+No. Taler Operations AG is not supervised by FINMA. Escrow is in a segregated bank account and is not covered by deposit insurance. See the sticky notice above.
+You can only spend money you previously withdrew. No credit; the exchange does not learn what you bought.
+Live service: taler-ops.ch.
+#0042B3, Logo, Frame #F1F1F4taler-ops-www)nginx:1.27-alpine, rootless Podman · bin/up.sh + deploy/compose.ymlreverse_proxy → 127.0.0.1:9091+ Withdraw eCHF into the Taler wallet from your Swiss bank account, then pay with QR or NFC. +
+ Get the wallet + Slide through steps +CH+41 to receive P2P paymentsWithdraw eCHF, keep private purchases, pay in person where Taler is accepted.
+ User guide +Accept eCHF with the Taler merchant backend. Onboarding and fees are documented on production.
+ Merchant guide +No. Taler Operations AG is not supervised by FINMA. Escrow is in a segregated bank account and is not covered by deposit insurance. See the sticky notice above.
+You can only spend money you previously withdrew. No credit; the exchange does not learn what you bought.
+Live service: taler-ops.ch.
+taler-ops-www — nur HTTP-Mirror / Fallbacknginx:1.27-alpine, rootless Podman · bin/up.sh (+ optional --refresh-classic)reverse_proxy → 127.0.0.1:9092