Skip to content

fix(cloud): restore support and clarify deployment failures - #970

Merged
Hydralerne merged 4 commits into
mainfrom
fix/cloud-support-tickets
Sep 28, 2026
Merged

Hydralerne merged 4 commits into
mainfrom
fix/cloud-support-tickets

Conversation

@Hydralerne

@Hydralerne Hydralerne commented Sep 28, 2026 •

Copy link
Copy Markdown
Member

Summary

Restore the missing support page and replace the website's email-only contact handler with Cloud API tickets. Requests are committed before acknowledgement, so a rejected mailbox or SMTP outage no longer loses a customer's report.

Changes

  • Share support/contact intake and validation. Return a saved reference, preserve the form on failure, and deduplicate retries after a lost response.
  • Keep persistence and delivery in the engine, with a thin Cloud-only API. Save each ticket and its customer receipt/team notification in one transaction; reuse the existing mail sender and scheduler for bounded, leased retries.
  • Notify support@openship.io and send the customer a receipt with that reply address. Add private operator endpoints for listing, reading, replying, resolving, and retrying delivery. Ticket data is excluded from customer exports.
  • Repair support links and document deployment, SMTP configuration, operator access, and delivery guarantees.
  • In a separate commit, replace the misleading Docker log-fetch envelope with actionable provider-proxy and bridge-health errors. A missing provider proxy no longer causes a healthy bridge to be reinstalled.

Related issue

None; reported Cloud support/contact failures and the opaque workspace Docker connection error.

Verification

  • GitHub CI: all ten checks passed on f74a26ce.
  • Support HTTP, SQL and SMTP tests: 27 passed. Includes actual loopback SMTP recipient rejection/recovery, transaction rollback, concurrent submissions, lease recovery, private operator access, replies/resolution, and local-mode isolation.
  • Support plus existing shared-mail regressions: 34 passed.
  • Cloud Docker and WebSocket transport tests: 31 passed.
  • Database migration/export/upgrade regressions: 18 passed. Rate-limit regressions: 25 passed.
  • API, website, database and adapter typechecks passed; documentation checks and the production website build passed. Built /support and /contact both returned HTTP 200.
  • Full local API suite: 7,407 tests across 597 files passed. Full database, adapter, SDK, CLI, core, contracts, dashboard, platform, and desktop suites also passed. The two new support fixtures allow 30 seconds for cold embedded-database startup under contention; individual request and delivery assertion timeouts are unchanged. An unchanged deployment-log test failed on the initial run and passed both in isolation and in the full dashboard rerun.
bun run --cwd apps/api test test/modules/cloud-support
# Test Files  2 passed (2)
#      Tests  27 passed (27)
bun run --cwd apps/api lint
# tsc --noEmit — exit 0

Rollout

Deploy the Cloud API and migration 0152_cloud_support.sql before the website. Provision support@openship.io and configure the Cloud API's existing SMTP settings; the website needs neither SMTP credentials nor the internal operator token. Ticket creation works even while email delivery is unavailable.

Replies sent through the operator API are recorded and queued. Ordinary inbound email goes to the support mailbox; it is not automatically imported into the ticket database. SMTP delivery is at least once if a process crashes after mail acceptance but before recording delivery, with a stable Message-ID reused on retry.

@Hydralerne
Hydralerne marked this pull request as ready for review September 28, 2026 10:52
After a cold workspace restart, SDK 2.4 can retain a runtime credential that
Oblien has rotated. Refresh once through the same namespace client on 401,
and recheck cached bridge readiness after a failed WebSocket handshake.
Retry only the unopened connection, before any Docker request bytes are sent.

Extend the existing proxy diagnostics with a validated provider request ID,
bounded health bodies and safe bridge state. Persistent access denials fail
closed. Keep the existing missing-proxy error contract and exclude raw log
envelopes, provider response bodies and signed URLs from deployment errors.

Verified with the real CloudDockerRuntime, SDK 2.4.0 and Vaultwarden template:
public HTTPS and admin login, disabled signup, namespace isolation, container
limits, named-volume/database persistence through redeployment and cold
restart, and recovery after runtime credential rotation. Both Oblien nodes
passed HTTP/WebSocket, authentication and persistent-data image checks.

Validation: 55 focused Cloud tests; 7407 API tests; 4675 adapter tests with
2 existing ACME DNS tests skipped; API/adapter typechecks and API build.
An unchanged Cloudflare SSH diagnostic test failed intermittently on the
first combined run, then passed in isolation and in the full adapter rerun.

Oblien's cached-init repair is live and the customer Vaultwarden is healthy.
Deploy this Cloud API change to apply connection recovery and diagnostics.
@Hydralerne
Hydralerne merged commit 6c24d29 into main Sep 28, 2026
10 checks passed
@Hydralerne
Hydralerne deleted the fix/cloud-support-tickets branch October 12, 2026 23:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant