O lavedonio.download é onde guardo os arquivos que meus outros projetos usam, servidos em endereços que não mudam. É um site para organizá-los e uma API REST para enviá-los e baixá-los por código, feito em Python com Django e Django REST Framework, no visual deste site (o site e a API estão em inglês).
O que ele faz
- Uploads e links. Um item é um arquivo enviado ou um link para um arquivo que está em outro lugar. Os endereços de um link redirecionam para ele, e ele não ocupa espaço.
- Pastas e tags. Cada usuário tem a sua pasta no armazenamento, que segue as pastas dele: renomear ou mover um arquivo ou uma pasta também o move no armazenamento.
- Endereços para outros projetos. Todo item tem um endereço permanente (
/f/<id>/), que continua valendo depois de renomeado ou movido, um que segue as pastas (/d/<usuário>/<pastas>/<nome>) e um na API. Os arquivos abrem no navegador quando isso é seguro (imagens, PDFs, textos...), e com?downloadsão baixados. - Privado, compartilhado ou público. Cada item é visto só pelo seu usuário, também pelos usuários com quem é compartilhado, ou por qualquer um com o seu endereço, sem login.
- Limites. Por padrão, cada arquivo tem no máximo 10 MB e cada usuário guarda no máximo 5 GB.
Contas
Não há cadastro: as contas são criadas por um administrador. Os donos podem tudo, inclusive mudar os limites e a cota de cada usuário; os administradores criam usuários e gerenciam as suas contas e dados; e os usuários gerenciam os seus próprios arquivos, links e pastas.
A API
Arquivos, links, pastas, tags e contas também podem ser gerenciados pela API, com um token criado na página da conta. Por exemplo, para enviar um arquivo público:
curl -H "Authorization: Token $TOKEN" -F file=@relatorio.pdf \
-F visibility=public https://api.lavedonio.download/v1/items/
Todos os endpoints estão na documentação interativa, gerada a partir do código (OpenAPI).
Como foi feito
- Os arquivos ficam em buckets privados do Cloudflare R2. Todo download passa pelo Django, que confere quem pode ver o arquivo e então redireciona para um endereço assinado que expira em 5 minutos.
- Ele roda nos mesmos servidores deste site: Django sob uWSGI em uma VPS com CloudPanel, com o PostgreSQL em outra, atrás da Cloudflare.
- Os testes rodam em todo pull request, no SQLite e no PostgreSQL, e o GitHub Actions publica cada push nas branches de staging e de produção.