298 lines
8.0 KiB
Markdown
298 lines
8.0 KiB
Markdown
|
|
# Docker2PBS
|
||
|
|
|
||
|
|
Docker Compose to Proxmox Backup Server integration tool. Automatically backup Docker services with their volumes and configuration to Proxmox Backup Server.
|
||
|
|
|
||
|
|
## Features
|
||
|
|
|
||
|
|
- ✅ **Docker Compose Integration** - Reads service configuration directly from `docker-compose.yml`
|
||
|
|
- ✅ **Volume Detection** - Automatically identifies bind mounts, named volumes, and external volumes
|
||
|
|
- ✅ **Network Analysis** - Parses network configuration including external networks
|
||
|
|
- ✅ **Safe Operations** - Stops service before backup, restarts after completion
|
||
|
|
- ✅ **Separate Archives** - Creates individual `.pxar` archives for each volume
|
||
|
|
- ✅ **Selective Restore** - Restore individual volumes or complete service
|
||
|
|
- ✅ **Dry-run Mode** - Test configuration without executing operations
|
||
|
|
- ✅ **PBS Integration** - Direct integration with Proxmox Backup Server
|
||
|
|
- ✅ **Authentication Support** - Supports PBS username/password/fingerprint authentication
|
||
|
|
|
||
|
|
## Requirements
|
||
|
|
|
||
|
|
- Python 3.6+
|
||
|
|
- PyYAML
|
||
|
|
- Docker and docker-compose
|
||
|
|
- `proxmox-backup-client` installed and configured
|
||
|
|
|
||
|
|
## Installation
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Clone or download the script
|
||
|
|
git clone <repository_url>
|
||
|
|
cd docker2pbs
|
||
|
|
|
||
|
|
# Install dependencies
|
||
|
|
pip install -r requirements.txt
|
||
|
|
|
||
|
|
# Make script executable
|
||
|
|
chmod +x docker2pbs.py
|
||
|
|
```
|
||
|
|
|
||
|
|
## Quick Start
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Basic backup
|
||
|
|
./docker2pbs.py docker-compose.yml web --pbs-repository user@pbs.example.com:datastore
|
||
|
|
|
||
|
|
# Test configuration first
|
||
|
|
./docker2pbs.py docker-compose.yml web --pbs-repository user@pbs.example.com:datastore --dry-run
|
||
|
|
|
||
|
|
# With authentication
|
||
|
|
./docker2pbs.py docker-compose.yml database \
|
||
|
|
--pbs-repository user@pbs.example.com:datastore \
|
||
|
|
--pbs-username backup-user \
|
||
|
|
--pbs-password secret123
|
||
|
|
```
|
||
|
|
|
||
|
|
## Usage
|
||
|
|
|
||
|
|
```
|
||
|
|
./docker2pbs.py <compose_file> <service_name> --pbs-repository <repository> [options]
|
||
|
|
|
||
|
|
Arguments:
|
||
|
|
compose_file Path to docker-compose.yaml file
|
||
|
|
service_name Name of the service to backup
|
||
|
|
|
||
|
|
Required Options:
|
||
|
|
--pbs-repository PBS repository (format: user@host:datastore)
|
||
|
|
|
||
|
|
Optional:
|
||
|
|
--pbs-username PBS username for authentication
|
||
|
|
--pbs-password PBS password for authentication
|
||
|
|
--pbs-fingerprint PBS server fingerprint for verification
|
||
|
|
--dry-run Show what would be done without executing
|
||
|
|
--help Show help message
|
||
|
|
```
|
||
|
|
|
||
|
|
## How It Works
|
||
|
|
|
||
|
|
### Backup Process
|
||
|
|
|
||
|
|
1. **Configuration Parsing**
|
||
|
|
- Reads `docker-compose.yml` file
|
||
|
|
- Extracts service configuration (volumes, networks)
|
||
|
|
- Identifies volume types (bind mounts vs named volumes)
|
||
|
|
- Detects external volumes and networks
|
||
|
|
|
||
|
|
2. **Service Management**
|
||
|
|
- Stops the target service using `docker-compose stop`
|
||
|
|
- Ensures data consistency during backup
|
||
|
|
|
||
|
|
3. **Backup Creation**
|
||
|
|
- Creates separate `.pxar` archive for each volume
|
||
|
|
- Uses descriptive archive names (e.g., `volume_db_data.pxar`, `bind_dot_html.pxar`)
|
||
|
|
- Uploads to Proxmox Backup Server
|
||
|
|
|
||
|
|
4. **Service Recovery**
|
||
|
|
- Restarts the service using `docker-compose up -d`
|
||
|
|
- Ensures service availability is restored
|
||
|
|
|
||
|
|
### Archive Naming Convention
|
||
|
|
|
||
|
|
| Volume Type | Source Example | Archive Name |
|
||
|
|
|-------------|----------------|--------------|
|
||
|
|
| Named volume | `db_data` | `volume_db_data.pxar` |
|
||
|
|
| Bind mount | `./html` | `bind_dot_html.pxar` |
|
||
|
|
| Bind mount | `/app/data` | `bind__app_data.pxar` |
|
||
|
|
| Bind mount | `../config` | `bind_dotdot_config.pxar` |
|
||
|
|
|
||
|
|
### Dry-run Mode
|
||
|
|
|
||
|
|
Use `--dry-run` to preview operations:
|
||
|
|
- Shows detailed service configuration
|
||
|
|
- Lists all volumes that would be backed up
|
||
|
|
- Displays archive names that would be created
|
||
|
|
- Shows exact commands that would be executed
|
||
|
|
- **No actual operations performed**
|
||
|
|
|
||
|
|
## Examples
|
||
|
|
|
||
|
|
### Basic Web Service Backup
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
# docker-compose.yml
|
||
|
|
services:
|
||
|
|
web:
|
||
|
|
image: nginx:latest
|
||
|
|
volumes:
|
||
|
|
- ./html:/var/www/html
|
||
|
|
- ./config:/etc/nginx/conf.d
|
||
|
|
networks:
|
||
|
|
- webnet
|
||
|
|
```
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Backup the web service
|
||
|
|
./docker2pbs.py docker-compose.yml web --pbs-repository backup@pbs.local:webapps
|
||
|
|
|
||
|
|
# Creates these archives:
|
||
|
|
# - bind_dot_html.pxar (contains ./html content)
|
||
|
|
# - bind_dot_config.pxar (contains ./config content)
|
||
|
|
```
|
||
|
|
|
||
|
|
### Database Service with Named Volumes
|
||
|
|
|
||
|
|
```yaml
|
||
|
|
# docker-compose.yml
|
||
|
|
services:
|
||
|
|
database:
|
||
|
|
image: postgres:13
|
||
|
|
volumes:
|
||
|
|
- db_data:/var/lib/postgresql/data
|
||
|
|
- db_backups:/backups
|
||
|
|
environment:
|
||
|
|
POSTGRES_PASSWORD: secret
|
||
|
|
|
||
|
|
volumes:
|
||
|
|
db_data:
|
||
|
|
db_backups:
|
||
|
|
external: true
|
||
|
|
```
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Backup database service
|
||
|
|
./docker2pbs.py docker-compose.yml database \
|
||
|
|
--pbs-repository dba@pbs.local:databases \
|
||
|
|
--pbs-username backup-user
|
||
|
|
|
||
|
|
# Creates these archives:
|
||
|
|
# - volume_db_data.pxar (PostgreSQL data directory)
|
||
|
|
# - volume_db_backups.pxar (backup directory)
|
||
|
|
```
|
||
|
|
|
||
|
|
## Restore Operations
|
||
|
|
|
||
|
|
See [restore_example.md](restore_example.md) for detailed restore procedures.
|
||
|
|
|
||
|
|
### Quick Restore Example
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# List available backups
|
||
|
|
proxmox-backup-client list --repository user@pbs.example.com:datastore
|
||
|
|
|
||
|
|
# Restore specific volume
|
||
|
|
proxmox-backup-client restore \
|
||
|
|
--repository user@pbs.example.com:datastore \
|
||
|
|
host/web/2024-01-15_10-30-45 \
|
||
|
|
volume_db_data.pxar /var/lib/docker/volumes/db_data/_data
|
||
|
|
```
|
||
|
|
|
||
|
|
## Configuration
|
||
|
|
|
||
|
|
### PBS Client Setup
|
||
|
|
|
||
|
|
Ensure `proxmox-backup-client` is installed and configured:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Install PBS client (Debian/Ubuntu)
|
||
|
|
apt install proxmox-backup-client
|
||
|
|
|
||
|
|
# Configure repository (optional)
|
||
|
|
export PBS_REPOSITORY=user@pbs.example.com:datastore
|
||
|
|
export PBS_PASSWORD=your_password
|
||
|
|
```
|
||
|
|
|
||
|
|
### Supported Volume Types
|
||
|
|
|
||
|
|
- ✅ **Bind Mounts** - Local directories mounted into containers
|
||
|
|
- ✅ **Named Volumes** - Docker-managed volumes
|
||
|
|
- ✅ **External Volumes** - Pre-existing volumes managed outside compose
|
||
|
|
- ❌ **Tmpfs Volumes** - Memory-based volumes (not backed up)
|
||
|
|
- ❌ **Anonymous Volumes** - Unnamed volumes (not backed up)
|
||
|
|
|
||
|
|
### Supported Network Types
|
||
|
|
|
||
|
|
- ✅ **Default Networks** - Docker compose default networks
|
||
|
|
- ✅ **Named Networks** - Custom networks defined in compose
|
||
|
|
- ✅ **External Networks** - Pre-existing networks
|
||
|
|
- ✅ **Bridge Networks** - Standard bridge networks
|
||
|
|
- ✅ **Overlay Networks** - Multi-host networks
|
||
|
|
|
||
|
|
## Security Considerations
|
||
|
|
|
||
|
|
- PBS credentials can be provided via command line or environment variables
|
||
|
|
- Avoid hardcoding passwords in scripts
|
||
|
|
- Use PBS fingerprint verification for secure connections
|
||
|
|
- Consider using PBS tokens instead of passwords
|
||
|
|
- Ensure backup user has minimal required permissions
|
||
|
|
|
||
|
|
## Troubleshooting
|
||
|
|
|
||
|
|
### Common Issues
|
||
|
|
|
||
|
|
1. **Service fails to stop**
|
||
|
|
```bash
|
||
|
|
# Check if service is running
|
||
|
|
docker-compose ps
|
||
|
|
|
||
|
|
# Manually stop if needed
|
||
|
|
docker-compose stop service_name
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **Volume path not found**
|
||
|
|
```bash
|
||
|
|
# Check volume exists
|
||
|
|
docker volume ls
|
||
|
|
docker volume inspect volume_name
|
||
|
|
|
||
|
|
# For bind mounts, verify path exists
|
||
|
|
ls -la /path/to/bind/mount
|
||
|
|
```
|
||
|
|
|
||
|
|
3. **PBS connection fails**
|
||
|
|
```bash
|
||
|
|
# Test PBS connectivity
|
||
|
|
proxmox-backup-client list --repository user@pbs.example.com:datastore
|
||
|
|
|
||
|
|
# Verify credentials
|
||
|
|
echo $PBS_PASSWORD
|
||
|
|
```
|
||
|
|
|
||
|
|
4. **Permission issues**
|
||
|
|
```bash
|
||
|
|
# Ensure script is executable
|
||
|
|
chmod +x docker2pbs.py
|
||
|
|
|
||
|
|
# Check Docker permissions
|
||
|
|
docker ps
|
||
|
|
```
|
||
|
|
|
||
|
|
### Debug Mode
|
||
|
|
|
||
|
|
For verbose output, modify the script to enable debug logging or run with:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Show all executed commands
|
||
|
|
bash -x docker2pbs.py docker-compose.yml service --pbs-repository repo --dry-run
|
||
|
|
```
|
||
|
|
|
||
|
|
## Contributing
|
||
|
|
|
||
|
|
1. Fork the repository
|
||
|
|
2. Create feature branch (`git checkout -b feature/amazing-feature`)
|
||
|
|
3. Commit changes (`git commit -m 'Add amazing feature'`)
|
||
|
|
4. Push to branch (`git push origin feature/amazing-feature`)
|
||
|
|
5. Open Pull Request
|
||
|
|
|
||
|
|
## License
|
||
|
|
|
||
|
|
This project is licensed under the MIT License - see the LICENSE file for details.
|
||
|
|
|
||
|
|
## Support
|
||
|
|
|
||
|
|
- Create issues for bugs or feature requests
|
||
|
|
- Check existing documentation in `/docs` directory
|
||
|
|
- Review example configurations in `/examples` directory
|
||
|
|
|
||
|
|
## Related Projects
|
||
|
|
|
||
|
|
- [Proxmox Backup Server](https://www.proxmox.com/en/proxmox-backup-server)
|
||
|
|
- [Docker Compose](https://docs.docker.com/compose/)
|
||
|
|
- [proxmox-backup-client](https://pbs.proxmox.com/docs/backup-client.html)
|