Construir um NAS Privado e Partilhável

self-hosting
segurança

Na manhã seguinte a expor o portfólio da minha namorada à internet, verifiquei os logs do Nginx e encontrei dezenas de pedidos a tentar aceder a /wp-admin, /wp-login.php e vários ficheiros de configuração do WordPress. O site não foi construído com WordPress. Era puro HTML e JavaScript. Os bots não se importam, estão apenas à espera de ter sorte.

Esta é a realidade de self-hosting em 2026: no momento em que expões algo à internet pública, scanners automatizados começam a sondar vulnerabilidades. Mas a verdade é esta, não fiquei surpreendido. Estava à espera disto. E é exatamente por isso que a minha infraestrutura está desenhada desta forma.

O Problema: Quero Partilhar Coisas, Não Tudo

Tenho um NAS caseiro (UGREEN DXP2800 com Intel N100) que aloja vários serviços:

  • Immich para gestão e partilha de fotos
  • Vaultwarden para gestão de passwords
  • Paperless-ngx para organização de documentos
  • Sites de portfólio para a minha namorada e para mim
  • Uma arr stack para gestão de media

Alguns destes precisam de ser acessíveis a amigos e família. A maioria nunca deveria ver a internet pública. O desafio é criar uma arquitetura que permita partilha seletiva sem criar superfícies de ataque.

O Princípio Central: Páginas de Login São Armadilhas

Depois de ver aquelas sondagens do WordPress, uma coisa ficou cristalina: páginas de login acessíveis publicamente são ímanes para ataques automatizados. Mesmo que as tuas credenciais sejam fortes, mesmo que tenhas rate limiting, mesmo que aches que o teu software é seguro, estás a jogar à defesa contra um exército de bots que correm 24/7.

A minha filosofia tornou-se simples: se um serviço requer autenticação, fica atrás do Tailscale. Ponto final.

O Que Mantenho Privado

Estes serviços só são acessíveis através da minha VPN Tailscale:

  • Vaultwarden (gestor de passwords) - Nem pensar em expor isto publicamente
  • Instância completa do Immich - Biblioteca de fotos completa com todas as funcionalidades de gestão
  • Paperless-ngx - Todos os meus documentos, garantias, registos financeiros
  • Arr stack - Não há razão para isto ser público
  • UI de administração do NAS - Desativei o UGREEN Link e quaisquer funcionalidades cloud, acesso apenas através do Tailscale

Se alguém quiser acesso à minha biblioteca do Immich, peço-lhes para instalar o Tailscale. Isto cria fricção? Sim. Pessoas não-técnicas vão achar chato? Absolutamente. Mas a alternativa é expor milhares de fotos pessoais à internet pública, e esse não é um compromisso que estou disposto a fazer.

O Que Exponho (E Como)

Álbuns de Fotos Públicos: A Abordagem das Regras Nginx

Para partilhar álbuns de fotos específicos publicamente, uso um subdomínio separado com regras rigorosas no Nginx Proxy Manager que apenas permitem acesso a:

  • /_app (assets do frontend)
  • /share (páginas de partilha pública)
  • /api/shared-links
  • /api/assets
  • /api/albums
  • /api/timeline
  • /api/download

Todo o resto retorna um 403. A página de login? Bloqueada. /api/auth? Bloqueado. Endpoints de administração? Bloqueados. Isto significa que alguém pode ver um álbum partilhado e até fazer upload de fotos, mas não pode fazer brute-force de credenciais ou enumerar utilizadores porque esses endpoints simplesmente não estão acessíveis.

Mantenho os URLs dos álbuns temporários e defino sempre datas de expiração. No momento em que termino de partilhar, o link morre.

A Decisão do Proxy da Cloudflare

Para os sites de portfólio, uso o proxy da Cloudflare (nuvem laranja) que fornece:

  • Proteção DDoS
  • Mascaramento do endereço IP
  • Filtragem de bots

Mas aqui está o problema: o proxy da Cloudflare tem um limite de upload de 100MB. Para álbuns partilhados do Immich onde quero que amigos façam upload de fotos de alta resolução, uso o modo apenas DNS (nuvem cinzenta). Isto significa que o meu IP real fica exposto, mas o compromisso vale a pena pela funcionalidade. Mitigo isto mantendo os links de partilha de curta duração e nunca os deixando ativos mais tempo do que o necessário.

Antes de me decidir por esta abordagem, experimentei o projeto public Immich proxy, mas removia demasiadas funcionalidades que eu realmente queria: uploads, localizações das fotos, modo de apresentação. Às vezes a solução DIY é mesmo melhor.

Os Serviços Que Quase Expus (Mas Não O Fiz)

Tentei self-host um serviço de transferência de ficheiros (como o Erugo, uma alternativa ao WeTransfer). O problema? Requer que os utilizadores façam login antes de fazer upload. Isso é um desqualificador instantâneo para mim.

Até considerei contribuir para o projeto para adicionar URLs temporários anónimos assinados que permitiriam uploads sem autenticação. Se alguma vez o alojar, bloquearia absolutamente o painel de administração e páginas de login do acesso público, mesmo que a funcionalidade principal de upload estivesse exposta.

