add rpm packaging; dnf and firewalld support

- packaging/rpm/terraria-server-manager.spec.in: installs via make
  install, plain scriptlets (no Fedora-only macros) mirroring the deb
  maintainer scripts; removal stops servers, disables boot/backups/
  daemon and removes only terractl's own drop-ins.
- make rpm (rpmbuild --nodeps, works on Debian/Ubuntu); make check
  parses the spec when rpmspec is installed.
- Release workflow builds deb and rpm, attaches both, publishes the rpm
  to Gitea's RPM registry. Job renamed to 'packages'.
- pkg_install: install hints use dnf or apt with the right package
  names (doctor, fetch, python3/openssl checks).
- firewalld: new prints the firewall-cmd command for its port; doctor
  lists instance and daemon ports firewalld doesn't allow.
- Docs, README, AGENTS.md and changelog; VERSION 0.0.13.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adamandClaude Opus 5.5 committed 2026-10-02 22:54:39 +00:00
1 parent 3a3b4b8eb9
commit 85da15a26f
10 files changed
+332 -38

No files matched your search

@@ -0,0 +1,123 @@
# RPM package for Fedora, RHEL and similar. Built by 'make rpm', which fills in
# @VERSION@ and makes the source tarball. The scriptlets use plain systemctl,
# systemd-sysusers and systemd-tmpfiles rather than Fedora's macros, so the
# package can be built anywhere rpmbuild runs (the release workflow builds it on
# Ubuntu). They do what packaging/deb/ does for Debian; see the comments there.
Name: terraria-server-manager
Version: @VERSION@
Release: 1
Summary: Run multiple Terraria and tModLoader dedicated servers with systemd
# TODO: no license has been chosen for this project yet
License: LicenseRef-Unspecified
URL: https://gitea.adbraun.lol/adam/terraria-server-manager
Packager: Adam Brown <adam@adbraun.lol>
Source0: %{name}-%{version}.tar.gz
BuildArch: noarch
BuildRequires: make
Requires: bash
Requires: coreutils
Requires: util-linux
Requires: unzip
Requires: systemd
Requires: python3
Requires: openssl
# Only needed for tModLoader instances (ICU: they stop with 'Aborted' without it)
Recommends: curl
Recommends: libicu
# Lets the terraria group start, stop and restart servers without sudo
Recommends: polkit
Suggests: bash-completion
%description
Provides the terraria@.service template and the terractl command for running
any number of vanilla Terraria and tModLoader dedicated servers, each as its
own systemd service under an unprivileged terraria user.
Server software is not included. 'terractl fetch' downloads the official server
zips into /var/lib/terraria/dist, and they are unpacked into each instance on
demand.
Hosts can also be managed from other hosts (terractl --host, copy, move)
through the optional terractld daemon.
%prep
%setup -q
%build
# Nothing to build: shell and Python scripts
%install
make install DESTDIR=%{buildroot} PREFIX=/usr SYSCONFDIR=/etc
%post
systemd-sysusers terractl.conf >/dev/null 2>&1 || :
systemd-tmpfiles --create terractl.conf >/dev/null 2>&1 || :
if [ -d /run/systemd/system ]; then
systemctl daemon-reload >/dev/null 2>&1 || :
# On upgrades the daemon (if it's on) runs the new version right away. It
# only serves other hosts; the game servers keep running.
if [ "$1" -ge 2 ]; then
systemctl try-restart terractld.service >/dev/null 2>&1 || :
fi
fi
# Let the terraria group read the servers' journal (LogNamespace=terraria)
/usr/bin/terractl journal-access >/dev/null 2>&1 || :
%preun
# On removal (not upgrade), stop everything while terractl still exists, so each
# server is sent "exit" and saves its world, and take back what was enabled:
# rpm, unlike dpkg, has no separate purge.
if [ "$1" -eq 0 ] && [ -d /run/systemd/system ]; then
systemctl disable --now terractld.service >/dev/null 2>&1 || :
for f in /etc/systemd/system/*.wants/terraria-backup@*.timer \
/etc/systemd/system/*.wants/terraria@*.service; do
[ -L "$f" ] && systemctl disable "${f##*/}" >/dev/null 2>&1 || :
done
systemctl stop 'terraria-backup@*.timer' 'terraria-backup@*.service' >/dev/null 2>&1 || :
units=$(systemctl list-units --plain --no-legend --all 'terraria@*.service' | awk '{print $1}')
if [ -n "$units" ]; then
echo "Stopping Terraria instances: $units"
# Unquoted on purpose: each unit name must be a separate argument
# shellcheck disable=SC2086
systemctl stop $units || :
fi
fi
%postun
if [ "$1" -eq 0 ]; then
# Drop-ins terractl wrote itself (backup schedules, 'doctor --fix'). Ones
# you added with 'systemctl edit' are kept.
rm -f /etc/systemd/system/terraria-backup@*.timer.d/terractl.conf \
/etc/systemd/system/terraria-backup@*.service.d/terractl.conf \
/etc/systemd/system/*.d/terractl-locations.conf
rmdir /etc/systemd/system/terraria-backup@*.d /etc/systemd/system/terraria@.service.d \
/etc/systemd/system/terractld.service.d 2>/dev/null || :
cat >&2 <<MSG
terraria-server-manager removed. Worlds, instances and backups in /var/lib/terraria,
the daemon's keys in /var/lib/terractl and the 'terraria' user were kept. Remove
them manually if they are no longer needed:
sudo rm -rf /var/lib/terraria /var/lib/terractl && sudo userdel terraria
MSG
fi
if [ -d /run/systemd/system ]; then
systemctl daemon-reload >/dev/null 2>&1 || :
fi
%files
/usr/bin/terractl
/usr/lib/terraria-server-manager/
/usr/lib/systemd/system/terraria@.service
/usr/lib/systemd/system/terraria@.socket
/usr/lib/systemd/system/terractld.service
/usr/lib/systemd/system/terraria-backup@.service
/usr/lib/systemd/system/terraria-backup@.timer
/usr/lib/sysusers.d/terractl.conf
/usr/lib/tmpfiles.d/terractl.conf
/usr/share/polkit-1/rules.d/50-terractl.rules
/usr/share/bash-completion/completions/terractl
/usr/share/terraria-server-manager/
%doc /usr/share/doc/terraria-server-manager/
%config(noreplace) /etc/default/terractl
%config(noreplace) /etc/systemd/journald@terraria.conf