Rotator Docker Image
MOAS-Rotator is published as a container image on GitHub Container Registry (GHCR):
ghcr.io/m1dst/moas-rotator
The Docker image runs the native MOASRotator binary directly.
What the image includes
Section titled “What the image includes”- Runtime base image:
ubuntu:24.04 - Binary:
/app/MOASRotator - Container port:
13020/tcp
Supported image tags
Section titled “Supported image tags”The publish workflow pushes multiple tags to GHCR:
latest- Version tags from Git tags, for example
v2.1.0 - Commit SHA tags (
sha-*)
Use version tags in production for reproducible deployments.
Architecture support
Section titled “Architecture support”Published GHCR images are multi-architecture:
linux/amd64linux/arm64
So on ARM64 hosts (for example Raspberry Pi 64-bit or Apple Silicon Macs), docker pull ghcr.io/m1dst/moas-rotator:<tag> will automatically fetch the ARM64 variant.
Notes:
- Multi-arch images are created by the GitHub publish workflow using Buildx.
- On macOS, run with Docker Desktop. Direct USB serial passthrough is typically limited.
- There are no macOS-native container images; Mac runs the Linux image variant via Docker Desktop.
Pull the prebuilt image
Section titled “Pull the prebuilt image”docker pull ghcr.io/m1dst/moas-rotator:latestOr pin to a release:
docker pull ghcr.io/m1dst/moas-rotator:v2.0.0Quick start
Section titled “Quick start”Run the image and publish the rotator control port:
docker run --rm -it \ -p 13020:13020 \ ghcr.io/m1dst/moas-rotator:latestRun with USB serial hardware (Linux host)
Section titled “Run with USB serial hardware (Linux host)”Pass through each required serial device:
docker run --rm -it \ --device=/dev/ttyUSB0:/dev/ttyUSB0 \ -p 13020:13020 \ ghcr.io/m1dst/moas-rotator:latestIf your station has multiple rotators, add one --device flag per device.
13020/tcp: MOAS-Rotator control endpoint used by MOAS-Server
Expose this port where MOAS-Server can reach it.
Checking logs
Section titled “Checking logs”Run in detached mode:
docker run -d \ --name moas-rotator \ -p 13020:13020 \ ghcr.io/m1dst/moas-rotator:latestThen inspect logs:
docker logs moas-rotatorOr follow logs live:
docker logs -f moas-rotatorA typical startup log looks like:
__ __ ___ _ ____| \/ |/ _ \ / \ / ___|| |\/| | | | |/ _ \ \___ \| | | | |_| / ___ \ ___) ||_| |_|\___/_/ \_\____/
____ ___ _____ _ _____ ___ ____| _ \ / _ \_ _|/ \|_ _/ _ \| _ \| |_) | | | || | / _ \ | || | | | |_) || _ <| |_| || |/ ___ \| || |_| | _ <|_| \_\\___/ |_/_/ \_\_| \___/|_| \_\
Master Of Antenna Switching (MOAS) RotatorDeveloped by James Patterson, M1DST and Paul Young, K1XM.Version: v2.0.0Build: Mar 17 2026 21:51:21TCP port: 13020
MOAS Rotator CLI running. Press Ctrl+C to stop.Portainer deployment
Section titled “Portainer deployment”If you are using Portainer and want to use a Stack, you can find an example below.
version: "3.8"
services:
moas-rotator:
# Override IMAGE in Portainer if needed.
image: ${IMAGE:-ghcr.io/m1dst/moas-rotator:latest}
container_name: moas-rotator
restart: unless-stopped
ports:
# MOAS rotator command/control
- "13020:13020/tcp"
# Optional serial passthrough (uncomment if using USB serial hardware).
# devices:
# - "/dev/ttyUSB0:/dev/ttyUSB0"
Default behaviour of the stack:
- Uses
ghcr.io/m1dst/moas-rotator:latest(override withIMAGEif needed) - Exposes
13020/tcp - Includes optional serial passthrough lines you can uncomment
Troubleshooting
Section titled “Troubleshooting”- Container exits immediately:
- Run
docker logs <container>for startup errors.
- Run
- MOAS-Server cannot connect:
- Ensure
13020/tcpis published and reachable from MOAS-Server.
- Ensure
- USB serial hardware not detected:
- Confirm
--devicemapping and permissions on/dev/ttyUSB*.
- Confirm
Security and operations notes
Section titled “Security and operations notes”- Prefer pinned tags (
vX.Y.Z) overlatestin production. - Limit network exposure to trusted station networks.