Skip to content

Latest commit

 

History

History
445 lines (403 loc) · 18.1 KB

README.md

File metadata and controls

445 lines (403 loc) · 18.1 KB

URFd Docker Image

This Ubuntu Linux based Docker image allows you to run N7TAE's URFd and tcd without having to configure any files or compile any code.

This is a currently a single-arch image and will only run on amd64 devices.

Image Tag Architectures Base Image
latest, ubuntu amd64 Ubuntu 22.04

Compatibility

urfd-docker requires certain variables be defined in your docker run command or docker-compose.yml (recommended) so it can automate the configuration upon bootup.

Required

# Define your FCC callsign
CALLSIGN="your_callsign"

# Define your email address which will appear on dashboard
EMAIL="[email protected]"

# Define your fully-qualified domain name
URL="your_domain.com"

# Where ? is A-Z or 0-9. NO EXCEPTIONS!
URFNUM="URF???"

Optional

# DO NOT enable the "calling home" feature unless you are sure
# that you will not be infringing on an existing XLX or XRF
# reflector with the same callsign suffix. If you don't understand
# what this means, don't set CALLHOME: 'true'
CALLHOME=false

# Setting this to true will ensure 'https' is used in URL
SSL=true

# Port that dashboard runs on. If SSL is enabled, then this is used for the backend proxy service
PORT="8080"

# Get an ID here -> https://register.ysfreflector.de
YSFID="12345"

# Add your ID to the file here -> https://github.com/g4klx/NXDNClients/blob/master/NXDNGateway/NXDNHosts.txt
NXDNID="12345"

# Add your ID to the file here -> https://github.com/g4klx/P25Clients/blob/master/P25Gateway/P25Hosts.txt
P25ID="12345"

# Set to 'true' if you intend to interlink with Brandmeister (TGIF is better)
BRANDMEISTER=false

# Set to 'true' if you want to enable Allstar node
ALLSTAR=false

# Change to your country
COUNTRY="US"

# Decribe your reflector. used in various places on dashboard *and* YSF registry
DESCRIPTION="My urfd-docker reflector"

# MODULES: ABCDEFGHIJKLMNOPQRSTUVWXYZ
MODULES="ABCD"

# Name your modules however you like (container only supports naming first 4)
MODULEA="Main"
MODULEB="D-Star"
MODULEC="DMR"
MODULED="YSF"

# Set your timezone here if you want dashboard times to apear in local time
TZ="UTC"

Usage

Command Line:

docker \
  run \
    --detach \
    --name urfd \
    --hostname urfd_container \
    --restart unless-stopped \
    --volume /opt/urfd:/config \
    --env CALLSIGN=your_callsign \
    --env [email protected] \
    --env URL=your_domain.com \
    --env URFNUM=URF??? \
  mfiscus/urfd:latest

Parameters

The parameters are split into two halves, separated by a colon, the left hand side representing the host and the right the container side.

  • --detach - runs container in background (required)
  • --env - set environment variables in the container (minimum required: CALLSIGN, EMAIL, URL, URFNUM )
  • --hostname - assigns a container host name (optional)
  • --name - assigns a name to the container (optional)
  • --restart - set restart policy to apply when a container exits (optional)
  • --volume - maps a local directory used for backing up state and configuration files including callinghome.php and urfd.ini (required)

Docker Compose Examples

Using Docker Compose (recommended):

version: '3.8'

