feat: separate MinIO write path from public URL#999
Conversation
|
@rondinelisaad não poderíamos ter uma URL para escrita e outra para leitura? Isso funcionaria para a demanda? |
@robertatakenaka essa é a intenção. A url de leitura é minio.scielo.br e a de gravação será o endpoint definido pelo provedor. Exemplo: s3.wasabisys.com |
|
@rondinelisaad mas acho que está complicando com bucket_root: scielo |
Não acho que fica complicado dessa forma, o complicado é quando vc não trata níveis diferentes de depósito. O padrão que o minio usa não é comum entra as nuvens. E essa sugestão trata pelo o menos dois níveis. Lembrando que se o write_prefix ficar vazio ele vai considerar apenas um nível. Da mesma forma como é no minio hj. |
| self.http_client = minio_http_client | ||
| self._client_instance = None | ||
| self.location = location | ||
| self.location = location or bucket_subdir |
There was a problem hiding this comment.
@rondinelisaad é um erro considerar location como um subdir.
Cria um bucket no MinIO/S3.
self._client — cliente MinIO (instância de Minio).
make_bucket(...) — cria um novo bucket no armazenamento de objetos.
self.bucket_root — nome do bucket a ser criado.
location=self.location — região onde o bucket será criado (ex.: "us-east-1").
Não. make_bucket não aceita caminhos com / — o nome do bucket é plano, não hierárquico.
Buckets S3/MinIO não têm subdiretórios reais. A "estrutura de pastas" é uma ilusão criada por prefixos na chave do objeto, não no nome do bucket.
"pasta/subpasta" como nome de bucket falharia: / é caractere inválido em nome de bucket (regras S3). Você receberia um erro de validação (InvalidBucketName).
# bucket plano
self._client.make_bucket("scielo-assets")
# "pastas" via prefixo na chave do objeto
self._client.put_object(
"scielo-assets",
"pasta/subpasta/arquivo.pdf", # aqui o / é permitido e simula diretórios
data, length,
)
Oi @robertatakenaka |
|
@rondinelisaad deixa que eu faço |
|
#1015 substitui este |
O que esse PR faz?
Separa o endpoint/caminho de gravação no MinIO/S3 da URL pública de leitura armazenada no banco.
A mudança adiciona suporte a:
write_prefix: prefixo usado no object storage durante a gravação.public_base_url: URL pública usada para montar a URI salva/lida pela aplicação.uricommax_length=500, para suportar URLs públicas mais longas.Com isso, é possível gravar arquivos em um bucket/caminho como
scielo/upload/...usandos3.wasabisys.com, mas armazenar no banco uma URL pública comohttps://minio.scielo.br/upload/....Onde a revisão poderia começar?
Comece por:
files_storage/minio.pyDepois revise:
files_storage/models.pyfiles_storage/migrations/0005_minioconfiguration_public_read_write_prefix_and_more.pyfiles_storage/test_minio.pyComo este poderia ser testado manualmente?
Rodar as migrações:
Configurar um registro
MinioConfigurationcom:Enviar/publicar um pacote que acione o fluxo de upload para MinIO.
Confirmar que o objeto foi gravado no storage em:
Confirmar que a URI salva no banco usa a URL pública:
Rodar os testes automatizados:
docker compose -f local.yml run --rm django python manage.py test files_storage.test_minioAlgum cenário de contexto que queira dar?
Antes deste PR, a URL salva no banco era derivada do mesmo cliente MinIO usado para gravação via
presigned_get_object. Isso acoplava o endpoint de escrita à URL de leitura.No cenário atual, a aplicação precisa gravar no endpoint S3/Wasabi (
s3.wasabisys.com) usando o bucketscieloe o prefixoupload, mas os consumidores devem ler os arquivos por uma URL pública diferente:https://minio.scielo.br/upload.Screenshots
Não aplicável. A alteração é de backend/configuração de storage.
Quais são tickets relevantes?
Não informado.
Referências
files_storage/minio.py.files_storage/models.py.fput_objectepresigned_get_object.