O padrão aqui é consistente: se tem uma página de login, painel de administração ou API de autenticação, sou extremamente cauteloso em expô-lo. E se não há uma boa razão para ser público (como a minha arr stack), simplesmente fica privado.

Compromissos do Mundo Real

A Fricção do Onboarding do Tailscale

Conseguir que pessoas não-técnicas instalem o Tailscale é infelizmente um desafio, mesmo sendo apenas criar uma conta e fazer download de uma app. Tento apresentá-lo como "configura e esquece" e ofereço-me para ajudar na configuração, mas continua a ser fricção. Algumas pessoas apenas querem um link que funcione no browser delas.

É aqui que a abordagem das regras Nginx para álbuns do Immich brilha. Posso enviar a alguém um URL e eles podem ver fotos sem instalar nada. Mas para acesso completo onde possam criar álbuns, gerir fotos, usar reconhecimento facial? Tailscale é inegociável.

O Resgate do Portfólio

A minha namorada é designer de moda e originalmente alojava o seu portfólio no Behance. Os sistemas automatizados da Adobe sinalizaram-no como nudez (é fotografia de moda artística), e de repente ninguém podia vê-lo sem criar uma conta Behance. Dissemos que se lixe a Adobe e fizemos self-host.

Agora o portfólio dela é apenas HTML e JavaScript servido através do proxy da Cloudflare. Monto um volume isolado apenas com os ficheiros de imagem, sem acesso ao resto do sistema. O site é rápido, ela tem controlo completo, e não há nenhuma plataforma corporativa que o possa sinalizar arbitrariamente. +1 para self-hosting, +1 para namorados desenvolvedores.

A Revolução dos Documentos

O Paperless-ngx mudou completamente como lido com documentos. Digitalizei papéis físicos, criei regras para importar automaticamente anexos de email e guardo PDFs diretamente nele. A forma física de guardar documentos morreu para mim agora.

Posso procurar qualquer garantia, encontrar qualquer recibo e realmente lembrar-me onde pus documentos importantes. Tudo isto fica atrás do Tailscale porque são registos sensíveis: documentos fiscais, registos médicos, extratos financeiros. Não há universo onde eu exporia isto publicamente.

Manutenção e Atualizações

Uma das razões pelas quais optei pelo NAS UGREEN em vez de uma construção totalmente personalizada é a gestão de atualizações. O sistema verifica automaticamente atualizações, recebo uma notificação, revejo o changelog e, se não for breaking, atualizo imediatamente. Se estivesse numa configuração totalmente personalizada, usaria o Watchtower para atualizações de containers.

A chave é que desativei todas as funcionalidades cloud do próprio UGREEN. Sem UGREEN Link, sem acesso remoto através da plataforma deles. A UI de administração só é acessível através do Tailscale. Confio mais no meu próprio modelo de segurança do que em qualquer serviço cloud de um fornecedor.

As Lições

Depois de meses a correr esta configuração, eis o que aprendi:

1. Desenha assumindo que os bots te vão encontrar imediatamente. Encontraram-me, literalmente na manhã seguinte a expor. Tem o teu modelo de segurança pronto antes de expores seja o que for.

2. Páginas de login são os alvos de maior valor. Se conseguires evitar expor autenticação completamente, fá-lo. Usa VPNs para serviços privados e, para serviços públicos, usa regras de reverse proxy restritivas que bloqueiam endpoints de autenticação.

3. A Cloudflare é útil, mas compreende os compromissos. O proxy protege o teu IP e filtra bots, mas o limite de upload pode quebrar o teu caso de uso. Escolhe apenas DNS quando precisares, proxy quando não precisares.

4. Links com expiração são teus amigos. Para qualquer coisa pública que envolva uploads de utilizadores ou conteúdo sensível, usa URLs temporários e impõe realmente datas de expiração.

5. A melhor segurança é não expor coisas em primeiro lugar. Antes de tornar algo público, pergunta: isto precisa mesmo de ser acessível a partir da internet? A maioria dos serviços não precisa.

6. A fricção do utilizador é uma funcionalidade de segurança. Sim, pedir às pessoas para instalar o Tailscale cria fricção. Essa fricção também significa que o meu gestor de passwords e arquivo de documentos não estão sentados na internet pública.

O Que Diria ao Meu Eu do Passado

Se estivesse a começar esta configuração do zero, não mudaria muito. A arquitetura de dois volumes (HDD para media, NVMe para Docker) funciona muito bem. A abordagem Tailscale + regras seletivas de Nginx lida tanto com privacidade como com partilha. O Intel N100 com Quick Sync lida eficientemente com os modelos de machine learning do Immich (embora esse seja um tópico para outro post).

A única coisa que enfatizaria mais é a rapidez com que precisas de ter o teu modelo de segurança definido. Os bots não esperam. Já estão a fazer scan ao teu IP antes de teres terminado o teu primeiro café.

Constrói para privacidade primeiro, depois esculpe as peças específicas que queres partilhar. Não o contrário.


A correr o teu próprio NAS? Fala comigo, adorava ouvir como estás a lidar com a divisão privado/público.