services:
  urfd:
    image: mfiscus/urfd:latest
    container_name: urfd
    hostname: urfd_container
    environment:
      # DO NOT enable the "calling home" feature unless you are sure
      # that you will not be infringing on an existing XLX or XRF
      # reflector with the same callsign suffix. If you don't understand
      # what this means, don't set CALLHOME: 'true'
      CALLHOME: 'false'
      # Define your FCC callsign
      CALLSIGN: 'your_callsign'
      # Define your email address which will appear on dashboard
      EMAIL: '[email protected]'
      # Define your fully-qualified domain name
      URL: 'your_domain.com'
      # Setting this to true will ensure 'https' is used in URL
      SSL: 'true'
      # Port that dashboard runs on. If SSL is enabled, then this is used for the backend proxy service
      PORT: '8080'
      # Where ? is A-Z or 0-9. NO EXCEPTIONS!
      URFNUM: 'URF???'
      # Get an ID here -> https://register.ysfreflector.de
      YSFID: '12345'
      # Add your ID to the file here -> https://github.com/g4klx/NXDNClients/blob/master/NXDNGateway/NXDNHosts.txt
      NXDNID: '12345'
      # Add your ID to the file here -> https://github.com/g4klx/P25Clients/blob/master/P25Gateway/P25Hosts.txt
      P25ID: '12345'
      # Set to 'true' if you intend to interlink with Brandmeister (TGIF is better)
      BRANDMEISTER: 'false'
      # Set to 'true' if you want to enable Allstar node
      ALLSTAR: 'false'
      # Change to your country
      COUNTRY: 'US'
      # Decribe your reflector. used in various place on dashboard and YSF registry
      DESCRIPTION: 'My urfd-docker reflector'
      # MODULES: ABCDEFGHIJKLMNOPQRSTUVWXYZ
      MODULES: 'ABCD'
      # Name your modules however you like (container only supports naming first 4)
      MODULEA: 'Main'
      MODULEB: 'D-Star'
      MODULEC: 'DMR'
      MODULED: 'YSF'
      # Set your timezone here if you want dashboard times to apear in local time
      TZ: 'UTC'
    # Privilged MUST be enabled if you are using AMBE transcoding usb hardware 
    privileged: true
    volumes:
      # Local directory where state and config files (including callinghome.php and urfd.ini)
      # will be saved. Change /opt/urfd to any location you prefer on your host machine
      - /opt/urfd:/config
    restart: unless-stopped

Using Docker Compose (recommended) and traefik (reverse proxy w/ssl):

version: '3.8'

networks:
  proxy:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: br-proxy
    ipam:
      driver: default
      config:
        - subnet: "10.0.0.0/24"
          gateway: "10.0.0.1"
          ip_range: "10.0.0.0/30"

