Moutmout

Le blog du Moutmout

Astronomie, informatique, reflexions diverses

Auto-héberger ses podcasts?

Guide d'installation de Castopod

and0uille

Lecture de 7 Minutes

Un microphone devant un écran avec un audiogramme affiché.

Je vous propose aujourd’hui un article un peu spécial, puisque c’est un article invité écrit par and0uille ! Elle nous explique en détail comment installer sa propre instance castopod. Si vous voulez voir le résultat avant de vous lancer, vous pouvez jeter un oeil au podcast SpaceSheep.

Table des matières

Introduction

Le projet Castopod, bien qu’encore en version Alpha, permet déjà à ses utilisateurs et utilisatrices d’auto-héberger leurs podcasts dans le fediverse (et c’est chouette).

C'était la solution toute trouvée pour héberger les premiers essais de @Moutmout@framapiaf.org à qui je donne un coup de main.

Une documentation d’installation existe sur le Gitlab de Castopod, mais j’ai eu envie la rendre un peu plus accessible en proposant ici une version très détaillée qui aidera certain.e.s j’espère à mettre leur instance sur pied (en attendant que castopod se fasse chatoniser ?)

J’utilise ici un serveur Debian 11 avec :

  • Apache 2.4.48
  • MariaDB 10.5.11
  • PHP 8.1
  • Castopod v1.0.0-alpha.70 (31/08/2021)

Pré-requis

Installer les paquets de base requis :

$ sudo apt update && sudo apt upgrade -y
$ sudo apt install apache2 mariadb-server certbot apt-transport-https \
    lsb-release ca-certificates curl wget unzip

Installer php8.1, qui est pour le moment seulement disponible dans le dépot sid/unstable de Debian. On fera l’installation de PHP 8.1 depuis le dépot de Ondřej Surý :

$ sudo wget -O /etc/apt/trusted.gpg.d/php.gpg https://packages.sury.org/php/apt.gpg
$ echo "deb https://packages.sury.org/php/ $(lsb_release -sc) main" | sudo tee -a /etc/apt/sources.list.d/php.list
$ sudo apt update && sudo apt upgrade
$ sudo apt install php8.1 php8.1-common php-json php8.1-gd php8.1-mbstring \
    php8.1-curl php8.1-xml php8.1-intl libapache2-mod-php8.1 php8.1-mysql

(optionnel) Génération de certificat auto-signé

⚡ ⚡ Ne pas utiliser cette méthode en production. Les certificats générés ici ne seront pas jugés “de confiance” par les navigateurs de vos auditeurs et auditrices ! Préférez par exemple Let’s Encrypt. Pour celles et ceux qui préféreront Let’s Encrypt, sautez cette section et passez directement à la configuration de MariaDB, on générera le certificat du serveur avec certbot plus tard.

Renseigner votre nom de domaine dans /etc/hosts, par exemple :

$ echo "127.0.0.1 	castopod.local" | sudo tee -a /etc/hosts

Générer le certificat et la clé correspondant à ce domaine (inspiré de cet article) :

