├── data └── .gitkeep ├── logs └── .gitkeep ├── .gitignore ├── .images └── aprsc-screenshot.png ├── docker-compose.yaml ├── aprsc ├── README.md ├── Dockerfile └── aprsc.conf.example /data/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /logs/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | aprsc.conf 2 | data/* 3 | !data/.gitkeep 4 | logs/* 5 | !logs/.gitkeep 6 | -------------------------------------------------------------------------------- /.images/aprsc-screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brannondorsey/aprsc-docker/HEAD/.images/aprsc-screenshot.png -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | aprsc: 4 | build: . 5 | volumes: 6 | - "./aprsc:/etc/default/aprsc" 7 | - "./aprsc.conf:/opt/aprsc/etc/aprsc.conf" 8 | - "./logs:/opt/aprsc/logs" 9 | - "./data:/opt/aprsc/data" 10 | ports: 11 | - 8080:8080 12 | - 10152:10152 13 | - 14501:14501 14 | - 14580:14580 15 | privileged: true 16 | -------------------------------------------------------------------------------- /aprsc: -------------------------------------------------------------------------------- 1 | # 2 | # STARTAPRSC: start aprsc on boot. Should be set to "yes" once you have 3 | # configured aprsc. 4 | # 5 | STARTAPRSC="yes" 6 | 7 | # 8 | # Additional options that are passed to the Daemon. 9 | # Description of used options (don't change these unless 10 | # you're sure what you're doing): 11 | # -u aprsc: switch to user 'aprsc' as soon as possible 12 | # -t /opt/aprsc: chroot to the given directory 13 | # -f: fork to a daemon 14 | # -e info: log at level info 15 | # -o file: log to file 16 | # -r logs: log files are placed in /opt/aprsc/logs 17 | # -c etc/aprsc.conf: configuration file location 18 | # 19 | # Since the daemon chroots to /opt/aprsc, all paths are relative to 20 | # that directory and the daemon cannot access any files outside 21 | # the chroot. 22 | # 23 | # aprsc can log to syslog too, but that'd require bringing the 24 | # syslog socket within the chroot. 25 | # 26 | 27 | DAEMON_OPTS="-u aprsc -t /opt/aprsc -f -e info -o file -r logs -c etc/aprsc.conf" 28 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # APRSC Docker 2 | 3 | A dockerized version of [hessu's aprsc](http://aprs-is.net/) APRS-IS server. [APRS-IS](http://aprs-is.net/) connects regional APRS packet radio networks together through the Internet. The original source for `aprsc` lives [here](https://github.com/hessu/aprsc). 4 | 5 | ![APRSC Screenshot](.images/aprsc-screenshot.png) 6 | 7 | ## Install 8 | [Docker and Docker Compose need to be installed.](https://docs.docker.com/engine/install/debian/) 9 | ```bash 10 | # clone the repo 11 | git clone https://github.com/brannondorsey/aprsc-docker 12 | cd aprsc-docker 13 | ``` 14 | 15 | ```bash 16 | # create an aprsc.conf file using the example. You MUST configure this to fit 17 | # your needs. Configuration information is available here: 18 | # http://he.fi/aprsc/CONFIGURATION.html 19 | cp aprsc.conf.example aprsc.conf 20 | ``` 21 | 22 | ```bash 23 | # run the service in "detach" mode 24 | docker compose up -d 25 | 26 | # follow the logs 27 | docker compose logs -f 28 | ``` 29 | 30 | You should now have an HTTP status server running at . 31 | 32 | ```bash 33 | # shutdown 34 | docker compose down 35 | ``` 36 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | # debian 11 is the most recent debian version that aprsc supports 2 | FROM debian:bullseye-slim 3 | 4 | # Install requirements 5 | RUN apt-get update && apt-get install -y gnupg 6 | 7 | # add signing key and deb source, install aprsc 8 | RUN gpg --keyserver keyserver.ubuntu.com --recv-keys C51AA22389B5B74C3896EF3CA72A581E657A2B8D && \ 9 | gpg --export C51AA22389B5B74C3896EF3CA72A581E657A2B8D > /etc/apt/trusted.gpg.d/aprsc.gpg && \ 10 | chown root:root /etc/apt/trusted.gpg.d/aprsc.gpg && chmod 644 /etc/apt/trusted.gpg.d/aprsc.gpg && \ 11 | echo "deb [signed-by=/etc/apt/trusted.gpg.d/aprsc.gpg] http://aprsc-dist.he.fi/aprsc/apt $(cat /etc/os-release | grep VERSION_CODENAME | awk '{gsub("VERSION_CODENAME=", "");print}') main" > /etc/apt/sources.list.d/aprsc.list && \ 12 | apt-get update && \ 13 | apt-get install -y aprsc 14 | 15 | # change the aprsc user's uid to 1000 so that volume permissions translate 16 | # between the first non-root user on the host 17 | RUN usermod -u 1000 aprsc 18 | 19 | # start the service and follow the logs so that container doesn't exit 20 | CMD service aprsc start && tail -F /opt/aprsc/logs/aprsc.log 21 | -------------------------------------------------------------------------------- /aprsc.conf.example: -------------------------------------------------------------------------------- 1 | # Configuration for aprsc, an APRS-IS server for core servers 2 | 3 | # Your unique server ID 4 | ServerId NOCALL 5 | # Passcode for the server ID 6 | PassCode 0 7 | # Who is running this server? 8 | MyAdmin "My Name, MYCALL" 9 | # The email address where the admin can be reached 10 | MyEmail email@example.com 11 | 12 | ### Directories ######### 13 | # Data directory (for persistent state files - currently none) 14 | RunDir data 15 | 16 | # If logging to a file (-o file), enable built-in log rotation. 17 | # LogRotate 18 | # "LogRotate 10 5" keeps 5 old files of 10 megabytes each. 19 | LogRotate 1000 1 20 | 21 | ### Intervals and timers ######### 22 | # Interval specification format examples: 23 | # 600 (600 seconds), or 600s, 5m, 2h, 1h30m, 1d3h15m24s, etc... 24 | 25 | # When no data is received from an upstream server in N seconds, switch to 26 | # another server. 27 | UpstreamTimeout 15s 28 | 29 | # When no data is received from a downstream server in N seconds, disconnect 30 | ClientTimeout 48h 31 | 32 | ### TCP listener ########## 33 | # Listen tcp
34 | # socketname: any name you wish to show up in logs and statistics 35 | # porttype: one of: 36 | # fullfeed - everything, after dupe filtering 37 | # igate - igate / client port with user-specified filters 38 | # udpsubmit - UDP packet submission port (8080) 39 | # dupefeed - duplicate packets dropped by the server 40 | # options: 41 | # filter "m/500" - force a filter for users connected here 42 | # maxclients 100 - limit clients connected on this port 43 | # acl etc/client.acl - match client addresses against ACL 44 | # hidden - don't show the port in the status page 45 | # 46 | # If you wish to provide UDP service for clients, set up a 47 | # second listener on the same address, port and protocol. 48 | # 49 | # The "::" is IPv6 "IN6ADDR_ANY", whereas "0.0.0.0" is same 50 | # with IPv4. 51 | # 52 | # On FreeBSD you need to have separate listeners for IPv4 and 53 | # IPv6. On Linux, just use :: alone - the IPv6 listener will 54 | # catch the IPv4 connections just as well. 55 | # 56 | # Example of normal server ports for Linux, supporting both TCP and UDP, 57 | # IPv4 and IPv6: 58 | # 59 | Listen "Full feed" fullfeed tcp :: 10152 hidden 60 | Listen "" fullfeed udp :: 10152 hidden 61 | 62 | Listen "Client-Defined Filters" igate tcp :: 14580 63 | Listen "" igate udp :: 14580 64 | 65 | #Listen "350 km from my position" igate tcp :: 20350 filter "m/350" 66 | #Listen "" igate udp :: 20350 filter "m/350" 67 | 68 | Listen "UDP submit" udpsubmit udp :: 8080 69 | 70 | ### Uplink configuration ######## 71 | # Uplink tcp
72 | # name: a name of the server or service you're connecting to 73 | # type: one of: 74 | # full - full feed 75 | # ro - read-only, do not transmit anything upstream 76 | # 77 | # If you wish to specify multiple alternative servers, use multiple 78 | # Uplink lines, one for each server. 79 | # 80 | # Normally a single line for the 'rotate' address is fine - it will connect 81 | # to one of the servers in a random fashion and go for another one should 82 | # the first one become unavailable. 83 | # 84 | #Uplink "Core rotate" full tcp rotate.aprs.net 10152 85 | #Uplink "Core rotate" ro tcp rotate.aprs.net 10152 86 | 87 | # OPTIONAL: Bind source address before connecting to an uplink 88 | # You can enter two addresses, one for IPv4 and one for IPv6 connections. 89 | # Needed if you have multiple IP addresses on your server and only one 90 | # of them is allowed to connect by the remote server. 91 | #UplinkBind 127.0.0.1 92 | #UplinkBind ::1 93 | 94 | ### HTTP server ########## 95 | # HTTPStatus port provides a status view to web browsers. 96 | # IPv6+IPv4 support works slightly differently than in Listen: 97 | # :: is "all addresses" for IPv6, 0.0.0.0 for IPv4, but 98 | # :: only works if you actually have a global IPv6 address 99 | # configured on the system. 100 | # The example is for IPv4, change the address to :: if you have 101 | # IPv6. For FreeBSD, or if you wish to support multiple specific 102 | # ports/addresses, use multiple HTTPStatus directives for each. 103 | HTTPStatus 0.0.0.0 14501 104 | # HTTPUpload port allows position uploads over HTTP 105 | HTTPUpload 0.0.0.0 8080 106 | 107 | ### Environment ############ 108 | # When running this server as super-user, the server can (in many systems) 109 | # increase several resource limits, and do other things that less privileged 110 | # server can not do. 111 | # 112 | # The FileLimit is resource limit on how many simultaneous connections and 113 | # some other internal resources the system can use at the same time. 114 | # If the server is not being run as super-user, this setting has no effect 115 | # in case it is above what normal user can set. 116 | # 117 | FileLimit 10000 118 | 119 | ### Operator attention span qualification run ########### 120 | # After configuring the rest of the settings, remove this bad command 121 | # from the configuration file. It's here only to avoid starting the 122 | # server up accidentally with an invalid configuration. 123 | MagicBadness 42.7 --------------------------------------------------------------------------------