Object Storage
Por Matheus Alexandre, Henrique Siqueira, and João Guilherme
Por Matheus Alexandre, Henrique Siqueira, and João Guilherme
Armazenamento compatível com S3: endpoint, chaves, ferramentas, backups e uso em código.
Object Storage: primeiros passos (endpoint, chaves e primeiro bucket)
O Object Storage da LuraHosting é um armazenamento compatível com a API S3 da Amazon: qualquer ferramenta, biblioteca ou aplicativo que "fala S3" funciona com ele. Serve para backups, arquivos de sites e apps, mídia, logs e distribuição de downloads. Conceitos em 30 segundos - Bucket: um "balde" onde os arquivos ficam. É o nível mais alto (ex.: backups-vps, midia-site). - Objeto: cada arquivo dentro do bucket, identificado pela chave (o caminho, ex.: 2026/09/foto.jpg). - Endpoint: o endereço da API S3 (é o que as ferramentas pedem). Não é o endereço do painel. - Access Key / Secret Key: o par de credenciais. A secret é mostrada só uma vez, guarde. Onde encontrar o endpoint e as chaves 1. Acesse o painel do Object Storage com os dados enviados na ativação. 2. Em Access Keys (Chaves de acesso), clique em Criar e salve a Access Key e a Secret Key. 3. O endpoint da API está na tela inicial / documentação do serviço: | | Endereço | |---|---| | Painel (navegador) | endereço informado no e-mail de ativação | | Endpoint da API S3 (use nas ferramentas) | informado no e-mail de ativação e no painel | | Região | us-east-1 (ou conforme indicado) | Criar o primeiro bucket 1. No painel, Buckets → Criar bucket. 2. Nome em minúsculas, sem espaços (ex.: backups-vps). 3. Deixe privado (padrão). Só torne público o que for realmente para download aberto, veja Bucket público ou privado e links pré-assinados. Testando em 1 minuto Com o AWS CLI instalado (guia completo em Como conectar com rclone, s3cmd e AWS CLI): aws configure # informe Access Key, Secret Key e a região aws --endpoint-url https://ENDPOINT-DA-API s3 ls aws --endpoint-url https://ENDPOINT-DA-API s3 cp arquivo.zip s3://backups-vps/ Erros comuns - InvalidAccessKeyId / SignatureDoesNotMatch: chave errada, secret com espaço extra, ou relógio do servidor fora de hora (timedatectl). - Could not connect: você usou o endereço do painel em vez do endpoint da API. - NoSuchBucket: nome do bucket digitado diferente (é case-sensitive). - Ferramenta insiste em amazonaws.com: faltou informar o endpoint/endpoint-url na configuração.
Object Storage: como conectar com rclone, s3cmd e AWS CLI
Você precisa do endpoint da API (informado na ativação), da Access Key, da Secret Key e do nome do bucket, veja Primeiros passos. rclone (recomendado para backup e sincronização) Instalação (Linux): curl https://rclone.org/install.sh | sudo bash Configuração sem o assistente, crie ~/.config/rclone/rclone.conf: [lura] type = s3 provider = Other access_key_id = SUA_ACCESS_KEY secret_access_key = SUA_SECRET_KEY endpoint = https://ENDPOINT-DA-API region = us-east-1 acl = private Uso: rclone lsd lura: # lista buckets rclone copy /var/www lura:backups-vps/www --progress # envia (só o que mudou) rclone sync /var/www lura:backups-vps/www # espelha (apaga no destino o que sumiu na origem) rclone copy lura:backups-vps/www /restore # baixa rclone mount lura:midia /mnt/midia --daemon # monta como pasta Windows: baixe o rclone.exe em rclone.org, use rclone config ou o mesmo arquivo em %APPDATA%\rclone\rclone.conf. AWS CLI pip install awscli # ou apt install awscli aws configure # Access Key, Secret Key, região us-east-1, output json Para não digitar --endpoint-url toda vez, adicione ao ~/.aws/config: [default] region = us-east-1 s3 = endpoint_url = https://ENDPOINT-DA-API aws s3 ls aws s3 cp arquivo.zip s3://backups-vps/ aws s3 sync ./site s3://midia-site/ --delete s3cmd sudo apt install s3cmd s3cmd --configure No assistente: informe as chaves, em S3 Endpoint coloque ENDPOINT-DA-API e em DNS-style bucket+hostname coloque ENDPOINT-DA-API também (path-style). Depois: s3cmd ls s3cmd put arquivo.zip s3://backups-vps/ s3cmd sync ./pasta/ s3://backups-vps/pasta/ Interface gráfica Cyberduck (Windows/mac) e S3 Browser (Windows): novo perfil tipo "S3 (compatível)", servidor = endpoint, chaves. Bom para navegar e fazer uploads pontuais. Dicas de desempenho - Muitos arquivos pequenos: rclone copy --transfers 16 --checkers 32. - Arquivos grandes: o upload é feito em partes automaticamente (multipart). - Sempre use copy para backup e reserve sync para quando quiser um espelho exato.
Backup automático da VPS para o Object Storage com rclone
Snapshot protege contra mudança que deu errado; backup fora da VPS protege contra tudo o mais (invasão, exclusão, cancelamento, disco perdido). Com o Object Storage isso fica automático em 10 minutos. Pré-requisito: rclone configurado com o remote lura, veja Como conectar com rclone. Crie um bucket, por exemplo backups-vps. 1. O script sudo nano /usr/local/bin/backup.sh: #!/bin/bash set -e DATA=$(date +%F) DEST="lura:backups-vps/$(hostname)" TMP=/tmp/backup-$DATA mkdir -p $TMP # 1) bancos de dados (ajuste ou remova o que não usa) mysqldump --all-databases -u root -pSENHA | gzip > $TMP/mysql-$DATA.sql.gz # sudo -u postgres pg_dumpall | gzip > $TMP/postgres-$DATA.sql.gz # 2) pastas importantes tar -czf $TMP/www-$DATA.tar.gz /var/www tar -czf $TMP/etc-$DATA.tar.gz /etc # docker: volumes (pare containers sensíveis antes se precisar de consistência) tar -czf $TMP/docker-volumes-$DATA.tar.gz /var/lib/docker/volumes # 3) envia para o bucket rclone copy $TMP $DEST/$DATA --transfers 4 # 4) apaga backups com mais de 30 dias no bucket rclone delete $DEST --min-age 30d rclone rmdirs $DEST --leave-root rm -rf $TMP echo "backup $DATA ok" sudo chmod 700 /usr/local/bin/backup.sh sudo /usr/local/bin/backup.sh # teste rclone lsd lura:backups-vps/$(hostname) # confira Dica: em vez da senha no script, use um arquivo ~/.my.cnf com [client] user=root password=... (chmod 600) e remova -pSENHA. 2. Agendar todo dia às 3h sudo crontab -e 0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1 3. Testar a restauração (a parte que todo mundo pula) rclone copy lura:backups-vps/$(hostname)/2026-09-29 /restore zcat /restore/mysql-2026-09-29.sql.gz | mysql -u root -p tar -xzf /restore/www-2026-09-29.tar.gz -C / Faça isso uma vez por mês. Backup que nunca foi restaurado é uma aposta. Windows Instale o rclone, configure o remote e use o Agendador de Tarefas com um .bat: "C:\rclone\rclone.exe" copy "C:\Dados" lura:backups-vps/servidor-win/%date:~-4%-%date:~3,2%-%date:~0,2% --transfers 4 Quanto vai custar Backup diário com 30 dias de retenção ocupa ~30× o tamanho de um backup (menos com compressão). Veja o consumo no painel do Object Storage e ajuste a retenção (--min-age).
Object Storage: bucket público ou privado, links pré-assinados e política de acesso
Privado (padrão) Só quem tem Access/Secret Key acessa. É o certo para backups, dados de clientes e qualquer coisa que não seja para download aberto. Público (leitura anônima) Para servir imagens de site, downloads, arquivos estáticos. Qualquer pessoa com a URL baixa o arquivo: https://ENDPOINT-DA-API/NOME-DO-BUCKET/caminho/arquivo.jpg Como tornar público: - Pelo painel: Buckets → seu bucket → Acesso/Política → Público (somente leitura). - Por linha de comando (política anônima de leitura): aws s3api put-bucket-policy --bucket midia-site --policy '{ "Version": "2012-10-17", "Statement": [{"Effect": "Allow","Principal": "*","Action": ["s3:GetObject"],"Resource": ["arn:aws:s3:::midia-site/*"]}] }' Nunca deixe público um bucket de backup. Escrita anônima, jamais. Link pré-assinado (compartilhar um arquivo privado por tempo limitado) O bucket continua privado; você gera uma URL que vale por X minutos: # AWS CLI (1 hora) aws s3 presign s3://backups-vps/relatorio.pdf --expires-in 3600 # rclone (24 horas) rclone link lura:backups-vps/relatorio.pdf --expire 24h Em código a maioria dos SDKs tem getSignedUrl / generate_presigned_url, exemplos em Como usar o Object Storage em código. Uma chave por aplicação, com o mínimo de acesso Não use a chave principal em todo lugar. Crie uma chave para cada uso (site, backup da VPS 1, backup da VPS 2) e restrinja ao bucket necessário. Se uma vazar, você revoga só ela. Exemplo de política que permite ler e escrever apenas em backups-vps: { "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Action": ["s3:ListBucket","s3:GetObject","s3:PutObject","s3:DeleteObject"], "Resource": ["arn:aws:s3:::backups-vps","arn:aws:s3:::backups-vps/*"] }] } CORS (quando o navegador vai acessar direto) Upload/download feito pelo JavaScript do seu site precisa de CORS no bucket: aws s3api put-bucket-cors --bucket midia-site --cors-configuration '{"CORSRules":[{"AllowedOrigins":["https://seusite.com"],"AllowedMethods":["GET","PUT"],"AllowedHeaders":["*"]}]}'
Como usar o Object Storage em código (Node.js, Python e PHP)
Todos os SDKs da AWS funcionam. Basta informar o endpoint (informado na ativação) e usar forcePathStyle (ou equivalente). Credenciais em variáveis de ambiente, nunca no código. export S3_ENDPOINT=https://ENDPOINT-DA-API export AWS_ACCESS_KEY_ID=SUA_ACCESS_KEY export AWS_SECRET_ACCESS_KEY=SUA_SECRET_KEY export AWS_REGION=us-east-1 Node.js (@aws-sdk/client-s3) import { S3Client, PutObjectCommand, GetObjectCommand } from "@aws-sdk/client-s3"; import { getSignedUrl } from "@aws-sdk/s3-request-presigner"; import fs from "node:fs"; const s3 = new S3Client({ endpoint: process.env.S3_ENDPOINT, region: process.env.AWS_REGION, forcePathStyle: true, }); // upload await s3.send(new PutObjectCommand({ Bucket: "midia-site", Key: "img/foto.jpg", Body: fs.createReadStream("foto.jpg"), ContentType: "image/jpeg" })); // link temporário (15 min) const url = await getSignedUrl(s3, new GetObjectCommand({ Bucket: "backups-vps", Key: "relatorio.pdf" }), { expiresIn: 900 }); Python (boto3) import boto3, os s3 = boto3.client("s3", endpoint_url=os.environ["S3_ENDPOINT"]) s3.upload_file("foto.jpg", "midia-site", "img/foto.jpg", ExtraArgs={"ContentType": "image/jpeg"}) s3.download_file("backups-vps", "relatorio.pdf", "relatorio.pdf") url = s3.generate_presigned_url("get_object", Params={"Bucket": "backups-vps", "Key": "relatorio.pdf"}, ExpiresIn=900) PHP (aws/aws-sdk-php) $s3 = new Aws\S3\S3Client([ 'version' => 'latest', 'region' => getenv('AWS_REGION'), 'endpoint' => getenv('S3_ENDPOINT'), 'use_path_style_endpoint' => true, ]); $s3->putObject(['Bucket' => 'midia-site', 'Key' => 'img/foto.jpg', 'SourceFile' => 'foto.jpg']); $cmd = $s3->getCommand('GetObject', ['Bucket' => 'backups-vps', 'Key' => 'relatorio.pdf']); $url = (string) $s3->createPresignedRequest($cmd, '+15 minutes')->getUri(); Laravel: no config/filesystems.php, disco s3 com 'endpoint' => env('S3_ENDPOINT') e 'use_path_style_endpoint' => true; depois Storage::disk('s3')->put(...). WordPress: plugins de "offload media" (ex.: WP Offload Media, Media Cloud) aceitam provedor "S3 compatível" com endpoint personalizado. Erros comuns - SignatureDoesNotMatch: região diferente entre cliente e servidor, ou relógio fora de hora. - PermanentRedirect / tentativa de acessar bucket.amazonaws.com: faltou o endpoint ou o path-style. - Upload grande falhando: use o upload multipart do SDK (Upload no Node, upload_file já faz isso no Python).