SSD Nodes Learn Hosting plans →
Guias Matt ConnorPor Matt Connor · Atualizado 2026-10-21

Como instalar o MinIO em um VPS Ubuntu 24.04

Configure o MinIO em um VPS Ubuntu 24.04 com build verificado, systemd, comandos mc, URLs preassinadas e destino S3 para backups do restic.

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

O armazenamento de objetos auto-hospedado que o MinIO oferece

O MinIO é uma solução de armazenamento de objetos auto-hospedada compatível com a API Amazon S3. Aponte o restic ou um SDK S3 para o seu próprio servidor, altere uma definição de endpoint e, para leituras, escritas, listagens e links pré-assinados de objetos no dia a dia, isso é suficiente. No entanto, compatível não significa idêntico. Por exemplo, o MinIO não implementa as ACLs de objetos da Amazon, e os seus responsáveis já disseram que não tencionam fazê-lo. Por isso, uma aplicação que dependa do comportamento das ACLs precisa de mais do que um novo endpoint. Este guia cria um nó único no Ubuntu 24.04: um binário compilado a partir de código-fonte verificado, um utilizador de sistema dedicado, uma unidade systemd que mantém as credenciais root fora do ficheiro da unidade e um bucket para onde o restic faz cópias de segurança.

S3 (simple storage service) é uma API HTTP, não um sistema de ficheiros. Coloca um objeto num bucket sob uma chave com PUT e obtém-o novamente com GET. Num bucket padrão, não existem escrita parcial nem renomeação. Os buckets de diretório Amazon S3 Express One Zone são a exceção, com chamadas próprias para acrescentar e renomear, mas essa é uma classe de armazenamento específica e nada neste guia depende dela. As ferramentas de cópia de segurança preferem o modelo padrão, porque um objeto chegou completo ou não chegou.

Um nó mantém uma única cópia dos seus dados. Esse é o compromisso que está a assumir. Obtém um endpoint S3 sob o seu controlo pelo preço de um VPS e também assume todas as tarefas que o fornecedor de cloud executava, desde substituir um disco avariado até aplicar correções no software do servidor. A secção perto do final explica claramente quando esse compromisso é adequado.

O estado da Community Edition do MinIO em outubro de 2026

Leia esta parte antes de seguir este guia, porque a situação mudou recentemente. Em maio de 2025, o MinIO removeu as funcionalidades de administração da consola web da Community Edition. O que permanece no navegador é um navegador de objetos. Por isso, os buckets e as chaves de acesso são geridos através do cliente de linha de comandos mc.

Mais tarde, em 2025, o MinIO deixou de publicar binários comunitários pré-compilados. O README do projeto informa que a Community Edition é distribuída apenas como código-fonte. Desde abril de 2026, o repositório minio/minio foi arquivado com o aviso THIS REPOSITORY IS NO LONGER MAINTAINED. O servidor de downloads antigo também deixou de disponibilizar os ficheiros comunitários. Verificado em 20 de outubro de 2026, todos os caminhos dl.min.io que este guia usava para descarregar o binário do servidor, o binário do cliente e os respetivos ficheiros de checksum respondem 410 Gone. Isto indica uma remoção deliberada, não uma indisponibilidade temporária. O único binário mc que ainda está nesse servidor é o AIStor Client, disponível em /aistor/mc/release/, que pertence à linha comercial. A página de downloads em min.io lista agora AIStor Server, AIStor Client, AIStor SDK e alguns complementos AIStor, além de um nível gratuito do AIStor que descreve como destinado a programadores, investigadores e pequenas organizações que executam implementações autónomas. Não existe uma build comunitária.

O código-fonte continua disponível e é mais recente do que o último binário. A versão comunitária final é RELEASE.2025-10-15T17-29-55Z, publicada em 16 de outubro de 2025 como uma versão de segurança. Essa versão corrige uma escalação de privilégios através de um desvio da política de sessão em contas de serviço e STS. As notas da versão recomendam que todos os utilizadores atualizem imediatamente. O último binário pré-compilado era a build de setembro de 2025, por isso não recebeu essa correção. Este guia compila a versão de outubro. Como o repositório está arquivado, esta é também a última correção que a Community Edition receberá.

