Compartilhamento de arquivos seguro, efêmero e auto-hospedado. Visualize uma vez, e o arquivo desaparece para sempre.
Um sistema de Burn After Reading (queimar após ler) construído em Golang. Projetado para ser extremamente simples de implantar (binário único), mas robusto o suficiente para produção graças à persistência em SQLite e armazenamento local.
- Zero dependências externas: Não precisa de Redis, S3 ou Docker Compose complexo. Apenas o binário.
- Persistência real: Utiliza SQLite para manter o estado dos arquivos. Se o servidor reiniciar, nada é perdido.
- Atomicidade garantida: Usa transações SQL (
DELETE ... RETURNING) para garantir que apenas uma pessoa consiga visualizar o arquivo, eliminando condições de corrida (race conditions). - Coletor de lixo automático: Um processo em background limpa arquivos expirados do disco automaticamente.
- Driver pure Go: Utiliza
modernc.org/sqlite, permitindo compilação cruzada (CGO-free) fácil para qualquer sistema operacional.
O sistema adota uma abordagem minimalista de Clean Architecture:
- Storage (Disco): Os arquivos cifrados/brutos são salvos na pasta
./uploads. - Metadata (SQLite): Dados como ID, Nome, MimeType e Expiração ficam no
app.db. - Atomic Lock: A leitura utiliza uma instrução atômica de banco de dados para buscar e deletar o registro simultaneamente. Se dois usuários tentarem baixar ao mesmo tempo, o banco de dados garante que apenas um receba o arquivo.
- Go 1.22+
-
Clone o repositório:
git clone [email protected]:wvoliveira/once.git cd once
-
Instale as dependências:
go mod tidy
-
Execute o projeto:
go run cmd/once/main.go
Isso criará automaticamente a pasta
./uploadse o arquivoapp.db.
Como usamos o driver Pure Go do SQLite, o build é simples e estático:
# Exemplo para Linux
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o server .Use a collection do Postman encontrada no arquivo api/Once.postman_collection.
As configurações são definidas por constantes no main.go (podem ser refatoradas para Variáveis de Ambiente):
| Variável | Padrão | Descrição |
|---|---|---|
| ONCE_DATABASE_URI | file:app.db?_journal_mode=WAL&_cache_size=2000&_foreign_keys=on&_busy_timeout=5000&_synchronous=NORMAL | Onde os arquivos físicos serão salvos. |
| ONCE_STORAGE_FOLDER | uploads | Pasta onde os arquivos serão armazenados. |
| ONCE_STORAGE_CLEANER_INTERVAL | 60 segundos | Intervalo para verificar se há arquivos para serem deletados (expirados). |
| ONCE_HTTP_SERVER_PORT | 8080 | A porta do web server. |
| ONCE_HTTP_SERVER_READ_TIMEOUT | 3 segundos | Tempo para ler a requisição. |
| ONCE_HTTP_SERVER_WRITE_TIMEOUT | 3 segundos | Tempo para responder a requisição. |
| ONCE_HTTP_SERVER_GRACEFUL_SHUTDOWN | 10 segundos | Tempo para o graceful shutdown do web server. |
Para um MVP, a complexidade de infraestrutura é o maior inimigo.
Custo: Elimina custos de AWS S3 e instâncias gerenciadas de Redis.
Latência: Ler do disco SSD local e do SQLite (em processo) é ordens de grandeza mais rápido que requisições de rede para serviços de nuvem.
Simplicidade: O backup do seu sistema inteiro consiste em copiar a pasta ./uploads e o arquivo app.db.
Este projeto está sob a licença MIT. Sinta-se livre para usar e modificar.