Lucas Janin | Pocket-ID: Installation Bare-metal sur Debian - Lucas Janin

Pocket-ID: Installation Bare-metal sur Debian

  • PocketID VM Feature

Après avoir utilisé PocketID pendant de nombreux mois via une installation dans un LXC avec les Proxmox Helper Scripts, j’ai constaté que le service tourne en tant que root. De plus, j’ai lu qu’une installation dans une VM s’avère davantage sécurisée qu’un LXC.

Présentation de Pocket-ID

Avant toute chose, si vous ne connaissez pas Pocket-ID, c’est un client OIDC moderne et léger pour gérer l’authentification de vos services tels qu’Authentific, Aurelia, etc. Sa particularité est qu’il ne prend en charge que les passkeys. Je l’utilise avec de nombreux services auto-hébergés tels que Proxmox, Proxmox Backup Server, Komodo, Betszel, Karakeep, et évidemment Headscale/Headplane. Pour davantage de détails, le site officiel répondra sûrement à beaucoup de vos questions. Si une installation via Docker est plus adaptée à votre environnement, je vous invite à visiter l’excellent billet de BlackVoid en anglais. Il détaille également la configuration pour utiliser Pocket-ID afin de se connecter à Synology DSM.

Préamble

Étant donné que je ne manque pas de mémoire sur mon nœud Proxmox et que je suis très attentif au niveau de sécurité de mon homelab, je me suis lancé dans l’installation d’une VM. Cela a été laborieux, car jusqu’à la version 0.53, il y avait deux services, de nombreuses dépendances et des compilations nécessaires. Malgré les nombreux obstacles, j’ai réussi ma mission ! Puis, quelques heures après, sans avoir même eu le temps de savourer ma petite victoire, la version 1.0 est sortie. Cette révision majeure simplifie grandement les choses, car c’est un exécutable. Voici la procédure pour une installation simplifiée en tant que service avec un utilisateur non root dans une VM Debian de Proxmox. Cette procédure devrait pouvoir s’adapter relativement facilement à d’autres types de configurations. Il existe beaucoup d’autres méthodes pour installer Pocket-ID, je vous invite à consulter la page “installation” sur du site de Pocket-ID.

Préparation de la VM dans Proxmox

Si vous êtes dans Proxmox, je vous invite à installer une VM Debian en utilisant les Proxmox Helper Scripts. Il est également possible de le faire avec une Alpine plus légère, mais je ne me suis pas encore lancé dans cette aventure. Choisir le mode mode advanced et ajuste pour votre situation et changer le nom du host à “pocketid”.

bash -c "$(curl -fsSL https://raw.githubusercontent.com/community-scripts/ProxmoxVE/main/vm/debian-vm.sh)"

QEMU

Il est recommandé d’installer l’agent invité QEMU sur votre machine virtuelle. Vous pouvez suivre ces étapes dans la console Proxmox de la machine virtuelle.

Mettre à jour la liste des paquets :

sudo apt update && sudo apt upgrade -y

Installer le paquet Proxmox QEMU Guest Agent :

sudo apt install qemu-guest-agent -y

Démarrer et activer le service :

sudo systemctl start qemu-guest-agent
sudo systemctl enable emu-guest-agent

Vérifier que le service est en cours d’exécution

sudo systemctl status qemu-guest-agent

Cela garantira que l’agent invité Proxmox QEMU est correctement installé et exécuté sur votre système Debian.

Installation de Pocket-ID

Préparation du système

apt update && apt upgrade -y

Créer un utilisateur dédié

useradd -r -s /bin/false -m -d /opt/pocket-id pocketid

Installer les dépendances nécessaires à l’installation

apt install -y curl

Téléchargement et Installation de PocketID

