When cloud-init behavior is confusing on a VPS, I want a repeatable way to capture the full state in one file.
The helper script cloud-init-ctx.sh does exactly that.
Run it from your workstation:
./cloud-init-ctx.sh <ssh-target>
# example:| #!/usr/bin/env python3 | |
| import argparse | |
| import re | |
| import sys | |
| from pathlib import Path | |
| # Platzhalter-Syntax: {{ include:... }} | |
| PLACEHOLDER_RE = re.compile(r'{{\s*include\s*:\s*([^}]+?)\s*}}') | |
| def hydrate(prompt_path: Path, output_path: Path, src_dir_name: str) -> None: |
This gist is part of Nym Mixnet & dVPN: A Node Operator's Guide (2026).
Quick notes:
docker-compose.yaml, which builds nymvpn-debian.dockerfile.secrets.env is an example; put your real mnemonic there and keep it private../config/nymvpn1/ (mapped to /etc/nym and /var/lib/nym-vpnd).Build helpers:
TAG_DATE=$(date +%Y%m%d) docker compose buildTAG_DATE=$(date +%Y%m%d) docker compose build --no-cache
| ~/workspaces/nym$ ./target/release/nym-gateway-probe run-local --config-dir "$HOME/.local/share/nym-gateway-probe" --gateway-ip "152.53.122.46:8080" --min-gateway-mixnet-performance 0 | |
| 2026-01-19T19:41:23.073628Z INFO nym_gateway_probe::run: Using direct IP query mode for gateway: 152.53.122.46:8080 | |
| 2026-01-19T19:41:23.073652Z INFO nym_gateway_probe::nodes: Querying gateway directly at address: 152.53.122.46:8080 | |
| 2026-01-19T19:41:23.097391Z INFO nym_gateway_probe::nodes: Successfully connected to gateway at http://152.53.122.46:8080 | |
| 2026-01-19T19:41:23.200988Z INFO nym_http_api_client::dns: building new configured resolver | |
| 2026-01-19T19:41:23.383759Z INFO nym_gateway_probe::run: Test mode: mixnet | |
| 2026-01-19T19:41:23.383778Z INFO nym_gateway_probe::run: using the following directory for the probe config: /home/me/.local/share/nym-gateway-probe | |
| 2026-01-19T19:41:23.383792Z INFO nym_gateway_probe: Using pre-queried gateway node from direct IP query | |
| 2026-01-19T19:41:23.383849Z INFO nym_gateway_probe: connec |
| #!/usr/bin/env bash | |
| set -euo pipefail | |
| NODE_ID="${NODE_ID:-default-nym-node}" | |
| SRC_BASE="/root/.nym" | |
| SRC_NODE="${SRC_BASE}/nym-nodes/${NODE_ID}" | |
| BASE="/root/nym-backup" | |
| REPO="${BASE}/dotnym-repo" |
| #!/usr/bin/env python3 | |
| """ | |
| Minimal otpauth-migration decoder using only Python standard library | |
| Decodes Google Authenticator export data to standard otpauth URLs | |
| """ | |
| # https://github.com/digitalduke/otpauth-migration-decoder/issues/6 | |
| # https://www.rajashekar.org/migrate-otp/ | |
| # https://github.com/dim13/otpauth |
| # Dockerfile | |
| FROM python:3.12-slim | |
| # Install system dependencies. You might need more packages (like gnupg2, libusb, etc.). | |
| RUN apt-get update && apt-get install -y gnupg2 usbutils libusb-1.0-0-dev libudev-dev git curl && rm -rf /var/lib/apt/lists/* | |
| # The working directory inside the container | |
| WORKDIR /app |
This gist belongs to the blog post Incus/LXD as an Alternative to Vagrant for DevOps Testing.
| # .env file | |
| # Secret (avoid storing real secrets in version control!) | |
| KOPIA_REPOSITORY_SECRET=mysupersecret | |
| LUKS_PASSPHRASE=abc123 | |
| # Toggle alerting | |
| ALERT_ENABLED=false | |
| # Pushover credentials |