Volumes Docker sobre S3 / Cloudflare R2 com índice local: file_exists em microssegundos
200
Plugin Docker (volume driver) que monta buckets S3 (Cloudflare R2, AWS S3, MinIO, …) como pastas locais. Pensado para aplicações legadas e buckets enormes: sem sincronização, sem cópia local, e com um índice completo da árvore que responde a file_exists, filesize e scandir em microssegundos. Afinado contra o Cloudflare R2 com 415 mil ficheiros reais (152 GiB).
services:
app:
image: php:8.3-apache
volumes:
- documentos:/var/www/html/protected/data
volumes:
documentos:
driver: st693ava/docker-s3-volume
driver_opts:
bucket: "os-meus-documentos"
profile: "r2"
uid: "33" # www-data
gid: "33"
changes: "log" # ver as escritas dos outros hosts em segundos
reindex_interval: "24h" # rede de segurança diária
Publica-se uma tag por arquitectura (0.1.6-amd64 e 0.1.6-arm64). O --alias dá ao driver o mesmo nome em todas as máquinas e entre versões:
ARCH=$(docker info --format '{{.Architecture}}' | sed 's/x86_64/amd64/; s/aarch64/arm64/')
docker plugin install st693ava/docker-s3-volume:0.1.6-$ARCH \
--alias st693ava/docker-s3-volume --grant-all-permissions \
credentials.source=/etc/docker-s3-volume
O ficheiro /etc/docker-s3-volume/s3-credentials (dono root, chmod 600) tem os perfis no formato do ~/.aws/credentials; é relido em cada montagem. As credenciais nunca vão nas opções do volume (ficariam visíveis no docker volume inspect).
[r2]
endpoint = https://<conta>.eu.r2.cloudflarestorage.com
access_key_id = ...
secret_access_key = ...
file_exists, o volume gastou 0,2 ms no total.fclose() só devolve sucesso com o objecto no S3. Multipart com partes iguais (compatível com o R2), Content-MD5 em cada pedido, repetição automática depois de falhas e um diário para recuperar depois de um crash.changes: "log", um LIST por minuto seja qual for o tamanho do bucket), correcção automática quando um ficheiro desaparece (404) e reindexação periódica como rede de segurança, perto do mínimo de pedidos LIST.kill -9 a meio de envios, sinais na aplicação e carga prolongada com dados reais..versions/ (invisível no volume). O plugin nunca altera a configuração do bucket.debug: "true" regista cada operação e cada pedido ao S3, com resumos de latência por minuto; slow_log regista só as operações lentas. Ambos desligados por defeito.docker volume inspect: índice, versionamento, envios, cache, alterações de fora e crashes.<conta>.eu.r2.cloudflarestorage.com.| Opção | Defeito | Descrição |
|---|---|---|
bucket | — | Bucket (obrigatório) |
prefix | — | Subpasta do bucket exposta como raiz do volume |
profile | default | Perfil de credenciais |
endpoint, region, secure | do perfil | Sobrepõem-se ao perfil |
read_only | false | Volume só de leitura (também no kernel: ro) |
uid, gid | 0 | Dono dos ficheiros |
file_mode, dir_mode | 0644, 0755 | Permissões |
versioning | false | true (nativo ou do plugin), native, copy |
versions_keep | 0 | Versões a manter por ficheiro (0 = todas) |
version_on_delete | true | Guardar versão antes de apagar |
cache_mb | 1024 | Cache local de assets em MiB (0 desliga) |
cache_max_file_kb | 4096 | Tamanho máximo de um ficheiro na cache |
cache_ext | assets web | Extensões admitidas na cache |
prefetch | false | Pré-carregar um asset depois de um file_exists |
changes | off | log: diário de alterações partilhado no bucket |
changes_interval | 1m | Leitura do diário (1 LIST por leitura) |
changes_batch | 10s | Junta as alterações do volume num só PUT no diário |
reindex_interval | 0 | Reindexação periódica (ex.: 24h; 0 desliga) |
reindex_max_interval | 0 | Intervalo adaptativo: duplica enquanto não houver diferenças |
reindex_on_mount | false | Reconstruir o índice em cada montagem |
workers | 128 | Pedidos LIST em paralelo na indexação |
mem_mb | 256 | Memória para buffers de leitura |
kernel_ttl | 1h | Cache de atributos no kernel |
max_inodes | 200000 | Ficheiros mantidos em memória |
part_size_mb | 16 | Tamanho das partes multipart |
http2 | false | Usar HTTP/2 |
debug | false | Registar todas as operações e pedidos ao S3 |
slow_log | 0 | Registar as operações mais lentas do que isto (ex.: 1s) |
CREDS=$(docker plugin inspect -f '{{range .Settings.Mounts}}{{.Source}}{{end}}' st693ava/docker-s3-volume)
docker plugin disable -f st693ava/docker-s3-volume
docker plugin upgrade --skip-remote-check --grant-all-permissions st693ava/docker-s3-volume st693ava/docker-s3-volume:0.1.6-$ARCH
docker plugin set st693ava/docker-s3-volume credentials.source=$CREDS
docker plugin enable st693ava/docker-s3-volume
O docker plugin upgrade mantém os volumes, os índices e a cache, mas não volta a aplicar credentials.source: por isso é reposto antes de reactivar.
EXDEV (o mv e o rename() do PHP copiam ficheiro a ficheiro).chmod/chown são aceites sem efeito; as permissões vêm das opções.docker restart (limitação do FUSE).Content type
Plugin
Digest
sha256:b9c3eefac…
Size
13.3 MB
Last updated
4 days ago
docker plugin install st693ava/docker-s3-volume:0.1.6-amd64