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 Home

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.

yaml
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: 5

Servizio 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.

bash
DATABASE_DB=memos
DATABASE_USER=memos-username
DATABASE_PASSWORD=5up3r_P4s5w0rd_DB

Primo Avvio

Una volta creati i file docker-compose.yml e .env, è possibile avviare lo stack con il comando:

bash
docker compose up -d

Al 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.

Memos - Creazione account amministratore

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 .env corrispondano tra i due servizi e che l’indirizzo dell’host nella stringa URI MEMOS_DSN coincida con il nome del servizio database nel file Docker Compose (in questo caso memos_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_dump direttamente dal container PostgreSQL con il comando:
    bash
    docker exec memos_postgres pg_dump -U memos-username memos > backup.sql
    È consigliabile automatizzare questa operazione con un cron job per non rischiare di perdere le proprie note.