Accept _APP_MIGRATION_HOST too when matching local source endpoint

_APP_DOMAIN is the public host users paste from console, but programmatic
migrations that leave `endpoint` blank default to _APP_MIGRATION_HOST in
processMigration. Both are valid references to this cluster; checking only
_APP_DOMAIN rejected the second pattern (e.g. CI tests pass the internal
host directly) and routed legitimate intra-cluster migrations to SDK.
This commit is contained in:
Prem Palanisamy
2026-05-22 17:58:14 +01:00
parent 2b08313cda
commit 2eb5aca116
+10 -4
View File
@@ -208,12 +208,18 @@ class Migrations extends Action
$this->sourceProject = $this->dbForPlatform->getDocument('projects', $credentials['projectId']);
// Same projectId on source and destination only means "local" when the source
// endpoint's host is this installation — otherwise it's an external Appwrite
// that happens to share an id, and we must go over SDK/HTTP.
// endpoint's host is one of this installation's hostnames — _APP_DOMAIN is the
// public host users paste from console; _APP_MIGRATION_HOST is the internal one
// workers default to when the caller omits `endpoint`. Anything else is an
// external Appwrite that happens to share an id, and we must go over SDK/HTTP.
$sourceHost = parse_url($credentials['endpoint'] ?? '', PHP_URL_HOST);
$localDomain = System::getEnv('_APP_DOMAIN', '');
$isLocalEndpoint = is_string($sourceHost) && $localDomain !== ''
&& ($sourceHost === $localDomain || str_ends_with($sourceHost, '.' . $localDomain));
$migrationHost = System::getEnv('_APP_MIGRATION_HOST', '');
$matchesDomain = $localDomain !== ''
&& ($sourceHost === $localDomain || str_ends_with((string) $sourceHost, '.' . $localDomain));
$matchesInternal = $migrationHost !== '' && $sourceHost === $migrationHost;
$isLocalEndpoint = is_string($sourceHost) && ($matchesDomain || $matchesInternal);
$isLocalSource = !$this->sourceProject->isEmpty()
&& (!$isAppwriteToAppwrite || $isLocalEndpoint);