docs(spec): qbit-file-gateway design #4

Merged
KofTwentyTwo merged 2 commits from feature/spec into develop 2026-10-14 00:43:05 +00:00
KofTwentyTwo commented 2026-10-14 00:38:05 +00:00 (Migrated from github.com)

The approved design for qbit-file-gateway: docs/DESIGN.md.

Stacked on #1 (scaffold). Until #1 merges this diff also shows the scaffold. After it merges, the diff is only docs/DESIGN.md.

Highlights:

  • A virtual SFTP tree generated from metadata and filtered by the user's permissions:
    • apps and tables;
    • upload/<profile>/, views/, reports/, results/ and archive/;
    • endpoints (aliases) with an ENDPOINTS_ONLY chroot.
  • Data only through /qqq/v1 with UiApiInvoker on channel sftp, as the signed-in user. Masking, permissions and audits apply as in the UI.
  • Core additions, in a separate qqq PR:
    • in-process sessions for the invoker, accepted only on loopback with a JVM-held token;
    • streamed binary responses;
    • multipart uploads.
  • qbit-authentik: customizeAutomatedSessionForUser.
  • The consumer and outbox API (com.kingsrook.qbits.filegateway.api), agreed with the qbit-edi agent. Bulk load is the default consumer.
  • SSH-key-only SFTP (Apache MINA SSHD) with:
    • lockouts and CIDR allowlists;
    • expiry and per-account limits;
    • a scan hook and optional PGP.
  • Tables file_gateway_account, _ssh_key, _alias, _upload_job, _outbox_file, _transfer_log and _connection_log, plus the app home.
  • A k8s example with one SFTP port, no passive range, and a stateless, read-only root filesystem.
  • Acceptance tests, including the no-disk filesystem guard.

Owner decisions recorded:

  • 2026-10-12: all recommendations accepted.
  • 2026-10-13: separate deployment; /qqq/v1 only; SSH keys; SFTP only in v1 (FTPS documented as future); no files or filesystem, just the database and S3; the consumer and outbox API.

Open for the owner: the LoadBalancer IP in 10.100.22.60–.69.

🤖 Generated with Claude Code

The approved design for qbit-file-gateway: `docs/DESIGN.md`. **Stacked on #1 (scaffold).** Until #1 merges this diff also shows the scaffold. After it merges, the diff is only `docs/DESIGN.md`. Highlights: - A virtual SFTP tree generated from metadata and filtered by the user's permissions: - apps and tables; - `upload/<profile>/`, `views/`, `reports/`, `results/` and `archive/`; - endpoints (aliases) with an `ENDPOINTS_ONLY` chroot. - **Data only through `/qqq/v1`** with `UiApiInvoker` on channel `sftp`, as the signed-in user. Masking, permissions and audits apply as in the UI. - **Core additions, in a separate qqq PR:** - in-process sessions for the invoker, accepted only on loopback with a JVM-held token; - streamed binary responses; - multipart uploads. - **qbit-authentik:** `customizeAutomatedSessionForUser`. - **The consumer and outbox API** (`com.kingsrook.qbits.filegateway.api`), agreed with the qbit-edi agent. Bulk load is the default consumer. - **SSH-key-only SFTP** (Apache MINA SSHD) with: - lockouts and CIDR allowlists; - expiry and per-account limits; - a scan hook and optional PGP. - Tables `file_gateway_account`, `_ssh_key`, `_alias`, `_upload_job`, `_outbox_file`, `_transfer_log` and `_connection_log`, plus the app home. - A k8s example with one SFTP port, no passive range, and a stateless, read-only root filesystem. - Acceptance tests, including the no-disk filesystem guard. Owner decisions recorded: - 2026-10-12: all recommendations accepted. - 2026-10-13: separate deployment; `/qqq/v1` only; SSH keys; **SFTP only in v1** (FTPS documented as future); **no files or filesystem, just the database and S3**; the consumer and outbox API. Open for the owner: the LoadBalancer IP in 10.100.22.60–.69. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Sign in to join this conversation.