Skip to content

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.

  • Runtime base image: ubuntu:24.04
  • Binary: /app/MOASRotator
  • Container port: 13020/tcp

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.

Published GHCR images are multi-architecture:

  • linux/amd64
  • linux/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.
Terminal window
docker pull ghcr.io/m1dst/moas-rotator:latest

Or pin to a release:

Terminal window
docker pull ghcr.io/m1dst/moas-rotator:v2.0.0

Run the image and publish the rotator control port:

Terminal window
docker run --rm -it \
-p 13020:13020 \
ghcr.io/m1dst/moas-rotator:latest

Pass through each required serial device:

Terminal window
docker run --rm -it \
--device=/dev/ttyUSB0:/dev/ttyUSB0 \
-p 13020:13020 \
ghcr.io/m1dst/moas-rotator:latest

If 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.

Run in detached mode:

Terminal window
docker run -d \
--name moas-rotator \
-p 13020:13020 \
ghcr.io/m1dst/moas-rotator:latest

Then inspect logs:

Terminal window
docker logs moas-rotator

Or follow logs live:

Terminal window
docker logs -f moas-rotator

A typical startup log looks like:

__ __ ___ _ ____
| \/ |/ _ \ / \ / ___|
| |\/| | | | |/ _ \ \___ \
| | | | |_| / ___ \ ___) |
|_| |_|\___/_/ \_\____/
____ ___ _____ _ _____ ___ ____
| _ \ / _ \_ _|/ \|_ _/ _ \| _ \
| |_) | | | || | / _ \ | || | | | |_) |
| _ <| |_| || |/ ___ \| || |_| | _ <
|_| \_\\___/ |_/_/ \_\_| \___/|_| \_\
Master Of Antenna Switching (MOAS) Rotator
Developed by James Patterson, M1DST and Paul Young, K1XM.
Version: v2.0.0
Build: Mar 17 2026 21:51:21
TCP port: 13020
MOAS Rotator CLI running. Press Ctrl+C to stop.

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 with IMAGE if needed)
  • Exposes 13020/tcp
  • Includes optional serial passthrough lines you can uncomment
  • Container exits immediately:
    • Run docker logs <container> for startup errors.
  • MOAS-Server cannot connect:
    • Ensure 13020/tcp is published and reachable from MOAS-Server.
  • USB serial hardware not detected:
    • Confirm --device mapping and permissions on /dev/ttyUSB*.
  • Prefer pinned tags (vX.Y.Z) over latest in production.
  • Limit network exposure to trusted station networks.