Pocket-ID: Installation Bare-metal sur Debian
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-agentsudo 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-idARCH="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-idsudo 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.xxPORT=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 GeolocationMAXMIND_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/.envsudo 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 ServerAfter=network.target[Service]Type=simpleUser=pocketidGroup=pocketidWorkingDirectory=/opt/pocket-idExecStart=/opt/pocket-id/pocket-idEnvironmentFile=/opt/pocket-id/.envRestart=alwaysRestartSec=10NoNewPrivileges=truePrivateTmp=true[Install]WantedBy=multi-user.target
sudo systemctl daemon-reloadsudo systemctl enable pocketid.servicesudo systemctl start pocketid.servicesudo 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-idJun 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 schedulerJun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 Server listening on 0.0.0.0:1411Jun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 GeoLite2 City database is up-to-dateJun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 Job "UpdateGeoLiteDB" run successfullyJun 01 07:12:57 pocketid pocket-id[28699]: 2025/06/01 07:12:57 Job "SyncLdap" run successfullyJun 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 headerheader Content-Type "text/plain; charset=utf-8"# Respond with the body and status code 200respond `User-agent: *Disallow: /` 200}}# Pocket-IDid.xxxx.xx {import common_robots_txt# Fallback to reverse proxy for other requestsreverse_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 1fiecho "Latest version available: v${LATEST_TAG}"CURRENT_VERSION="0" # Default to 0 if no version fileif [ -f "$VERSION_FILE" ]; then CURRENT_VERSION=$(cat "$VERSION_FILE")fiecho "Currently installed version: v${CURRENT_VERSION}"if [ "$LATEST_TAG" = "$CURRENT_VERSION" ]; then echo "PocketID is already up to date (v${CURRENT_VERSION})." exit 0fiecho "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 1fiecho "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 !