Esse facto determina o restante deste guia. É por isso que, neste guia, o MinIO escuta em 127.0.0.1 e só fica acessível à Internet através de um proxy que controla.

Instalar o binário do MinIO e verificar o download

O MinIO é escrito em Go, e o README do fornecedor compila-o com um único comando go install que requer Go 1.24 ou posterior. Instale primeiro o Go a partir do tarball oficial. Em 20 October 2026, a versão estável atual em go.dev/dl é go1.27.3, lançada em 19 October 2026 com uma correção de segurança no pacote crypto/x509, e o hash abaixo é o publicado nessa página para o arquivo linux-amd64. Se escolher uma versão mais recente do Go, use o respetivo hash da mesma página. A flag -f faz com que curl falhe perante um erro HTTP, em vez de guardar a página de erro com o nome solicitado. Sem esta flag, é possível acabar por extrair uma página 404 e não perceber por que razão ela não é um arquivo.

cd /tmp
GOVER=go1.27.3
curl -fsSL "https://go.dev/dl/$GOVER.linux-amd64.tar.gz" -o go.tar.gz

Compare os dois hashes, e compare apenas os hashes.

published=65efbc80fdc1fa2cd2631cad5b481777a68e8725f34e89f50fc6ac714e379b40
downloaded=$(sha256sum go.tar.gz | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"

Tenha presente o que esta verificação comprova. Uma correspondência comprova que o download está completo e não foi danificado nem alterado durante o trânsito. Não comprova que o fornecedor é confiável. Esse é um problema diferente, e nenhum comando sha256sum o resolve.

sudo rm -rf /usr/local/go
sudo tar -C /usr/local -xzf go.tar.gz
export PATH=$PATH:/usr/local/go/bin
go version

Agora compile a versão final da comunidade como o seu utilizador normal. go install verifica cada módulo que descarrega, incluindo o código-fonte do MinIO, na base de dados pública de checksums do Go em sum.golang.org. Assim, um módulo adulterado ou substituído interrompe a compilação com um erro de segurança, em vez de produzir um binário.

go install github.com/minio/minio@RELEASE.2025-10-15T17-29-55Z
sudo install -o root -g root -m 755 ~/go/bin/minio /usr/local/bin/minio
minio --version
go version -m /usr/local/bin/minio | head -n 3

minio --version imprime DEVELOPMENT.GOGET onde anteriormente era usado um nome de versão, porque go install não aplica as flags de compilação usadas pelo fornecedor para gravar informações nos seus próprios binários. go version -m lê as informações dos módulos que o Go incorpora em todos os binários, e a linha mod github.com/minio/minio identifica o commit compilado. Um Permission denied neste ponto significa que o modo está incorreto, e command not found significa que /usr/local/bin não está no seu PATH. Se o VPS tiver pouca memória para a compilação, execute o mesmo go install noutra máquina Linux com a mesma arquitetura e copie o binário para o VPS.

Crie um utilizador de sistema e um diretório de dados

O MinIO aceita carregamentos pela rede, por isso não deve ser executado como root. Atribua-lhe uma conta sem diretório pessoal e sem shell de início de sessão.

sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user -s /usr/sbin/nologin minio-user
sudo mkdir -p /var/lib/minio/data
sudo chown -R minio-user:minio-user /var/lib/minio
sudo chmod 750 /var/lib/minio

-r cria uma conta de sistema com um UID inferior a 1000, mantendo-a fora do intervalo utilizado por utilizadores humanos. -M não cria o diretório pessoal, porque uma conta que nunca inicia sessão não precisa de guardar nada nesse diretório. Confirme o resultado com id minio-user e com stat -c '%U %a' /var/lib/minio, que deve apresentar minio-user 750.

O diretório de dados tem de permitir escrita a esse utilizador, não apenas leitura. No primeiro arranque, o MinIO cria um diretório .minio.sys dentro do volume para guardar a sua própria configuração. Por isso, um diretório pertencente a root faz o MinIO terminar durante o arranque com uma mensagem que termina em permission denied. A mesma regra aplica-se a todos os serviços executados desta forma. O guia utilizadores de serviço com privilégios mínimos numa VPS explica este procedimento corretamente.

Coloque as credenciais de root num ficheiro de ambiente

As credenciais de root dão acesso a todos os buckets, por isso não devem ficar no ficheiro da unidade, que pode ser lido por qualquer utilizador. Crie primeiro o ficheiro com o modo correto e escreva nele depois. Assim, a palavra-passe nunca fica num ficheiro legível, nem por um instante.

sudo install -o root -g root -m 600 /dev/null /etc/default/minio
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\nMINIO_VOLUMES="/var/lib/minio/data"\nMINIO_OPTS="--address 127.0.0.1:9000 --console-address 127.0.0.1:9001"\n' "$(openssl rand -base64 24)" | sudo tee /etc/default/minio > /dev/null
sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio

tee trunca um ficheiro existente em vez de o recriar, por isso o modo mantém-se em 600 e o proprietário continua a ser root. Isto é deliberado. O systemd lê EnvironmentFile como root antes de remover os privilégios para User=. Assim, a conta de serviço nunca precisa de ler as próprias credenciais. Depois de o serviço estar em execução, confirme com sudo -u minio-user cat /etc/default/minio. Esse comando deve imprimir Permission denied.

Antes de iniciar o MinIO, é importante conhecer dois comportamentos. Sem MINIO_ROOT_USER e sem MINIO_ROOT_PASSWORD no ambiente, o MinIO não recusa iniciar. Inicia com as credenciais predefinidas documentadas minioadmin:minioadmin, que são o primeiro par que qualquer scanner tenta, e parece estar completamente saudável. Uma palavra-passe com menos de 8 caracteres é rejeitada. Nesse caso, o MinIO termina durante o arranque com um erro a indicar que as credenciais são inválidas, porque a chave de acesso precisa de ter pelo menos 3 caracteres e a chave secreta pelo menos 8.

MINIO_VOLUMES é o caminho dos dados e MINIO_OPTS contém as flags. Fazer o bind a 127.0.0.1 significa que nada fora deste VPS consegue ainda aceder à API S3, o que é a predefinição correta. Mais tarde, abra o acesso de forma deliberada através de um proxy que tenha um certificado.

Escreva a unidade systemd

Crie /etc/systemd/system/minio.service:

[Unit]
Description=MinIO object storage
Documentation=https://github.com/minio/minio
Wants=network-online.target
After=network-online.target

[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target

Não existe - inicial em EnvironmentFile. Isto é uma decisão, não um erro de digitação. Com o hífen, o systemd ignora um ficheiro em falta e inicia o MinIO na mesma. Assim, um ficheiro eliminado ou um caminho escrito incorretamente disponibiliza silenciosamente um servidor em minioadmin:minioadmin. Sem o hífen, um ficheiro em falta faz a unidade falhar antes de o MinIO ser executado, e journalctl -u minio mostra Failed to load environment files: No such file or directory. É muito mais fácil detetar uma unidade que se recusa a iniciar do que um servidor que aceita silenciosamente a palavra-passe predefinida.

$MINIO_VOLUMES e $MINIO_OPTS não estão entre aspas de propósito, porque o systemd divide variáveis sem aspas nos espaços em branco, convertendo-as em argumentos separados. É assim que as quatro palavras em MINIO_OPTS se tornam quatro argumentos para minio server. LimitNOFILE=65536 aumenta o limite de descritores de ficheiros, porque cada ligação aberta e cada ficheiro de dados aberto consomem um descritor, e o valor predefinido de 1024 esgota-se sob carga.

sudo systemctl daemon-reload
sudo systemctl enable --now minio
systemctl is-active minio
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/live

is-active deve apresentar active, e o endpoint de health check deve responder 200. journalctl -u minio -n 20 --no-pager mostra o endereço da API onde o servidor está a escutar. Se a unidade continuar a reiniciar, o systemd desiste e regista Start request repeated too quickly. Isto significa que o MinIO termina em todas as tentativas. O motivo é apresentado nas linhas anteriores a essa mensagem, por isso leia para cima.

Para obter mais isolamento, adicione ProtectSystem=full e ProtectHome=true à secção [Service]. Ambos precisam de namespaces de montagem disponibilizados pelo kernel do host. Em virtualização de contentores que partilha o kernel do host, como OpenVZ ou LXC, podem falhar, e a unidade apresenta então status=226/NAMESPACE. Remova essas duas linhas para que a unidade inicie. A própria unidade é uma unidade normal, e serviços e temporizadores systemd num VPS explica as restantes diretivas.

Instale o mc e valide uma operação de ida e volta

O cliente MinIO é mc. Não o instale com apt install mc. Esse pacote é o Midnight Commander, um gestor de ficheiros sem relação com o MinIO.

dl.min.io ainda disponibiliza um binário mc, mas não o da comunidade. O caminho antigo da comunidade, https://dl.min.io/client/mc/release/linux-amd64/mc, responde com 410 Gone. Atualmente, o que a MinIO disponibiliza nesse endereço é o AIStor Client em https://dl.min.io/aistor/mc/release/linux-amd64/mc, para o qual aponta a referência da AIStor CLI e que é descrito como tendo funcionalidades exclusivas para implementações licenciadas do AIStor Server. Essa referência não diz nada sobre a utilização com um servidor da comunidade, por isso este guia continua a usar o cliente da comunidade. O repositório minio/mc foi arquivado em julho de 2026. Por isso, compile a sua última versão, RELEASE.2025-08-13T08-35-41Z, com a mesma toolchain Go. A base de dados de checksums também cobre este download.

go install github.com/minio/mc@RELEASE.2025-08-13T08-35-41Z
sudo install -o root -g root -m 755 ~/go/bin/mc /usr/local/bin/mc

Registe o servidor como um alias e transfira um objeto através dele.

MINIO_PASS=$(sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio)
mc alias set local http://127.0.0.1:9000 minio-root "$MINIO_PASS"
mc mb local/backups
echo "hello object storage" > /tmp/hello.txt
mc cp /tmp/hello.txt local/backups/hello.txt
mc ls local/backups
mc cat local/backups/hello.txt

mc ls deve listar hello.txt com o respetivo tamanho, e mc cat deve imprimir hello object storage. Essa operação de ida e volta é a prova efetiva de que o servidor funciona, porque faz os mesmos pedidos S3 assinados que todos os outros clientes farão. mc admin info local imprime o estado do servidor, se quiser uma segunda confirmação.

Execute agora mais uma verificação, enquanto a máquina ainda está vazia.

mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadmin

Este comando tem de falhar. Se for bem-sucedido, o ficheiro de ambiente nunca chegou ao processo e o servidor está a usar as credenciais predefinidas. Corrija isso antes de qualquer outra operação na máquina.

mc guarda os aliases em ~/.mc/config.json em texto simples. Por isso, essas credenciais ficam no diretório pessoal de quem executou o comando. Executar mc com sudo coloca as credenciais de root em /root/.mc/config.json. Mantenha o alias de root numa única conta de administrador e atribua a cada aplicação a sua própria chave.

Entregar um objeto com um URL pré-assinado

Um URL pré-assinado é uma ligação HTTPS normal com uma assinatura e um prazo de validade associados. Qualquer pessoa que tenha a ligação pode obter esse objeto sem uma conta e sem um cliente.

mc share download --expire 12h local/backups/hello.txt

A saída inclui X-Amz-Signature e X-Amz-Expires na cadeia de consulta. Há dois aspetos que surpreendem muitas pessoas. A ligação é criada a partir do endpoint do alias utilizado. Por isso, um alias em 127.0.0.1 produz uma ligação que apenas esta máquina consegue abrir. Crie um segundo alias no seu hostname público para as ligações que pretende enviar. Além disso, não existe um botão para revogar cada ligação individualmente. A assinatura permanece válida até expirar ou até a chave que a assinou ser removida ou alterada. Para uma ligação assinada com as credenciais root, isso significa proceder à rotação dessas credenciais. Por isso, um prazo de validade curto é o controlo prático. Seven days é o máximo permitido pelo formato de assinatura S3.

Dê ao restic a sua própria chave e bucket

As credenciais de root podem ler e eliminar todos os buckets, por isso uma tarefa de backup não deve utilizá-las. Crie um bucket, uma política limitada a esse bucket e um utilizador sem permissões adicionais.

mc mb local/restic
cat > /tmp/restic-rw.json <<'EOF'
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:ListBucket", "s3:GetBucketLocation"],
      "Resource": ["arn:aws:s3:::restic"]
    },
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
      "Resource": ["arn:aws:s3:::restic/*"]
    }
  ]
}
EOF
RESTIC_KEY=$(openssl rand -base64 24)
mc admin policy create local restic-rw /tmp/restic-rw.json
mc admin user add local restic-backup "$RESTIC_KEY"
mc admin policy attach local restic-rw --user restic-backup

