Upgrading from v0.1? See Upgrading from v0.1 below — the miner config schema changed, container/image names changed, and the substrate validator now owns p2p. There's a one-time
make updateconfigstep plus a few docker compose differences worth scanning before you bring things up.
Quick-start Docker Compose deployment for Quip Network nodes. Supports CPU and CUDA (GPU) mining, with an optional Substrate-based validator and faucet sidecar. Each profile brings up a Caddy reverse proxy, the telemetry dashboard, and a bundled Postgres backend — so operators get a single-URL monitoring UI with automatic TLS out of the box.
Internet
├─ 80/tcp → quip-caddy (TLS mode: auto-redirect to :443)
├─ 443/tcp → quip-caddy ─┬─ /rpc/* → quip-validator:9944 (substrate RPC, validator profiles)
│ ├─ /api/faucet/* → quip-faucet:8087 (faucet profile)
│ ├─ /api/v1/* → quip-node:80 (miner telemetry)
│ └─ /* → quip-dashboard:3001 (dashboard SPA)
├─ 20049/tcp → quip-caddy (same routes as :443; the canonical Quip API port)
└─ 30333/tcp+udp → quip-validator (substrate libp2p, bundled into every profile)
Caddy is the single front door for HTTP/WS traffic; libp2p binds :30333 directly on the validator container. The miner runs purely as an outbound substrate RPC client (no inbound QUIC, no inbound REST) and is reachable only over the compose network. Substrate RPC is at /rpc, faucet at /api/faucet/*, miner telemetry at /api/v1/*, dashboard SPA at /. All four are served on both :443 and :20049 in TLS mode, or on :20049 HTTP-only in dev mode. :80 is used for ACME HTTP-01 challenges and auto-redirects to :443.
Inbound ports every public deployment should open: :20049 (Caddy — required for the dashboard/RPC/telemetry surface), :30333/tcp+udp (libp2p peer dials — strongly recommended so other validators can connect inbound and your node can be a useful peer), and :80+:443 (Caddy TLS — only if you want HTTPS via HTTP-01 ACME). Without :30333, your validator still mines and gossips outbound through the bootnodes, but won't accept inbound peer dials — you become a leaf in the mesh rather than a participating peer.
Verify your ports are open from the public internet via check.quip.network — run the curls from the host itself; the service uses the caller's source IP so you can't misdirect it at a different target:
curl -sS https://check.quip.network/checkport?port=20049
curl -sS https://check.quip.network/checkport?port=30333
curl -sS https://check.quip.network/checkport?port=80 # only if using HTTP-01 ACME
curl -sS https://check.quip.network/checkport?port=443 # only if using HTTPSEach returns {"reachable": true, …} or {"reachable": false, "error": "…"}.
The v0.2 stack replaces the v0.1 P2P mesh with a substrate validator + RPC-client miner. That changes the binary (quip-node → quip-miner), the image names (quip-network-node-{cpu,cuda} → quip-miner-{cpu,cuda}), the compose services (qpu collapsed into cpu + a [qpu] config section; new quip-validator and quip-faucet services), and the config schema ([global] → [miner], P2P/TLS keys removed, validators + signer_key required). Full schema diff in CHANGELOG.md.
The v0.1 container names (quip-cpu, quip-cuda, quip-qpu, quip-dashboard, quip-postgres, quip-caddy) still exist in v0.2 except for quip-qpu, so a plain docker compose down from the new tree won't necessarily reach them if you've already pulled v0.2. Stop and remove them explicitly first — || true makes this safe to copy/paste even if some containers don't exist on your host:
docker stop quip-cpu quip-cuda quip-qpu quip-dashboard quip-postgres quip-caddy 2>/dev/null || true
docker rm quip-cpu quip-cuda quip-qpu quip-dashboard quip-postgres quip-caddy 2>/dev/null || trueYour data is in bind mounts (./data/, ./dashboard-data/) and named volumes (quip-pgdata, quip-caddy-data, quip-caddy-config), so removing containers is non-destructive.
git pull origin v0.2Review docker-compose.yml and env.example against your local .env:
- New env vars you'll want to set before the first start:
QUIP_VALIDATOR_TAG,QUIP_FAUCET_TAG,QUIP_MINER_CPUSET,VALIDATOR_NAME,SUBSTRATE_BOOTNODES,CERT_EMAIL. - Removed env vars — delete these from your
.envif present (they're no longer consumed by v0.2 and only clutter the file):QUIP_NODE_URL— superseded byQUIP_VALIDATOR_RPC_URLS(now drives both chain indexing and the miner REST surface; comma-separated list of substrate WS URLs).QUIP_NODE_TOKEN— removed; bearer-token access control moved out of the dashboard image into the deployment layer (reverse-proxy auth, network policy).
- Repointing for miner-only nodes: if your
.envhadQUIP_NODE_URL=https://cpu-1.nodes.quip.network(or similar single-host), the v0.2 equivalent isQUIP_VALIDATOR_RPC_URLSpointing at the same host's substrate WS endpoint (comma-separated if you want failover across multiple validators):QUIP_VALIDATOR_RPC_URLS=wss://cpu-1.nodes.quip.network/rpc
⚠️ First, make sure your shell user can move every file indata/. The converter moves the v0.1 contents intodata/.v0.1_backup/and will fail with aPermissionErrorif any file is owned by a different user (commonly the case if your v0.1 node ran the container as root). Run this once before the converter:sudo chown -R "$(id -u):$(id -g)" data/Skip if your
data/is already owned by your shell user (e.g., you've been running v0.1 withPUID=$(id -u)).
Pick one (both produce identical output):
# Native — needs Python 3.11+ on the host
make updateconfig
# Docker fallback — for Python < 3.11 (e.g. Ubuntu 22.04 ships 3.10)
make updateconfig-docker
# Or call the script directly
python3 scripts/upgrade-config.py dataDefaults to ./data; override with DATA=/path/to/data. The converter:
- moves every entry in
data/(including your oldconfig.toml) intodata/.v0.1_backup/ - writes a fresh
data/config.tomlin v0.2 shape, carrying overnode_name,public_host,public_port,rest_host,log_level,node_logand preserving backend tables ([cpu],[gpu],[cuda.N],[qpu],[dwave], …) verbatim - forces
rest_port = 80(v0.2 Caddy proxies/api/v1/*toquip-miner:80; v0.1 deployments using miner-terminated TLS often hadrest_port = 443, which would leave Caddy's upstream unreachable) - defaults
validators = ["ws://quip-validator:9944"]— the local bundled validator. It peers with the testnet bootnodes via libp2p on:30333, so this entry is correct out of the box and shouldn't be edited - defaults
signer_key = "/data/keystore.json"— the entrypoint auto-generates the hybrid keystore on first start - warns loudly about dropped
[global].port/[global].listen(semantics flipped from QUIC peer to telemetry REST — the v0.2 loader would silently alias these, but that risks exposing the REST API on what used to be the peer port) - migrates
.envalongside (sibling ofdata/): backs up the current file to.env.v0.1_backup, drops staleQUIP_NODE_URL/QUIP_NODE_TOKENlines (commented or uncommented), and appends a commentedQUIP_VALIDATOR_RPC_URLSplaceholder. Use--no-env-file(ormake updateconfig DATA=datawith the env override unset) to skip the.envstep.
Idempotent: re-running on an already-converted dir exits with "nothing to do".
Caddy auto-provisions a Let's Encrypt cert for QUIP_HOSTNAME in production mode. Two ways it can prove control of the DNS name:
| Challenge | What you need | When to pick |
|---|---|---|
| HTTP-01 (default) | Port 80 reachable from the public internet | Simplest. Works out of the box with caddy:2-alpine. Required if you can't or won't share DNS API credentials with the host. |
| DNS-01 | A custom Caddy image with your DNS provider plugin compiled in (caddy-dns/cloudflare, caddy-dns/route53, caddy-dns/digitalocean, …) and DNS-API credentials in .env |
Required if your host can't bind :80 (firewalled, port already taken, behind a NAT without port-forward). Also supports wildcard certs. |
For HTTP-01, no extra config — just make sure :80 is open and CERT_EMAIL is set in .env. For DNS-01, build a Caddy image with your provider's plugin (see Caddy's DNS challenge docs), swap the image: line for the caddy service in docker-compose.yml, and add the appropriate tls { dns <provider> } block in caddy/Caddyfile. The plumbing is out of scope for this repo because the credential surface is provider-specific.
# CPU miner + bundled local validator + dashboard + Caddy
docker compose --profile cpu up -d
# CUDA miner + bundled local validator + dashboard + Caddy
docker compose --profile cuda up -d
# Layer in the faucet (dev only)
docker compose --profile cpu --profile faucet up -dBoth cpu and cuda profiles bundle a local substrate validator by default — there's no separate validator profile anymore. The first start pulls the v0.2 images (quip-miner-{cpu,cuda}, quip-network-node, quip-faucet, etc.) and auto-generates data/keystore.json for the miner. The miner self-bootstraps on startup: it funds the new account via the canonical testnet faucet (https://faucet.testnet.quip.network, wired by default) and registers it in the chain's QuantumPow.Miners map before it starts producing proofs. Set QUIP_FAUCET_URL= (empty) in .env to opt out of faucet-funding if you've pre-funded the account yourself.
Check it came up cleanly:
docker compose --profile cpu ps
docker compose logs -f cpu # miner
docker compose logs -f quip-validator # validatorThen visit the dashboard at http://localhost:20049/ (dev) or https://<your-hostname>/ (production).
For hardware SM sharing across miner processes the CUDA miner uses NVIDIA MPS (Multi-Process Service). MPS is a host facility — a control daemon runs on the host and exposes a pipe directory (/tmp/nvidia-mps) that the container joins via ipc:host. Without it the miner logs MPS not active in container — using software nonce reduction only and runs in a degraded fallback; it does not fail. MPS is unsupported under WSL2 / Docker Desktop.
make testnet PROFILE=cuda starts the host MPS control daemon for you (the require-mps target) before bringing the stack up, so SM sharing just works:
make testnet PROFILE=cudaThe cuda service in docker-compose.yml is already wired for this (ipc:host, pid:host, the /tmp/nvidia-mps bind-mount, and the CUDA_MPS_* env). If you bring the stack up with raw docker compose --profile cuda up -d instead of make, start the daemon on the host yourself first (may require root):
sudo nvidia-cuda-mps-control -dSet QUIP_GPU_UTILIZATION in .env to cap each miner's GPU SM share (CUDA_MPS_ACTIVE_THREAD_PERCENTAGE); default 100, use 100/N for N miners sharing one GPU. If the NVIDIA driver's MPS utilities aren't installed, make testnet PROFILE=cuda warns and continues with the software fallback.
If you need to undo the conversion: restore the original data/config.toml from the backup and remove the v0.2 file.
cp data/.v0.1_backup/config.toml data/config.tomlThe v0.1 containers can be re-created from a v0.1 checkout of this repo (git checkout main if main still points at the v0.1 line, or git checkout <pre-v0.2-sha>). Bind-mounted data survives across both stacks.
# CPU mining (also the base for QPU/D-Wave — see step 2)
cp data/config.cpu.toml data/config.toml
# CUDA GPU mining (requires NVIDIA GPU + drivers)
cp data/config.cuda.toml data/config.tomlEdit data/config.toml:
- Adjust
node_namefor telemetry display - For QPU (D-Wave): uncomment the
[qpu]and[dwave]sections at the bottom ofconfig.cpu.toml. Solver and budget are pre-set for Advantage2.
[miner].validators defaults to ws://quip-validator:9944 — the bundled local validator. Leave it alone; it peers with the canonical testnet bootnodes via libp2p (see the chain spec's bootNodes).
cp env.example .env
printf 'PUID=%s\nPGID=%s\n' "$(id -u)" "$(id -g)" >> .envThen edit .env and set QUIP_HOSTNAME:
| Mode | QUIP_HOSTNAME value |
What you get |
|---|---|---|
| Dev / local | :20049 (default) |
HTTP on :20049 only, no TLS. |
| Production | cpu-1.nodes.quip.network, cpu-1.nodes.quip.network:20049 |
Auto-TLS on :443 + :20049, :80 auto-redirects to :443. |
The comma-separated production form is required so a single Let's Encrypt cert covers both ports. Port 80 must be reachable from the internet during cert provisioning and every renewal.
Also set:
CERT_EMAIL— required when running in TLS / production mode.DWAVE_API_KEY— required only for QPU / D-Wave mining.POSTGRES_PASSWORD— optional; defaults toquip. Postgres isn't published to the host, so the default is safe for local use.QUIP_VALIDATOR_TAG,VALIDATOR_NAME,SUBSTRATE_BOOTNODES— seeenv.examplefor the validator and faucet sections.
The printf line seeds .env with your host's uid/gid so files under ./data/ stay editable without sudo. Since quip-protocol v0.1.7 the node runs as a non-root quip user and chowns /data to match PUID/PGID on start (default 1000).
Apply BBR + fair-queueing + no slow-start-after-idle on the host — improves throughput for long-lived TCP and is required for BBR's packet pacing:
sudo ./scripts/sysctl-tune.shIdempotent. Writes /etc/sysctl.d/99-quip.conf and runs sysctl --system. Needs kernel ≥ 4.9 (every supported Ubuntu LTS qualifies).
Two primary profiles are available. Plain docker compose ... always boots the live Quip Testnet — the dev-chain override is opt-in (see Local dev chain below).
| Profile | Includes | Notes |
|---|---|---|
cpu |
miner (CPU), local validator, dashboard, postgres, Caddy | Default. Uncomment [qpu] + [dwave] in config.toml for D-Wave. |
cuda |
miner (CUDA), local validator, dashboard, postgres, Caddy | Requires NVIDIA GPU + Docker GPU runtime. |
Every node bundles its own substrate validator — there's no separate validator-only or miner-only profile.
# CPU miner + local validator (testnet)
docker compose --profile cpu up -d
# CUDA miner + local validator (testnet)
docker compose --profile cuda up -dFor experimentation without joining the testnet — //Alice as the sole authority + sudo + faucet funder. Two ways:
make localdev # full flow: wipe + start + seed topology + bootstrap miner
# or
docker compose -f docker-compose.yml -f docker-compose.localdev.yml --profile cpu up -dThe opt-in docker-compose.localdev.yml swaps the validator command to --chain=dev, pulls quip-faucet into the cpu/cuda profiles, and points the miner's QUIP_FAUCET_URL at the local faucet. It is not auto-loaded — the filename was deliberately moved off the magic docker-compose.override.yml to keep plain docker compose invocations on the testnet path. If you previously relied on the override auto-applying, switch to make localdev or pass the explicit -f flags.
Monitor your node at http://localhost:20049/ — or https://<QUIP_HOSTNAME>/ (and :20049) when running on a remote machine with TLS.
cron.sh detects which profiles are running (based on which quip-* containers exist) and preserves them on auto-update.
With the default QUIP_HOSTNAME=:20049, Caddy serves HTTP on port 20049 with no TLS — good for local dev with the cpu / cuda profiles. Access the dashboard at http://localhost:20049/.
For production, set QUIP_HOSTNAME to the comma-separated form (example.com, example.com:20049) and CERT_EMAIL to a valid address. Caddy provisions a Let's Encrypt cert via HTTP-01 on :80, serves HTTPS on :443 and :20049, and redirects HTTP to HTTPS. Port 80 must be reachable from the internet during provisioning and every renewal — if it isn't (firewalled host, port already taken, NAT without port-forward), see the DNS-01 alternative in the upgrade flow.
The default ACME issuer is Let's Encrypt, with ZeroSSL as an automatic fallback (built-in to Caddy 2.6+). To pin ZeroSSL as the primary issuer — useful if you want longer cert validity or have hit LE rate limits — uncomment the cert_issuer zerossl line in caddy/Caddyfile and optionally set ZEROSSL_API_KEY in .env for pre-provisioned EAB credentials.
Certs persist in the quip-caddy-data named volume across container recreations.
The dashboard indexer polls the local validator over the compose network (ws://quip-validator:9944) for both chain state and the miner REST surface that Caddy fronts on the same host. The node's RPC is not exposed to the host directly — all external traffic goes through Caddy.
For miner-only nodes (no colocated validator), point the indexer at a public full node via QUIP_VALIDATOR_RPC_URLS in .env. The value is comma-separated; the indexer rotates through the list on failure:
QUIP_VALIDATOR_RPC_URLS=wss://cpu-1.nodes.quip.network/rpcTelemetry persists in the quip-pgdata named volume, so it survives container recreations.
Every node bundles a local substrate validator, so just starting the cpu or cuda profile makes you a validator. What changes by deployment:
- Inbound
:20049(Caddy) — required for the dashboard/RPC surface to be reachable from the public internet. - Inbound
:30333/tcp+udp(libp2p) — same priority as:20049. Lets other validators dial yours so you're a participating peer instead of a leaf. Mining works without it (outbound to bootnodes is enough), but your peer count stays in the single digits. - TLS for the public RPC is best-effort and Caddy-driven. Set
QUIP_HOSTNAMEto your real DNS name +CERT_EMAIL, open port 80 (HTTP-01) or wire DNS-01, and Caddy serveswss://<host>/rpcandwss://<host>:20049/rpc. Without those, the validator still runs locally and is reachable on the compose network (ws://quip-validator:9944) — only the public WSS endpoint is gated on the cert. - Docker Compose v2.20+ for the
depends_on.required: falseflag used to make the validator a soft dependency of the miner. On older versions, remove that line fromdocker-compose.yml(miner will retry RPC connection on startup either way).
After bringing the stack up, verify :20049 and :30333 are reachable from the public internet via check.quip.network — see the architecture section for the exact curl invocations.
The validator boots against chain-specs/quip-testnet.json by default (see Quip Testnet below). For local development against the quip-local preset, set QUIP_CHAIN_SPEC=./data/chain-spec.json in .env.
# 1. Start the stack — chain spec is already in place
docker compose --profile cpu up -d
# 3. Rotate session keys — substrate generates and stores them under the
# keystore in ./data/validator-data/chains/<id>/keystore/. The returned
# hex pubkey gets bound to your validator account via session.setKeys.
curl -fsSL -H 'Content-Type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"author_rotateKeys","params":[]}' \
https://<QUIP_HOSTNAME>/rpc
# 4. Submit session.setKeys from your controller account using the pubkey
# above, via Polkadot.js Apps pointed at wss://<QUIP_HOSTNAME>/rpc.Notes:
--rpc-methods=safeblocksauthor_rotateKeysfrom external callers as a hardening default. Run step 3 from inside the docker network (e.g.docker compose exec quip-validator …with the substrate node's curl) if your remote/rpcblocks the call.- Running two validators on one host is not supported — the upstream litep2p transport's wildcard binding causes a port collision when multiple validators share a docker bridge. Use separate hosts or separate docker networks.
- The validator's libp2p node key is auto-generated at first start (under
data/validator-data/chains/<id>/network/secret_ed25519). To pin a stable peer id across recreations, generate the key explicitly withkey generate-node-key --file /data/node-keyand add--node-key-file=/data/node-keyto the validator command. Canonical bootnode operator setup is documented indocs/testnet-deployment.md.
The compose stack joins the canonical Quip Testnet by default. Identity:
| Field | Value |
|---|---|
| Chain name | Quip Testnet |
| Chain id | quip_testnet |
| Chain type | Live |
| Token | tQUIP (12 decimals, ss58Format=42) |
| Protocol id | quip-testnet |
| Bootnodes (embedded in spec) | /dns4/bootnode-{1,2,3}.testnet.quip.network/tcp/30333/p2p/12D3KooW… |
A fresh docker compose --profile cpu up -d boots straight onto Quip Testnet — the spec is committed at chain-specs/quip-testnet.json, the v0.2 validator image is pinned by default, and the bootnode addresses are embedded in the spec (no SUBSTRATE_BOOTNODES env var needed unless you're overriding for a private network).
The spec ships with a SHA-256 checksum:
(cd chain-specs && shasum -a 256 -c quip-testnet.json.sha256)
# quip-testnet.json: OKTo verify provenance against the published validator image:
docker run --rm \
registry.gitlab.com/quip.network/quip-protocol-rs/quip-network-node:v0.2 \
export-chain-spec --chain quip-testnet --raw > /tmp/from-image.json
shasum -a 256 /tmp/from-image.json chain-specs/quip-testnet.json
# Both hashes should match exactly.The chain spec is mirrored from quip-protocol-rs — specifically runtime/src/genesis_quip_testnet/ plus the inline tx-account hex in genesis_config_presets.rs::quip_testnet_config_genesis. To regenerate after an upstream preset change:
# Pull the new preview image (after upstream pushes the new sha-XXXXXXXX tag)
docker pull registry.gitlab.com/quip.network/quip-protocol-rs/quip-network-node:v0.2
# Re-export and update the checksum sidecar
docker run --rm registry.gitlab.com/quip.network/quip-protocol-rs/quip-network-node:v0.2 \
export-chain-spec --chain quip-testnet --raw > chain-specs/quip-testnet.json
(cd chain-specs && shasum -a 256 quip-testnet.json > quip-testnet.json.sha256)Do not hand-edit chain-specs/quip-testnet.json. Any change must come from re-exporting after an upstream preset commit.
Genesis authorities, sudo, and the full set-keys procedure live in quip-protocol-rs/docs/genesis-quip-testnet.md. Operator key handling is documented in quip-protocol-rs/docs/testnet-keys.md.
Set QUIP_CHAIN_SPEC in .env to flip the validator to the quip-local preset that ships at data/chain-spec.json:
QUIP_CHAIN_SPEC=./data/chain-spec.jsonThe local preset has //Alice/Bob/etc. pre-funded so the faucet works against it without QUIP_FAUCET_ALLOW_ANY_CHAIN=1. Bootnodes are empty in the local spec; provide them via SUBSTRATE_BOOTNODES if you're joining a private network.
The faucet profile adds a small HTTP service that signs Balances.transferKeepAlive extrinsics from a funded URI-derived account. Currently dev-only: the funder is one of //Alice, //Bob, or //Alice//stash and must be funded at genesis on the chain you're running against. Real-keystore support is on the roadmap (see https://gitlab.com/quip.network/faucet).
# Activate alongside any validator profile (one or both):
docker compose --profile cpu --profile faucet up -dHTTP API (through Caddy):
# Request funds for an address
curl -fsSL -H 'Content-Type: application/json' \
-d '{"dest":"<ss58-or-0x-hex>","amount":1000000000000000}' \
https://<QUIP_HOSTNAME>/api/faucet/request
# Health check
curl -fsSL https://<QUIP_HOSTNAME>/api/faucet/healthamountis in plancks (smallest balance unit). Default 1000 UNIT on 12-decimal chains. Optional in the request body.- Per-destination rate limit defaults to 60s (configurable via
QUIP_FAUCET_RATE_LIMIT_SECONDS). - The bot refuses to bind against a non-dev chain unless
QUIP_FAUCET_ALLOW_ANY_CHAIN=1. Override only when the funder URI is legitimately allocated on the production chain.
Install an hourly cron job that checks for new images and recreates containers only when digests change:
./cron.sh --install # install the hourly cron job
./cron.sh --uninstall # remove it
./cron.sh # run a one-off update checkpull_policy: always on every image ensures the registry is checked each time. If an image hasn't changed, up -d is a no-op — no restart, no downtime. Logs are written to data/update.log.
After editing data/config.toml, restart the node to pick up changes:
docker compose restart cpu # or cudaThe config file is bind-mounted, so restarting re-reads it from disk. Use --force-recreate only if you change .env or docker-compose.yml (environment variables are baked into the container at creation time):
docker compose --profile cpu up -d --force-recreate| Task | Command |
|---|---|
| View miner logs | docker compose logs -f cpu (or cuda) |
| View validator logs | docker compose logs -f quip-validator |
| View faucet logs | docker compose logs -f quip-faucet |
| View dashboard logs | docker compose logs -f dashboard |
| View Caddy / TLS logs | docker compose logs -f caddy |
| View auto-update logs | tail -f data/update.log |
| Restart after config change | docker compose restart cpu |
| Restart after .env change | docker compose --profile cpu up -d --force-recreate |
| Force pull and redeploy | docker compose pull cpu && docker compose up -d cpu |
| Stop everything | docker compose --profile cpu --profile faucet down |
| File | Purpose |
|---|---|
docker-compose.yml |
Node + validator + faucet + dashboard + postgres + caddy services |
caddy/Caddyfile |
Reverse-proxy + auto-TLS config for the Caddy front door |
data/config.toml |
Active node configuration (copied from a template) |
data/config.cpu.toml |
CPU mode template (base for QPU/D-Wave; uncomment [qpu] + [dwave]) |
data/config.cuda.toml |
CUDA GPU mode template |
chain-specs/quip-testnet.json |
Canonical Quip Testnet chain spec (committed; mirrored from quip-protocol-rs) |
chain-specs/quip-testnet.json.sha256 |
SHA-256 checksum for the testnet spec |
data/chain-spec.json |
Local-development chain spec (quip-local; opt-in via QUIP_CHAIN_SPEC) |
data/validator-data/ |
Validator base path (keystore, db, libp2p key; gitignored) |
docs/testnet-deployment.md |
Operator host setup for canonical testnet bootnode validators |
scripts/sysctl-tune.sh |
Host kernel tuning (BBR + fq + no slow-start-after-idle) |
.env |
QUIP_HOSTNAME, CERT_EMAIL, DWAVE_API_KEY, validator + faucet env (not checked in) |
env.example |
Template for .env |
dashboard-data/ |
Dashboard auxiliary state (bind mount, gitignored) |
quip-pgdata |
Docker named volume for Postgres data |
quip-caddy-data |
Docker named volume for Caddy's certs + state |
quip-caddy-config |
Docker named volume for Caddy's autosaved config |