Self-hosted file sharing with one-time download links.
# Clone and run
git clone https://github.com/k2sobot/dropzone.git
cd dropzone
docker-compose up -dVisit: http://localhost:8080
Admin Panel: http://localhost:8080/admin
Default Password: admin123 (change in .env)
- Upload files and get shareable one-time download links
- Files auto-delete after download
- Orphaned files cleaned up after 7 days
- Admin panel with:
- Dashboard with storage stats
- Upload management (view/delete)
- Background image customization
- Rate limiting (5 uploads/min per IP)
- Docker-ready with auto-migrations
Set these in .env or docker-compose.yml:
| Variable | Default | Description |
|---|---|---|
APP_URL |
http://localhost:8080 |
Your domain |
ADMIN_PASSWORD |
admin123 |
Admin panel password |
APP_ENV |
production |
local or production |
APP_DEBUG |
false |
Enable debug mode |
# Build and start
docker-compose up -d --build
# View logs
docker-compose logs -f
# Reinstall dependencies
docker exec dropzone-app composer install
# Run artisan commands
docker exec dropzone-app php artisan migrate
# Check scheduler status
docker exec dropzone-app supervisorctl status- Upload: User selects file → stored in
storage/app/uploads/{uuid}/ - Share: System generates link:
https://yourdomain.com/d/{uuid} - Download: Recipient clicks → file streamed → deleted
- Cleanup: Scheduler runs hourly → removes expired files
├── app/
│ ├── Http/Controllers/
│ │ ├── UploadController.php # Upload form
│ │ ├── DownloadController.php # Download page
│ │ └── Admin/ # Dashboard, Settings, etc.
│ ├── Models/
│ │ ├── Upload.php # File metadata (UUID primary)
│ │ └── AdminSetting.php # Key-value settings
│ └── Services/
│ └── FileService.php # Upload/download/cleanup logic
├── docker/
│ ├── supervisord.conf # Runs Apache + Scheduler
│ └── run-scheduler.sh # Runs `php artisan schedule:run`
└── resources/views/
├── upload.blade.php # Main layout
├── download.blade.php # Download landing
└── admin/ # Dashboard, Uploads, Settings
- UUIDs are cryptographically random (128-bit)
- Admin password stored in environment (not database)
- Files stored outside web root
- Rate limiting prevents abuse
For production:
- Use HTTPS
- Set a strong
ADMIN_PASSWORD - Consider adding file virus scanning (ClamAV)
- Set
APP_DEBUG=false
- Password-protected links
- Custom expiration times
- Multiple downloads before delete
- Email notifications
- S3/DO Spaces storage
- User accounts with file history
MIT