Experience the future of Amateur Radio Networking. Deploy a professional-grade DX Cluster node in minutes, not hours.
β¨ Features β’ π Quick Start β’ βοΈ Configuration β’ π Documentation β’ π FAQ
Welcome to 9M2PJU-DXSpider-Docker. We've taken the legendary DXSpider softwareβthe backbone of the global DX Cluster networkβand encased it in a state-of-the-art Docker container.
Why is this cool?
- Zero Dependencies: No need to install Perl, CPAN modules, or databases manually.
- Sandboxed: Keeps your server clean and secure.
- Portable: Move your entire cluster to a new server just by copying a few folders.
- Beautiful: Designed for modern sysops who care about quality and ease of use.
Standing on Giant Shoulders: A massive tribute to Dirk Koopman (G1TLH), the creator of DXSpider, for his decades of service to our hobby.
| Feature | Description |
|---|---|
| π Instant Launch | Type 3 lines of code, and you are live. Literally. |
| π Web Console | Built-in web terminal for easy administration without SSH. |
| π Iron-Clad | Runs with minimal privileges. Hardened for the modern web. |
| πΎ Data Safety | Your user database and spots are safe in persistent volumes. |
| π Universal | Runs on your powerful server OR your customized Raspberry Pi. |
| π€ Automation | Built-in Cron and Startup script support. |
| β‘ Performance | Optimized for low-latency spot delivery. |
How does the magic happen?
graph LR
subgraph "Your Station (Host)"
Config[".Env Config"]
Data["π Local Data"]
end
subgraph "The Engine (Docker)"
DXSpider["π·οΈ DXSpider Core"]
Cron["β±οΈ Scheduler"]
end
World["π Global Network"]
Users["π¨βπ» Hams (Port 7300)"]
Config --> DXSpider
Data <--> DXSpider
DXSpider <--> World
Users --> DXSpider
Cron --> DXSpider
Follow these simple steps to join the global network.
- Docker & Docker Compose installed.
1. Get the Code
git clone https://github.com/9M2PJU/9M2PJU-DXSpider-Docker.git
cd 9M2PJU-DXSpider-Docker2. Configure Identity
Open .env and tell the cluster who you are.
nano .env
# Set CLUSTER_CALLSIGN, CLUSTER_SYSOP_CALLSIGN, etc.3. Launch!
docker compose up -d --buildπ You are live! Access your node:
- Web Console:
http://localhost:8080(Use admin credentials set in.env) - Telnet:
telnet localhost 7300
This project supports a wide range of CPU architectures, making it compatible with everything from high-end servers to Raspberry Pi Zero.
Supported Platforms:
linux/amd64(Standard 64-bit PC)linux/arm64(Raspberry Pi 4/5, Apple Silicon, AWS Graviton)linux/arm/v7(Raspberry Pi 2/3, 32-bit)linux/arm/v6(Raspberry Pi Zero/1)
If you prefer not to use Docker Compose, you can run the cluster with a single docker run command. This is useful for quick testing or cloud environments like AWS ECS or Azure ACI.
docker run -d \
--name dxspider \
-p 7300:7300 \
-p 8080:8080 \
-e CLUSTER_CALLSIGN=9M2PJU-2 \
-e CLUSTER_SYSOP_CALLSIGN=9M2PJU \
-v $(pwd)/local_data:/spider/local_data \
ghcr.io/9m2pju/9m2pju-dxspider-docker:mainTip
Persistent Data: Always ensure you mount a volume to /spider/local_data to keep your user database and spots persistent!
Note
This is optional. Our GitHub Actions automatically build and push these images for you. Use this only if you want to build a custom version locally.
To build for all platforms manually using Docker Buildx:
docker buildx build --platform linux/amd64,linux/arm64,linux/arm/v7,linux/arm/v6 -t ghcr.io/9m2pju/9m2pju-dxspider-docker:latest --push .Edit these in your .env file. We've set sensible defaults for everything else.
| Variable | Description | Example |
|---|---|---|
CLUSTER_CALLSIGN |
Required. The callsign of your node. | 9M2PJU-2 |
CLUSTER_SYSOP_CALLSIGN |
Required. Your admin callsign. | 9M2PJU |
CLUSTER_LOCATOR |
Your Grid Square. | OJ03 |
CLUSTER_LATITUDE |
Your Latitude. | +03 08 |
CLUSTER_LONGITUDE |
Your Longitude. | +101 41 |
CLUSTER_PORT |
The user-facing Telnet port. | 7300 |
CLUSTER_SYSOP_PORT |
The Web Console port. | 8080 |
OVERWRITE_CONFIG |
Set to yes to force-regenerate DXVars.pm. |
no |
WEB_USER |
Username for the Web Console. | sysop |
WEB_PASS |
Password for the Web Console. | supersecret |
CLUSTER_DBUSER |
Username for the MariaDB database. | sysop |
CLUSTER_DBPASS |
Password for the MariaDB database. | password |
π Understanding the Directory Structure (Click to Expand)
We map several folders from your host machine into the container using Docker Volumes. This is what allows your data to SURVIVE when you update or restart the container.
./local_data: CRITICAL. Storesusers.v3j(database), spots, debug logs, and state. Back this folder up regularly!./connect: Scripts that tell your node how to connect to other nodes../cmd: Custom commands you create for your users../msg: Stores bulletins and private messages../local_cmd: System-level local command overrides../startup: Files executed once when the container starts../crontab: Scheduled tasks.
π How to Add Partner Nodes (Click to Expand)
Connecting to the global DX Cluster network is a social and technical process. Follow these steps to link your node:
[!IMPORTANT] Ask Before You Link: You cannot simply "connect" to any node. You MUST contact the Sysop of the partner node (e.g., via email or DX message) to ask for a "partner link." They need to configure their cluster to accept your connection while you configure yours to dial them.
- Coordinate with a Sysop: Find a nearby or reliable node and request an inter-node link.
- Use a Password: Highly Recommended. Always agree on a connection password with your partner. This prevents unauthorized users from spoofing your node and protects the network from spam.
- Create a Connection Script: Create a file in
connect/named after the target node (lowercase).- Example:
connect/gb7mbc
- Example:
- Add the Connection Logic:
timeout 60 # connect telnet <hostname> <port> connect telnet gb7mbc.spud.org 7300 client gb7mbc telnet # Interaction (Wait for 'login', send 'user') login gb7mbc pass mysecurepassword # agreed upon with the partner sysop
- Test it: Run from the host shell:
docker compose exec dxspider sh -c '/spider/perl/connect gb7mbc'
β±οΈ Automation (Cron & Startup) (Click to Expand)
Startup Tasks
Edit the startup file. Commands here run every time the container boots.
# Example 'startup' file content:
load/forward
set/spider gb7mbc
connect gb7mbcScheduled Tasks (Cron)
Edit the crontab file. The format is standard Min/Hour/Day/Month/DayOfWeek.
# Example 'crontab' file content:
# Check connection to GB7MBC every 10 mins
0,10,20,30,40,50 * * * * start_connect('gb7mbc') unless connected('gb7mbc')DXSpider Docker is built to run anywhere. Here is how to deploy it to major cloud providers.
Recommended: EC2 with Docker Compose
- Launch an EC2 Instance (t3.micro or t4g.small for ARM64).
- Install Docker and Docker Compose.
- Clone this repo and follow the Quick Start.
- Security Group: Open ports
7300(Telnet) and8080(Web) to your desired IP ranges.
Advanced: ECS Fargate
- Use our sample task definition: ecs-task-def.json.
- Mount an EFS (Elastic File System) volume to
/spider/local_datafor persistent storage.
Recommended: Compute Engine
- Create a VM instance (e2-micro is sufficient).
- Use Container-Optimized OS (COS) or standard Ubuntu with Docker.
- Deploy via Docker Compose.
Alternative: Cloud Run (Web Console Only)
- If you only need the Web Console, you can deploy directly to Cloud Run using our template: cloud-run.yaml.
- Note: Cloud Run is serverless and works best for stateless web traffic; use with Cloud SQL or persistent disks for full functionality.
When running in the cloud, never store your data inside the container or on a temporary local disk.
- AWS: Use EFS.
- GCP: Use Filestore or Persistent Disks.
- Azure: Use Azure Files.
Best for: Mission-Critical Enterprise Hosting
Azure Container Instances (ACI) provide a great environment for DXSpider.
- Azure Portal: Go to "Container Instances" -> Create.
- CLI (Quick Start):
az container create \ --resource-group myResourceGroup \ --name dxspider-cluster \ --image ghcr.io/9m2pju/9m2pju-dxspider-docker:main \ --dns-name-label myclustersite \ --ports 7300 8080 \ --azure-file-volume-account-name myStorageAccount \ --azure-file-volume-account-key myStorageKey \ --azure-file-volume-share-name dxspider-data \ --azure-file-volume-mount-path /spider/local_data
- Template: Use our Azure ACI Template for automated deployment.
- Storage: Use Azure Files for
local_datato ensure persistence across container restarts.
If you are running your own home lab or data center, DXSpider Docker works perfectly on major hypervisors.
Best Practice: Linux VM
- Create a Virtual Machine running Ubuntu Server or Debian.
- Enable Hardware Virtualization in the VM settings (for better performance).
- Install Docker and follow the Quick Start.
- Network: Use "Bridged" networking if you want your DX Cluster to have its own dedicated IP address on your LAN.
Method A: Linux VM (Recommended)
- Create a standard VM and install Docker. This is the most stable and isolated method.
Method B: LXC Container (Advanced) You can run Docker inside LXC, but it requires specific settings:
- Check "nesting" and "keyctl" in the Container Features.
- Ensure the container is unprivileged for better security (though privileged may be needed for some advanced networking).
- Mount your data volumes from the Proxmox host to keep cluster data persistent even if the LXC is deleted.
- Port Forwarding: Ensure your router/firewall forwards port
7300(TCP) to your VM/Container's IP. - Failover: If running on Proxmox/VMware clusters, HA (High Availability) will work out-of-the-box since all state is stored in the mapped volumes.
Windows users can run DXSpider Docker easily using WSL2 or traditional virtualization.
This is the fastest and most efficient way to run Docker on Windows.
- Install Docker Desktop and enable the WSL2 Backend.
- Install a Linux distribution (e.g., Ubuntu) from the Microsoft Store.
- Performance Tip: Clone this repository inside the WSL2 file system (e.g.,
~/dxspider) rather than on the Windows C: drive (/mnt/c/). This significantly speeds up disk operations. - Follow the Quick Start from within your WSL2 terminal.
If you prefer not to use Docker Desktop:
- Enable the Hyper-V feature in Windows.
- Create a Linux Virtual Machine.
- Install Docker and follow the standard Linux instructions.
When using .env or Volume mappings on Windows, use forward slashes / or escaped backslashes \\ to avoid path resolution errors.
My container keeps restarting!
Check the logs immediately:
docker compose logs -fCommon issues:
- Invalid characters in
.env. - Port 7300 is already in use by another application.
How do I access the internal shell?
If you need to run manual spider commands or debug internally:
docker compose exec dxspider sh
# Then run commands like:
/spider/perl/console.plHow do I update to the latest version?
Simple. We built this to be easy.
git pull # Get latest docker configs
docker compose down # Stop old container
docker compose up -d --build # Build new oneYour data in local_data will remain safe.
To understand why this project exists, we must look back at the rich history of Amateur Radio networking.
In the late 1980s, Dick Newell (AK1A) revolutionized DX hunting by creating the PacketCluster software. Before this, DX spots could only be shared via voice repeaters or local shouting. AK1A's software allowed spots to be distributed over Packet Radio (AX.25) networks. A "Sysop" would run a node, and users would connect via radio to see a live stream of DX spots.
By the late 1990s, the internet was emerging, and the original DOS-based AK1A software was showing its age. Dirk Koopman (G1TLH) saw the need for a more flexible, modern solution that could bridge the gap between RF networks and the Internet.
He chose Perl for its robust text handling and modularity, creating DXSpider. It was designed to be:
- Compatible: It spoke the exact same protocol as AK1A, so users didn't need to change their client software.
- Scalable: It could handle hundreds of simultaneous internet connections, something the old PC-based clusters couldn't dream of.
- Open: It allowed the community to contribute and extend the software.
Today, DXSpider powers a vast majority of the world's DX Cluster nodes, silently processing millions of spots a year and keeping the global amateur radio community connected. 9M2PJU-DXSpider-Docker is simply the next step in this evolutionβpackaging this history into a container for the future.
We love community involvement!
- Fork it.
- Create your feature branch (
git checkout -b feature/cool-thing). - Commit your changes.
- Push to the branch.
- Create a Pull Request.
Distributed under the GNU General Public License v3.0. See LICENSE for more information.
Enjoying the project? β Star us on GitHub!
If you find this project useful, you can support its development by buying me a coffee:
Designed with β€οΈ by 9M2PJU 73 and Good DX!
