2025-04-07 Galène was comparatively easy to setup

I remember how tricky the Jitsi setup was, at the time. When we used it, system load for my small server jumped up to seven or eight. And in the end, we all ended up on Discord. But with Discord showing annoying ads even to paying customers, I'm taking another look at the alternatives.

From my point of view, Galène has the benefits of requiring just a single binary for installation. Sure, deployment is trickier, but in typical Go fashion, you get a huge binary that you copy over to the server and you're essentially ready to test it.

Galène

So what did I do?

I created a system user `galene` with home directory `/home/galene`. There is no `galene` group.

This is where the binary lives.

I copied the example `galene.service` from the website and adapted it (by changing `Group=galene` to `Group=nogroup`).

from the website

My Galène installation does not live behind a reverse proxy, so there is no logging of bots trying to access it. Perhaps a problem to solve for later.

I had to add a bunch of lines to my `/etc/apache2/hook.sh` that runs whenever `mod_md` gets new certificates. When that happens, Galène also gets a copy, with permissions set appropriately. And it gets restarted.

I created a JSON file to define a single group, making me the operator (with a password), and allowing wildcard users (all sharing the same password). I handed out this password on the IRC channel we use to chat and hang out.

wildcard users

Should we end up with two dozen people or more, then I'll write a web app to administrate users and groups via the web. An API to do this already exists. Or if I'm feeling evil, I'll add the functionality to administer them to an IRC bot. 😂

API

​#Jitsi ​#Galène ​#Discord ​#Administration

#!/bin/sh
# -*- sh -*-

: <<=cut

=head1 NAME

galene - Munin plugin to monitor number of rooms and clients on a Galène server.

=head1 USAGE

This plugin connects to a Galène server.

It requires curl and jq.

=head1 CONFIGURATION

There is no default configuration.  This is an example:

    [galene]
    env.host campaignwiki.org
    env.port 8443
    env.user root
    env.password secret

=head1 AUTHOR

Alex Schroeder

=head1 LICENSE

CC0, dedicated to the public domain

=head1 MAGIC MARKERS

  #%# family=manual

=cut

. "$MUNIN_LIBDIR/plugins/plugin.sh"

if [ "$1" = "autoconf" ]; then
	if [ -z "$host" ]; then
		echo "no (Configuration required)"
		exit 0
	fi

	echo yes
	exit 0
fi

if [ -z "$host" ] || [ -z "$port" ] || [ -z "$user" ] || [ -z "$password" ]; then
  echo "Configuration required"
  exit 1
fi

if [ "$1" = "config" ]; then

        echo "graph_title Galene status - $host:$port"
        echo "graph_category chat"
        echo "graph_order clients channels"
        echo "graph_args -l 0"
        echo "clients.label clients"
        echo "clients.draw LINE2"
        echo "channels.label channels"
        echo "channels.draw LINE2"
	exit 0
fi

data=$(curl --silent --user "$user:$password" "https://$host:$port/galene-api/v0/.stats")
channels=$(echo "$data" | jq '.|length')
echo "channels.value $channels"
clients=$(echo "$data" | jq '[.[].clients|length]|add')
echo "clients.value $clients"