← Blog

Hospede o Memos para suas notas

Railyard

12 de julho de 2026 · 9 min de leitura

Siga isso no seu próprio servidor. Comece grátis, sem cartão

A maioria dos apps de notas que vale usar, em algum momento, pede para você pagar uma mensalidade só para manter suas próprias notas acessíveis a você mesmo, ou trancam seus dados num formato que só o app deles lê. O Memos é uma alternativa pequena e open-source: um único binário em Go com um banco de dados SQLite embutido, feito para notas rápidas, listas e uma base pessoal de conhecimento, que você pode rodar numa infraestrutura que você controla. No final deste guia, você vai ter sua própria instância do Memos rodando num servidor de US$6/mês, acessível via HTTPS no seu próprio domínio, com uma rotina de backup e um caminho de upgrade que não vai te surpreender.

O que você vai precisar

  • Um servidor. O Basic Droplet da DigitalOcean por US$6,00/mês te dá 1 vCPU, 1 GB de RAM e 25 GB de SSD, o que é mais que suficiente para o Memos e um proxy reverso rodando juntos numa única máquina. O Memos é um binário leve em Go apoiado por SQLite, não uma pilha de serviços, então isso é mais folga do que ele de fato precisa. Qualquer VPS Ubuntu 24.04 de outro provedor funciona da mesma forma.
  • Um domínio (ou um subdomínio de um que você já tenha), com acesso às configurações de DNS dele.
  • Docker e o plugin Docker Compose instalados no servidor (coberto na Etapa 2).
  • Um terminal e acesso SSH ao servidor.

Etapa 1: Crie o servidor e aponte um domínio para ele

Suba um droplet Ubuntu 24.04 no plano Basic de US$6/mês da DigitalOcean (1 vCPU, 1 GB de RAM, 25 GB de SSD). Anote o IP público dele.

Nas configurações de DNS do seu domínio, adicione um registro A apontando um subdomínio, por exemplo memos.yourdomain.com, para esse IP:

Type: A
Name: memos
Value: <IP do seu servidor>
TTL: 300

A propagação do DNS pode levar de alguns minutos a algumas horas. Você deve ver dig memos.yourdomain.com +short retornar o IP do seu servidor antes de continuar, já que as próximas etapas dependem disso.

Etapa 2: Instale o Docker

Conecte via SSH ao servidor e instale o Docker Engine mais o plugin Compose:

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER

Saia e entre de novo para a mudança de grupo ter efeito, depois confira que as duas peças estão presentes:

docker --version
docker compose version

Você deve ver uma versão do Docker e uma versão do Compose impressas, sem erros de “command not found”.

Etapa 3: Organize o diretório do projeto

O Memos não precisa de nenhuma chave de criptografia ou segredo gerado de antemão, diferente de alguns apps self-hosted. A única coisa que vale manter fora do arquivo compose é o domínio, para o Caddy conseguir pegá-lo:

mkdir -p ~/memos && cd ~/memos

Crie o .env com o seu domínio:

# .env
DOMAIN=memos.yourdomain.com

Essa é toda a história de segredos desta configuração.

Etapa 4: Escreva o arquivo Docker Compose

O Memos vem com um banco de dados SQLite embutido por padrão, que é o jeito documentado e suportado de rodá-lo para uso pessoal ou de equipe pequena, não um modo alternativo que você deveria superar. Não há container de banco de dados separado para rodar ou manter sincronizado aqui.

Crie o 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:

Algumas escolhas que valem explicar:

  • A imagem está fixada em neosmemo/memos:0.31.0 em vez da tag flutuante stable. O Memos marca suas releases como YY.MM.N (release candidates como YY.MM.N-rc.K), e stable sempre aponta para a mais recente delas, o que é conveniente, mas significa que um simples docker compose pull poderia te mover para uma release diferente sem você escolher isso. 0.31.0 é a release exata que stable aponta hoje; fixá-la significa que você faz upgrade de forma deliberada, na sua própria agenda, coberto na Etapa 8.
  • /var/opt/memos é o único caminho dentro do container onde o Memos guarda tudo: seu banco SQLite e qualquer arquivo que você tenha enviado por ele. Um único volume nomeado montado ali é toda a história de dados deste app, o que também explica por que a etapa de backup mais adiante é tão curta.
  • Só o Caddy publica portas no host. O Memos em si só é acessível pela rede interna do Docker, nunca diretamente pela internet.

