PhotoPrism ou Immich: qual escolher para self-hosting?
Compare o consumo de RAM, recursos de mapas e apps móveis entre PhotoPrism e Immich. Veja os comandos de backup para Docker e qual atende melhor seu servidor VPS.
PhotoPrism vs Immich: resposta curta
PhotoPrism vs Immich é uma escolha entre duas funções diferentes, não entre duas versões do mesmo produto. O Immich substitui o Google Photos: uma aplicação no telemóvel faz automaticamente uma cópia de segurança do rolo da câmara, e a linha cronológica apresentada é familiar para quem deixa de usar uma galeria de telemóvel. O PhotoPrism organiza uma biblioteca de fotografias que já existe: indexa pastas de ficheiros no disco, lê os respetivos metadados, coloca as fotografias num mapa e mantém os ficheiros exatamente onde estavam.
Escolha o Immich se o problema for "o meu telemóvel está cheio e quero deixar de usar o Google Photos". Escolha o PhotoPrism se o problema for "tenho 400 GB de fotografias numa unidade e não consigo encontrar nada". Ambos são open source, ambos funcionam como contentores Docker num VPS normal e ambos indexam e pesquisam a sua biblioteca sem enviar dados para terceiros.
A divisão de filosofia e por que determina tudo
O Immich é responsável pelos ficheiros. Indica-lhe um local de carregamento, a aplicação móvel ou o carregador Web envia os originais e o Immich armazena-os no seu próprio caminho, com a sua própria nomenclatura. A base de dados contém a informação principal sobre álbuns, rostos e pesquisa. É esse desenho que torna boa a experiência no telemóvel, porque o servidor conhece sempre o estado completo de cada recurso.
O PhotoPrism lê os ficheiros. Monta uma pasta originals que já controla e o PhotoPrism cria um índice sobre ela. A árvore de diretórios continua a ser sua. Se remover o PhotoPrism amanhã, as fotografias permanecem nas mesmas pastas, com os mesmos nomes, e os ficheiros YAML auxiliares que o PhotoPrism escreveu para descrever o que aprendeu ficam na sua própria pasta de armazenamento, que é onde os mantém por predefinição.
Essa única diferença explica a maior parte do resto. O Immich tem um suporte móvel forte porque controla a ingestão. O PhotoPrism oferece uma curadoria forte da biblioteca porque nunca entra em conflito com a sua estrutura existente. O Immich é a melhor opção para uma família cujas fotografias vivem nos telemóveis. O PhotoPrism é a melhor opção para um arquivo que vive num disco.
Consumo de hardware: o Immich exige mais
Os requisitos mínimos de memória documentados são muito diferentes, e num VPS pequeno este é normalmente o fator decisivo.
Os dados por trás deste gráfico
[
{
"label": "Immich",
"min_ram_gb": 6
},
{
"label": "PhotoPrism",
"min_ram_gb": 3
}
]O Immich documenta 6 GB de RAM como mínimo e 8 GB como recomendado. Também indica que uma máquina com 4 GB só consegue executá-lo com o machine learning desativado. O PhotoPrism documenta 3 GB de memória física e dois núcleos de CPU. Além desse mínimo, indica que a quantidade de RAM deve acompanhar o número de núcleos.
A diferença é real e resulta do contentor de machine learning. O Immich executa os seus modelos num serviço immich-machine-learning separado, que carrega para a memória os modelos CLIP (contrastive language image pretraining) e de deteção facial. Numa máquina com 2 GB, o kernel termina esse contentor. O contentor sai com o código 137, que indica um processo terminado com o sinal 9 e é a forma como um encerramento por falta de memória aparece no Docker. Os modelos integrados do PhotoPrism são executados no ONNX, que, segundo a documentação, funciona geralmente bem em todos os tipos de hardware. O PhotoPrism também tem uma alternativa documentada para situações de pouca memória: em máquinas com 1 GB ou menos, desativa a conversão RAW e o reconhecimento facial. Isto não é uma garantia de estabilidade. Abaixo do mínimo de 3 GB, o projeto avisa que podem ocorrer instabilidade e problemas de desempenho. Trate, portanto, esse valor como um limite mínimo.
A documentação do PhotoPrism é explícita ao recomendar pelo menos 4 GB de swap no servidor. A página de requisitos do Immich não menciona swap, mas a swap dá margem de memória ao contentor de machine learning numa máquina pequena. Adicione-a antes de instalar qualquer um dos dois.
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -hfree -h deve agora mostrar uma linha Swap: com 4.0Gi. Se mostrar 0B, então swapon falhou, normalmente porque o sistema de ficheiros não suporta fallocate, e sudo dd if=/dev/zero of=/swapfile bs=1M count=4096 é a alternativa. Os limites de memória dos contentores também são importantes neste caso. Definir limites de memória no Docker Compose é a forma de impedir que um serviço com elevado consumo de memória derrube a máquina inteira. A exceção é o próprio PhotoPrism: a documentação recomenda não definir um limite rígido de memória no seu contentor, porque a indexação de ficheiros grandes precisa temporariamente de memória adicional e um limite pode causar reinícios inesperados.
Há outro requisito que costuma causar problemas. A base de dados PostgreSQL do Immich deve ficar num sistema de ficheiros Unix normal, com propriedade e permissões reais, em armazenamento local, nunca numa partilha de rede. O PhotoPrism avisa para nunca guardar os ficheiros da sua base de dados numa pasta de rede partilhada e indica o armazenamento SSD local como o melhor local para esses ficheiros. Nenhuma das aplicações deve executar a sua base de dados num object store montado.
Como instalar cada um
Ambas as instalações consistem num ficheiro Compose do fornecedor e num comando. Configure primeiro o Docker Engine e o plugin Compose, conforme explicado no nosso guia do Docker Compose numa VPS.
O Immich publica o seu ficheiro Compose e um ficheiro de ambiente de exemplo em cada release.
sudo mkdir -p /opt/immich && cd /opt/immich
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.envEdite .env antes de iniciar qualquer coisa. UPLOAD_LOCATION é o local onde ficarão os seus originais. DB_PASSWORD já vem com um valor predefinido funcional, e o Immich recomenda alterá-lo para uma palavra-passe aleatória, embora isso não seja obrigatório. O Postgres não fica exposto publicamente, por isso a palavra-passe é usada apenas para autenticação local, mas não custa definir uma palavra-passe aleatória. Use apenas os caracteres A-Za-z0-9, porque a documentação do Immich indica que outros caracteres podem causar problemas quando o Docker analisa o valor. Em seguida, inicie o serviço.
docker compose up -d
docker compose psA interface web responde na porta 2283. A primeira conta registada nessa página torna-se a conta de administrador. Aceda à página e registe-a imediatamente, em vez de deixar uma instância aberta na Internet.
O PhotoPrism fornece um ficheiro Compose que já inclui o MariaDB.
sudo mkdir -p /opt/photoprism && cd /opt/photoprism
wget https://dl.photoprism.app/docker/compose.yamlAbra compose.yaml e altere PHOTOPRISM_ADMIN_PASSWORD antes do primeiro arranque. A documentação é clara: a aplicação arranca com a palavra-passe inicial que estiver nesse ficheiro, o comprimento mínimo é de 8 caracteres e o valor predefinido nunca deve ser usado num servidor público. Defina também o volume originals para a pasta que contém as suas fotografias.
docker compose up -d
docker compose logs -f photoprismO PhotoPrism responde na porta 2342 com o utilizador admin. Nenhuma das aplicações deve ser exposta diretamente. Coloque um reverse proxy com TLS (segurança da camada de transporte) à frente, seguindo a mesma estrutura usada para um Nextcloud autoalojado com Docker, TLS e cópias de segurança, ou mantenha o servidor privado e aceda-lhe através de uma VPN. Se essa VPS acabar por alojar mais do que fotografias, aplique a mesma restrição a todos os serviços que adicionar, porque um relay RustDesk autoalojado precisa apenas das suas duas portas acessíveis e de mais nada.
Qual tem a melhor aplicação para telemóvel
É aqui que os dois projetos mais divergem. É também a razão pela qual a maioria das pessoas acaba por escolher o Immich.
O Immich disponibiliza aplicações oficiais para Android e iOS. Estas fazem cópias de segurança em segundo plano do rolo da câmara. Isto significa que as fotografias novas saem do telemóvel sem ser necessário abrir qualquer aplicação. Para utilizar o serviço fora de casa, o Immich documenta três opções: uma VPN, como WireGuard ou OpenVPN, Tailscale ou um reverse proxy a disponibilizar HTTPS. O reverse proxy permite que as aplicações móveis estabeleçam ligação sem ser necessária uma aplicação VPN em cada telemóvel. O Immich avisa que nunca se deve reencaminhar diretamente a porta 2283 para a Internet sem configuração adicional.
O PhotoPrism não tem uma aplicação nativa oficial. Disponibiliza uma progressive web app, que pode ser adicionada ao ecrã inicial a partir do navegador. Também documenta o WebDAV (web distributed authoring and versioning) como método para sincronizar a partir de um telemóvel. O projeto recomenda uma aplicação de terceiros chamada PhotoSync para esta finalidade, apontada para o diretório /import/ ou /originals/ através de WebDAV. Funciona, mas é uma aplicação paga de terceiros a executar uma tarefa que o Immich realiza dentro do seu próprio cliente.
Se o requisito for fazer cópias de segurança automáticas dos telemóveis de vários membros da família, a decisão fica tomada. Immich.
O que o machine learning fornece na prática
O Immich faz pesquisas semânticas na biblioteca com o CLIP. Assim, uma pesquisa como "bicicleta vermelha na neve" encontra fotografias que nunca foram etiquetadas por ninguém. Também faz deteção e agrupamento de rostos, além de deteção de duplicados. A indexação de uma importação grande apenas com CPU pode demorar horas em segundo plano. Isto é normal e não requer uma GPU (graphics processing unit).
O PhotoPrism classifica imagens em etiquetas com um modelo ONNX integrado, deteta rostos e agrupa-os por pessoa com modelos faciais ONNX, e lê metadados de localização para criar um mapa de lugares. Um ficheiro vision.yml na pasta de configuração permite substituir esses componentes por Ollama ou OpenAI para etiquetas e legendas, se necessário. O mapa é a funcionalidade que leva as pessoas a permanecerem na aplicação: uma biblioteca indexada pelo local onde os acontecimentos ocorreram é uma forma realmente diferente de percorrer vinte anos de fotografias. A mesma ideia funciona noutras coleções de multimédia, e a interface de videoclube dos anos 90 do Halcyon para o Jellyfin é a versão cinematográfica dessa abordagem, com navegação por prateleira em vez de por lista. O reconhecimento facial está incluído na edição gratuita Community. As subscrições pagas Essentials e Plus adicionam funcionalidades como camadas de mapa mais detalhadas, mais funções de utilizador e uma interface de gestão de utilizadores. Em outubro de 2026, começam em alguns euros por mês, com faturação anual.
O Immich não tem funcionalidades bloqueadas por pagamento, e o projeto afirma que nunca terá. Também vende chaves de produto opcionais vitalícias: $25 para um utilizador ou $100 para um servidor inteiro, segundo os preços anunciados pelo Immich em julho de 2024. No entanto, comprar uma chave não desbloqueia nada. O Immich funciona sem restrições se nunca pagar. O núcleo do PhotoPrism é gratuito e inclui extras pagos opcionais.
Backups determine whether you keep your data
Um servidor de fotografias sem cópias de segurança fica a uma falha de disco de perder tudo o que uma família tem. Ambas as aplicações precisam de duas cópias de segurança: a base de dados e os ficheiros.
No Immich, faça um dump da base de dados a partir do contentor Postgres e copie a localização dos uploads.
docker exec -t immich_postgres pg_dump --clean --if-exists --dbname=immich --username=postgres | gzip > /backup/immich-db.sql.gzDepois, faça uma cópia de segurança de UPLOAD_LOCATION. As pastas que contêm dados insubstituíveis são upload, library e profile. As pastas thumbs e encoded-video podem ser regeneradas, mas isso pode consumir horas de CPU. Um dump da base de dados, por si só, não restaura nada, porque contém apenas metadados.
No PhotoPrism, o índice tem o seu próprio comando.
docker compose exec photoprism photoprism backup -i -fEsse comando grava um dump SQL em storage/backup/. Depois, copie a pasta originals e a pasta storage. Como o PhotoPrism também grava ficheiros YAML auxiliares que descrevem cada fotografia, é possível reconstruir um índice perdido apenas a partir dos ficheiros. Esta é uma vantagem importante para um arquivo que pretende conservar durante décadas.
Independentemente da opção escolhida, envie essas cópias de segurança para fora do servidor segundo um agendamento, utilizando cópias de segurança restic encriptadas e com deduplicação para armazenamento remoto. Uma cópia de segurança no mesmo disco que a biblioteca não é uma cópia de segurança. Configure o job para emitir um alerta quando falhar, porque uma cópia de segurança que deixou silenciosamente de ser executada em março parece exatamente igual a uma que foi executada na noite passada, até ao dia em que precisar dela; um servidor ntfy autoalojado enviará essa falha para o seu telemóvel ainda nessa noite.
Qual deles deve executar
Execute o Immich se as suas fotografias estiverem nos telemóveis, se mais de uma pessoa precisar de fazer uma cópia de segurança do rolo da câmara e se puder disponibilizar 6 GB de RAM ou mais ao servidor. É o mais próximo do Google Photos que pode alojar por conta própria, e a experiência móvel é o seu principal objetivo. O nosso guia passo a passo para instalar o Immich explica detalhadamente os encerramentos por falta de memória e as armadilhas das atualizações.
Execute o PhotoPrism se já tiver um arquivo de fotografias no disco, se valorizar mapas e metadados e quiser manter a sua própria estrutura de pastas, ou se o seu VPS tiver 4 GB de RAM e preferir uma biblioteca funcional a uma biblioteca que use swap. É a melhor ferramenta para organizar e selecionar fotografias e é mais adequada para hardware com poucos recursos.
Também é razoável executar ambos. O Immich trata da importação diária das fotografias dos telemóveis. Uma vez por ano, organiza as fotografias que pretende manter no arquivo e deixa o PhotoPrism indexá-lo. Não entram em conflito, porque o PhotoPrism lê pastas, enquanto o Immich gere o seu próprio armazenamento.
FAQ
O PhotoPrism e o Immich podem partilhar a mesma pasta de fotografias?
Não de forma segura nos dois sentidos. O PhotoPrism indexa uma pasta originals e tem funcionalidades que escrevem nela, exceto quando é executado em modo só de leitura, enquanto o Immich espera ser o proprietário do conteúdo do local de carregamento. Pode apontar o PhotoPrism para uma cópia só de leitura da pasta library do Immich para a consultar, mas não permita que as duas aplicações giram os mesmos ficheiros, porque o modelo de armazenamento do Immich pode mover ou mudar o nome dos ativos enquanto o PhotoPrism os indexa.
O Immich é suficientemente estável para guardar a única cópia das minhas fotografias?
Nenhuma aplicação autoalojada deve guardar a única cópia de qualquer ficheiro. O Immich segue agora o versionamento semântico e indica que as alterações incompatíveis estão limitadas às versões principais. Por isso, fixe IMMICH_VERSION numa tag de versão principal, como v3, leia as notas da versão e atualize com docker compose pull && docker compose up -d. Não há suporte para downgrade, mesmo dentro da mesma versão secundária, por isso faça um dump da base de dados antes de cada atualização. Mantenha os ficheiros originais com cópias de segurança fora do servidor para manter o risco reduzido.
Por que motivo o contentor de machine learning do Immich está sempre a reiniciar?
Normalmente, está a ser terminado por consumir memória em excesso. Execute docker compose ps --all, porque um contentor parado fica oculto sem essa flag, e procure o serviço de machine learning a terminar com o código 137. Esse código significa que o processo foi terminado com o sinal 9. O out of memory killer do kernel é a causa habitual, mas não é a única, por isso confirme com sudo dmesg | grep -i 'out of memory'. Adicione swap ou desative completamente o machine learning numa máquina com 4 GB. Um limite de memória no contentor não o limita de forma gradual: quando atinge o limite, continua a ser terminado, mas deixa de privar o resto do servidor de memória. A pesquisa inteligente e o reconhecimento facial deixam de funcionar sem machine learning, mas o restante Immich funciona normalmente.
O PhotoPrism precisa de MariaDB ou SQLite é suficiente?
SQLite funciona e é adequado para uma biblioteca pessoal, mas o PhotoPrism limita-se a quatro workers quando o utiliza. A documentação recomenda mudar para MariaDB porque este suporta melhor uma elevada concorrência. O ficheiro compose fornecido pelo projeto já inclui MariaDB, por isso o caminho recomendado também é o predefinido.
Quanto espaço em disco devo reservar além do tamanho da minha biblioteca?
Adicione 10 a 20 por cento ao tamanho dos originais, para qualquer uma das aplicações. Esse espaço cobre miniaturas geradas e pré-visualizações de vídeo transcodificadas. Uma coleção de 200 GB precisa de aproximadamente 220 a 240 GB apenas para a biblioteca, além de espaço para a base de dados e para o crescimento. Se também mantiver uma cópia local completa no mesmo volume, os originais e essa cópia precisam de pelo menos 400 GB antes de contabilizar qualquer outro conteúdo. Nesse caso, reserve cerca de 450 GB ou coloque a cópia num volume separado.