3f14c0d5729f5849db751961e1a4892728c8f4a2
Beekeeper
Automated Docker volume backup service with compression and FTP upload.
Overview
Beekeeper is a Rust-based service that automatically backs up Docker volumes on a scheduled basis. It safely stops containers, compresses their volumes, restarts the containers, and uploads the backups to an FTP server.
Features
- Automated Backups: Schedule backups using cron expressions
- Safe Container Management: Automatically stops and restarts containers during backup
- Efficient Compression: Creates tar.xz archives for optimal storage
- FTP Upload: Automatically uploads backups to a remote FTP server
- Label-Based Selection: Uses Docker labels to identify containers to backup
- Volume Mounting: Shares the same volumes as the target containers
How It Works
- Discovery: Beekeeper scans for Docker containers with the backup label
- Preparation: Stops the identified containers gracefully
- Compression: Creates a tar.xz archive of the volume contents
- Restoration: Restarts the stopped containers
- Upload: Transfers the backup archive to the configured FTP server
Configuration
Environment Variables
| Variable | Description | Required | Example |
|---|---|---|---|
BACKUP_FOLDER |
Path to the folder containing volumes to backup | Yes | /data/volumes |
BACKUP_CRON |
Cron expression for backup schedule | Yes | 0 2 * * * |
FTP_HOST |
FTP server hostname | Yes | ftp.example.com |
FTP_PORT |
FTP server port | No | 21 (default) |
FTP_USER |
FTP username | Yes | backup_user |
FTP_PASSWORD |
FTP password | Yes | secret123 |
FTP_PATH |
Remote path on FTP server | No | /backups |
Docker Labels
Add the following label to containers you want to backup:
labels:
- "beekeeper.backup=true"
Usage
Docker Compose Example
version: '3.8'
services:
beekeeper:
image: beekeeper:latest
container_name: beekeeper
privileged: true
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- data-volume:/data/volumes
environment:
- BACKUP_FOLDER=/data/volumes
- BACKUP_CRON=0 2 * * *
- FTP_HOST=ftp.example.com
- FTP_USER=backup_user
- FTP_PASSWORD=secret123
restart: unless-stopped
# Example service to backup
myapp:
image: myapp:latest
volumes:
- data-volume:/app/data
labels:
- "beekeeper.backup=true"
restart: unless-stopped
volumes:
data-volume:
Standalone Docker
docker run -d \
--name beekeeper \
--privileged \
-v /var/run/docker.sock:/var/run/docker.sock \
-v data-volume:/data/volumes \
-e BACKUP_FOLDER=/data/volumes \
-e BACKUP_CRON="0 2 * * *" \
-e FTP_HOST=ftp.example.com \
-e FTP_USER=backup_user \
-e FTP_PASSWORD=secret123 \
beekeeper:latest
Cron Expression Examples
| Expression | Description |
|---|---|
0 2 * * * |
Daily at 2:00 AM |
0 */6 * * * |
Every 6 hours |
0 0 * * 0 |
Weekly on Sunday at midnight |
0 3 1 * * |
Monthly on the 1st at 3:00 AM |
Development
Prerequisites
- Rust 1.70+
- Docker 20.10+
- Docker Compose (optional)
Building
cargo build --release
Running Locally
export BACKUP_FOLDER=/tmp/backups
export BACKUP_CRON="*/5 * * * *"
export FTP_HOST=localhost
export FTP_USER=test
export FTP_PASSWORD=test
cargo run
Testing
cargo test
Security Considerations
- Privileged Mode: Beekeeper requires access to the Docker socket and privileged mode to manage containers
- Credentials: Store FTP credentials securely (use Docker secrets in production)
- Network: Ensure FTP traffic is encrypted (use FTPS if possible)
- Permissions: The backup folder should have appropriate permissions
Limitations
- Currently supports FTP only (SFTP/S3 support planned)
- Containers are stopped during backup (downtime expected)
- No incremental backup support yet
Roadmap
- SFTP and S3 backend support
- Incremental backups
- Backup retention policies
- Backup verification
- Prometheus metrics
- Web UI for monitoring
License
MIT
Contributing
Contributions are welcome! Please open an issue or submit a pull request.
Description
🐝 Beekeeper - Your Docker Swarm's guardian. Automatically backs up volumes from labeled services, manages graceful service restarts, and uploads to remote storage.
Languages
Rust
65.2%
Dockerfile
34.8%