$ services: bacula-director: image: bacularis/bacularis-standalone:6.0.0-trixie container_name: bacula-director -weight: 500;">restart: unless-stopped ports: - "9097:9097" # Bacularis web UI - "9101:9101" # Director daemon volumes: - bacula-config:/opt/bacula/etc # Bacula configuration - bacula-data:/opt/bacula/archive # Backup storage - bacula-catalog:/var/lib/pgsql/data # PostgreSQL catalog database - bacula-logs:/opt/bacula/log # Bacula logs environment: DB_INIT: "true" # Initialize database on first run DB_HOST: "localhost" DB_PORT: "5432" DB_NAME: "bacula" DB_USER: "bacula" DB_PASSWORD: "change-this-password" # CHANGE: strong database password BACULARIS_API_USER: "admin" # CHANGE: web UI username BACULARIS_API_PASSWORD: "change-this-too" # CHANGE: web UI password networks: - backup bacula-storage: image: bacularis/bacularis-standalone:6.0.0-trixie container_name: bacula-storage -weight: 500;">restart: unless-stopped ports: - "9103:9103" # Storage daemon volumes: - bacula-config:/opt/bacula/etc:ro - bacula-data:/opt/bacula/archive entrypoint: ["/opt/bacula/bin/bacula-sd", "-f", "-c", "/opt/bacula/etc/bacula-sd.conf"] networks: - backup networks: backup: driver: bridge volumes: bacula-config: bacula-data: bacula-catalog: bacula-logs:
services: bacula-director: image: bacularis/bacularis-standalone:6.0.0-trixie container_name: bacula-director -weight: 500;">restart: unless-stopped ports: - "9097:9097" # Bacularis web UI - "9101:9101" # Director daemon volumes: - bacula-config:/opt/bacula/etc # Bacula configuration - bacula-data:/opt/bacula/archive # Backup storage - bacula-catalog:/var/lib/pgsql/data # PostgreSQL catalog database - bacula-logs:/opt/bacula/log # Bacula logs environment: DB_INIT: "true" # Initialize database on first run DB_HOST: "localhost" DB_PORT: "5432" DB_NAME: "bacula" DB_USER: "bacula" DB_PASSWORD: "change-this-password" # CHANGE: strong database password BACULARIS_API_USER: "admin" # CHANGE: web UI username BACULARIS_API_PASSWORD: "change-this-too" # CHANGE: web UI password networks: - backup bacula-storage: image: bacularis/bacularis-standalone:6.0.0-trixie container_name: bacula-storage -weight: 500;">restart: unless-stopped ports: - "9103:9103" # Storage daemon volumes: - bacula-config:/opt/bacula/etc:ro - bacula-data:/opt/bacula/archive entrypoint: ["/opt/bacula/bin/bacula-sd", "-f", "-c", "/opt/bacula/etc/bacula-sd.conf"] networks: - backup networks: backup: driver: bridge volumes: bacula-config: bacula-data: bacula-catalog: bacula-logs:
services: bacula-director: image: bacularis/bacularis-standalone:6.0.0-trixie container_name: bacula-director -weight: 500;">restart: unless-stopped ports: - "9097:9097" # Bacularis web UI - "9101:9101" # Director daemon volumes: - bacula-config:/opt/bacula/etc # Bacula configuration - bacula-data:/opt/bacula/archive # Backup storage - bacula-catalog:/var/lib/pgsql/data # PostgreSQL catalog database - bacula-logs:/opt/bacula/log # Bacula logs environment: DB_INIT: "true" # Initialize database on first run DB_HOST: "localhost" DB_PORT: "5432" DB_NAME: "bacula" DB_USER: "bacula" DB_PASSWORD: "change-this-password" # CHANGE: strong database password BACULARIS_API_USER: "admin" # CHANGE: web UI username BACULARIS_API_PASSWORD: "change-this-too" # CHANGE: web UI password networks: - backup bacula-storage: image: bacularis/bacularis-standalone:6.0.0-trixie container_name: bacula-storage -weight: 500;">restart: unless-stopped ports: - "9103:9103" # Storage daemon volumes: - bacula-config:/opt/bacula/etc:ro - bacula-data:/opt/bacula/archive entrypoint: ["/opt/bacula/bin/bacula-sd", "-f", "-c", "/opt/bacula/etc/bacula-sd.conf"] networks: - backup networks: backup: driver: bridge volumes: bacula-config: bacula-data: bacula-catalog: bacula-logs:
-weight: 500;">docker compose up -d
-weight: 500;">docker compose up -d
-weight: 500;">docker compose up -d
-weight: 500;">apt -weight: 500;">install bacula-fd
-weight: 500;">apt -weight: 500;">install bacula-fd
-weight: 500;">apt -weight: 500;">install bacula-fd
-weight: 500;">dnf -weight: 500;">install bacula-client
-weight: 500;">dnf -weight: 500;">install bacula-client
-weight: 500;">dnf -weight: 500;">install bacula-client
Director { Name = bacula-dir Password = "shared-secret-password" # Must match Director's client config
} FileDaemon { Name = client-hostname-fd Maximum Concurrent Jobs = 5
}
Director { Name = bacula-dir Password = "shared-secret-password" # Must match Director's client config
} FileDaemon { Name = client-hostname-fd Maximum Concurrent Jobs = 5
}
Director { Name = bacula-dir Password = "shared-secret-password" # Must match Director's client config
} FileDaemon { Name = client-hostname-fd Maximum Concurrent Jobs = 5
}
server { listen 443 ssl; server_name bacula.example.com; location / { proxy_pass http://localhost:9097; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
}
server { listen 443 ssl; server_name bacula.example.com; location / { proxy_pass http://localhost:9097; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
}
server { listen 443 ssl; server_name bacula.example.com; location / { proxy_pass http://localhost:9097; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; }
}
-weight: 500;">systemctl -weight: 500;">status bacula-fd
-weight: 500;">systemctl -weight: 500;">status bacula-fd
-weight: 500;">systemctl -weight: 500;">status bacula-fd
-weight: 500;">docker exec -it bacula-director psql -U bacula -d bacula < catalog-backup.sql
-weight: 500;">docker exec -it bacula-director psql -U bacula -d bacula < catalog-backup.sql
-weight: 500;">docker exec -it bacula-director psql -U bacula -d bacula < catalog-backup.sql
# From bconsole inside the Director container
-weight: 500;">docker exec -it bacula-director /opt/bacula/bin/bconsole
*prune expired volumes
# From bconsole inside the Director container
-weight: 500;">docker exec -it bacula-director /opt/bacula/bin/bconsole
*prune expired volumes
# From bconsole inside the Director container
-weight: 500;">docker exec -it bacula-director /opt/bacula/bin/bconsole
*prune expired volumes - A Linux server (Ubuntu 22.04+ recommended)
- Docker and Docker Compose installed (guide)
- 2 GB of free RAM (minimum)
- Sufficient disk space for backup storage
- Network access to all machines you want to back up
- A domain name (optional, for remote web UI access) - Open the Bacularis web UI at http://your-server-ip:9097
- Log in with the credentials from your environment variables
- Navigate to Configuration → Director to review default job definitions
- The default configuration includes a self-backup job — verify it runs successfully - Client: which machine to back up
- FileSet: which directories to include/exclude
- Schedule: when to run (full, incremental, differential)
- Pool: which storage pool to target
- Level: Full, Incremental, or Differential - /opt/bacula/etc/ — configuration files
- The PostgreSQL catalog database (dump regularly)
- SSH keys and certificates - RAM: 512 MB idle, 1-2 GB during active backup jobs
- CPU: Low to moderate (depends on compression and encryption settings)
- Disk: Depends on data volume. The catalog database grows with the number of files backed up — budget 1-5 GB for the catalog, plus backup storage. - Best Self-Hosted Backup Solutions
- How to Self-Host BackupPC
- How to Self-Host Restic
- How to Self-Host BorgBackup
- UrBackup vs BackupPC
- Restic vs BorgBackup
- Replace Backblaze
- Backup Strategy
- Docker Compose Basics