Releases: nextdeveloper-nl/s3
Releases · nextdeveloper-nl/s3
Release list
v1.1.28
Fixed
- Access-key reveal/revoke (and other audit-logged actions) no longer fail with "not allowed" for s3-user/s3-manager roles. AuditLogsService::log() now bypasses the create-authorization check when writing the audit trail, since it's a system-triggered side effect of an already-authorized action, not a user-initiated create.
Requires nextdeveloper-nl/iam >= v2.0.7 (adds UserHelper::withRolesCheckBypassed()).
v1.1.26 — quota alerts perspective + role read parity
New
s3_quota_alerts_perspective— read-only perspective (GET /s3/quota-alerts-perspective), one row per S3 account currently at/above the 80% quota warning threshold (or already blocked) on storage or monthly egress. Uses the same thresholds asQuotaHelper/QuotaWarningNotification/QuotaExceededNotification, so it always reflects what did (or will) trigger an alert email.- Ships as a DB view — see
schemas/s3_quota_alerts_perspective.sqlfor theCREATE OR REPLACE VIEWto apply to the database (no Laravel migration, same as the otherschemas/*.sqlreferences in this repo). - Full model/controller/service/transformer/request/filter scaffolding, mirroring the existing
worm-expiring-perspectivepattern.
- Ships as a DB view — see
Fix
S3UserRolewas missing read access tos3_account_stats,s3_accounts_perspective, ands3_server_capacity_stats, even thoughS3ManagerRole/S3AdminRolealready had them — brought to parity.s3_quota_alerts_perspective:readgranted to all three S3 roles (admin/manager/user).
v1.1.25 — s3-user server read access
Fix
s3-userrole accounts could not list servers (GET /s3/servers,GET /s3/servers-perspective) — the Authorize middleware returned 403 becauses3_servers:read/s3_servers_perspective:readwere missing fromS3UserRole::allowedOperations(), even thoughS3ManagerRole/S3AdminRolealready had them.- This blocked bucket creation for regular users, since the bucket-creation form needs the servers list to populate the required
s3_server_idfield.
v1.1.24 — Restore jobs + backup agent auto-resync
Restore jobs (new)
- New customer-facing restore path:
POST /s3/backup-jobs/{id}/restoredispatches arestore_snapshotcommand to the owning agent, restoring backup data to an explicitdestination_path(optionally scoped torestore_paths) and mandatorily checksum-verifying the result before it's ever reportedcompleted. - New
s3_restore_jobstable/model/service/filter/transformer + read-onlyGET /s3/restore-jobs,GET /s3/restore-jobs/{id}endpoints — same read-only pattern asbackup-job-runs. s3_backup_jobsgains anenginecolumn (rsyncdefault,kopiaopt-in), immutable after creation.rsyncjobs always restore current bucket state;kopiajobs restore a specific point-in-time snapshot vias3_backup_job_run_id. Enforced inRestoreJobsService::startRestore().
Backup agent: auto-recover from a stale job list
BackupAgentEventService::handleResult()now re-sendsfull_syncwhenever an agent repliesstatus: rejectedto a command — this generally means the agent's local job list is stale relative to the platform (reconnected before the lastfull_synclanded, or a job changed after its last sync).- For
run_job_nowspecifically, a rejection also triggers an automatic retry of the run after the resync (BackupAgentCommandService::retryRunJobNowAfterRejection()), capped at 3 consecutive rejections. Past that, the platform stops looping and leaves a system comment on the job (viaCommentsService::createSystemComment()) for manual follow-up instead of retrying forever.
Full protocol/schema details: docs/backup.agent/protocol.md, docs/backup.agent/database.md, docs/backup.agent/updates/2026-07-06-restore-jobs.md.
S3 service agent handles added
S3AgentService handles inbound agent.s3.*.evt messages: heartbeat updates agent_status/last_seen, telemetry ingests snapshot and updates server health, alert fires platform event, result logs command outcome
S3AgentCommandService dispatches fire-and-forget commands to agent.s3.{uuid}.cmd: full_sync (with bucket + IAM key payload), bucket_create/delete/update, iam_create/delete, reconcile
fullSync triggered automatically on first heartbeat from a pending server