Héberger Memos soi-même pour prendre des notes
Suivez ça sur votre propre serveur. Commencer gratuitement, sans carte
La plupart des applis de prise de notes qui valent la peine finissent par vous demander un abonnement mensuel pour garder vos propres notes accessibles, ou enferment vos données dans un format que seule leur appli peut lire. Memos est une petite alternative open source: un seul binaire Go avec une base de données SQLite intégrée, conçu pour des notes rapides, des listes et une base de connaissances personnelle, que vous pouvez faire tourner sur un serveur que vous contrôlez. À la fin de ce guide, vous aurez votre propre instance Memos qui tourne sur un serveur à 6$/mois, accessible en HTTPS sur votre propre domaine, avec une routine de sauvegarde et un chemin de mise à jour qui ne vous surprendra pas.
Ce qu’il vous faut
- Un serveur. Le Basic Droplet de DigitalOcean à 6,00$/mois donne 1 vCPU, 1 Go de RAM et 25 Go de SSD, ce qui est largement suffisant pour faire tourner Memos et un reverse proxy ensemble sur une seule machine. Memos est un binaire Go léger appuyé sur SQLite, pas une pile de services, donc c’est plus de marge que ce dont il a réellement besoin. N’importe quel VPS Ubuntu 24.04 chez un autre fournisseur fonctionne de la même façon.
- Un nom de domaine (ou un sous-domaine d’un domaine que vous possédez déjà), avec accès à ses réglages DNS.
- Docker et le plugin Docker Compose installés sur le serveur (couvert à l’étape 2).
- Un terminal et un accès SSH au serveur.
Étape 1: créer le serveur et pointer un domaine vers lui
Montez un droplet Ubuntu 24.04 sur le plan Basic à 6$/mois de DigitalOcean (1 vCPU, 1 Go de RAM, 25 Go de SSD). Notez son adresse IP publique.
Dans les réglages DNS de votre domaine, ajoutez un enregistrement A qui pointe un sous-domaine, par exemple memos.votredomaine.com, vers cette IP:
Type: A
Name: memos
Value: <l'IP de votre serveur>
TTL: 300
La propagation DNS peut prendre de quelques minutes à quelques heures. Vous devriez voir dig memos.votredomaine.com +short retourner l’IP de votre serveur avant de continuer, puisque les étapes suivantes en dépendent.
Étape 2: installer Docker
Connectez-vous en SSH au serveur et installez Docker Engine ainsi que le plugin Compose:
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
Déconnectez-vous et reconnectez-vous pour que le changement de groupe prenne effet, puis vérifiez que les deux pièces sont bien présentes:
docker --version
docker compose version
Vous devriez voir une version de Docker et une version de Compose s’afficher, sans erreur “command not found”.
Étape 3: organiser le répertoire du projet
Memos n’a pas besoin de clé de chiffrement ni de secrets générés à l’avance, contrairement à certaines applis auto-hébergées. La seule chose qui vaut la peine de garder en dehors du fichier compose, c’est le domaine, pour que Caddy puisse le récupérer:
mkdir -p ~/memos && cd ~/memos
Créez .env avec votre domaine:
# .env
DOMAIN=memos.votredomaine.com
C’est toute l’histoire des secrets pour cette configuration.
Étape 4: écrire le fichier Docker Compose
Memos vient avec une base de données SQLite intégrée par défaut, ce qui est la façon documentée et supportée de le faire tourner pour un usage personnel ou une petite équipe, pas un mode de repli que vous êtes censé dépasser. Il n’y a pas de conteneur de base de données séparé à faire tourner ou à garder synchronisé ici.
Créez docker-compose.yml:
services:
memos:
image: neosmemo/memos:0.31.0
restart: unless-stopped
volumes:
- memos_data:/var/opt/memos
networks:
- memos-net
caddy:
image: caddy:2
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- DOMAIN=${DOMAIN}
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
depends_on:
- memos
networks:
- memos-net
networks:
memos-net:
volumes:
memos_data:
caddy_data:
caddy_config:
Quelques choix qui méritent une explication:
- L’image est fixée à
neosmemo/memos:0.31.0plutôt que l’étiquette flottantestable. Memos étiquette ses versionsYY.MM.N(les versions candidates enYY.MM.N-rc.K), etstablepointe toujours vers la plus récente d’entre elles, ce qui est pratique mais signifie qu’un simpledocker compose pullpourrait vous faire basculer vers une autre version sans que vous l’ayez choisi.0.31.0est la version exacte vers laquellestablepointe aujourd’hui; la fixer signifie que vous mettez à jour délibérément, selon votre propre horaire, couvert à l’étape 8. /var/opt/memosest le seul chemin à l’intérieur du conteneur où Memos garde tout: sa base de données SQLite et tous les fichiers que vous avez téléversés par son intermédiaire. Un seul volume nommé monté là représente toute l’histoire des données de cette appli, ce qui explique aussi pourquoi l’étape de sauvegarde plus loin est si courte.- Seul Caddy publie des ports vers l’hôte. Memos lui-même n’est accessible que sur le réseau Docker interne, jamais directement depuis l’internet.
Validez que le fichier s’analyse correctement avant de continuer:
docker compose config
Cela devrait afficher la configuration entièrement résolue sans erreur.
Étape 5: écrire le Caddyfile et tout démarrer
Caddy gère automatiquement le certificat TLS de Let’s Encrypt, tant que le DNS pointe déjà vers le serveur et que les ports 80 et 443 sont accessibles depuis l’internet. Créez Caddyfile dans le même répertoire:
{$DOMAIN} {
reverse_proxy memos:5230
}
Démarrez la pile:
docker compose up -d
Observez le démarrage et vérifiez que Caddy a bien obtenu un certificat:
docker compose logs -f caddy
Vous devriez voir une ligne mentionnant un certificat obtenu pour votre domaine, puis visiter https://memos.votredomaine.com dans un navigateur devrait charger Memos avec un cadenas valide, sans avertissement de certificat.
Étape 6: configuration du premier démarrage
Memos ne vous demande pas de vous inscrire quelque part ni d’entrer une clé de licence. La première fois que vous visitez votre instance, un formulaire s’affiche pour créer directement le premier compte, et ce compte devient l’hôte de l’instance, avec des droits d’administration dessus. Créez-le maintenant, avec un vrai mot de passe, puisque quiconque atteint l’instance avant vous pourrait réclamer ce premier compte à votre place.
Étape 7: sauvegarder le volume de données
Tout ce que Memos conserve, sa base de données et tous les fichiers téléversés, vit sous le seul chemin /var/opt/memos à l’intérieur du conteneur, qui correspond au volume nommé memos_data. Sauvegarder ce seul volume représente toute l’histoire de sauvegarde pour cette appli:
docker run --rm -v memos_memos_data:/data -v $(pwd):/backup alpine \
tar czf /backup/memos-data-backup-$(date +%F).tar.gz -C /data .
Mettez ça dans une tâche cron et copiez le résultat ailleurs que sur ce serveur, un bucket de stockage objet, une autre machine, n’importe où sauf sur ce droplet. Une sauvegarde qui vit uniquement sur le serveur qu’elle sauvegarde ne survit pas au mode de défaillance qui détruit réellement un serveur.
Étape 8: mettre à jour Memos
Vérifiez la version que vous faites tourner actuellement, lisez les notes de version de Memos pour tout ce qui se trouve entre cette version et celle vers laquelle vous allez, puis changez l’étiquette dans docker-compose.yml une fois que vous avez décidé de passer à la suivante, par exemple:
image: neosmemo/memos:<new-version>
Récupérez et redémarrez seulement ce service:
docker compose pull memos
docker compose up -d memos
Vérifiez les journaux pour un démarrage propre:
docker compose logs -f memos
Vous devriez voir Memos démarrer sans erreur, et vos notes existantes devraient encore être là quand vous vous reconnectez. Votre sauvegarde de volume de l’étape 7 est le chemin de retour si quelque chose semble anormal.
Le raccourci: le faire avec Railyard
Tout ce qui précède, le conteneur Memos unique avec un volume de données persistant et HTTPS déjà configuré, est aussi disponible comme gabarit en un clic:
https://app.railyard.run/deploy?template=memos
C’est la même forme à un seul conteneur que la configuration manuelle de ce guide: pas d’extension Postgres, pas de service de base de données séparé, le moteur SQLite intégré propre à Memos qui fait le même travail qu’ici. Le volume persistant et le HTTPS sont déjà configurés pour vous.
Si vous préférez partir de Railyard en général avant de vous décider pour Memos en particulier, le guide de démarrage rapide couvre les bases, et bases de données et sauvegardes explique comment les sauvegardes fonctionnent à travers tous les gabarits, pas seulement celui-ci. Bouton de déploiement couvre le format de lien ?template= lui-même si vous voulez en intégrer un ailleurs.
Le plan gratuit de Railyard couvre un serveur plus un serveur de base de données et 3 applis, sans carte requise. Le plan Pro est à 19$/mois par équipe, et le plan Team à 49$/mois par équipe, pour des limites plus élevées et plus de collaborateurs.
Dépannage
Caddy n’obtient jamais de certificat, ou le navigateur affiche un avertissement de certificat. C’est presque toujours le DNS, pas Caddy. Lancez dig memos.votredomaine.com +short depuis votre propre machine et confirmez qu’il retourne l’IP du serveur, pas une ancienne, et pas rien. Let’s Encrypt a aussi besoin du port 80 accessible depuis l’internet pour la validation initiale, alors vérifiez que le pare-feu ou le groupe de sécurité de votre fournisseur cloud autorise le trafic entrant sur 80 et 443, pas seulement 443.
docker compose up échoue avec “port is already allocated.” Autre chose sur la machine est déjà lié au port 80 ou 443, souvent une installation par défaut de Nginx ou Apache livrée avec certaines images de base. Trouvez-la avec sudo ss -tlnp | grep -E ':80|:443' et arrêtez ce service.
Les notes semblent disparaître après un redémarrage. Cela signifie habituellement qu’un répertoire de l’hôte a été monté en bind plutôt qu’un volume Docker nommé pour /var/opt/memos, et quelque chose à propos de ce chemin, des permissions ou d’un autre conteneur réutilisant ce chemin, a laissé les données ailleurs que là où vous le pensiez. Les volumes nommés, comme utilisés dans le fichier compose ci-dessus, évitent ce problème parce que Docker les gère de façon cohérente peu importe ce qui se trouve sur le système de fichiers de l’hôte.
Le conteneur démarre puis se ferme immédiatement. Vérifiez docker compose logs memos pour voir l’erreur réelle d’abord. Un montage incorrect ou manquant pour /var/opt/memos, ou un volume avec des problèmes de permissions suite à un changement manuel antérieur, est la cause habituelle. Recréer le volume proprement et restaurer une sauvegarde si vous avez de vraies données dessus est la solution la plus rapide.
FAQ
Ai-je besoin de Postgres ou MySQL au lieu de SQLite pour une plus grande équipe? Non. Le moteur SQLite intégré de Memos est l’option documentée par défaut et c’est ce que ce guide utilise. Il est conçu pour un usage personnel ou une petite équipe, et rien dans cette configuration ne change si votre équipe grandit dans ces proportions. Si vous faites tourner quelque chose d’assez gros pour que le modèle à écriture unique de SQLite devienne un réel goulot d’étranglement, c’est un ordre de grandeur de déploiement différent de celui couvert par ce guide.
Puis-je faire tourner ça sans domaine, juste avec l’IP du serveur? Le HTTPS automatique de Caddy a besoin d’un vrai nom de domaine; Let’s Encrypt n’émet pas de certificats pour des adresses IP nues. Vous pouvez atteindre Memos en HTTP simple sur une IP pour des tests rapides en pointant un navigateur directement sur le port 5230 du serveur, mais ne comptez pas là-dessus pour quoi que ce soit que vous comptez garder en usage.
Combien ça coûte réellement à faire tourner? Le serveur coûte 6$/mois. Memos lui-même est un logiciel libre et gratuit, donc vous payez pour la machine qui le fait tourner, rien de plus.
Qu’est-ce qui est exactement sauvegardé dans ce seul volume? Tout. La base de données SQLite de Memos, qui contient chaque note, étiquette et réglage, ainsi que tous les fichiers téléversés par l’appli, vivent sous /var/opt/memos. Il n’y a pas de deuxième entrepôt de données à se rappeler, ce qui explique entièrement pourquoi l’étape 7 est aussi courte.
Le gabarit de Railyard a-t-il la même architecture que cette configuration manuelle? Oui. Les deux font tourner un seul conteneur Memos avec sa propre base de données SQLite intégrée, sans extension Postgres ou MySQL, et les deux conservent ce seul volume. Le gabarit de Railyard utilise l’étiquette flottante stable plutôt qu’une version fixée, puisqu’un déploiement géré s’occupe du chemin de mise à jour à votre place.
Les deux chemins vous donnent la même chose au final: une appli de notes sans abonnement attaché, vos données à un seul endroit que vous contrôlez, et une facture de serveur qui ne change pas peu importe le nombre de notes que vous écrivez.
Pourquoi les gens choisissent Railyard pour ça
- Votre propre compte infonuagique. Déployez sur DigitalOcean, Hetzner, Vultr, AWS, OVHcloud, ou n'importe quel serveur Linux par SSH, facturé directement par votre fournisseur, sans majoration.
- Un prix fixe par équipe. L'offre gratuite est gratuite pour toujours : un serveur plus un serveur de base de données, trois applications, sans carte. Pro coûte 19 $ par mois pour jusqu'à cinq serveurs et un nombre illimité d'applications. Team coûte 49 $ par mois avec des serveurs illimités. Aucuns frais par application, par déploiement, par siège ou par gigaoctet.
- Des gabarits en un clic. Déployez des applications open source, comme des bases de données, des outils d'analyse et des outils de développement, sur votre propre serveur en un clic.
- Des bases de données gérées. Postgres, MySQL et Redis, avec des sauvegardes planifiées, vérifiées par restauration, et la récupération à un point dans le temps.
- Déploiement par push. Déployez depuis GitHub, GitLab ou la CLI, avec HTTPS automatique et des mises en production sans interruption.