Memos è un’applicazione di note-taking completamente open-source che si pone come una valida alternativa a Google Keep o strumenti simili. È stato sviluppato fin dall’inizio con particolare attenzione alla privacy e con la volontà di creare un servizio veloce, immediato e semplice da utilizzare. È completamente gratuito, senza limitazioni o tier premium, ed è sviluppato da una community molto attiva che contribuisce con idee e innovazione continua.
Memos è principalmente sviluppato attorno ai file Markdown, che permettono la cattura istantanea di idee in testo semplice con rendering completo. Le note vengono salvate in un database locale (SQLite, PostgreSQL o MySQL), garantendo controllo totale sui dati senza dipendere da servizi cloud o terze parti, minimizzando così i rischi di violazioni della privacy in contesti sensibili.
Processo di Installazione
Dopo aver installato Docker Engine
e Docker Compose, è possibile procedere con l’installazione di Memos. La configurazione proposta utilizza un file Docker Compose per definire i due servizi necessari (il server Memos e il database PostgreSQL) e un file .env per le variabili d’ambiente.
Di default Memos utilizza SQLite come database integrato, ma in questa guida abbiamo scelto di configurare PostgreSQL, in quanto offre maggiore robustezza, migliori strumenti di backup e una gestione più efficiente dei dati nel lungo periodo. È inoltre una soluzione preferibile se il servizio viene utilizzato da più utenti contemporaneamente.
Creiamo il File Docker Compose
Il file docker-compose.yml qui sotto configura l’intero stack di Memos. Il servizio sarà raggiungibile sulla porta 5230, modificabile in base alle proprie esigenze.
services:
memos:
image: neosmemo/memos:stable
container_name: memos
restart: always
depends_on:
memos_db:
condition: service_healthy
ports:
- 5230:5230
environment:
TZ: Europe/Rome
MEMOS_DRIVER: postgres
MEMOS_DSN: postgresql://${DATABASE_USER}:${DATABASE_PASSWORD}@memos_db:5432/${DATABASE_DB}?sslmode=disable
volumes:
- ./memos/data:/var/opt/memos
memos_db:
image: postgres:17
container_name: memos_postgres
restart: always
volumes:
- ./memos/database:/var/lib/postgresql/data
environment:
TZ: Europe/Rome
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
POSTGRES_DB: ${DATABASE_DB}
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${DATABASE_USER} -d ${DATABASE_DB}"]
interval: 5s
timeout: 5s
retries: 5Servizio Memos
Il container Memos si occupa della gestione e del salvataggio delle note. La direttiva depends_on con condition: service_healthy garantisce che il container venga avviato solo quando il database è effettivamente pronto a ricevere connessioni, mentre la policy restart: always assicura il riavvio automatico in caso di problemi. Il volume montato in ./memos/data rende persistenti i dati dell’applicazione, preservandoli anche in caso di arresto o ricreazione del container.
La variabile MEMOS_DRIVER indica a Memos di utilizzare PostgreSQL come motore di database, mentre MEMOS_DSN contiene la stringa di connessione in formato URI con le credenziali lette dal file .env. L’indirizzo memos_db nella stringa di connessione fa riferimento al nome del servizio database definito nello stesso file Docker Compose, che viene risolto automaticamente tramite la rete interna di Docker.
Servizio Database
In questa configurazione abbiamo definito un database PostgreSQL dedicato, ma è possibile rimuoverlo nel caso si volesse utilizzare un database già presente o disponibile in un’altra posizione. Il database non espone alcuna porta sull’host: la comunicazione con Memos avviene interamente sulla rete interna di Docker. Se fosse necessario accedere al database tramite un client esterno come DBeaver, sarà sufficiente aggiungere la sezione ports al servizio memos_db.
Per garantire la corretta sequenza di avvio, è stato aggiunto un healthcheck che utilizza pg_isready per verificare lo stato del database. Questo permette a Docker Compose di sapere esattamente quando PostgreSQL è pronto ad accettare connessioni, evitando che Memos tenti di connettersi prima che il database sia disponibile.
Creiamo il File .env
Il file .env contiene le credenziali condivise tra i servizi, così da evitare di scrivere password direttamente nel file Docker Compose. È importante personalizzare la password del database con una stringa sicura
prima di avviare lo stack.
DATABASE_DB=memos
DATABASE_USER=memos-username
DATABASE_PASSWORD=5up3r_P4s5w0rd_DBPrimo Avvio
Una volta creati i file docker-compose.yml e .env, è possibile avviare lo stack con il comando:
docker compose up -dAl primo accesso tramite browser all’indirizzo http://<indirizzo-server>:5230, Memos rileverà che non è ancora stato configurato alcun account e reindirizzerà automaticamente alla pagina di registrazione. Il primo utente registrato diventa l’amministratore del servizio, con la possibilità di gestire le impostazioni del sistema e gli eventuali utenti aggiuntivi.
Come si può notare dallo screenshot, l’applicazione mostra il messaggio “You are registering as the Site Host”, a conferma che il primo account creato avrà il ruolo di amministratore del servizio.
Registrazione utenti
Dopo il primo avvio, la registrazione di nuovi utenti è aperta a chiunque raggiunga l’interfaccia. Se il servizio è esposto su internet, è consigliabile disabilitare la registrazione pubblica dalle impostazioni di amministrazione una volta creati tutti gli account necessari.Troubleshooting & Consigli
Di seguito alcuni consigli utili per risolvere i problemi di configurazione più comuni:
- Se Memos non riesce a connettersi al database, verificare che le credenziali nel file
.envcorrispondano tra i due servizi e che l’indirizzo dell’host nella stringa URIMEMOS_DSNcoincida con il nome del servizio database nel file Docker Compose (in questo casomemos_db). - Per esporre Memos su internet, configurare un reverse proxy (es. Caddy o NGINX Proxy Manager ) con HTTPS e un certificato SSL valido. Non esporre mai la porta 5230 direttamente su internet senza cifratura.
- Per eseguire il backup del database, è possibile utilizzare
pg_dumpdirettamente dal container PostgreSQL con il comando:È consigliabile automatizzare questa operazione con un cron job per non rischiare di perdere le proprie note.bashdocker exec memos_postgres pg_dump -U memos-username memos > backup.sql