Server-side services for the WSPRDAEMON WSPR propagation monitoring system. This repository contains three main services:
- wsprnet_scraper - Scrapes WSPR spot data from wsprnet.org
- wsprdaemon_server - Processes uploaded .tbz files from wsprdaemon clients
- wsprdaemon_reflector - Distributes uploaded files to multiple servers
┌─────────────────────┐
│ WSPRDAEMON Clients │
│ (Receivers/Kiwis) │
└──────────┬──────────┘
│ Upload .tbz files
▼
┌─────────────────────┐ ┌──────────────────┐
│ Reflector Service │────▶│ Server 1 │
│ (Distribution) │ │ - Scraper │
└─────────────────────┘ │ - Server │
│ │ - ClickHouse │
│ └──────────────────┘
▼
┌──────────────────┐
│ Server 2 │
│ - Scraper │
│ - Server │
│ - ClickHouse │
└──────────────────┘
- Ubuntu 24.04 LTS (or similar Debian-based system)
- Python 3.10 or later
- ClickHouse 24.x or later
- 4GB+ RAM (8GB+ recommended)
- Fast storage (SSD recommended for database)
sudo apt update
sudo apt install -y python3 python3-pip python3-venv git rsyncThe server services require ClickHouse to be installed and running:
# Install ClickHouse
curl https://clickhouse.com/ | sh
sudo ./clickhouse install
# Start ClickHouse
sudo systemctl start clickhouse-server
sudo systemctl enable clickhouse-server
# Set default user password
clickhouse-client --password
# Then: ALTER USER default IDENTIFIED BY 'your_secure_password';cd /home/wsprdaemon
git clone https://github.com/rrobinett/wsprdaemon-server.git wsprdaemon
cd wsprdaemonFor servers that will process WSPR data:
sudo bash install-servers.shThis installs:
- Python scripts to
/usr/local/bin/ - Wrapper scripts to
/usr/local/bin/ - Systemd services to
/etc/systemd/system/ - Creates
/etc/wsprdaemon/config directory - Creates Python virtual environment with dependencies
For servers that will distribute files:
sudo bash install-reflector.shCreate /etc/wsprdaemon/clickhouse.conf:
sudo cp config-examples/clickhouse.conf.example /etc/wsprdaemon/clickhouse.conf
sudo nano /etc/wsprdaemon/clickhouse.confSet strong passwords for all database users.
Create /etc/wsprdaemon/wsprnet.conf:
sudo cp config-examples/wsprnet.conf.example /etc/wsprdaemon/wsprnet.conf
sudo nano /etc/wsprdaemon/wsprnet.confRequired: Set your wsprnet.org username and password (register at wsprnet.org if needed).
Create /etc/wsprdaemon/wsprdaemon.conf:
sudo cp config-examples/wsprdaemon.conf.example /etc/wsprdaemon/wsprdaemon.conf
sudo nano /etc/wsprdaemon/wsprdaemon.confCreate /etc/wsprdaemon/reflector_destinations.json:
sudo cp config-examples/reflector_destinations.json.example /etc/wsprdaemon/reflector_destinations.json
sudo nano /etc/wsprdaemon/reflector_destinations.jsonConfigure destination servers, SSH credentials, and rsync settings.
sudo chown root:wsprdaemon /etc/wsprdaemon/*.conf
sudo chmod 640 /etc/wsprdaemon/*.conf
sudo chown wsprdaemon:wsprdaemon /etc/wsprdaemon/*.json
sudo chmod 644 /etc/wsprdaemon/*.json# Enable and start service
sudo systemctl enable wsprnet_scraper@wsprnet
sudo systemctl start wsprnet_scraper@wsprnet
# Check status
sudo systemctl status wsprnet_scraper@wsprnet
# View logs
sudo journalctl -u wsprnet_scraper@wsprnet -f
# or
sudo tail -f /var/log/wsprdaemon/wsprnet_scraper.log# Enable and start service
sudo systemctl enable wsprdaemon_server@wsprdaemon
sudo systemctl start wsprdaemon_server@wsprdaemon
# Check status
sudo systemctl status wsprdaemon_server@wsprdaemon
# View logs
sudo journalctl -u wsprdaemon_server@wsprdaemon -f
# or
sudo tail -f /var/log/wsprdaemon/wsprdaemon_server.log# Enable and start service
sudo systemctl enable wsprdaemon_reflector@reflector
sudo systemctl start wsprdaemon_reflector@reflector
# Check status
sudo systemctl status wsprdaemon_reflector@reflector
# View logs
sudo journalctl -u wsprdaemon_reflector@reflector -f
# or
sudo tail -f /var/log/wsprdaemon/reflector.logwsprnet.spots- All WSPR spots from wsprnet.orgwsprnet.spots_recent- Last 7 days (faster queries)wsprnet.spots_frequency_overflow- Spots with out-of-band frequencies
wsprdaemon.spots- WSPR spots from local receiverswsprdaemon.noise- Background noise measurements
See the individual service documentation in the docs/ directory for detailed schema information.
- Check systemd status:
sudo systemctl status service_name - Check logs:
sudo journalctl -u service_name -n 100 - Verify configuration files exist and have correct permissions
- Test Python venv:
/home/wsprdaemon/wsprdaemon/venv/bin/python3 --version
- Verify ClickHouse is running:
sudo systemctl status clickhouse-server - Test connection:
clickhouse-client --password - Check credentials in
/etc/wsprdaemon/clickhouse.conf - Verify database users exist (see service documentation)
- Verify credentials in
/etc/wsprdaemon/wsprnet.conf - Test login manually at wsprnet.org
- Check session file:
/var/lib/wsprdaemon/wsprnet_session.json - Clear session file and restart service to force re-login
- Verify SSH key authentication to destination servers
- Check rsync connectivity:
sudo -u wsprdaemon rsync -avz --dry-run /tmp/ user@host:/path/ - Verify all directories are on the same filesystem (for hard links)
- Check spool directories:
ls -la /var/spool/wsprdaemon/reflector/
- Credentials: All configuration files containing passwords should have 640 permissions
- SSH Keys: The wsprdaemon user needs SSH key access to destination servers (reflector only)
- Firewall: ClickHouse port 8123 should only be accessible from trusted servers
- Updates: Keep ClickHouse and system packages updated
This is a specialized system for WSPR data collection. If you have improvements or bug fixes:
- Test thoroughly on a non-production system
- Ensure no private credentials are included
- Document any configuration changes needed
- Submit pull requests with clear descriptions
MIT License - See LICENSE file for details
For issues or questions about WSPRDAEMON server services, please open an issue on GitHub.
For WSPR protocol questions, see: http://wsprnet.org
For ClickHouse questions, see: https://clickhouse.com/docs
- WSPRDAEMON Client - Client-side receiver and processing code