Edit history

rexctl backup fails on migrated self-hosted instances with unlabeled Docker volumes has not been edited, so there are no earlier versions.

Current version | Original by g00by
Show

rexctl backup fails on migrated self-hosted instances with unlabeled Docker volumes

Reproduction steps

  1. Start with an existing, operational self-hosted Fluxer instance deployed using the original/legacy Docker Compose installation method, before adopting the new rexctl management system.
  2. Migrate the existing installation to the new official rexctl deployment and management system, retaining the original Docker volumes, PostgreSQL database, and existing production data.
  3. Successfully upgrade the migrated instance to Fluxer 2026.1024.213335 using rexctl.
  4. Confirm that the migrated instance operates normally and that all production containers, including PostgreSQL, are healthy.
  5. Run rexctl status --dir /opt/fluxer and verify that it correctly reports Fluxer as running.
  6. Inspect the existing PostgreSQL volume using docker volume inspect fluxer_postgres-data. The volume exists and is actively used but reports "Labels": null, because it originated from the legacy deployment.
  7. Run rexctl backup --dir /opt/fluxer to create a native backup using the new management system.
  8. Observe that the backup immediately fails, incorrectly stating that Fluxer has never started, despite the instance having operated successfully before and after migration. No backup archive is created.

Expected behaviour

After successfully migrating an existing self-hosted Fluxer installation from the legacy Docker Compose deployment method to the new official rexctl management system, all supported rexctl functionality, including native backups, should work correctly. rexctl backup should recognize and back up the existing PostgreSQL database, applicable Docker volumes, uploaded files, and instance configuration, even when the volumes were originally created by the legacy deployment method and lack Docker Compose project labels. The migration should preserve compatibility with existing production data without requiring administrators to recreate, rename, or manually migrate Docker volumes. A successful backup should generate a valid, restorable archive that can be used for disaster recovery or rollback during future upgrades. If a required volume cannot be discovered, rexctl should report the specific missing resource rather than incorrectly stating that Fluxer has never started.

Actual behaviour

After successfully migrating my existing self-hosted Fluxer instance from the legacy Docker Compose deployment method to the new official rexctl management system, the instance operates normally, but native backups fail. The migration and subsequent upgrade to Fluxer 2026.1024.213335 completed successfully. All production containers, including PostgreSQL, are healthy, and rexctl status --dir /opt/fluxer correctly confirms that Fluxer is running. However, executing rexctl backup --dir /opt/fluxer immediately produces the following error:
Fluxer stops for about a minute while rexctl copies your uploads.
✗ Fluxer hasn't started on this machine yet, and there's nothing to back up.
  Run rexctl start, then run rexctl backup.
No backup archive is generated, despite the instance being fully operational and containing existing production data. Root cause identified through source-code investigation:
  • fluxer_rexctl/internal/engine/ps.go: Engine.Volumes() filters Docker volumes using the com.docker.compose.project label.
  • The existing Docker volumes inherited from the legacy installation, including fluxer_postgres-data, have "Labels": null.
  • Because these volumes lack the expected labels, Docker excludes them from the filtered results.
  • fluxer_rexctl/internal/backup/create.go: findVolume() supports matching expected volume names, but cannot discover volumes excluded by the earlier filtering operation.
  • Consequently, backup.Create() returns ErrNeverStarted, resulting in the misleading error message.
The same discovery logic was confirmed in the upstream source code on October 25, 2026. This appears to be a compatibility issue affecting existing self-hosted installations migrated to rexctl, where production volumes created by the previous deployment system are not recognized by the new native backup functionality. No production data has been lost. The instance remains operational, and independent backups continue to function. However, native rexctl backups are currently unusable.

Build information

Canary Desktop 2026.1024.213614, Web 2026.1024.213614, Linux 7.2.11-200.fc44.x86_64 (x64), Electron 44.9.1, Chrome 152.0.7977.167, Node 24.22.0, Locale en-US

Platform

Self-hosting

Evidence

Environment

  • Fluxer version: 2026.1024.213335
  • rexctl version: 2026.1024.213335
  • OS: Ubuntu Linux (x86_64)
  • Docker Engine: 29.9.0
  • Deployment: Existing self-hosted Fluxer instance migrated from the original Docker Compose installation method to the new official rexctl management system.

1. Instance status

Command:
rexctl status --dir /opt/fluxer
Output:
✓ Fluxer is running.
Version   2026.1024.213335
Folder    /opt/fluxer
All production containers, including PostgreSQL, are operational.

2. Existing Docker volume information

Command:
docker volume inspect fluxer_postgres-data \
  --format '{{.Name}} | Labels: {{json .Labels}}'
Output:
fluxer_postgres-data | Labels: null
The same result was observed across six other existing Docker volumes, including SeaweedFS, Valkey, Meilisearch, NATS, and edge storage.

3. Native backup failure

Command:
rexctl backup --dir /opt/fluxer
Output:
Fluxer stops for about a minute while rexctl copies your uploads.
✗ Fluxer hasn't started on this machine yet, and there's nothing to back up.
  Run rexctl start, then run rexctl backup.
No backup archive is created.

4. Source-code observations

Investigation identified the following behavior:
  • fluxer_rexctl/internal/engine/ps.go — Engine.Volumes() applies a Docker Compose project-label filter before listing volumes.
  • fluxer_rexctl/internal/backup/create.go — findVolume() supports matching existing volume names but only receives volumes returned by the filtered query.
  • fluxer_rexctl/internal/backup/create.go — backup.Create() returns ErrNeverStarted when it cannot identify the expected PostgreSQL volume.
The existing production volumes lack Compose labels, which appears to explain why the backup operation cannot discover them. This behavior was also observed in upstream source commit c0ed67c on October 25, 2026.

Additional information

The original self-hosted instance was successfully migrated to rexctl management without losing production data. The application remains operational, and independent encrypted backups continue to succeed. The issue appears isolated to native backup functionality following migration.