A complete Docker setup for running a Reticulum transport node with LoRa, TCP, and optional I2P interfaces.
- Docker and Docker Compose installed
- RNode-compatible device (e.g., Heltec LoRa32 V3) connected via USB
- Port 4242 forwarded if you want external TCP connections
First, identify your RNode device:
# List USB serial devices
ls -l /dev/serial/by-id/
# You should see something like:
# usb-Heltec_LoRa32_V3_XXXXXX-if00 -> ../../ttyUSB0Locate the appropriate Dockerfile.<platform> for your platform and rename it to Dockerfile OR edit docker-compose.yml and update the build value to target the correct platform specific file.
Edit docker-compose.yml and update the device mapping with your actual device ID:
devices:
- "/dev/serial/by-id/usb-Heltec_LoRa32_V3_YOUR_ID-if00:/dev/ttyUSB0"# Build the image
docker-compose build
# Start the container
docker-compose up -d
# View logs
docker-compose logs -fOn first run, a default config will be created at ./config/config. You can customize it by editing this file and restarting:
nano ./config/config
docker-compose restartTo create a private network, add these lines to your interface configurations:
network_name = family_network_2024
passphrase = your_secure_passphrase_here
- Uncomment the I2P interface section in the config
- Restart the container
- Wait 5-10 minutes for I2P to bootstrap
- Check logs for your I2P address:
docker-compose logs | grep "I2P"
Share this config snippet:
[[Family Node]]
type = TCPClientInterface
enabled = yes
target_host = your.ip.address.or.domain
target_port = 4242
network_name = family_network_2024 # if using passphrases
passphrase = your_secure_passphrase_here # if using passphrases
Share your I2P base32 address (found in logs):
[[Family I2P Node]]
type = I2PInterface
enabled = yes
peers = xxxxxx.b32.i2p
# View logs
docker-compose logs -f
# Check Reticulum status
docker-compose exec reticulum rnstatus
# Restart container
docker-compose restart
# Stop container
docker-compose down
# Rebuild after changes
docker-compose up -d --build- Check device is connected:
ls -l /dev/ttyUSB* - Check permissions:
groups(should includedialout) - Verify device mapping in docker-compose.yml
- Try using
/dev/ttyUSB0directly instead of by-id path
- Verify port 4242 is forwarded on your router
- Check firewall rules:
sudo ufw status - Test externally:
telnet your-ip 4242
- Wait 10-15 minutes for initial bootstrap
- Check I2P logs:
docker-compose logs i2pd - Verify I2P interface is uncommented and enabled in config
- Check logs:
docker-compose logs - Verify all volumes are accessible
- Check for port conflicts:
sudo netstat -tlnp | grep 4242
- Change default passphrases immediately
- Use strong, unique passphrases (20+ characters)
- Keep the container updated:
docker-compose pull && docker-compose up -d - Consider running on isolated VLAN if exposing to internet
- Monitor resource usage:
docker stats
.
├── Dockerfile # Container definition
├── docker-compose.yml # Service configuration
├── start.sh # Container startup script
├── config/ # Reticulum config (auto-created)
│ └── config
├── i2pd_data/ # I2P data (auto-created)
└── logs/ # Application logs (auto-created)
To update Reticulum:
docker-compose down
docker-compose build --no-cache
docker-compose up -d