Remote RF Server Guide (Linux)
Environment and setup
This guide installs Miniconda, installs mamba, creates a conda env named remoterf, installs dependencies, and verifies the install on Ubuntu Server 24.04 LTS.
- This guide is done APT-based distro (Ubuntu/Debian/Raspberry Pi OS 64-bit).
1) System Prerequisites
sudo apt update
sudo apt install -y curl ca-certificates bzip2 git build-essential
sudo apt install -y libusb-1.0-0 udev
Optional: confirm architecture:
uname -m
x86_64→ Intel/AMDaarch64→ ARM64 (Raspberry Pi 64-bit, some servers)
2) Install Miniconda
2.1 Download the installer
x86_64
cd /tmp
curl -fsSLO https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
ARM64 (aarch64)
cd /tmp
curl -fsSLO https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-aarch64.sh
2.2 Install (non-interactive, recommended)
x86_64
bash Miniconda3-latest-Linux-x86_64.sh -b -p "$HOME/miniconda3"
ARM64 (aarch64)
bash Miniconda3-latest-Linux-aarch64.sh -b -p "$HOME/miniconda3"
2.3 Enable conda in your current shell
source "$HOME/miniconda3/etc/profile.d/conda.sh"
conda --version
If you want conda available automatically in new terminals:
"$HOME/miniconda3/bin/conda" init bash source ~/.bashrc
2.4 Install mamba (default solver)
conda install -n base -c conda-forge -y mamba
mamba --version
Might have to accept anaconda TOS.
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r
3) Create the Environment
mamba create -n remoterf -y -c conda-forge -c defaults python=3.10 pip setuptools wheel grpcio protobuf python-dotenv numpy scipy libiio pylibiio libusb
conda activate remoterf
python -m pip install -U pip
python -m pip install pyadi-iio remoterf-server
Server Config
Depending on your IT/ISP setup, this will vary, but regardless, you will need a static dial name, whether that be a IP address or a DNS.
Generate CA Certificates
If direct IP connection: (force overrides existing)
serverrf --gen-certs 192.168.1.50 --days 3650 --force
If using DNS: (todo: DNS on client side)
serverrf --gen-certs 192.168.1.50 --dns remoterf.local --days 3650 --force
Confirm/View:
serverrf --show-certs
Specify Outward facing Ports
By default, the users expect to adjacent ports. Thus, it is recommended to do the following:
# examples
serverrf --config --main-port 61000 --cert-port 61001
serverrf --config --main-port 20000 --cert-port 20001
serverrf --config --main-port 32000 --cert-port 32001
Confirm/View:
serverrf --config --show
Testing Connection
The server now should be functional in its most basic form. In the same conda env:
serverrf --serve
If you see something along the lines of: self.socket.bind(self.server_address) PermissionError: [Errno 13] Permission Denied, make sure the ports you are using are not OS reserved (<1024)
Confirm it works locally
Start the server:
serverrf -s
Take note of the Local IP and Local Port, for example, if you see:
Local IP: 164.67.195.210
Local Port: 61000
then run the below on a seperate terminal (make sure to keep serverrf -s RUNNING!)
Confirm that its reachable:
nc -vz 164.67.195.210 61000
nc -vz 164.67.195.210 61001
Network Testing
Same test, but on a different computer. Works for UNIX based machines:
Confirm that the Server is reachable:
nc -vz 164.67.195.210 61000
nc -vz 164.67.195.210 61001
You most likely will need to port forward, etc.
Troubleshooting: Some distros come with default firewall settings that block traffic on specific ports. Make sure that your firewall settings permit traffic to and from the server. Depending on the setup, you may also have ISP firewalls.
Server Device Configuration
Currently, only Adalm Plutos are supported.
To connect plutos to the server:
iio_info -s
If the pluto doesn't show up, yet the below works:
sudo iio_info -s
Run the below and reboot after:
sudo groupadd -f plugdev
sudo usermod -aG plugdev "$USER"
sudo tee /etc/udev/rules.d/53-adi-usb.rules >/dev/null <<'EOF'
# Type the below in
SUBSYSTEM=="usb", ATTR{idVendor}=="0456", MODE="0660", GROUP="plugdev"
EOF
sudo udevadm control --reload-rules
sudo udevadm trigger
sudo reboot now
The below should work as intended now:
iio_info -s
Look for 'serial='. Take note of this serial.
serverrf --device --add --pluto <device_id:name:serial>
# example
serverrf --device --add --pluto 0:pluto_0:104473f6
serverrf --device --add --pluto "1:Pluto SDR (OTA):58472j"
Run the below to check if this new device exists:
serverrf --device --show
Run the below to edit names of existing devices:
serverrf -d --edit-name 0 "New Name"
Note that all device and server config parameters need a 'restart' to take affect (ctrl + c -> serverrf -s).
Server Runtime Configuration
After running serverrf --serve, you’ll enter the RemoteRF Server Shell. This interactive shell is used for runtime administration: users, devices, reservations, user groups, enrollment codes, and live host-tunnel state.
Server
help/h/?— Show helpclear/cls— Clear the screenstatus/server status— Show server status (start time / uptime / bind + cert ports)quit/exit/q— Exit the server shell
Users
users list— List all accountsusers manage— Manage a specific user (perms / delete / reservations)users purge— Delete all usersusers perms— Show permissions table
Devices
devices list— List all devicesdevices status— Show live device routing/online/last_seen from the Host Tunnel
Reservations
reservations list— List all reservationsreservations purge— Delete all reservations
Groups
groups list— List user groupsgroups create— Create a user group (interactive)groups edit— Edit a user group (interactive)groups delete— Delete a user group (interactive)groups csv— Export all groups as a CSV
Enrollment Codes
codes list— List enrollment codescodes create— Create enrollment codes (interactive)codes delete— Delete an enrollment code (interactive)codes csv— Export all codes as a CSV
Host Tunnel
hosts status— Show live host online/last_seen and associated deviceshosts wipe— Wipe persisted host directory state and clear in-memory registry (prompts for confirmation)hosts wipe -y/hosts wipe --yes— Same as above, no prompt
Database
db purge— Remove all database entries
Adding Hosts
You will need, for each host, to run this first on the server CLI:
serverrf --host --token-create host-name --length 8
Which will return the corresponding command to run on the respective host to give that host access to the server. Below are some other related commands (ie: 'whitelists' hosts)
serverrf --host --show
serverrf --host --delete host-name
serverrf --host --wipe
Status (Optional)
If you desire to pull the server information (ie: live updates of reservation, server usage parameters, etc.)
It uses GitHub Gists to push the status updates.
Create public gist on your github. Keep note of the file name: (example) https://gist.github.com/ethange1/2a35e08a90bf88a70dfe7f42a55685ed
The last one is the "GIST_ID" part of the URL, e.g. "2a35e08a90bf88a70dfe7f42a55685ed"
Creating the GitHub PAT Token
- GitHub → Settings
- Developer settings
- Personal access tokens → Fine-grained tokens
- Generate new token
- Set repository access to "Public Respositories"
- Permissions: enable Gists: Read and write
- Generate + copy the token (you only see it once)
serverrf --gist --set --id <gist_id> --file <filename>
Run the server normally, and you should see your gist change every minute!
serverrf -s
Metadata
Release files for remoteRF-server-testing 0.0.15
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| remoterf_server_testing-0.0.15.tar.gz | 102.3 kB | Without provenance | Details for remoterf_server_testing-0.0.15.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| remoterf_server_testing-0.0.15-py3-none-any.whl | Python 3 | none | any | Details for remoterf_server_testing-0.0.15-py3-none-any.whl |
Total release size: 213.5 kB
Release files / remoterf_server_testing-0.0.15.tar.gz
| Download URL | remoterf_server_testing-0.0.15.tar.gz |
|---|---|
| Size | 102.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
500a12642cb95aa71029ed8f1ae565d1a815ddd00e9c6545939eb0cb5b529741
|
|
BLAKE2b-256 checksum How to use checksums |
87e4d1f3c92db45b51fdb1e62abf3fef86cd25a5ef77fd57a4f94df8c6c24056
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.2
|
Release files / remoterf_server_testing-0.0.15-py3-none-any.whl
| Download URL | remoterf_server_testing-0.0.15-py3-none-any.whl |
|---|---|
| Size | 111.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e32f558ae69e925c033b97f52570f105740c5ca740b979d3ceddc8f8e8e65e80
|
|
BLAKE2b-256 checksum How to use checksums |
cb957573fe7f8622dd25053cd3754892d022938e9c00a0f0ab0f078fd41c4215
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.2
|
Security for remoteRF-server-testing 0.0.15
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.