Wings

Backup Adapters

How Wings stores backups — adapter dispatch, panel config fetching, and the Google Drive adapter.

Wings supports multiple backup adapters. The Panel picks the adapter per backup and records it on the backup row; Wings dispatches on that value.

Adapters

AdapterValueWhere the data goes
Wings (local)wingsNode's local backup directory
ddup-bakddup-bakddup-bak repository on the node
S3s3S3-compatible storage via presigned multipart uploads issued by the Panel
Resticresticrestic repository (config fetched from the Panel per backup)
Proxmox Backup Serverproxmox-backup-serverPBS datastore
KopiakopiaKopia repository
Google Drivegoogle-driveThe connected user's personal Google Drive

External adapters (restic, pbs, kopia, google-drive) fetch their configuration from the Panel at operation time via GET /api/remote/backups/{uuid}/{adapter}, authenticated with the node token. S3 receives presigned upload URLs instead of credentials.

Google Drive adapter

Introduced with the per-user Google Drive backups feature (Panel: Admin → Settings → Backups).

Create — the archive is buffered to {backup_directory}/{uuid}.gdrive.tar.gz (gzip), then uploaded through the Google Drive resumable upload protocol: a session is created in the per-server folder the Panel resolves, chunks of 1 MiB are PUT sequentially with Content-Range, and the final response returns the file id, which Wings reports back to the Panel.

Tokens — the Panel supplies a user access token, a refresh token, and the operator's OAuth client credentials. On a 401 Wings refreshes the access token itself (POST oauth2.googleapis.com/token) and retries; on 404 (expired session) it starts a new session. Retries use exponential backoff capped by system.backups.gdrive.retry_limit.

Restore — Wings fetches the backup config, downloads files/{id}?alt=media, and untars through the same pipeline as other adapters.

Delete — best-effort DELETE files/{id}. If the Drive file can't be deleted (for example, access was revoked), the backup row in the Panel is still removed and the file stays in Drive.

Configuration

All fields are optional and defaulted in config.yml under system.backups.gdrive:

FieldDefaultMeaning
create_threads4Compression threads while building the archive
part_upload_timeout7200Per-request HTTP timeout (seconds)
retry_limit10Max attempts per chunk

Treat node tokens with care: they authenticate requests that fetch backup configuration, including user OAuth tokens and the operator's OAuth client secret. Store them securely and rotate them if a node is decommissioned.

Requirements

  • Panel configured with Google OAuth client credentials (Admin → Settings → Backups)
  • The user must have connected their Google Drive in Account settings
  • Outbound HTTPS to www.googleapis.com and oauth2.googleapis.com from the node

On this page