cd /opt/pocket-id
ARCH="amd64"
LATEST_RELEASE_URL=$(curl -s https://api.github.com/repos/pocket-id/pocket-id/releases/latest | grep "browser_download_url.*pocket-id-linux-${ARCH}" | cut -d '"' -f 4)
sudo curl -L -o pocket-id "${LATEST_RELEASE_URL}"
sudo chmod +x pocket-id
sudo chown pocketid:pocketid pocket-id

Création des répertoires pour les données de Pocket-ID

sudo mkdir -p /opt/pocket-id/data/uploads

Fichier de configuration de Pocket-ID. Pour obtenir la localisation des adresses IP des visiteurs, je vous invite à créer une clé API sur le site de Maxmind.

sudo nano /opt/pocket-id/.env
APP_URL=https://id.xxxx.xx
PORT=1411

# Database: SQLite, file located at /opt/pocket-id/data/db.sqlite
# (relative to WorkingDirectory=/opt/pocket-id)
DB_CONNECTION_STRING=file:data/db.sqlite?_journal_mode=WAL&_busy_timeout=2500&_txlock=immediate

# Optional: Maxmind License Key for IP Geolocation
MAXMIND_LICENSE_KEY="YOUR-MAXMIND-LICENSE-KEY"

# Optional: Logging level (debug, info, warn, error)
LOG_LEVEL=info

Assurez-vous que tous les fichiers de pocket-ID soient avec les bonnes permissions d’utilisateur.

sudo chown pocketid:pocketid /opt/pocket-id/.env
sudo chmod 600 /opt/pocket-id/.env

Mise en place du service Pocket-ID

sudo nano /etc/systemd/system/pocketid.service
[Unit]
Description=Pocket ID Application Server
After=network.target

[Service]
Type=simple
User=pocketid
Group=pocketid
WorkingDirectory=/opt/pocket-id
ExecStart=/opt/pocket-id/pocket-id
EnvironmentFile=/opt/pocket-id/.env

Restart=always
RestartSec=10

NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable pocketid.service
sudo systemctl start pocketid.service
sudo systemctl status pocketid.service

Si tout se passe comme prévu, vous devriez recevoir une confirmation.

● pocketid.service - Pocket ID Application Server
     Loaded: loaded (/etc/systemd/system/pocketid.service; enabled; preset: enabled)
     Active: active (running) since Sun 2025-06-01 07:12:57 EDT; 7s ago
   Main PID: 28699 (pocket-id)
      Tasks: 8 (limit: 2309)
     Memory: 8.7M
        CPU: 65ms
     CGroup: /system.slice/pocketid.service
             └─28699 /opt/pocket-id/pocket-id

Jun 01 07:12:57 pocketid systemd[1]: Started pocketid.service - Pocket ID Application Server.
Jun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 Starting job scheduler
Jun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 Server listening on 0.0.0.0:1411
Jun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 GeoLite2 City database is up-to-date
Jun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 Job "UpdateGeoLiteDB" run successfully
Jun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 Job "SyncLdap" run successfully
Jun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 Job "SendHeartbeat" run successfully

Reverse Proxy avec Caddy

Voici mon Caddyfile avec le fichier /robots.txt au cas où il serait respecté (c’est beau de rêver).

# Snippet for robots.txt
(common_robots_txt) {
	handle /robots.txt {
		# Set the Content-Type header
		header Content-Type "text/plain; charset=utf-8"
		# Respond with the body and status code 200
		respond `User-agent: *
		Disallow: /` 200
	}
}

# Pocket-ID
id.xxxx.xx {
	import common_robots_txt
	# Fallback to reverse proxy for other requests
	reverse_proxy 192.168.x.yyy:1411 [xxxx:xxxx:xxxx:xxxx::yyyy]:1411
}
systemctl reload caddy.service 

Pour la première configuration de votre instance Pocket-ID, je vous invite à créer votre compte administrateur sur https://id.xxxx.xx/login/setup. Il est très fortement encouragé d’avoir deux passkeys vu que c’est la seule manière d’authentification. J’en ai une dans Bitwarden/Vaultwarden et une autre dans le trousseau iCloud (via Safari).

Mise à jour

Puisque nous ne sommes pas dans Docker, la mise à jour peut être un peu plus compliquée. Cependant, rien d’insurmontable, surtout depuis la version 1.0 déjà compilée. Voici un petit script de mise à jour qui m’a permis de passer de la version 1.0 à 1.1.0 sans encombre.

nano /root/update-pocketid.sh
#!/bin/bash
# update-pocketid.sh

# --- Configuration ---
INSTALL_DIR="/opt/pocket-id"
SERVICE_NAME="pocketid.service"
USER="pocketid"
GROUP="pocketid"
VERSION_FILE="${INSTALL_DIR}/version.txt" 
ARCHITECTURE="amd64" # Change if needed (e.g., arm64)
# --- End Configuration ---

echo "Checking for the latest version of PocketID..."
LATEST_TAG_JSON=$(curl -s https://api.github.com/repos/pocket-id/pocket-id/releases/latest)
LATEST_TAG=$(echo "$LATEST_TAG_JSON" | grep '"tag_name":' | sed -E 's/.*"v([^"]+)".*/\1/') # Version without 'v'
LATEST_TAG_WITH_V=$(echo "$LATEST_TAG_JSON" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') # Version with 'v'

if [ -z "$LATEST_TAG" ]; then
    echo "Could not retrieve the latest version from GitHub."
    exit 1
fi

echo "Latest version available: v${LATEST_TAG}"

CURRENT_VERSION="0" # Default to 0 if no version file
if [ -f "$VERSION_FILE" ]; then
    CURRENT_VERSION=$(cat "$VERSION_FILE")
fi
echo "Currently installed version: v${CURRENT_VERSION}"

if [ "$LATEST_TAG" = "$CURRENT_VERSION" ]; then
    echo "PocketID is already up to date (v${CURRENT_VERSION})."
    exit 0
fi

echo "New version v${LATEST_TAG} available. Updating..."

DOWNLOAD_URL=$(echo "$LATEST_TAG_JSON" | grep -E "browser_download_url.*pocket-id-linux-${ARCHITECTURE}" | cut -d '"' -f 4)

if [ -z "$DOWNLOAD_URL" ]; then
    echo "Could not find the download URL for linux-${ARCHITECTURE} and version v${LATEST_TAG}."
    exit 1
fi

echo "Stopping service ${SERVICE_NAME}..."
sudo systemctl stop "${SERVICE_NAME}"

echo "Backing up the old binary..."
BACKUP_NAME="pocket-id_backup_v${CURRENT_VERSION}_$(date +%Y%m%d_%H%M%S)"
sudo cp "${INSTALL_DIR}/pocket-id" "${INSTALL_DIR}/${BACKUP_NAME}"
echo "Old binary backed up to ${INSTALL_DIR}/${BACKUP_NAME}"

Rendre le script exécutable

sudo chmod +x /root/update-pocketid.sh

J’ai ajouté dans mes alias.

alias update='/root/update-pocketid.sh'

Pensez à faire une mise à jour du système avant celle de Pocket-ID.

sudo apt update && sudo apt upgrade -y

Si vous utilisez Proxmox, je vous encourage à faire un snapshot juste avant la mise à jour et à avoir des sauvegardes régulières (on ne sait jamais :-).

Conclusion

Vous êtes maintenant prêt a entrer dans le futur avec OIDC et Passkey. Vous pouvez visiter la page Exemples de clients pour configurer facilement vos services avec Pocket-ID. Je vous souhaite un bon voyage dans le monde captivant de l’auto-hébergement !

Leave a Reply

Your feedback is valuable for us. Your email will not be published.