Valide se o arquivo é interpretado corretamente antes de continuar:

docker compose config

Isso deve imprimir a configuração totalmente resolvida sem erros.

Etapa 5: Escreva o Caddyfile e inicie tudo

O Caddy cuida do certificado TLS do Let’s Encrypt automaticamente, desde que o DNS já esteja apontando para o servidor e as portas 80 e 443 estejam acessíveis pela internet. Crie o Caddyfile no mesmo diretório:

{$DOMAIN} {
	reverse_proxy memos:5230
}

Inicie a stack:

docker compose up -d

Observe ela subir e confira se o Caddy de fato obteve um certificado:

docker compose logs -f caddy

Você deve ver uma linha mencionando um certificado obtido para o seu domínio, e então acessar https://memos.yourdomain.com num navegador deve carregar o Memos com um cadeado válido, sem aviso de certificado.

Etapa 6: Configuração inicial

O Memos não pede para você se cadastrar em lugar nenhum nem digitar uma chave de licença. Na primeira vez que você visita sua instância, ela mostra um formulário para criar a primeira conta diretamente, e essa conta se torna a dona da instância, com direitos de admin sobre ela. Crie agora, com uma senha de verdade, já que qualquer um que chegue à instância antes de você poderia reivindicar essa primeira conta no seu lugar.

Etapa 7: Faça backup do volume de dados

Tudo que o Memos guarda, seu banco de dados e qualquer arquivo enviado, vive sob o único caminho /var/opt/memos dentro do container, que é o volume nomeado memos_data. Fazer backup desse único volume é toda a história de backup deste app:

docker run --rm -v memos_memos_data:/data -v $(pwd):/backup alpine \
  tar czf /backup/memos-data-backup-$(date +%F).tar.gz -C /data .

Coloque isso num cron job e copie o resultado para algum lugar fora deste servidor, um bucket de object storage, outra máquina, qualquer lugar que não seja este droplet. Um backup que vive só no servidor que ele está protegendo não sobrevive ao tipo de falha que de fato destrói um servidor.

Etapa 8: Faça upgrade do Memos

Confira a versão que você está rodando atualmente, leia as release notes do Memos sobre qualquer coisa entre essa versão e a que você vai migrar, depois mude a tag no docker-compose.yml quando decidir migrar, por exemplo:

image: neosmemo/memos:<new-version>

Baixe a imagem e reinicie só esse serviço:

docker compose pull memos
docker compose up -d memos

Confira os logs para ver uma inicialização limpa:

docker compose logs -f memos

Você deve ver o Memos iniciar sem erro, e suas notas existentes devem continuar lá quando você fizer login de novo. Seu backup de volume da Etapa 7 é o caminho de volta se algo parecer errado.

O caminho curto: faça com o Railyard

Tudo isso acima, o único container do Memos com um volume de dados persistente e HTTPS já ligados, também é um template de um clique:

https://app.railyard.run/deploy?template=memos

Essa é a mesma forma de container único da configuração manual deste guia: sem add-on de Postgres, sem serviço de banco de dados separado, o próprio backend SQLite embutido do Memos fazendo o mesmo trabalho que faz aqui. O volume persistente e o HTTPS já vêm configurados para você.

Se você preferir começar pelo Railyard de forma geral antes de decidir pelo Memos especificamente, o quickstart cobre o básico, e databases and backups explica como os backups funcionam em todos os templates, não só este. Deploy button cobre o próprio formato do link ?template= se você quiser incorporar um em outro lugar.

O plano Free do Railyard cobre um servidor mais um servidor de banco de dados e 3 apps, sem exigir cartão. O Pro é US$19/mês por equipe, e o Team, US$49/mês por equipe, para limites maiores e mais colaboradores.

Solução de problemas

O Caddy nunca obtém um certificado, ou o navegador mostra um aviso de certificado. Isso quase sempre é DNS, não o Caddy. Rode dig memos.yourdomain.com +short da sua própria máquina e confirme que retorna o IP do servidor, não um antigo, e não nada. O Let’s Encrypt também precisa que a porta 80 esteja acessível pela internet para a validação inicial, então confira se o firewall ou security group do seu provedor de nuvem permite entrada nas portas 80 e 443, não só a 443.

