Same companion shape as bitcoin-ui/electrs-ui: host-networked nginx bound to 127.0.0.1:18091 (auth: gated + session_passthrough), serving a dark glass status page that polls the node's restricted RPC via a session-gated /cuprate-rpc/ proxy — sync height/target with progress bar, peers, mempool, chain size and free disk (from get_info), plus a wallet 'remote node' endpoint. The offline state explains the disk gate so a refused node says why. No secret rendering: the restricted RPC is Monero's safe-for-public subset, so nginx.conf is baked into the image (no pre_start hook, no bind mount). companion.rs auto-provisions archy-cuprate-ui alongside cuprate and reaps it when cuprate goes. Catalog regenerated (cuprate-ui entry + manifest embed, 18091 into the mesh launch-port list). NOTE: releases/app-catalog.json is UNSIGNED as committed — run scripts/sign-catalog.sh before publishing.
68 lines
2.0 KiB
YAML
68 lines
2.0 KiB
YAML
app:
|
|
id: cuprate-ui
|
|
name: Cuprate UI
|
|
version: 1.0.0
|
|
# Built by this project — there is no upstream release feed to watch.
|
|
upstream:
|
|
kind: internal
|
|
description: |
|
|
Archipelago-native HTTP frontend for the Cuprate Monero node. Runs nginx
|
|
inside a container, serves a static status dashboard, and proxies
|
|
/cuprate-rpc/ to the cuprate restricted RPC on 127.0.0.1:18090 (the
|
|
published host port for the container's 18089). No credentials are
|
|
injected — the restricted RPC is Monero's own safe-for-public subset — so
|
|
the nginx.conf is baked into the image and there is no rendered-config
|
|
bind-mount like bitcoin-ui's.
|
|
|
|
container:
|
|
build:
|
|
context: /opt/archipelago/docker/cuprate-ui
|
|
dockerfile: Dockerfile
|
|
tag: localhost/cuprate-ui:local
|
|
|
|
dependencies:
|
|
- app_id: cuprate
|
|
|
|
resources:
|
|
memory_limit: 64Mi
|
|
|
|
security:
|
|
readonly_root: false
|
|
network_policy: host
|
|
|
|
# Host networking: nginx listens on 18091 directly on the host IP.
|
|
# Declared so the APP GATE can see this port. Host networking means Podman
|
|
# publishes nothing (quadlet skips PublishPort in host mode), so `bind:` here
|
|
# is a statement of where the container's own nginx listens — 127.0.0.1 —
|
|
# not a publish instruction. Without this declaration the gate would have no
|
|
# idea the port existed: neither protected nor listed as unprotected.
|
|
ports:
|
|
- host: 18091
|
|
container: 18091
|
|
protocol: tcp
|
|
bind: 127.0.0.1
|
|
auth: gated
|
|
# First-party companion UI: its nginx forwards the node session cookie
|
|
# to the daemon's authenticated endpoints; without passthrough the gate
|
|
# strips it and every data call 401s while the page shell renders.
|
|
session_passthrough: true
|
|
|
|
volumes: []
|
|
|
|
environment: []
|
|
|
|
health_check:
|
|
type: http
|
|
endpoint: http://127.0.0.1:18091
|
|
path: /
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
|
|
metadata:
|
|
icon: /assets/img/app-icons/cuprate.svg
|
|
category: money
|
|
tier: optional
|
|
author: Archipelago
|
|
repo: https://github.com/Cuprate/cuprate
|