bc16a186d54d7357cb445e5fc0b64d450742f71a
ExternalStorageFactory builds storages with files_external's own backends and auth mechanisms from an unsaved StorageConfig (as its ConfigAdapter does), and StorageBackend adapts any IStorage to IBackend (writeStream, seekable range reads, temp name + rename except on S3). IBackend::put() now owns and always closes the stream, because files_external's S3 writeStream closes it. Spike D (NC34): S3 (SeaweedFS) and SFTP: 120 MiB backup ~6s, unchanged run uploads nothing, restore bit-identical, no files_external mount created, no temp files (max 12 KiB in /tmp). Works with files_external disabled when its classes are loaded. Backup peak memory 85-89 MiB on these targets (to investigate).
NG Backup
Encrypted, incremental backups of Nextcloud with restore from the web interface. Works without shell access: no external programs, no extra PHP extensions beyond sodium.
Status: phase 0 (prototype). Not usable yet. See PLAN.md for the design.
License: AGPL-3.0-or-later.