docker compose up falha com “port is already allocated”. Alguma outra coisa na máquina já está vinculada à porta 80 ou 443, geralmente uma instalação padrão de Nginx ou Apache que vem com algumas imagens base. Encontre com sudo ss -tlnp | grep -E ':80|:443' e pare esse serviço.

As notas parecem desaparecer depois de um restart. Isso geralmente significa que um diretório do host foi montado via bind em vez de um volume nomeado do Docker para /var/opt/memos, e algo sobre esse caminho, a propriedade dele, ou um container não relacionado reaproveitando-o, deixou os dados em algum lugar diferente de onde você pensa. Volumes nomeados, como usados no arquivo compose acima, evitam isso porque o Docker os gerencia de forma consistente independente do que está no sistema de arquivos do host.

O container inicia e sai imediatamente. Confira docker compose logs memos primeiro para ver o erro real. Um mount errado ou faltando para /var/opt/memos, ou um volume com problemas de permissão de uma mudança manual anterior, é a causa usual. Recriar o volume do zero e restaurar de um backup, se você tiver dados reais nele, é a correção mais rápida.

Perguntas frequentes

Eu preciso de Postgres ou MySQL em vez de SQLite para uma equipe maior? Não. O backend SQLite embutido do Memos é o padrão documentado e é o que este guia usa. Ele é feito para uso pessoal ou uma equipe pequena, e nada nesta configuração muda se a sua equipe crescer dentro dessa faixa. Se você estiver rodando algo grande o suficiente para o modelo de escritor único do SQLite se tornar um gargalo real, isso é uma escala de deploy diferente da que este guia cobre.

Posso rodar isso sem um domínio, só com o IP do servidor? O HTTPS automático do Caddy precisa de um domínio real; o Let’s Encrypt não emite certificados para endereços IP simples. Você pode acessar o Memos via HTTP puro num IP para testes rápidos, apontando um navegador direto para a porta 5230 no servidor, mas não confie nisso para nada que você pretenda continuar usando.

Quanto isso de fato custa para rodar? O servidor custa US$6/mês. O Memos em si é software livre e gratuito, então você está pagando pela máquina em que ele roda, nada além disso.

O que exatamente está no backup daquele único volume? Tudo. O banco de dados SQLite do Memos, que guarda cada nota, tag e configuração, e qualquer arquivo que você tenha enviado pelo app, tudo vive sob /var/opt/memos. Não há um segundo banco de dados para lembrar, que é todo o motivo da Etapa 7 ser tão curta.

O template do Railyard tem a mesma arquitetura desta configuração manual? Sim. Os dois rodam um único container do Memos contra o próprio banco SQLite embutido, sem add-on de Postgres ou MySQL, e os dois persistem esse único volume. O template do Railyard usa a tag flutuante stable em vez de uma versão fixa, já que um deploy gerenciado cuida do caminho de upgrade para você.

Qualquer um dos dois caminhos te dá a mesma coisa: um app de notas sem assinatura atrelada, seus dados num único lugar que você controla, e uma conta de servidor que não muda independente de quantas notas você escreve.

Por que escolhem o Railyard para isso

  • Sua própria conta de cloud. Faça deploy no DigitalOcean, Hetzner, Vultr, AWS, OVHcloud, ou em qualquer servidor Linux via SSH, cobrado direto pelo seu provedor, sem markup.
  • Um preço fixo por equipe. O Free é grátis para sempre: um servidor mais um servidor de banco de dados, três apps, sem cartão. O Pro custa US$19 por mês para até cinco servidores e apps ilimitados. O Team custa US$49 por mês com servidores ilimitados. Sem cobrança por app, por deploy, por assento ou por gigabyte.
  • Templates de um clique. Faça deploy de apps open source, como bancos de dados, analytics e ferramentas de dev, no seu próprio servidor em um clique.
  • Bancos de dados gerenciados. Postgres, MySQL e Redis com backups programados, verificados por restauração, e recuperação point-in-time.
  • Push-to-deploy. Faça deploy a partir do GitHub, GitLab ou da CLI, com HTTPS automático e releases sem downtime.

Pule a configuração do servidor

Suba o template verificado do Memos no Railyard com um clique e já tenha uma instância rodando com HTTPS pronto.

Plano grátis, sem cartão, e 14 dias de Pro para cada equipe nova. Um preço fixo por equipe.