Skip to content

fix: re-sync SSH deploy keys when updating site source control#1083

Open
urufudev wants to merge 27 commits into
vitodeploy:4.xfrom
urufudev:fix/ssh-key-resync-on-source-control-update
Open

fix: re-sync SSH deploy keys when updating site source control#1083
urufudev wants to merge 27 commits into
vitodeploy:4.xfrom
urufudev:fix/ssh-key-resync-on-source-control-update

Conversation

@urufudev

Copy link
Copy Markdown

When a user updates the Source Control provider/token for an existing site (via Settings → Source Controls), the SSH deploy key is not automatically re-registered in the repository. This leads to Permission denied (publickey) errors during subsequent deployments.

This PR updates UpdateSourceControl.php to:

  1. Remove the old deploy key from the previous source control provider (if it exists).
  2. Register the existing SSH key with the new source control provider/token.
  3. Store the new deploy_key_id in type_data to ensure DeleteSite can correctly clean it up later.

Changes:
Modified app/Actions/Site/UpdateSourceControl.php to include the logic for deleting the old key and creating the new one using the existing Site and SourceControl providers.

Verification:

  1. Tested on local and production (DigitalOcean) servers.
  2. Verified that keys are correctly created in GitHub with the expected {domain}-key-{id} format.
  3. Verified that the previous key is removed before creating the new one to avoid clutter.

saeedvaziry and others added 20 commits March 3, 2026 18:36
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
* throw error instead of suppressing

* Add error message from generic error

* fixes

* fix naming issue

align with interface
* dns improvements

* copilot fixes
…g multi-host accounts (vitodeploy#1075)

SyncDatabaseUsers previously matched existing database_users rows by username
only. MySQL and MariaDB treat 'user'@'localhost' and 'user'@'127.0.0.1' as
independent accounts with potentially different passwords and grants, so
collapsing them onto a single row caused silent data corruption: the databases
column was overwritten in an order-dependent way, additional host variants
were never inserted, and the stored host no longer matched the grants shown
under it.

The lookup now scopes by (username, host) whenever the handler returns a
non-empty host, aligning sync with CreateDatabaseUser, UpdateDatabaseUser and
DeleteDatabaseUser. PostgreSQL keeps the original username-only match because
its get-users-list view returns an empty host (roles are host-agnostic); an
unconditional composite filter would miss the existing UI-created row and
insert a duplicate (rolname, '') record on every sync.

Adds regression tests covering MySQL multi-host sync, MySQL sync idempotency
and the PostgreSQL no-duplicate-row invariant.
@saeedvaziry

Copy link
Copy Markdown
Member

@urufudev thanks for the PR. I'd appreceate test coverage for this

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes deploy-key drift when a site's Source Control provider/token is changed: the old provider's deploy key is removed and the existing site SSH key is re-registered with the new provider, with the resulting deploy_key_id persisted in type_data so DeleteSite can clean it up later.

Changes:

  • In UpdateSourceControl::update, attempt to delete the previous deploy key, swap source control (and unset the cached relation), then re-register the SSH key on the new provider and store the new deploy_key_id.
  • Failures in the old-key deletion and new-key registration are caught and logged via Log::warning rather than aborting the update.
  • Adds three feature tests covering old-key deletion, new-key registration, and resilience when the old-key deletion fails; also makes minor formatting-only edits to existing tests.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.

File Description
app/Actions/Site/UpdateSourceControl.php Adds delete-old / re-register-new deploy key logic around the existing source control swap, with try/catch + logging.
tests/Feature/SitesTest.php Adds three tests for the new behavior; also reformats Http::fake calls and arrow-function spacing in existing tests.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread app/Actions/Site/UpdateSourceControl.php Outdated
@saeedvaziry saeedvaziry changed the base branch from 3.x to 4.x June 11, 2026 14:55
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.

5 participants