O MinIO inclui uma política readwrite integrada que reduziria o número de comandos em um, mas concede acesso total a todos os buckets do servidor. A política acima indica o bucket duas vezes de propósito: uma vez como arn:aws:s3:::restic, para permitir listar o bucket, e outra como arn:aws:s3:::restic/*, para os objetos dentro dele. No S3, um bucket e os seus objetos são recursos distintos. Por isso, uma política que indique apenas um deles falha de uma forma que parece ser um problema do cliente.

Teste o limite antes de confiar nele.

mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backups

O primeiro ls é concluído com sucesso e o segundo falha com Access Denied. Uma política que não foi testada é apenas uma suposição.

Agora configure o restic para usar o bucket. O restic lê as credenciais S3 a partir das variáveis de ambiente AWS padrão, por isso não é necessário um ficheiro de credenciais específico do restic.

sudo apt install -y restic
export AWS_ACCESS_KEY_ID=restic-backup
export AWS_SECRET_ACCESS_KEY="$RESTIC_KEY"
restic -r s3:http://127.0.0.1:9000/restic init
restic -r s3:http://127.0.0.1:9000/restic backup /etc
restic -r s3:http://127.0.0.1:9000/restic snapshots

restic init pede uma palavra-passe para o repositório. Essa palavra-passe cifra o repositório, por isso o MinIO armazena apenas texto cifrado. Se perder a palavra-passe, perde o backup. Uma execução iniciada por um temporizador do systemd não tem um terminal onde possa introduzir a palavra-passe, por isso defina RESTIC_PASSWORD_FILE como um ficheiro com permissões 600 para os backups agendados.

Uma regra de colocação é mais importante do que qualquer comando acima. Um repositório restic no mesmo VPS que os dados que protege permite recuperar de um rm defeituoso, mas não de outras falhas. O nó MinIO deve estar noutra máquina, idealmente noutra região. backups restic num VPS explica como configurar o agendamento e a retenção com base nesta configuração.

Terminar TLS com nginx

O MinIO escuta em localhost, por isso o nginx é a superfície pública. Emita primeiro o certificado, conforme descrito em Certificados Let's Encrypt com certbot e nginx, e depois use este bloco de servidor.

server {
    listen 443 ssl;
    server_name s3.example.com;

    ignore_invalid_headers off;
    client_max_body_size 0;
    proxy_buffering off;
    proxy_request_buffering off;

    location / {
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_connect_timeout 300;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        chunked_transfer_encoding off;
        proxy_pass http://127.0.0.1:9000;
    }
}

Várias destas linhas são essenciais. client_max_body_size 0 remove o limite padrão de 1 MB para o corpo do pedido. Sem essa diretiva, qualquer upload maior é rejeitado com 413 Request Entity Too Large antes de o MinIO receber o pedido. proxy_request_buffering off encaminha o upload diretamente, porque, por padrão, o pedido completo é primeiro gravado num ficheiro temporário. Assim, um objeto grande precisa de espaço em disco duas vezes. proxy_set_header Host $http_host é a diretiva mais subtil: uma assinatura S3 inclui o cabeçalho Host. Se o proxy o reescrever, todos os pedidos falham com SignatureDoesNotMatch, embora o access log mostre a chegada de um pedido normal.

Informe também o MinIO do seu nome público, para que os links gerados apontem para o proxy e não para localhost.

echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minio

A configuração da firewall continua simples. Permita SSH e HTTPS, e não crie nenhuma regra para as portas 9000 e 9001, porque um endereço associado a 127.0.0.1 não pode ser alcançado a partir de outra máquina, independentemente da configuração da firewall. Noções básicas da firewall ufw num VPS contém os comandos.

Quando o MinIO num único nó é suficiente e quando deve escolher S3 real

Aqui, um único nó significa uma unidade, pelo que não existe paridade nem uma segunda cópia dentro da implementação. A durabilidade de cada objeto é a durabilidade do disco de uma única VPS. A documentação do próprio MinIO, disponível apenas como código-fonte no repositório minio/docs desde que a documentação comunitária alojada foi retirada em outubro de 2025, descreve uma implementação standalone como adequada para desenvolvimento inicial e avaliação e afirma que o MinIO não a recomenda em produção. O bloqueio de objetos pode ser ativado para um bucket, mas, numa única VPS, apenas impede a eliminação através da API S3. Qualquer pessoa com root na máquina pode continuar a remover os ficheiros do disco. Por isso, não prometa uma política de retenção imutável neste cenário.

É uma boa opção como destino do restic numa segunda VPS noutra região e como endpoint S3 para desenvolvimento e artefactos de CI, quando perder um bucket implica apenas reconstruir o ambiente. Também é razoável para uploads de utilizadores numa aplicação pequena, desde que seja responsável pelo plano de recuperação e tenha testado efetivamente um restauro.

Escolha S3 gerido quando um contrato ou um regulador exigir object lock ou durabilidade multi-região, ou quando preferir não ser a pessoa contactada às 03:00 porque um disco ficou cheio. O código congelado é outra razão objetiva. Em 20 de outubro de 2026, a edição comunitária está arquivada e deixou de ser mantida. A última release, RELEASE.2025-10-15T17-29-55Z, é a que este guia compila. Nada posterior será corrigido. Executá-la significa aceitar essa condição ou migrar para a linha comercial AIStor do MinIO ou para outro armazenamento self-hosted, comparado em alternativas ao MinIO self-hosted.

É importante esclarecer um limite, porque esta questão surge com frequência. O armazenamento de objetos não é uma base de dados. Num bucket padrão, cada escrita substitui um objeto inteiro. Até a chamada append que a Amazon adicionou ao S3 Express One Zone apenas acrescenta dados no fim. Por isso, manter um ficheiro SQL ativo num bucket S3 é lento e inseguro. Mantenha a base de dados no disco local e faça cópias de segurança para o bucket. executar SQLite em produção numa VPS descreve essa separação.

Modos de falha e mensagens apresentadas

A unidade falha logo depois de systemctl enable --now. Consulte journalctl -u minio -n 30 --no-pager. Failed to load environment files: No such file or directory significa que /etc/default/minio está em falta ou que o seu caminho está escrito incorretamente na unidade. Uma mensagem terminada em permission denied significa que o diretório de dados não pode ser escrito pela conta de serviço. Confirme, portanto, que stat -c '%U' /var/lib/minio/data apresenta minio-user.

minioadmin:minioadmin continua a iniciar sessão. O ficheiro de ambiente nunca chegou ao processo. Confirme que a unidade contém EnvironmentFile=/etc/default/minio, execute sudo systemctl daemon-reload e reinicie o serviço. O MinIO lê as credenciais root uma vez durante o arranque. Editar esse ficheiro sem reiniciar não altera nada.

Address already in use no arranque. Outro processo está a utilizar a porta 9000. Encontre-o com sudo ss -ltnp | grep :9000 antes de alterar a porta do MinIO.

Os carregamentos superiores a 1 MB falham através do proxy. O nginx respondeu com 413 Request Entity Too Large e o MinIO nunca recebeu o pedido. Defina client_max_body_size 0 no bloco do servidor.

SignatureDoesNotMatch. A chave secreta está errada ou algo entre o cliente e o MinIO reescreveu o cabeçalho Host, que é incluído na assinatura.

RequestTimeTooSkewed. O relógio do cliente ou do servidor está errado. Cada pedido S3 assinado inclui um timestamp. O MinIO, tal como o Amazon S3, rejeita um pedido assinado no cabeçalho cujo timestamp esteja a mais de 15 minutos do seu próprio relógio. As ligações presigned são verificadas em função da respetiva validade. Consulte timedatectl e confirme que a sincronização horária está ativa.

Access Denied num bucket que sabe que existe. A chave está associada a um bucket diferente. Apresente o que a política realmente permite com mc admin policy info local restic-rw e compare o nome do bucket nas linhas de recursos.

FAQ

O MinIO de nó único é suficiente para backups reais?

É suficiente como destino do restic numa máquina separada dos dados que protege. Não é suficiente como única cópia. Uma instalação com uma única unidade não tem paridade, por isso não existe uma segunda cópia dentro do MinIO. Se esse disco da VPS perder dados, os objetos desaparecem. Mantenha um segundo destino noutro local e faça pelo menos uma restauração a partir de ambos, para confirmar que o processo funciona.

Por que motivo sha256sum -c falha no ficheiro de checksum do MinIO?

Só encontrará esse ficheiro numa cópia guardada anteriormente, porque dl.min.io devolveu 410 Gone para todos os binários da comunidade e ficheiros de checksum quando foi verificado em 20 October 2026. A etiqueta depois do hash dentro desse ficheiro identifica a release, como minio.RELEASE.2025-09-07T16-13-09Z, enquanto o ficheiro transferido normalmente se chama minio. sha256sum -c procura um ficheiro com o nome escrito dentro do ficheiro de checksum, não o encontra e comunica No such file or directory e WARNING: 1 listed file could not be read. A transferência está correta. Compare diretamente as strings de hash e ignore a etiqueta, que não tem significado de segurança.

Onde está a consola Web de administração do MinIO?

O MinIO removeu as funcionalidades de administração da consola da edição da comunidade em May 2025, deixando um navegador de objetos na interface Web. Os buckets e utilizadores são agora geridos com o cliente mc, utilizando comandos como mc admin user add e mc admin policy attach. Esse é o procedimento previsto na edição da comunidade, e não uma solução alternativa. Por isso, este guia faz tudo a partir da linha de comandos.

Como configuro o restic para utilizar o MinIO como backend S3?

Defina AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY com uma chave de acesso do MinIO e o respetivo segredo. Depois, utilize uma string de repositório no formato s3:https://s3.example.com/restic, em que o último elemento do caminho é o nome do bucket. Crie primeiro o bucket com mc mb, porque uma chave limitada a um bucket não tem permissão para criar buckets. O restic cifra tudo com a sua própria palavra-passe do repositório antes da transferência. Assim, o MinIO armazena texto cifrado e nunca vê os seus ficheiros.

Tenho de executar o MinIO atrás do nginx?

Precisa de TLS (transport layer security) sempre que um cliente não estiver na mesma máquina. Sem TLS, cada objeto atravessa a rede em texto simples, juntamente com o ID da chave de acesso e a assinatura do pedido. A chave secreta não sai do cliente, porque a assinatura S3 utiliza-a apenas localmente para calcular essa assinatura. No entanto, qualquer pessoa no caminho pode ler os seus dados e repetir um pedido capturado enquanto o respetivo timestamp for válido. Um proxy na porta 443 com um certificado do certbot é a forma mais simples de obter TLS e mantém a renovação do certificado fora do MinIO. O MinIO também pode terminar o TLS diretamente se apontar --certs-dir para um diretório que contenha public.crt e private.key. Nesse caso, a conta de serviço precisa de acesso de leitura à chave privada renovada, o que acrescenta trabalho para obter o mesmo resultado.

Este artigo foi útil?

#minio#s3#object-storage#self-hosted#vps