# RNS Page Node [Русская](README.ru.md) [![Build and Publish Docker Image](https://github.com/Sudo-Ivan/rns-page-node/actions/workflows/docker.yml/badge.svg)](https://github.com/Sudo-Ivan/rns-page-node/actions/workflows/docker.yml) [![Docker Build Test](https://github.com/Sudo-Ivan/rns-page-node/actions/workflows/docker-test.yml/badge.svg)](https://github.com/Sudo-Ivan/rns-page-node/actions/workflows/docker-test.yml) [![DeepSource](https://app.deepsource.com/gh/Sudo-Ivan/rns-page-node.svg/?label=active+issues&show_trend=true&token=kajzd0SjJXSzkuN3z3kG9gQw)](https://app.deepsource.com/gh/Sudo-Ivan/rns-page-node/) A simple way to serve pages and files over the [Reticulum network](https://reticulum.network/). Drop-in replacement for [NomadNet](https://github.com/markqvist/NomadNet) nodes that primarily serve pages and files. ## Features - Serves pages and files over RNS - Dynamic page support with environment variables - Form data and request parameter parsing ## Usage ```bash # Pip # May require --break-system-packages pip install rns-page-node # Pipx pipx install rns-page-node # uv uv venv source .venv/bin/activate uv pip install rns-page-node # Pipx via Git pipx install git+https://github.com/Sudo-Ivan/rns-page-node.git ``` ## Usage ```bash # will use current directory for pages and files rns-page-node ``` or with command-line options: ```bash rns-page-node --node-name "Page Node" --pages-dir ./pages --files-dir ./files --identity-dir ./node-config --announce-interval 360 ``` or with a config file: ```bash rns-page-node /path/to/config.conf ``` ### Configuration File You can use a configuration file to persist settings. See `config.example` for an example. Config file format is simple `key=value` pairs: ``` # Comment lines start with # node-name=My Page Node pages-dir=./pages files-dir=./files identity-dir=./node-config announce-interval=360 ``` Priority order: Command-line arguments > Config file > Defaults ### Docker/Podman ```bash docker run -it --rm -v ./pages:/app/pages -v ./files:/app/files -v ./node-config:/app/node-config -v ./config:/root/.reticulum ghcr.io/sudo-ivan/rns-page-node:latest ``` ### Docker/Podman Rootless ```bash mkdir -p ./pages ./files ./node-config ./config chown -R 1000:1000 ./pages ./files ./node-config ./config podman run -it --rm -v ./pages:/app/pages -v ./files:/app/files -v ./node-config:/app/node-config -v ./config:/app/config ghcr.io/sudo-ivan/rns-page-node:latest-rootless ``` Mounting volumes are optional, you can also copy pages and files to the container `podman cp` or `docker cp`. ## Build ```bash make build ``` Build wheels: ```bash make wheel ``` ### Build Wheels in Docker ```bash make docker-wheels ``` ## Pages Supports dynamic executable pages with full request data parsing. Pages can receive: - Form fields via `field_*` environment variables - Link variables via `var_*` environment variables - Remote identity via `remote_identity` environment variable - Link ID via `link_id` environment variable This enables forums, chats, and other interactive applications compatible with NomadNet clients. ## Options ``` Positional arguments: node_config Path to rns-page-node config file Optional arguments: -c, --config Path to the Reticulum config file -n, --node-name Name of the node -p, --pages-dir Directory to serve pages from -f, --files-dir Directory to serve files from -i, --identity-dir Directory to persist the node's identity -a, --announce-interval Interval to announce the node's presence (in minutes, default: 360 = 6 hours) --page-refresh-interval Interval to refresh pages (in seconds, 0 = disabled) --file-refresh-interval Interval to refresh files (in seconds, 0 = disabled) -l, --log-level Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL) ``` ## License This project incorporates portions of the [NomadNet](https://github.com/markqvist/NomadNet) codebase, which is licensed under the GNU General Public License v3.0 (GPL-3.0). As a derivative work, this project is also distributed under the terms of the GPL-3.0. See the [LICENSE](LICENSE) file for full license.