Im Rahmen meiner Arbeit war ich jüngst in die Suche nach einem Podcasting-Dienst eingebunden. Die Nutzung proprietärer Plattformen als Basis wurde dabei zu Gunsten selbst gehosteter Dienste verworfen.
Da ich dienstlich schon einen PeerTube-Server betreibe wurde damit der erste Versuch gestartet. Funktioniert grundsätzlich aber leider war es damit nicht möglich die Einbindung des Podcasts z.B. in die Publikations-Plattformen von Apple oder Spotify zu bewerkstelligen.
Z.B. über Stephanie Henkels (aka Ückück) Vortrag „Castopod – Podcasting im Fediverse“ im Rahmen der Chemnitzer Linuxtage war ich schon auf diesen Dienst aufmerksam geworden. Der zweite Versuch fand somit mit Castopod statt.
Fazit, ich nehme es vorweg: Hier war Erfolg beschieden. Mit Castopod ist ein eigenes Hosting, mit einem gezielt für Podcasting ausgerichteten Dienst, einfach möglich. Podcasts sind damit dann im dezentralen Fediverse beheimatet, technisch unabhängiger Betrieb ist möglich, und die Einbindung in die obigen Mainstream-Publikationsplattformen total unproblematisch.
Nachfolgend nun „my way“ der Installation, direkt in einem Debian-System, ohne Docker. Dieser Weg hat sich zwar an der offiziellen Anleitung „How to install Castopod?“ (auch deutsche Version verfügbar) entlang bewegt, füllte aber ein paar Lücken der Anleitung und nutzt eine andere Variante der Mailanbindung.
Nginx mit PHP-FPM
Auf dem genutzten Server war, wegen der parallelen PeerTube-Installation, schon Nginx als Webserver installiert. Benötigt wird hier noch PHP-Unterstützung da Castopod eben eine PHP-Anwendung ist. Für möglichst gute Performance ist PHP-FPM hier bevorzugt.
Debian bringt zwar PHP-FPM mit, aber da ich schon mehrfach die Situation hatte unterschiedliche PHP-Versionen auf einem Server zu benötigen gehe ich hier immer den Weg über das Sury-Repo (siehe dazu auch Additional PHP Versions on Debian | 3rd party integration). Gesagt getan …
apt-get install extrepo
extrepo enable sury
apt install php8.4-{fpm,intl,curl,mbstring,gd,exif,mysql,xml}
Anmerkung: Die Original-Anleitung hat zwar angemerkt, dass xml aktiviert sein muss, aber wenn es nicht installiert wurde kann es auch nicht aktiviert werden. Hat mich eine wenig Zeit gekostet.
Für die Größe der später bereit zu stellenden MP3-Dateien muss die Uploadgrenze sowohl bei Nginx als auch bei PHP-FPM angepasst werden.
Im Fall von PHP-FPM erfolgt das über die die Konfigurationsdatei /etc/php/8.4/fpm/php.ini. Hier wurden die beiden folgenden Werte eingestellt.
post_max_size = 75M
upload_max_filesize = 50M
Die TLS-Zertifikate für den Nginx sind hier unter /var/www/certs/... installiert. Für den Castpod-Server selbst wurde das Verzeichnis /var/www/castopod angelegt.
Für den Nginx habe ich unter /etc/nginx/sites-available eine neue Datei castopod angelegt. Der hier relevante Teil der Datei sieht so aus:
root /var/www/castopod/public;
index index.html index.htm index.php;
access_log /var/log/nginx/castopod.access.log; # reduce I/0 with buffer=10m flush=5m
error_log /var/log/nginx/castopod.error.log;
##
# Certificates
# you need a certificate to run in production. see https://letsencrypt.org/
##
ssl_certificate /var/www/certs/fullchain.pem;
ssl_certificate_key /var/www/certs/privkey.pem;
server_tokens off;
add_header X-Frame-Options sameorigin always;
add_header Permissions-Policy interest-cohort=();
add_header X-Content-Type-Options nosniff;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload;";
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_types application/atom+xml application/javascript application/rss+xml image/bmp image/svg+xml image/x-icon text/css text/plain text/html;
autoindex off;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.4-fpm.sock;
}
# Upload-Groesse
client_max_body_size 75M;
Abschließend wird der PHP-FPM neu gestartet und der neue virtuelle Webserver in Betrieb genommen.
cd /etc/nginx/sites-enabled
ln -s /etc/nginx/sites-available/castopod
systemctl reload nginx
MariaDB-Datenbankserver und Castopod-Datenbank
Mit apt install mariadb-server wird der Datenbankserver installiert. Anschließend wird der MariaDB-Client mit dem Kommando mariadb gestartet und die Castopod-Datenbank angelegt.
Anmerkung: Im Gegensatz zur Originalanleitung werden hier alle PRIVILEGES erteilt. Hier war bei der Installation einer der Fallstricke, dass die Rechte nämlich nicht ausgereicht haben. Auch hier blieb für die Ursachenforschung einiges an Zeit liegen.
CREATE DATABASE castopod DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER castopoduser@localhost IDENTIFIED BY 'GeheimesPassswort';
GRANT ALL PRIVILEGES ON castopod.* TO 'castopoduser'@'localhost';
FLUSH PRIVILEGES;
QUIT
Redis-Server
Durch die PeerTube-Installation war schon Redis installiert. Dessen Installation ist aber mit apt install redis-server auch nicht sonderlich schwierig. Später ist nur relevant, dass in meinem Fall damit die Redis-Datenbank 0 schon von PeerTube genutzt wird.
Postfix-Mailserver mit Smarthost
Da der Mailserver der genutzten Domain an anderer Stelle gehostet ist, muss die Mailkonfiguration von Castopod auf einen solchen Server geleitet werden. Dabei bin ich an den Konfigurationsmöglichkeiten von Castopod gescheitert und konnte das erforderliche STARTTLS nicht in Betrieb nehmen.
Die Lösung bestand in einem Postfix, im Modus „Internet with smarthost“ auf der Castopod-Maschine. Installation ist ziemlich einfach! Mit apt install postfix libsasl2-modules werden die notwendigen Software-Paket installiert. In den Konfigurationsdialogen wurden dann diese Einstellungen vorgenommen:
- Server-Konfiguration: Internet with smarthost
- System mail name: <DNS-Name des Castopod-Servers>
- SMTP relay host: <DNS-Name des Mailservers>
- …
Um Postfix noch die SASL-Authentifizierung bei mail.lehrerfortbildung-bw.de beizubringen sind noch folgende Aktionen erforderlich:
echo mail.meinmailserver.de \
systemmailer:PasswortVonSystemmailer \
> /etc/postfix/relay_password
postmap hash:/etc/postfix/relay_password
In der Datei /etc/postfix/main.cf müssen dann noch folgende Zeilen enthalten sein:
relayhost = mail.meinmailserver.de:587
smtp_sasl_password_maps=hash:/etc/postfix/relay_password
smtp_sasl_auth_enable=yes
smtp_sasl_security_options = noanonymous
Abschließen Neu-Einlesen der Konfiguration mit postfix reload und Versandtest mit mailx -r noreply.meinmailserver.de -s "Testmail 2 von pt01" ich@meinemaildomain.de
Die eigentliche Castopod-Installation
Verwendet wurde die (zum Installations-Zeitpunkt aktuelle) Version 1.13.5. Damit läuft dann die Installation wie folgt:
CPDWNLD=https://code.castopod.org/-/project/2/uploads/f113e0feb39d129758629e3ea629d704/castopod-1.13.5.zip
cd /var/www
wget $CPDWNLD
unzip castopod-1.13.5.zip
rm castopod-1.13.5.zip
chown -R www-data:www-data castopod
chmod -R go-rwx castopod
Anschließend webbasierter Aufruf des Castopod-Installers über https://cp.meincastopodserver.de/cp-install. Die Dialoge werden mit den oben genutzten Daten durchgeführt und als Cache Redis ausgewählt.
Anpassungen bzgl. Redis
Da bei mir die Redis-Datenbank 0 schon genutzt wird, ich Kollisionen mit einem anderen Dienst vermeiden wollte, ist später die Castopod-Konfiguration mittels cache.redis.database=1 angepasst worden. Damit nutzt Castopod die Redis-Datenank 1.
Mail-Konfiguration
Da ich es, wie weiter oben schon erwähnt, nicht geschafft habe Castopod direkt als Mail-Client zu konfigurieren (es scheiterte an nicht verfügbaren SASL-Methoden) habe ich auf pt01.lehrerfortbildung-bw.de (auf dieser Maschine lief zu dem Zeitpunkt der Castopod-Server) eine Postfix als Mail-Relay aufgesetzt (siehe passenden Abschnitt). Die Mailkonfiguration für Castopod erfolgte dann durch Eintrag der folgenden Zeilen in /var/www/castopod/.env (siehe dazu auch https://codeigniter.com/user_guide/libraries/email.html#id2):
email.protocol=mail
email.fromEmail="noreply@meinemaildomain.de"
email.fromName="Castopod"
cron-Job
Über crontab -u www-data -e folgende Zeile hinterlegen:
* * * * * /usr/bin/php /var/www/castopod/spark tasks:run >> /dev/null 2>&1
Die finale Castopod-Konfigurationsdatei im Überblick
Die Castopod-Konfiguration ist in /var/www/castopod/.env zu finden und sah final bei mir dann so aus:
app.baseURL="https://cp.meincastopodserver.de/"
media.baseURL="https://cp.meincastopodserver.de/"
analytics.salt="OriginalSaltHierNatuerlichNichtDokumentiert"
admin.gateway="cpmd-admin"
auth.gateway="cpmd-auth"
database.default.hostname="localhost"
database.default.database="castopod"
database.default.username="castopoduser"
database.default.password="GeheimesPassswort"
database.default.DBPrefix="cp_"
cache.handler="redis"
cache.redis.database=1
email.protocol=mail
email.fromEmail="noreply@meinemaildomain.de"
email.fromName="Castopod"
Validierung von Podcast-Feeds
Hat man später Podcast konfiguriert, plant deren Publikation auch bei den (aktuell leider noch) Mainstream-Plattformen Apple oder Spotify, kann man seine Feeds vorab mit dem Cast Feed Validator von Blubrry Podcasting auf Compliance testen. Geht dort alles klar, ist der nächste Schritt sich mit Apple und Spotify zu beschäftigen. But this is none of my business :-)