Self-héberger le backend Note-SX sur Proxmox
Self-héberger le backend Note-SX sur Proxmox VE
Le plugin Obsidian Share Note permet de partager n’importe quelle note via un lien. Le contenu est chiffré côté client avant d’être envoyé au serveur — par défaut, celui de note.sx. Si tu veux garder le contrôle de tes données, tu peux héberger toi-même le backend.
Ce tutoriel couvre deux méthodes : Docker (recommandée, plus simple) et installation manuelle dans un container LXC sur Proxmox VE.
Prérequis
- Un hôte Proxmox VE 8.x fonctionnel
- Accès au shell Proxmox (root)
- Un domaine ou sous-domaine public accessible — le
BASE_WEB_URLdoit être joignable depuis le client Obsidian - Un reverse proxy en place (Nginx, Caddy, NPM…) si tu n’utilises pas Cloudflare en proxy direct
Méthode 1 : Docker (recommandée)
C’est la méthode officielle, la plus simple à maintenir.
Création du container LXC
Crée un container LXC Debian 13 (1 CPU, 512 Mo RAM, 4 Go disque), puis installe Docker dans le container :
curl -fsSL https://get.docker.com | sh
Déploiement
Crée un répertoire de travail, puis récupère les fichiers de configuration officiels :
mkdir -p /opt/notesx && cd /opt/notesx
wget https://raw.githubusercontent.com/note-sx/server/main/docker-compose.yml
wget -O .env https://raw.githubusercontent.com/note-sx/server/main/.env.example
Le docker-compose.yml officiel :
services:
notesx-server:
image: ghcr.io/note-sx/server:latest
container_name: notesx-server
restart: always
ports:
- "3000:3000"
env_file:
- ".env"
volumes:
- ./db:/notesx/db:Z
- ./userfiles:/notesx/userfiles:Z
healthcheck:
test: (wget -qO - http://localhost:3000/v1/ping | grep -q ok) || exit 1
interval: 30s
timeout: 5s
retries: 2
start_period: 10s
Les données sont persistées dans ./db et ./userfiles — ces deux dossiers sont à inclure dans tes sauvegardes.
Configure le .env (voir section ci-dessous), puis lance :
docker compose up -d
Vérifie que le serveur répond :
curl http://localhost:3000/v1/ping
Pour mettre à jour l’image plus tard :
docker compose pull && docker compose up -d
Méthode 2 : Installation manuelle (sans Docker)
Si tu préfères une installation Node.js native dans le container LXC :
apt update && apt install -y build-essential curl
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
Récupère la dernière release de note-sx/server, extrais-la dans /opt/notesx/app, puis :
cd /opt/notesx/app
npm install --omit=dev
npx tsc --noCheck
Service systemd
Crée /etc/systemd/system/notesx.service :
[Unit]
Description=NoteSX Share Note Server
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/opt/notesx/app
EnvironmentFile=/opt/notesx/app/.env
ExecStart=/usr/bin/node /opt/notesx/app/dist/index.js
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
systemctl enable --now notesx
Configuration du .env
Que tu utilises Docker ou l’installation manuelle, le fichier .env est identique. Voici toutes les options disponibles :
# Obligatoire
BASE_WEB_URL=https://ton-domaine.exemple.com
HASH_SALT=une-chaine-aleatoire-longue
MAXIMUM_UPLOAD_SIZE_MB=5
# Optionnel
FOLDER_PREFIX=0
ALLOW_NEW_USERS=true
# Cloudflare Turnstile (captcha à l'inscription)
CLOUDFLARE_TURNSTILE_KEY=
CLOUDFLARE_TURNSTILE_SECRET=
# Cloudflare Proxy (cache + purge automatique)
CLOUDFLARE_ZONE_ID=
CLOUDFLARE_API_KEY=
Options obligatoires
BASE_WEB_URL: l’URL publique de ton instance. Doit être accessible depuis les clients Obsidian.HASH_SALT: chaîne aléatoire générée une fois à l’installation. Ne jamais changer après coup — tous les liens existants seraient cassés.MAXIMUM_UPLOAD_SIZE_MB: taille maximale des uploads utilisateur en Mo.
Options optionnelles
FOLDER_PREFIX:0(défaut),1ou2. Divise les fichiers utilisateurs en sous-dossiers basés sur les N premiers caractères du nom de fichier. Utile si tu anticipes un grand volume de fichiers.ALLOW_NEW_USERS: passe àfalseune fois ton compte créé pour bloquer les nouvelles inscriptions. Les utilisateurs existants peuvent toujours générer de nouvelles API keys.
Options Cloudflare Turnstile
Turnstile est le système de captcha de Cloudflare. Si tu actives ces deux variables, un captcha s’affiche lors de la création d’un compte sur ton instance.
CLOUDFLARE_TURNSTILE_KEY: la clé publique (site key) obtenue dans le dashboard Cloudflare > Turnstile.CLOUDFLARE_TURNSTILE_SECRET: la clé secrète correspondante.
Pour les générer : Cloudflare Dashboard > Turnstile > Add widget, choisis le hostname de ton instance.
Options Cloudflare Proxy
Si ton serveur est derrière le proxy Cloudflare (icône nuage orange), ces variables permettent au backend de purger automatiquement le cache des notes supprimées ou modifiées.
CLOUDFLARE_ZONE_ID: visible dans le dashboard Cloudflare de ton domaine, colonne de droite.CLOUDFLARE_API_KEY: un token API Cloudflare avec permissionCache Purgesur la zone concernée.
Sans ces variables, les notes partagées supprimées depuis Obsidian pourraient rester accessibles depuis le cache Cloudflare jusqu’à expiration naturelle.
Après toute modification du .env :
# Docker
docker compose up -d
# systemd
systemctl restart notesx
Reverse proxy
Le serveur écoute sur le port 3000 en HTTP. Configure ton reverse proxy pour pointer vers http://IP_DU_CONTAINER:3000.
Exemple minimal Nginx :
server {
listen 443 ssl;
server_name ton-domaine.exemple.com;
location / {
proxy_pass http://192.168.x.x: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;
}
}
Si tu utilises Cloudflare en proxy (orange cloud), pense à restreindre l’accès au port 3000 aux seules IP Cloudflare depuis le firewall Proxmox ou le container.
Connexion du plugin Obsidian
Dans Obsidian, ouvre les paramètres du plugin Share Note :
- Champ Server : saisis l’URL de ton instance (
https://ton-domaine.exemple.com) - Clique sur Get API key — le plugin ouvre ton navigateur sur ta propre instance pour créer un compte
- Une fois le compte créé, l’API key est récupérée automatiquement
Ce fichier de configuration se trouve dans <VAULT_DIR>/.obsidian/plugins/share-note/data.json et se synchronise sur tous tes appareils via ton système de sync Obsidian habituel. Tous tes appareils pointent automatiquement vers ton instance sans configuration supplémentaire.
Pour vérifier que le plugin ne pointe plus vers note.sx, contrôle l’URL dans les requêtes réseau lors du partage d’une note.
Utilisation au quotidien
Une fois le plugin connecté à ton instance, partager une note se fait en deux clics.
Partager une note
Deux façons d’accéder à l’action :
- Palette de commandes (
Cmd+P) : tape “share” et sélectionne Share Note: Share current note

- Menu contextuel : clic droit sur le fichier dans l’explorateur > Share note on the web

Le plugin chiffre le contenu côté client, l’envoie sur ton serveur, puis affiche une notification verte avec le lien déjà copié dans le presse-papier. Un clic sur Open shared note ouvre directement la note dans le navigateur.

Mettre à jour une note déjà partagée
Un nouveau partage (Share current note) écrase la version précédente sur le serveur. Le lien reste identique. Si tu veux forcer un re-upload complet (utile après un changement de thème ou d’assets), utilise Share Note: Force re-upload of all data for this note depuis la palette.
Copier le lien d’une note existante
Si tu as besoin du lien sans re-partager : palette > Share Note: Copy shared note link, ou menu contextuel > Copy shared link.
Supprimer une note partagée
Menu contextuel > Share note on the web (si déjà partagée, l’option se transforme en action de suppression), ou depuis la palette. Une confirmation s’affiche — la suppression n’affecte que la version en ligne, ta note locale reste intacte.

Une notification bleue confirme la suppression.

Si tu utilises Cloudflare en proxy avec
CLOUDFLARE_ZONE_IDetCLOUDFLARE_API_KEYconfigurés, le cache est purgé automatiquement à la suppression.
Conclusion
L’instance tourne avec moins de 100 Mo de RAM au repos. En Docker, les données sont dans ./db et ./userfiles à côté du docker-compose.yml. En installation manuelle, dans /opt/notesx/db et /opt/notesx/userfiles. Dans les deux cas, ces deux dossiers suffisent pour une sauvegarde complète.
FAQ : questions fréquentes sur le self-hosting Note-SX
Johan Vivien
Lead DevOps passionné par l'infrastructure, l'automatisation et les nouvelles technologies. Je partage ici mes retours d'expérience sur le self-hosting, la domotique et le développement.