Pourquoi héberger Linkwarden soi-même
L'objection la plus courante est celle de la charge opérationnelle : un service de plus à mettre à jour, à sauvegarder, à sécuriser — autant rester sur un SaaS. Elle est légitime, mais elle part d'une prémisse inexacte : un outil bien conteneurisé comme Linkwarden ne demande pas plus d'entretien qu'une image Docker standard. La mise à jour se résume à tirer la nouvelle image et à relancer le service. La sauvegarde porte sur un seul volume de base de données. Le TLS est géré par un reverse proxy déjà en place sur le VPS.
Ce que l'auto-hébergement règle, en revanche, c'est la dépendance à un SaaS dont les conditions d'accès peuvent changer du jour au lendemain. Plusieurs équipes ont perdu l'accès à une veille partagée après la fermeture ou le rachat d'un outil tiers. Sur votre VPS, les données appartiennent à votre organisation, les collections restent accessibles quel que soit le contexte commercial du fournisseur, et vous maîtrisez la politique de rétention.
Ce que Linkwarden apporte à une agence
- Collections partagées — chaque projet ou client dispose de sa propre collection, accessible à l'équipe concernée sans exposer les autres dossiers.
- Droits par membre — les permissions se gèrent au niveau de la collection : lecteur, contributeur ou gestionnaire, selon le rôle de chacun.
- Annotations communes — les membres d'une collection peuvent laisser des notes sur chaque lien, ce qui évite les doublons de recherche et capitalise la veille.
- Extension navigateur multi-utilisateurs — chaque collaborateur installe l'extension dans son navigateur et enregistre directement dans la collection cible, sans ouvrir l'interface web.
- Archivage des pages — Linkwarden conserve une copie locale des pages enregistrées, ce qui évite de perdre une ressource disparue du web.
- API REST — les liens s'intègrent dans d'autres outils internes via l'API, sans dépendance à une interface graphique.
- Contrôle total des données — aucune analyse comportementale, aucune syndication externe des favoris vers des tiers.
Prérequis avant l'installation
Un VPS avec 2 vCPU et 2 Go de RAM suffit pour une agence de 5 à 15 personnes à usage normal : les collections chargent rapidement, l'archivage des pages tourne en arrière-plan sans impacter la navigation. En dessous de 1 Go de RAM, le processus Node.js de Next.js peut être tué par l'OOM killer sous charge.
Planifiez 10 à 20 Go de stockage selon le volume de pages archivées : chaque capture d'écran et chaque copie de page pèse entre 100 Ko et 2 Mo. Un VPS {{vps.power.name}} avec SSD NVMe convient à cette charge.
Côté réseau, le port 443 doit être ouvert et un nom de domaine doit pointer sur l'IP du VPS avant de générer le certificat TLS. Linkwarden requiert Docker et Docker Compose, disponibles sur toutes les distributions Linux majeures. Une base PostgreSQL est nécessaire — elle est incluse dans le fichier Compose officiel.
Déploiement pas à pas
Préparer le répertoire de travail
Connectez-vous en SSH à votre VPS en tant que root ou via un utilisateur sudoïsé, puis créez le dossier qui accueillera les fichiers de configuration :
mkdir -p /opt/linkwarden && cd /opt/linkwardenCréer le fichier Compose
Créez un fichier docker-compose.yml avec le contenu suivant. Les valeurs entre chevrons sont à remplacer avant de démarrer :
services:
postgres:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_DB: linkwarden
POSTGRES_USER: linkwarden
POSTGRES_PASSWORD: <mot-de-passe-db>
volumes:
- postgres_data:/var/lib/postgresql/data
linkwarden:
image: ghcr.io/linkwarden/linkwarden:latest
restart: unless-stopped
depends_on:
- postgres
environment:
DATABASE_URL: postgresql://linkwarden:<mot-de-passe-db>@postgres:5432/linkwarden
NEXTAUTH_SECRET: <chaine-aleatoire-32-caracteres>
NEXTAUTH_URL: https://votre-domaine.com
volumes:
- linkwarden_data:/data/data
ports:
- "127.0.0.1:3000:3000"
volumes:
postgres_data:
linkwarden_data:Pour générer la valeur de NEXTAUTH_SECRET, exécutez sur le serveur : openssl rand -base64 32.
Configurer la variable NEXTAUTH_URL avec soin
La variable NEXTAUTH_URL doit correspondre exactement à l'URL publique de votre instance, protocole inclus. Si votre instance est derrière un reverse proxy TLS, la valeur doit commencer par https:// et non par http://.
Un NEXTAUTH_URL malformé produit l'erreur suivante au premier chargement de l'interface : Error: NEXTAUTH_URL is not configured. Please set NEXTAUTH_URL in your .env. Si la valeur est en http:// alors que le proxy renvoie du HTTPS, la session ne se crée pas et la page de connexion se recharge en boucle sans message d'erreur visible.
Démarrer les conteneurs
Depuis /opt/linkwarden, lancez :
docker compose up -dLes images sont téléchargées, puis PostgreSQL démarre en premier. Linkwarden attend que la base soit prête avant d'initialiser le schéma. Vérifiez que les deux conteneurs sont en état running avec docker compose ps.
Configurer le reverse proxy (nginx)
Linkwarden écoute sur 127.0.0.1:3000. Ajoutez un bloc serveur nginx pour proxifier le trafic HTTPS :
server {
listen 443 ssl;
server_name votre-domaine.com;
ssl_certificate /etc/letsencrypt/live/votre-domaine.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/votre-domaine.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Rechargez nginx avec nginx -t && systemctl reload nginx.
Générer le certificat TLS
Si ce n'est pas déjà fait, générez un certificat Let's Encrypt avec Certbot :
certbot --nginx -d votre-domaine.comCertbot modifie automatiquement le bloc nginx pour ajouter les chemins de certificat et la redirection HTTP vers HTTPS. Le renouvellement est automatique via le timer systemd installé par le paquet.
Créer le premier compte administrateur
Ouvrez https://votre-domaine.com dans un navigateur. Linkwarden propose de créer le premier compte au premier accès. Ce compte devient l'administrateur de l'instance. Ensuite, invitez chaque collaborateur depuis le panneau Paramètres → Membres en renseignant son adresse e-mail.
Distribuer l'extension navigateur
L'extension Linkwarden est disponible sur le Chrome Web Store et sur Firefox Add-ons. Lors de la première configuration, chaque membre renseigne l'URL de l'instance (https://votre-domaine.com) et génère un token d'API depuis Paramètres → Tokens d'accès. Les favoris enregistrés via l'extension arrivent directement dans la collection choisie par l'utilisateur.
Durcissement après installation
Restreignez l'accès direct au port 3000 depuis l'extérieur — il ne doit répondre que sur l'interface locale : vérifiez que la ligne ports de votre Compose bind sur 127.0.0.1:3000:3000 et non sur 0.0.0.0:3000:3000.
Activez les mises à jour automatiques de l'image avec Watchtower ou planifiez un docker compose pull && docker compose up -d hebdomadaire dans une cron.
Sauvegardez le volume postgres_data avec un dump quotidien : docker compose exec postgres pg_dump -U linkwarden linkwarden > /opt/backups/linkwarden-$(date +%F).sql. Conservez les dumps hors du serveur (S3, stockage distant) pour résister à une défaillance disque.
Linkwarden ou Karakeep : deux usages distincts
Karakeep (anciennement Hoarder) et Linkwarden sont souvent cités ensemble dans les comparatifs de gestionnaires de favoris self-hosted, mais ils ne répondent pas au même besoin.
Karakeep est centré sur la capture intelligente : il extrait et résume automatiquement le contenu des pages grâce à un modèle de langage local ou distant. C'est un outil pensé pour un usage individuel, où la valeur vient de l'IA qui trie et classe. Il n'expose pas de notion de collection partagée ni de gestion de droits par membre.
Linkwarden est pensé pour la collaboration : la notion centrale est la collection partagée, accessible à plusieurs membres avec des droits différenciés. Les annotations y sont communes, pas personnelles. L'extension navigateur se connecte à l'instance de l'organisation, pas à un compte personnel. Pour une agence qui veut centraliser la veille de ses équipes-projets, Linkwarden est l'outil adapté. Pour un profil qui veut une bibliothèque personnelle enrichie par l'IA, Karakeep répond mieux.
Linkwarden vs Karakeep — tableau récapitulatif
| Critère | Linkwarden | Karakeep |
|---|---|---|
| Usage principal | Veille collaborative d'équipe | Capture personnelle assistée par IA |
| Collections partagées | Oui, avec droits par membre | Non (usage solo) |
| Annotations communes | Oui | Non |
| Extension navigateur multi-utilisateurs | Oui | Oui (compte unique) |
| Résumé IA du contenu | Non | Oui (modèle local ou API) |
| Ressources minimales | 2 vCPU / 2 Go RAM | 2 vCPU / 4 Go RAM (modèle local) |
| Licence | AGPL-3.0 | AGPL-3.0 |
Dépannage : erreurs courantes à l'installation
La page de connexion se recharge en boucle sans message d'erreur.
Cause probable : NEXTAUTH_URL est défini en http:// alors que le reverse proxy sert du HTTPS. NextAuth génère un cookie sécurisé que le navigateur refuse de renvoyer sur une connexion non chiffrée. Corrigez la valeur dans le Compose, puis relancez avec docker compose up -d --force-recreate.
L'interface s'affiche mais les images des collections ne chargent pas.
Le chemin du volume linkwarden_data n'est pas monté correctement. Vérifiez que le volume est bien déclaré dans la section volumes du fichier Compose et qu'aucun montage bind précédent n'a laissé le dossier vide.
Erreur ECONNREFUSED dans les logs de Linkwarden au démarrage.
Linkwarden démarre avant que PostgreSQL soit prêt à accepter des connexions. Ajoutez un healthcheck sur le service postgres et une condition depends_on: postgres: condition: service_healthy sur le service linkwarden pour imposer l'ordre.
L'extension navigateur affiche « Impossible de joindre le serveur ».
Vérifiez que l'URL saisie dans les paramètres de l'extension ne comporte pas de barre oblique finale (https://votre-domaine.com et non https://votre-domaine.com/). Certaines versions de l'extension sont sensibles à ce détail.
L'archivage des pages ne fonctionne pas.
Le processus d'archivage appelle Chromium en headless depuis le conteneur. Sur les VPS avec moins de 1,5 Go de RAM, le processus est terminé avant la capture. Augmentez les ressources du VPS ou désactivez l'archivage automatique dans Paramètres → Archivage si la RAM est contrainte.
L'étape suivante : centraliser l'ensemble des services de l'agence
Une agence qui auto-héberge sa veille avec Linkwarden a déjà franchi la ligne : elle gère ses propres données, ses propres mises à jour, ses propres sauvegardes. C'est la posture d'une équipe qui sait ce qu'elle fait tourner.
La prochaine étape logique est de centraliser aussi les domaines, hébergements et VPS de vos clients dans un espace revendeur sous votre propre marque — sans multiplier les interfaces ni perdre la visibilité sur les renouvellements. C'est exactement ce que l'offre agence de ServOrbit permet.
Si vous souhaitez aller plus loin sur l'auto-hébergement d'outils d'équipe, les articles sur Outline (wiki collaboratif) et l'automatisation des serveurs avec Ansible complètent ce guide.