$ openssl req -x509 -out castopod.local.crt -keyout castopod.local.key \
    -newkey rsa:4096 -nodes -sha256 \
    -subj '/CN=castopod.local' -extensions EXT -config <( \
     printf "[dn]\nCN=castopod.local\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:castopod.local\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

Déplacer le certificat et la clé privée aux endroits suivants par exemple :

$ sudo mv castopod.local.crt /etc/ssl/certs/
$ sudo mv castopod.local.key /etc/ssl/private/

Configurer le serveur MariaDB

Démarrer le service et l’activer au démarrage :

$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb

Executer le script mysql_secure_installation fourni par MariaDB qui permet d’améliorer un petit peu la sécurité de notre serveur de base de données :

$ sudo mysql_secure_installation

Lors de cette étape, définir un mot de passe pour root (il est vide initialement) et laisser les autres choix par défaut.

Créer la base de données et l’utilisateur dédié à Castopod :

$ sudo mysql -u root -p
MariaDB [(none)]> CREATE DATABASE castopod_db;
MariaDB [(none)]> CREATE USER 'castopod_user'@localhost IDENTIFIED BY 'password1';
MariaDB [(none)]> GRANT CREATE, ALTER, DELETE, EXECUTE, INDEX, INSERT, SELECT, UPDATE ON castopod_db.* TO 'castopod_user'@localhost;
MariaDB [(none)]> FLUSH PRIVILEGES;

Penser à bien changer le mot de passe ci-dessus et à le garder dans un coin…

Configurer Apache

  1. Télécharger le dernier zip de Castopod, par exemple à ce jour :

    $ wget https://code.podlibre.org/podlibre/castopod-host/uploads/d979ccf46d8426ccdbb838d460698f7d/castopod-host-1.0.0-alpha.70.zip
    

    ⚡ ⚡ Attention, il faut télécharger l’archive nommée “Castopod Host package” et pas le “Source Code”, disponible au même endroit.

  2. Extraire le code Castopod et le copier à la racine du serveur web :

    $ unzip castopod-host-1.0.0-alpha.70.zip
    $ sudo cp -r castopod-host /var/www/html/castopod
    
  3. Donner les permissions appropriées au répertoire :

    $ sudo chown -R www-data:www-data /var/www/html/castopod
    
  4. Hote virtuel Apache

    • Si on a choisi d’installer Castopod avec un certificat auto-signé pour faire quelques tests (non recommandé en production), on créer un hôte virtuel Apache comme le suivant. Attention à bien remplacer les chemins des certificats (options SSLCertificate…) :

       $ cat /etc/apache2/sites-available/castopod.example.conf
        <IfModule mod_ssl.c>
            <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost
                ServerName castopod
                ServerAlias castopod.local
                DocumentRoot /var/www/html/castopod/public
         
                LogLevel info ssl:warn
      
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined
      
                #   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on
                SSLCertificateFile    /etc/ssl/certs/castopod.local.crt
                SSLCertificateKeyFile /etc/ssl/private/castopod.local.key
      
                <Directory /var/www/html/castopod/public>
                    Options Indexes FollowSymLinks MultiViews
                    AllowOverride All
                    Order allow,deny
                    allow from all
                </Directory>
            </VirtualHost>
        </IfModule>
      

      On active l’hote virtuel tout juste créé :

      $ sudo a2ensite castopod.example.conf
      $ sudo systemctl reload apache2
      
    • Si on a choisi d’installer Castopod avec un certificat Let’s Encrypt on créer un hôte virtuel Apache comme le suivant :

      $ cat /etc/apache2/sites-available/castopod.example.conf
       <VirtualHost *:80>
           ServerName castopod.example.com
           DocumentRoot /var/www/html/castopod/public
           DirectoryIndex index.php index.html
              
           ErrorLog /var/log/apache2/error-castopod.log
           CustomLog /var/log/apache2/access-castopod.log common
      
           <Directory /var/www/html/castopod/public>
               Options Indexes FollowSymLinks 
               AllowOverride All
               Require all granted 
           </Directory>
       </VirtualHost>
      

      On active l’hote virtuel tout juste créé :

      $ sudo a2ensite castopod-test.example.conf
      $ sudo systemctl reload apache2
      

      Puis on fait appel a Certbot pour la génération du certificat et l’adaptation de l’hote virtuel Apache :

      $ sudo certbot --apache
      

      Certbot va poser quelques questions : selectionner le domaine correspondant à votre installation de Castopod et activer la redirection automatique vers HTTPS.

      Certbot a installé le certificat et la clé associée dans /etc/letsencrypt/live/castopod.example.com. Il a également créé un hote virtuel Apache (avec HTTPs activé) et modifié l’hote virtuel Apache original (qu’on avait créé plus tôt) pour que nos utilisateurs et utilisatrices soient redirigées automatiquement vers la version en HTTPs. Il n’y a donc rien de plus à faire ! Voici la tete de l’hote Apache créé par certbot :

       $ cat /etc/apache2/sites-available/castopod.example-le-ssl.conf 
        <IfModule mod_ssl.c>
            <VirtualHost *:443>
                ServerName castopod.example.com
                DocumentRoot /var/www/html/castopod/public
                DirectoryIndex index.php index.html
      
                      
                ErrorLog /var/log/apache2/error-castopod.log
                CustomLog /var/log/apache2/access-castopod.log common
      
                <Directory /var/www/html/castopod/public>
                    Options Indexes FollowSymLinks 
                    AllowOverride All
                    Require all granted 
                </Directory>
      
                SSLCertificateFile /etc/letsencrypt/live/castopod.example.com/fullchain.pem
                SSLCertificateKeyFile /etc/letsencrypt/live/castopod.example.com/privkey.pem
                Include /etc/letsencrypt/options-ssl-apache.conf
            </VirtualHost>
        </IfModule>
      
  5. Activer les modules Apache nécéssaires :

    $ sudo a2enmod ssl rewrite
    
  6. Vérifier que les extensions php nécéssaires sont bien activées :

    $ php -m
    

    On doit voir notamment curl, gd, intl, mbstring et mysqli dans la liste.

  7. Vérifier que la version de PHP utilisée est bien la 8.0 ou supérieure :

    $ php -i | grep -i "PHP Version"
    
  8. Relancer apache et activer le démarrage au boot :

    $ sudo systemctl restart apache2
    $ sudo systemctl enable apache2
    

Terminer l’installation dans l’installeur web

Se rendre à l’adresse du serveur : https://castopod.local/cp-install par exemple (nom de domaine défini dans les hôte virtuels Apache).

Instance Configuration

NB : Il est recommandé de modifier les valeurs par défaut de Admin gateway et Auth Gateway.

Database Configuration Cache Configuration Create your own superadmin account

Troubleshooting

Quelle est la version de PHP utilisée ?

Avec la commande php --ini on peut déterminer :

  • La version de PHP utilisée : doit être au moins la version 8.0 pour Castopod v1.0.0 alpha 70
  • La liste des extensions PHP activées : voir la liste des modules nécéssaires dans la documentation.
  • Le chemin du fichier de configuration : utile si on veut ajuster la liste des extensions activées.

Logs Apache

On peut ajuster la verbosité dans le fichier de configuration du virtual host : /etc/apache2/sites-available/castopod.example.conf (ou variante avec HTTPs).

On avait au départ : LogLevel info ssl:warn qu’on peut transformer en LogLevel debug ssl:warn dans ce fichier.

Ne pas oublier de recharger Apache après modification.

Les logs sont ensuite consultables par exemple dans /var/log/apache2/error.log

Logs Castopod

On peut aussi augmenter la verbosité des logs Castopod. C’est utile si on tombe par exemple sur une erreur comme “We seem to have hit a snag. Please try again later.” dans le navigateur au moment de l’installation.

  • Consulter les logs ici : /var/www/html/castopod/writable/logs/
  • Ajuster la verbosité dans /var/www/html/castopod/.env

Par exemple, ajouter au fichier la ligne suivante :

logger.threshold = 8

Ici on met Castopod en mode debug, mais on peut ajuster avec les valeurs suivantes :

  • 0 = Disables logging, Error logging TURNED OFF
  • 1 = Emergency Messages - System is unusable
  • 2 = Alert Messages - Action Must Be Taken Immediately
  • 3 = Critical Messages - Application component unavailable, unexpected exception.
  • 4 = Runtime Errors - Don’t need immediate action, but should be monitored.
  • 5 = Warnings - Exceptional occurrences that are not errors.
  • 6 = Notices - Normal but significant events.
  • 7 = Info - Interesting events, like user logging in, etc.
  • 8 = Debug - Detailed debug information.
  • 9 = All Messages

Vrac : Supprimer un podcast en CLI

Il y a quelques temps, il n'était pas encore possible de supprimer un podcast via l’interface web de castopod, je m’en étais sorti de cette façon (et donc je laisse ça là pour mémoire, mais sans garantie que ce soit toujours utile) :

  1. Supprimer l’entrée dans la base de données

    SELECT id,name from cp_podcasts;
    DELETE from cp_podcasts WHERE name="Astrosheep" ;
    
  2. Vider le cache :

    $ sudo rm /var/www/html/castopod-host/writable/cache/*
    

Conclusion

Je retourne écouter des podcasts. J’espère que tout ça en aura aidé certain.e.s !

Articles Récents

Catégories

À Propos

Docteur, astrophysicienne. Je joue de l'euphonium, du clavier et du télescope quand je peux.