services:
  traefik:
    image: traefik:latest
    container_name: "traefik"
    domainname: your_domain.com
    hostname: traefik_container
    command:
      # Enable dashboard
      - --api.dashboard=true
      # Enable docker backend with default settings
      - --providers.docker=true
      # Do not expose containers by default
      - --providers.docker.exposedbydefault=false
      # Default docker network used
      - --providers.docker.network=proxy
      # logging
      - --accesslog=true
      - --accesslog.filepath=/var/log/traefik.log
      - --accesslog.bufferingsize=100
      # create entrypoints
      - --entrypoints.webinsecure.address=:80/tcp
      - --entrypoints.websecure.address=:443/tcp
      # your_domain.com tls
      # Comment the following line to use production resolver
      # (don't do this until you're sure everyting is configured properly)
      - --certificatesresolvers.your_domain.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory
      # Be certain to add your email address here and change 'your_domain' to something meaninful
      - [email protected]
      - --certificatesresolvers.your_domain.acme.storage=/letsencrypt/your_domain.com.json
      - --certificatesresolvers.your_domain.acme.certificatesDuration=2160
      - --certificatesresolvers.your_domain.acme.keytype=RSA4096
      - --certificatesresolvers.your_domain.acme.tlschallenge=true
      # urfd
      - --entrypoints.urfd-m17.address=:17000/udp
      - --entrypoints.urfd-m17.udp.timeout=86400s
      - --entrypoints.urfd-dht.address=:17171/udp
      - --entrypoints.urfd-dht.udp.timeout=86400s
      - --entrypoints.urfd-http.address=:8470/tcp
      - --entrypoints.urfd-repnet.address=:8080/udp
      - --entrypoints.urfd-repnet.udp.timeout=86400s
      - --entrypoints.urfd-bm.address=:10002/udp
      - --entrypoints.urfd-bm.udp.timeout=86400s
      - --entrypoints.urfd-interlink.address=:10017/udp
      - --entrypoints.urfd-interlink.udp.timeout=86400s
      - --entrypoints.urfd-usrp.address=:32000/udp
      - --entrypoints.urfd-usrp.udp.timeout=86400s
      - --entrypoints.urfd-p25.address=:41000/udp
      - --entrypoints.urfd-p25.udp.timeout=86400s
      - --entrypoints.urfd-nxdn.address=:41400/udp
      - --entrypoints.urfd-nxdn.udp.timeout=86400s
      - --entrypoints.urfd-ysf.address=:42000/udp
      - --entrypoints.urfd-ysf.udp.timeout=1296000s
      - --entrypoints.urfd-dextra.address=:30001/udp
      - --entrypoints.urfd-dextra.udp.timeout=1296000s
      - --entrypoints.urfd-dplus.address=:20001/udp
      - --entrypoints.urfd-dplus.udp.timeout=1296000s
      - --entrypoints.urfd-dcs.address=:30051/udp
      - --entrypoints.urfd-dcs.udp.timeout=1296000s
      - --entrypoints.urfd-dmr.address=:8880/udp
      - --entrypoints.urfd-dmr.udp.timeout=1296000s
      - --entrypoints.urfd-mmdvm.address=:62030/udp
      - --entrypoints.urfd-mmdvm.udp.timeout=1296000s
      - --entrypoints.urfd-icom-terminal-1.address=:12345/udp
      - --entrypoints.urfd-icom-terminal-1.udp.timeout=1296000s
      - --entrypoints.urfd-icom-terminal-2.address=:12346/udp
      - --entrypoints.urfd-icom-terminal-2.udp.timeout=1296000s
      - --entrypoints.urfd-icom-dv.address=:40000/udp
      - --entrypoints.urfd-icom-dv.udp.timeout=86400s
      - --entrypoints.urfd-yaesu-imrs.address=:21110/udp
      - --entrypoints.urfd-yaesu-imrs.udp.timeout=86400s
    labels:
      traefik.enable: true
      traefik.http.routers.traefik.rule: Host(`traefik.local`)
      traefik.http.routers.traefik.service: api@internal
      traefik.http.routers.traefik.entrypoints: webinsecure
    ports:
      # traefik ports
      - 80:80/tcp       # (HTTP webinsecure port)
      - 443:443/tcp     # (HTTPS websecure port)
      - 8080:8080/tcp   # (HTTP Dashboard port)
      - 8880:8880/udp   # (DMR+ DMO mode)
      - 10002:10002/udp # (BM connection)
      - 10017:10017/udp # (URF interlinking)
      - 12345:12345/udp # (G3 Icom Terminal presence and request port 1)
      - 12346:12346/udp # (G3 Icom Terminal presence and request port 2)
      - 17000:17000/udp # (M17 protocol)
      - 17171:17171/udp # (OpenDHT port)
      - 20001:20001/udp # (DPlus protocol)
      - 30001:30001/udp # (DExtra protocol)
      - 30051:30051/udp # (DCS protocol)
      - 32000:32000/udp # (USRP protocol)
      - 40000:40000/udp # (G3 Icom Terminal port)
      - 41000:41000/udp # (P25 port)
      - 41400:41400/udp # (NXDN port)
      - 42000:42000/udp # (YSF protocol)
      - 62030:62030/udp # (MMDVM protocol)
    networks:
      - proxy
    volumes:
      # Let Traefik listen to the Docker events
      - /var/run/docker.sock:/var/run/docker.sock:ro
      # Volume to store letsencrypt certificates
      - /opt/traefik:/letsencrypt
    dns:
      - 1.1.1.1
    dns_search: your_domain.com
    restart: unless-stopped

  urfd:
    image: mfiscus/urfd:latest
    container_name: urfd
    domainname: your_domain.com
    hostname: urfd_container
    depends_on:
      traefik:
        condition: service_healthy
    labels:
      traefik.urfd-http.priority: 1
      traefik.docker.network: docker_proxy
      # Explicitly tell Traefik to expose this container
      traefik.enable: true
      # The domain the service will respond to
      traefik.http.routers.urfd-http.rule: Host(`your_domain.com`)
      # enable tls
      traefik.http.routers.urfd-http.tls: true
      traefik.http.routers.urfd-http.tls.certresolver: your_domain
      # Allow request only from the predefined entry point named urfd-http
      traefik.http.routers.urfd-http.entrypoints: websecure
      # Specify proxy service port
      traefik.http.services.urfd-http.loadbalancer.server.port: 8080
      # (DMR+ DMO mode)
      traefik.udp.routers.urfd-dmr.entrypoints: urfd-dmr
      traefik.udp.routers.urfd-dmr.service: urfd-dmr
      traefik.udp.services.urfd-dmr.loadbalancer.server.port: 8880
      # (BM connection)
      traefik.udp.routers.urfd-bm.entrypoints: urfd-bm
      traefik.udp.routers.urfd-bm.service: urfd-bm
      traefik.udp.services.urfd-bm.loadbalancer.server.port: 10002
      # (URF interlinking)
      traefik.udp.routers.urfd-interlink.entrypoints: urfd-interlink
      traefik.udp.routers.urfd-interlink.service: urfd-interlink
      traefik.udp.services.urfd-interlink.loadbalancer.server.port: 10017
      # (G3 Icom Terminal presence and request port 1)
      traefik.udp.routers.urfd-icom-terminal-1.entrypoints: urfd-icom-terminal-1
      traefik.udp.routers.urfd-icom-terminal-1.service: urfd-icom-terminal-1
      traefik.udp.services.urfd-icom-terminal-1.loadbalancer.server.port: 12345
      # (G3 Icom Terminal presence and request port 2)
      traefik.udp.routers.urfd-icom-terminal-2.entrypoints: urfd-icom-terminal-2
      traefik.udp.routers.urfd-icom-terminal-2.service: urfd-icom-terminal-2
      traefik.udp.services.urfd-icom-terminal-2.loadbalancer.server.port: 12346
      # (M17 protocol)
      traefik.udp.routers.urfd-m17.entrypoints: urfd-m17
      traefik.udp.routers.urfd-m17.service: urfd-m17
      traefik.udp.services.urfd-m17.loadbalancer.server.port: 17000
      # (OpenDHT port)
      traefik.udp.routers.urfd-dht.entrypoints: urfd-dht
      traefik.udp.routers.urfd-dht.service: urfd-dht
      traefik.udp.services.urfd-dht.loadbalancer.server.port: 17171
      # (DPlus protocol)
      traefik.udp.routers.urfd-dplus.entrypoints: urfd-dplus
      traefik.udp.routers.urfd-dplus.service: urfd-dplus
      traefik.udp.services.urfd-dplus.loadbalancer.server.port: 20001
      # (DExtra protocol)
      traefik.udp.routers.urfd-dextra.entrypoints: urfd-dextra
      traefik.udp.routers.urfd-dextra.service: urfd-dextra
      traefik.udp.services.urfd-dextra.loadbalancer.server.port: 30001
      # (DCS protocol)
      traefik.udp.routers.urfd-dcs.entrypoints: urfd-dcs
      traefik.udp.routers.urfd-dcs.service: urfd-dcs
      traefik.udp.services.urfd-dcs.loadbalancer.server.port: 30051
      # (USRP protocol)
      traefik.udp.routers.urfd-usrp.entrypoints: urfd-usrp
      traefik.udp.routers.urfd-usrp.service: urfd-usrp
      traefik.udp.services.urfd-usrp.loadbalancer.server.port: 32000
      # (G3 Icom Terminal port)
      traefik.udp.routers.urfd-icom-dv.entrypoints: urfd-icom-dv
      traefik.udp.routers.urfd-icom-dv.service: urfd-icom-dv
      traefik.udp.services.urfd-icom-dv.loadbalancer.server.port: 40000
      # (P25 port)
      traefik.udp.routers.urfd-p25.entrypoints: urfd-p25
      traefik.udp.routers.urfd-p25.service: urfd-p25
      traefik.udp.services.urfd-p25.loadbalancer.server.port: 41000
      # (NXDN port)
      traefik.udp.routers.urfd-nxdn.entrypoints: urfd-nxdn
      traefik.udp.routers.urfd-nxdn.service: urfd-nxdn
      traefik.udp.services.urfd-nxdn.loadbalancer.server.port: 41400
      # (YSF protocol)
      traefik.udp.routers.urfd-ysf.entrypoints: urfd-ysf
      traefik.udp.routers.urfd-ysf.service: urfd-ysf
      traefik.udp.services.urfd-ysf.loadbalancer.server.port: 42000
      # (MMDVM protocol)
      traefik.udp.routers.urfd-mmdvm.entrypoints: urfd-mmdvm
      traefik.udp.routers.urfd-mmdvm.service: urfd-mmdvm
      traefik.udp.services.urfd-mmdvm.loadbalancer.server.port: 62030
    environment:
      # DO NOT enable the "calling home" feature unless you are sure
      # that you will not be infringing on an existing XLX or XRF
      # reflector with the same callsign suffix. If you don't understand
      # what this means, don't set CALLHOME: 'true'
      CALLHOME: 'false'
      # Define your FCC callsign
      CALLSIGN: 'your_callsign'
      # Define your email address which will appear on dashboard
      EMAIL: '[email protected]'
      # Define your fully-qualified domain name
      URL: 'your_domain.com'
      # Setting this to true will ensure 'https' is used in URL
      SSL: 'true'
      # Port that dashboard runs on. If SSL is enabled, then this is used for the backend proxy service
      PORT: '8080'
      # Where ? is A-Z or 0-9. NO EXCEPTIONS!
      URFNUM: 'URF???'
      # Get an ID here -> https://register.ysfreflector.de
      YSFID: '12345'
      # Add your ID to the file here -> https://github.com/g4klx/NXDNClients/blob/master/NXDNGateway/NXDNHosts.txt
      NXDNID: '12345'
      # Add your ID to the file here -> https://github.com/g4klx/P25Clients/blob/master/P25Gateway/P25Hosts.txt
      P25ID: '12345'
      # Set to 'true' if you intend to interlink with Brandmeister (TGIF is better)
      BRANDMEISTER: 'false'
      # Set to 'true' if you want to enable Allstar node
      ALLSTAR: 'false'
      # Change to your country
      COUNTRY: 'US'
      # Decribe your reflector. used in various place on dashboard and YSF registry
      DESCRIPTION: 'My urfd-docker reflector'
      # MODULES: ABCDEFGHIJKLMNOPQRSTUVWXYZ
      MODULES: 'ABCD'
      # Name your modules however you like (container only supports naming first 4)
      MODULEA: 'Main'
      MODULEB: 'D-Star'
      MODULEC: 'DMR'
      MODULED: 'YSF'
      # Set your timezone here if you want dashboard times to apear in local time
      TZ: 'UTC'  
    networks:
      - proxy
    # Privilged MUST be enabled if you are using AMBE transcoding usb hardware 
    privileged: true
    volumes:
      # Local directory where state and config files (including callinghome.php and urfd.ini)
      # will be saved. Change /opt/urfd to any location you prefer on your host machine
      - /opt/urfd:/config
    dns:
      - 1.1.1.1
    dns_search: your_domain.com
    restart: unless-stopped

License

Copyright (C) 2016 Jean-Luc Deltombe LX3JL and Luc Engelmann LX1IQ
Copyright (C) 2022 Doug McLain AD8DP and Thomas A. Early N7TAE
Copyright (C) 2023 Matt Fiscus KK7MNZ

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.