A lightweight, concurrent backup tool for BigBlueButton recordings, backing up from outside the server. Downloads all presentation, video, screenshare, podcast, and notes content from a BigBlueButton instance with zero external dependencies.
- Multi-format support: Backs up presentations, videos, screenshare, podcasts, and notes
- Concurrent downloads: Configurable parallel downloads with built-in rate limiting
- Zero dependencies: Pure Go implementation with no external packages
- URL inspection mode: Export all discovered URLs without downloading
- Robust error handling: Gracefully handles missing files and network errors
- Automatic file discovery: Uses intelligent guessing to locate numbered file sequences
- Go 1.26 or later
- Access to a BigBlueButton instance with API credentials
Clone the repository:
git clone https://github.com/sa-kemper/bbb-backup-recordings-external.git
cd bbb-backup-recordings-externalBuild the binary (without debug symbols for a smaller executable):
go build -ldflags="-s -w" -o bbb-backup-recordings-external ./cmdThis creates a binary named bbb-backup-recordings-external in your current directory.
Run the binary with your BigBlueButton credentials:
./bbb-backup-recordings-external \
-bbb-hostname "bbb.example.com" \
-bbb-api-key "your-api-key-here" \
-backup-directory "./backups"All configuration is done via command-line flags:
| Flag | Environment Variable | Default | Description |
|---|---|---|---|
-bbb-hostname |
BBB_HOSTNAME |
(required) | Hostname of the BigBlueButton instance (e.g., bbb.example.com) |
-bbb-api-key |
BBB_API_KEY |
(required) | API key/shared secret from your BBB instance |
-bbb-port |
— | 443 |
Port of the BigBlueButton instance |
-bbb-timeout |
— | 10s |
HTTP timeout for requests to BBB (e.g., 30s, 1m) |
-backup-directory |
— | Current working directory | Directory where backup files are stored |
-urldump |
— | false |
Only discover and export URLs to urls.txt without downloading |
export BBB_HOSTNAME="bbb.example.com"
export BBB_API_KEY="your-api-key-here"
./bbb-backup-recordings-external -backup-directory "./backups"Useful for inspecting what will be downloaded:
./bbb-backup-recordings-external \
-bbb-hostname "bbb.example.com" \
-bbb-api-key "your-api-key-here" \
-urldumpThis creates a urls.txt file with all discovered URLs.
./bbb-backup-recordings-external \
-bbb-hostname "bbb.example.com" \
-bbb-api-key "your-api-key-here" \
-bbb-timeout "60s" \
-backup-directory "./backups"./bbb-backup-recordings-external \
-bbb-hostname "bbb.example.com" \
-bbb-port 8080 \
-bbb-api-key "your-api-key-here" \
-backup-directory "./backups"- Discovery: Connects to the BigBlueButton API and retrieves all available recordings
- URL Collection: For each recording, discovers all associated files (presentations, videos, etc.) using:
- Direct file references from metadata
- Intelligent guessing of numbered file sequences (e.g.,
slide1.svg,slide2.svg) - Multiple directory path checks to handle BigBlueButton's storage quirks
- Concurrent Download: Downloads all discovered files with configurable concurrency
- Storage: Saves files to disk maintaining the original directory structure
Backups are organized by recording type and meeting ID:
backups/
├── presentation/
│ └── {internalMeetingID}/
│ ├── shapes.svg
│ ├── metadata.xml
│ └── ...
├── video/
│ └── {internalMeetingID}/
│ ├── video-0.m4v
│ └── ...
├── screenshare/
│ └── {internalMeetingID}/
│ └── screenshare-0.webm
├── podcast/
│ └── {internalMeetingID}/
│ └── audio.ogg
└── notes/
└── {internalMeetingID}/
└── notes.pdf
The tool uses concurrent downloads with a default limit. For large backups:
- Increase timeout if experiencing timeouts:
-bbb-timeout "60s" - Use URL dump mode first to preview what will be downloaded:
-urldump - Run during off-peak hours to minimize impact on your BBB instance
Contributions are welcome! Please feel free to submit issues and pull requests.