13 KiB
13 KiB
QSfera Production Readiness
Date: 2026-06-08.
Benchmarks Used
- Google Photos Android backup: automatic photo/video backup, selected device folders, backup status, mobile-data limits, roaming controls, and battery optimization guidance. Source: https://support.google.com/photos/answer/6193313?co=GENIE.Platform%3DAndroid&hl=en
- Google Drive Android offline files and sharing roles. Sources: https://support.google.com/drive/answer/2375012?co=GENIE.Platform%3DAndroid&hl=en and https://support.google.com/drive/answer/2494822?co=GENIE.Platform%3DAndroid&hl=en
- Google storage quota behavior across Drive and Photos. Source: https://support.google.com/drive/answer/9312312?hl=en
- Google Drive for desktop: tray entry, multi-account sign-in, sync status, notifications, offline files, pause/resume sync, adding folders, and stream/mirror model. Sources: https://support.google.com/drive/answer/10838124?co=GENIE.Platform%3DDesktop&hl=en-fm and https://support.google.com/drive/answer/13401938?hl=en
- Yandex Disk Android auto-upload setup, account choice, network choice, source folders, and uploaded/not-uploaded indicators. Source: https://yandex.com/support/yandex-360/customers/disk/app/android/en/autoupload/setup
- Yandex Disk mobile link sharing controls: view-only, disable downloads, password, expiration, and organization-only links. Source: https://yandex.com/support/yandex-360/customers/disk/app/android/en/actions/share
- Yandex Disk desktop: Windows/macOS desktop app, selective sync, auto-save folders, automatic update, autorun, and sleep-prevention behavior during sync. Sources: https://www.yandex.com/support/yandex-360/customers/disk/web/en/desktop, https://www.yandex.com/support/yandex-360/customers/disk/desktop/windows/en/reserve-copy, and https://yandex.com/support/yandex-360/customers/disk/desktop/windows/en/installation
Completed In This Pass
- Android release builds now fail fast when release signing variables are missing, so unsigned release artifacts cannot be published by accident.
- Android version was raised to
1.3.7withversionCode35. - Android now has QSfera-specific Argus publishing scripts: local upload-keystore generation, signed APK staging, APK metadata verification, debug-certificate rejection, and Argus upload.
- Android
1.3.7/35was published to Argus asqsfera-mobileon 2026-06-08. Public manifest and latest download both report SHA-256c9c044c1332f8d973c64502ad2e3227ad92398101e7354ce9dbe7f708e7e693b. - Android auto-upload source paths are normalized and new/first source folders start from timestamp
0, so existing media is eligible for initial backup. - Android auto-upload validates persisted read permission and
DocumentFile.canRead()before scanning SAF folders. - Android immediate auto-upload scheduling no longer blocks the caller while waiting for WorkManager state.
- Android new auto-upload configurations default to Wi-Fi-only transfers for photos and videos.
- Android auto-upload now exposes a no-roaming control for photo and video backup, stores it in Room schema version
50, and maps mobile backup without roaming to WorkManagerNetworkType.NOT_ROAMING. - Server
qsfera_fullcompose files now require explicit admin, Keycloak, and S3/MinIO secrets instead of demo defaults. - Server
qsfera_full/env.production.exampleprovides a tracked production-safe starting point with TLS validation enabled and demo users disabled. - Server
qsfera_full/validate-production-env.shchecks production.envinvariants before compose validation: TLS validation enabled, demo users disabled, pinned production image, required domains, required secrets, and no public-production MinIO. - Server now has a Raspberry Pi 5 Docker path matching the Ikar/Argus deployment style:
Server/docker-compose.rpi5.yml,Server/.env.example, andServer/docs/raspberry-pi-5-docker.md. - Server Docker builds now accept explicit production metadata for
QSFERA_VERSION,QSFERA_EDITION, andQSFERA_BUILD_DATE, and the Raspberry Pi 5 compose path defaults to pinned imageqsfera-cloud-server:7.0.0-rpi5-stable. - Windows/Desktop update channel defaults now match the build channel: stable builds default to
stable, beta builds default tobeta. - Windows/Desktop CI now validates production release invariants before Windows packaging and requires signing variables for stable tag releases.
- Windows/Desktop now has a configured HTTPS update feed at
https://qsfera.kusoft.xyz/desktop/updates/stable.xml; the feed returned HTTP200on 2026-06-08 and contains the XML elements parsed byDesktop/src/gui/updater/updateinfo.cpp. - Added
scripts/verify-production-state.ps1as a repeatable live production endpoint gate for the public server status, Android Argus manifest/download, and Desktop update feed. scripts/verify-production-state.ps1 -VerifyAndroidDownloadpassed on 2026-06-08: serveredition=stable/productversion=7.0.0, Android1.3.7/35, downloaded APK size12220848, APK SHA-256c9c044c1332f8d973c64502ad2e3227ad92398101e7354ce9dbe7f708e7e693b, and valid Desktop no-update feed.- Added
Server/scripts/verify-rpi-production.sh, declared a loopback-only Pi metrics port inServer/docker-compose.rpi5.yml, and expanded the Raspberry Pi Docker runbook with local/public status checks, container/image checks, Prometheus metrics verification, backup/restore drill steps, and Docker data-root/retention planning. - Added systemd monitoring units for the Pi:
Server/systemd/qsfera-rpi-production-check.service,Server/systemd/qsfera-rpi-production-check.timer,Server/systemd/qsfera-rpi-production-check-alert@.service,Server/systemd/rpi-production-check.env.example, plus installerServer/scripts/install-rpi-production-monitoring.shand alert helperServer/scripts/alert-rpi-production-check-failure.sh. - Deployed the Pi metrics/checker update on 2026-06-09. Before upload,
/mnt/data/qsfera/cloud-server/src/docker-compose.rpi5.ymlwas backed up to/mnt/data/qsfera/backups/docker-compose.rpi5.yml-20260609-181614.bak;docker compose -f docker-compose.rpi5.yml up -drecreated and startedqsfera-cloud-server;docker compose psreported loopback ports127.0.0.1:9200->9200/tcpand127.0.0.1:9205->9205/tcp. Server/scripts/verify-rpi-production.shpassed on the Pi on 2026-06-09 withPUBLIC_STATUS_URL=https://qsfera.kusoft.xyz/status.phpandREQUIRE_METRICS=true: imageqsfera-cloud-server:7.0.0-rpi5-stable, containerrunning/healthy, Docker root/mnt/data/docker, root free space43.0 GiB, data free space851.5 GiB, local and public statusstable/7.0.0, and Prometheus metrics reachable.- Deployed the Pi systemd monitoring timer on 2026-06-09.
systemd-analyze verifyfor the three installed unit files returned exit0;systemctl is-enabled qsfera-rpi-production-check.timerreturnedenabled;systemctl is-active qsfera-rpi-production-check.timerreturnedactive;systemctl show qsfera-rpi-production-check.servicereturnedResult=success,ExecMainStatus=0,ActiveState=inactive; andjournalctl -u qsfera-rpi-production-check.servicerecordedQSfera Raspberry Pi production verification passed: 0 warning(s).
Raspberry Pi 5 Check
- Pi target checked on 2026-06-08:
192.168.0.185reportsaarch64, 64-bit Debian 13, Docker29.4.3, Docker Composev5.1.3, and Docker server architectureaarch64. - Before stable-image deployment, the old Pi server was running as local/dev image
qsfera-cloud-server:rpi5-local; public/status.phpreportededition: devandproductversion: 7.0.0. - The Pi server now runs through
/mnt/data/qsfera/cloud-server/src/docker-compose.rpi5.ymlwith pinned imageqsfera-cloud-server:7.0.0-rpi5-stable, bind-mounted config/data under/mnt/data/qsfera/cloud-server, loopback backend port127.0.0.1:9200, loopback metrics port127.0.0.1:9205, and Docker root/mnt/data/docker. - Before switching the Pi server to compose, config/data were backed up to
/mnt/data/qsfera/backups/cloud-server-before-compose-20260608-200921.tar.gz. The archive was created withsudo tar, had size213M, andtar -tzfcompleted successfully. - Before switching to the stable image, config/data were backed up to
/mnt/data/qsfera/backups/cloud-server-before-stable-image-20260608-201536.tar.gz. The archive had size213M, andtar -tzfcompleted successfully. docker run --rm --entrypoint /usr/bin/qsfera qsfera-cloud-server:7.0.0-rpi5-stable version --skip-servicesreturnedVersion: 7.0.0,Edition: stable, andCompiled: 2026-06-08 00:00:00 +0000 UTC.- After deployment,
docker compose psreportedqsfera-cloud-serverasUpandhealthy;docker inspectreportedIMAGE=qsfera-cloud-server:7.0.0-rpi5-stable HEALTH=healthy. - Local
https://127.0.0.1:9200/status.phpand publichttps://qsfera.kusoft.xyz/status.phpboth returnededition: stableandproductversion: 7.0.0; the public request returned HTTP200. - After Docker builder cache cleanup and the stable deployment,
/dev/mmcblk0p2reported57Gsize,12Gused,43Gavailable,21%use./mnt/datareported916Gsize,18Gused,852Gavailable,3%use.
Android Argus Publication Check
- Current public Argus manifest for
https://argus.kusoft.xyz/api/apps/qsfera-mobile/manifest?platform=android&channel=stablereports release id677fa0bc-07f8-4981-b7fe-98d6de283cb8, version1.3.7, channelstable, platformandroid, package kindapk,androidVersionCode35, package size12220848, and SHA-256c9c044c1332f8d973c64502ad2e3227ad92398101e7354ce9dbe7f708e7e693b. - Independent download verification of
https://argus.kusoft.xyz/api/apps/qsfera-mobile/download/latest?platform=android&channel=stableproduced a12220848byte APK with the same SHA-256c9c044c1332f8d973c64502ad2e3227ad92398101e7354ce9dbe7f708e7e693b. - The previously published
1.3.5/33APK matched Argus SHA-256b7d5bdcb49527c00983a15849252fa42189dee4287754803c46cf2f32e2130f3, butapksignerreportedCN=Android Debugwith certificate SHA-256b86d745cecb01ca24bda03092fe94ca7801678513b97edd1175bcabfdea4e941. - The new
1.3.7/35APK is signed byCN=QSfera Argus Upload, O=QSfera, C=RUwith certificate SHA-256ea5c304c78ee333f6586f54c933d986c1f865da9c4e3595f8fe0df274c1ab877. AppUpdateManagervalidates downloaded APK package name, greaterversionCode, ArgusandroidVersionCode, and signer digest against the installed app signature. Because of that local code path, devices that installed debug-signed1.3.5should be treated as needing reinstall or an explicit migration plan before they can move to the production-signed1.3.7.
Remaining P0
- Back up the gitignored Android release signing files created under
Android/signing/andAndroid/argus-signing.local.propertiesin a secure external secret store. Without this key material, future in-place Android updates from the production-signed1.3.7cannot be signed with the same certificate. - Provide CI/Argus signing secrets derived from the same release key:
QSFERA_RELEASE_KEYSTORE,QSFERA_RELEASE_KEYSTORE_PASSWORD,QSFERA_RELEASE_KEY_ALIAS, andQSFERA_RELEASE_KEY_PASSWORD. - Decide the rollout policy for any devices that installed the debug-signed Argus
1.3.5APK. The production-signed1.3.7APK is the correct current release, but installed debug-signed clients will not satisfy the app's own signer-digest check for an in-place update. - Fill production domains, ACME email, admin passwords, Keycloak passwords, and storage secrets from a secret manager. Do not commit real values.
- Run
./validate-production-env.sh .envand thendocker compose configforServer/devtools/deployments/qsfera_fullwith a filled production.env; Docker CLI is not available in this local environment, so compose rendering is not locally verified. - Provide real Windows signing secrets in CI:
QSFERA_DESKTOP_SIGN_PACKAGE=TrueandQSFERA_DESKTOP_CODESIGN_CERTIFICATEwith the Craft-compatible signing certificate reference. - Publish the first signed Windows MSI and update
https://qsfera.kusoft.xyz/desktop/updates/stable.xmlfrom the current no-update XML to a concrete<version>,<versionstring>, and HTTPS.msi<downloadurl>.
Remaining P1
- Add Google Photos-style backup status UX: overall status, per-item status, queued/paused/permanent-failure states, and low-storage messaging.
- Add mobile-data controls comparable to Google Photos/Yandex Disk beyond the Wi-Fi-only default: mobile-data limit and no-video-over-mobile-data options.
- Store auto-upload sync cursors per source folder rather than one timestamp for all folders.
- Configure
QSFERA_ALERT_WEBHOOK_URLin/etc/qsfera/rpi-production-check.envif off-host alert delivery is required; the installed failure service currently logs throughsystemd-catand journal without an external endpoint. - Verify sharing controls against Google Drive and Yandex Disk expectations: link expiration, password, disable downloads, organization-only access, and role inheritance.