mirror of
https://github.com/appwrite/appwrite.git
synced 2026-05-26 13:51:13 +00:00
Compare commits
19
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f4ce9b1d6a | ||
|
|
e95c256c1e | ||
|
|
e4bac5a5f7 | ||
|
|
a56f5ecef5 | ||
|
|
4840333e4f | ||
|
|
190b760052 | ||
|
|
660fd86142 | ||
|
|
a85b0957ee | ||
|
|
0f8d4bb5ad | ||
|
|
2267469d00 | ||
|
|
acf21bb22d | ||
|
|
070cc38b6c | ||
|
|
6f9b530d75 | ||
|
|
8fa94e98d9 | ||
|
|
0e3ad4f677 | ||
|
|
9e31e4c64f | ||
|
|
cb4bf473bc | ||
|
|
5fb857f0b2 | ||
|
|
a7fb3d91e1 |
+12
@@ -0,0 +1,12 @@
|
||||
# Environment variable overrides for CI tests
|
||||
# Provides multi-pool connections for documentsdb and vectorsdb shared tables testing
|
||||
|
||||
_APP_CONNECTIONS_DATABASE_DOCUMENTSDB=db_main=mongodb://user:password@mongodb:27017/appwrite,db_shared_v1=mongodb://user:password@mongodb-shared-tables-v1:27017/appwrite,db_shared_v2=mongodb://user:password@mongodb-shared-tables-v2:27017/appwrite
|
||||
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES=documentsdb_db_main,documentsdb_db_shared_v1,documentsdb_db_shared_v2
|
||||
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1=documentsdb_db_main,documentsdb_db_shared_v1
|
||||
_APP_DATABASE_DOCUMENTSDB_KEYS=documentsdb_db_main,documentsdb_db_shared_v1,documentsdb_db_shared_v2
|
||||
|
||||
_APP_CONNECTIONS_DATABASE_VECTORSDB=db_main=postgresql://user:password@postgresql:5432/appwrite,db_shared_v1=postgresql://user:password@postgresql-shared-tables-v1:5432/appwrite,db_shared_v2=postgresql://user:password@postgresql-shared-tables-v2:5432/appwrite
|
||||
_APP_DATABASE_VECTORSDB_SHARED_TABLES=vectorsdb_db_main,vectorsdb_db_shared_v1,vectorsdb_db_shared_v2
|
||||
_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1=vectorsdb_db_main,vectorsdb_db_shared_v1
|
||||
_APP_DATABASE_VECTORSDB_KEYS=vectorsdb_db_main,vectorsdb_db_shared_v1,vectorsdb_db_shared_v2
|
||||
+26
-40
@@ -5,7 +5,7 @@ concurrency:
|
||||
cancel-in-progress: true
|
||||
|
||||
env:
|
||||
COMPOSE_FILE: docker-compose.yml
|
||||
COMPOSE_FILE: docker-compose.yml:docker-compose.tests.yml
|
||||
IMAGE: appwrite-dev
|
||||
|
||||
on:
|
||||
@@ -218,8 +218,9 @@ jobs:
|
||||
const decode = (content) => JSON.parse(Buffer.from(content, 'base64').toString());
|
||||
const databaseChanged = getDbVersion(decode(base.content)) !== getDbVersion(decode(head.content));
|
||||
|
||||
core.setOutput('databases', JSON.stringify(databaseChanged ? allDatabases : defaultDatabases));
|
||||
core.setOutput('modes', JSON.stringify(databaseChanged ? allModes : defaultModes));
|
||||
// TEMP: only run failing MongoDB shared tests
|
||||
core.setOutput('databases', JSON.stringify(['MongoDB']));
|
||||
core.setOutput('modes', JSON.stringify(['shared_v1', 'shared_v2']));
|
||||
|
||||
build:
|
||||
name: Build
|
||||
@@ -379,45 +380,16 @@ jobs:
|
||||
matrix:
|
||||
database: ${{ fromJSON(needs.matrix.outputs.databases) }}
|
||||
mode: ${{ fromJSON(needs.matrix.outputs.modes) }}
|
||||
# TEMP: only the 14 failing services
|
||||
service: [
|
||||
Account,
|
||||
Avatars,
|
||||
Console,
|
||||
Databases,
|
||||
TablesDB,
|
||||
Functions,
|
||||
FunctionsSchedule,
|
||||
GraphQL,
|
||||
Health,
|
||||
Locale,
|
||||
Projects,
|
||||
Realtime,
|
||||
Sites,
|
||||
Proxy,
|
||||
Storage,
|
||||
Tokens,
|
||||
Teams,
|
||||
Users,
|
||||
ProjectWebhooks,
|
||||
Webhooks,
|
||||
VCS,
|
||||
Messaging,
|
||||
Migrations,
|
||||
Project
|
||||
Migrations
|
||||
]
|
||||
include:
|
||||
- service: Databases
|
||||
runner: blacksmith-4vcpu-ubuntu-2404
|
||||
- service: Sites
|
||||
runner: blacksmith-4vcpu-ubuntu-2404
|
||||
- service: Functions
|
||||
runner: blacksmith-4vcpu-ubuntu-2404
|
||||
- service: Avatars
|
||||
runner: blacksmith-4vcpu-ubuntu-2404
|
||||
- service: Realtime
|
||||
runner: blacksmith-4vcpu-ubuntu-2404
|
||||
- service: TablesDB
|
||||
runner: blacksmith-4vcpu-ubuntu-2404
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v6
|
||||
@@ -459,10 +431,14 @@ jobs:
|
||||
_APP_BROWSER_HOST: http://invalid-browser/v1
|
||||
_APP_DATABASE_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'database_db_main' || '' }}
|
||||
_APP_DATABASE_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'database_db_main' || '' }}
|
||||
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'documentsdb_db_main' || '' }}
|
||||
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'documentsdb_db_main' || '' }}
|
||||
_APP_DATABASE_VECTORSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'vectorsdb_db_main' || '' }}
|
||||
_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'vectorsdb_db_main' || '' }}
|
||||
run: |
|
||||
docker load --input /tmp/${{ env.IMAGE }}.tar
|
||||
docker compose pull --quiet --ignore-buildable
|
||||
docker compose up -d --quiet-pull --wait
|
||||
docker compose --env-file .env --env-file .env.tests pull --quiet --ignore-buildable
|
||||
docker compose --env-file .env --env-file .env.tests up -d --quiet-pull --wait
|
||||
|
||||
- name: Wait for Open Runtimes
|
||||
timeout-minutes: 3
|
||||
@@ -533,10 +509,14 @@ jobs:
|
||||
_APP_OPTIONS_ABUSE: enabled
|
||||
_APP_DATABASE_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'database_db_main' || '' }}
|
||||
_APP_DATABASE_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'database_db_main' || '' }}
|
||||
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'documentsdb_db_main' || '' }}
|
||||
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'documentsdb_db_main' || '' }}
|
||||
_APP_DATABASE_VECTORSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'vectorsdb_db_main' || '' }}
|
||||
_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'vectorsdb_db_main' || '' }}
|
||||
run: |
|
||||
docker load --input /tmp/${{ env.IMAGE }}.tar
|
||||
docker compose pull --quiet --ignore-buildable
|
||||
docker compose up -d --quiet-pull --wait
|
||||
docker compose --env-file .env --env-file .env.tests pull --quiet --ignore-buildable
|
||||
docker compose --env-file .env --env-file .env.tests up -d --quiet-pull --wait
|
||||
|
||||
- name: Run tests
|
||||
uses: itznotabug/php-retry@v3
|
||||
@@ -590,10 +570,14 @@ jobs:
|
||||
env:
|
||||
_APP_DATABASE_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'database_db_main' || '' }}
|
||||
_APP_DATABASE_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'database_db_main' || '' }}
|
||||
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'documentsdb_db_main' || '' }}
|
||||
_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'documentsdb_db_main' || '' }}
|
||||
_APP_DATABASE_VECTORSDB_SHARED_TABLES: ${{ matrix.mode != 'dedicated' && 'vectorsdb_db_main' || '' }}
|
||||
_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1: ${{ matrix.mode == 'shared_v1' && 'vectorsdb_db_main' || '' }}
|
||||
run: |
|
||||
docker load --input /tmp/${{ env.IMAGE }}.tar
|
||||
docker compose pull --quiet --ignore-buildable
|
||||
docker compose up -d --quiet-pull --wait
|
||||
docker compose --env-file .env --env-file .env.tests pull --quiet --ignore-buildable
|
||||
docker compose --env-file .env --env-file .env.tests up -d --quiet-pull --wait
|
||||
|
||||
- name: Wait for Open Runtimes
|
||||
timeout-minutes: 3
|
||||
@@ -667,6 +651,8 @@ jobs:
|
||||
run: docker compose down -v
|
||||
|
||||
- name: Installing latest version
|
||||
env:
|
||||
COMPOSE_FILE: docker-compose.yml
|
||||
run: |
|
||||
rm docker-compose.yml
|
||||
rm .env
|
||||
|
||||
@@ -3937,7 +3937,7 @@ Http::post('/v1/account/recovery')
|
||||
->setParam('userId', $profile->getId())
|
||||
->setParam('tokenId', $recovery->getId())
|
||||
->setUser($profile)
|
||||
->setPayload($response->showSensitive(fn () => $response->output($recovery, Response::MODEL_TOKEN)), sensitive: ['secret']);
|
||||
->setPayload(Response::showSensitive(fn () => $response->output($recovery, Response::MODEL_TOKEN)), sensitive: ['secret']);
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
@@ -4038,7 +4038,7 @@ Http::put('/v1/account/recovery')
|
||||
$queueForEvents
|
||||
->setParam('userId', $profile->getId())
|
||||
->setParam('tokenId', $recoveryDocument->getId())
|
||||
->setPayload($response->showSensitive(fn () => $response->output($recoveryDocument, Response::MODEL_TOKEN)), sensitive: ['secret']);
|
||||
->setPayload(Response::showSensitive(fn () => $response->output($recoveryDocument, Response::MODEL_TOKEN)), sensitive: ['secret']);
|
||||
|
||||
$response->dynamic($recoveryDocument, Response::MODEL_TOKEN);
|
||||
});
|
||||
@@ -4268,7 +4268,7 @@ Http::post('/v1/account/verifications/email')
|
||||
$queueForEvents
|
||||
->setParam('userId', $user->getId())
|
||||
->setParam('tokenId', $verification->getId())
|
||||
->setPayload($response->showSensitive(fn () => $response->output($verification, Response::MODEL_TOKEN)), sensitive: ['secret']);
|
||||
->setPayload(Response::showSensitive(fn () => $response->output($verification, Response::MODEL_TOKEN)), sensitive: ['secret']);
|
||||
|
||||
$response
|
||||
->setStatusCode(Response::STATUS_CODE_CREATED)
|
||||
@@ -4360,7 +4360,7 @@ Http::put('/v1/account/verifications/email')
|
||||
$queueForEvents
|
||||
->setParam('userId', $userId)
|
||||
->setParam('tokenId', $verification->getId())
|
||||
->setPayload($response->showSensitive(fn () => $response->output($verification, Response::MODEL_TOKEN)), sensitive: ['secret']);
|
||||
->setPayload(Response::showSensitive(fn () => $response->output($verification, Response::MODEL_TOKEN)), sensitive: ['secret']);
|
||||
|
||||
$response->dynamic($verification, Response::MODEL_TOKEN);
|
||||
});
|
||||
|
||||
@@ -868,7 +868,7 @@ Http::init()
|
||||
* Request format
|
||||
*/
|
||||
$route = $utopia->getRoute();
|
||||
$request->setRoute($route);
|
||||
Request::setRoute($route);
|
||||
|
||||
if ($route === null) {
|
||||
$response->setStatusCode(404);
|
||||
@@ -1019,7 +1019,7 @@ Http::init()
|
||||
return;
|
||||
}
|
||||
$route = $request->getRoute();
|
||||
if ($route?->getLabel('origin', false) === '*') {
|
||||
if ($route->getLabel('origin', false) === '*') {
|
||||
return;
|
||||
}
|
||||
if (!$originValidator->isValid($origin)) {
|
||||
@@ -1493,19 +1493,6 @@ Http::error()
|
||||
'type' => $type,
|
||||
];
|
||||
|
||||
// Add CORS headers to error responses so browsers can read the error.
|
||||
// Wrapped in try-catch: if the error itself is a DB failure, resolving
|
||||
// the cors resource (which depends on rule -> DB) would cascade.
|
||||
// Uses override:true to avoid duplicate headers if init() already set them.
|
||||
try {
|
||||
$cors = $utopia->getResource('cors');
|
||||
foreach ($cors->headers($request->getOrigin()) as $name => $value) {
|
||||
$response->addHeader($name, $value, override: true);
|
||||
}
|
||||
} catch (Throwable) {
|
||||
// Degrade gracefully - error response without CORS is no worse than before.
|
||||
}
|
||||
|
||||
$response
|
||||
->addHeader('Cache-Control', 'no-cache, no-store, must-revalidate')
|
||||
->addHeader('Expires', '0')
|
||||
|
||||
+26
-4
@@ -907,11 +907,12 @@ Http::setResource('getDatabasesDB', function (Group $pools, Cache $cache, Docume
|
||||
$dsn = new DSN('mysql://' . $project->getAttribute('database'));
|
||||
}
|
||||
|
||||
$pool = $pools->get($databaseDSN->getHost());
|
||||
$databaseHost = $databaseDSN->getHost();
|
||||
$pool = $pools->get($databaseHost);
|
||||
|
||||
$adapter = new DatabasePool($pool);
|
||||
$database = new Database($adapter, $cache);
|
||||
$sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', ''));
|
||||
$sharedTables = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', '')));
|
||||
|
||||
$database
|
||||
->setDatabase(APP_DATABASE)
|
||||
@@ -922,10 +923,31 @@ Http::setResource('getDatabasesDB', function (Group $pools, Cache $cache, Docume
|
||||
->setMaxQueryValues(APP_DATABASE_QUERY_MAX_VALUES);
|
||||
// inside pools authorization needs to be set first
|
||||
$database->getAdapter()->setSupportForAttributes($databaseType !== DOCUMENTSDB);
|
||||
if (\in_array($dsn->getHost(), $sharedTables)) {
|
||||
|
||||
// For separate pools (documentsdb/vectorsdb), check their own shared tables config.
|
||||
// If not configured, use dedicated mode to avoid cross-engine tenant type mismatches.
|
||||
if ($databaseHost !== $dsn->getHost()) {
|
||||
$dbTypeSharedTables = match ($databaseType) {
|
||||
DOCUMENTSDB => \array_filter(\explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', ''))),
|
||||
VECTORSDB => \array_filter(\explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', ''))),
|
||||
default => [],
|
||||
};
|
||||
|
||||
if (\in_array($databaseHost, $dbTypeSharedTables)) {
|
||||
$database
|
||||
->setSharedTables(true)
|
||||
->setTenant($project->getSequence())
|
||||
->setNamespace($dsn->getParam('namespace'));
|
||||
} else {
|
||||
$database
|
||||
->setSharedTables(false)
|
||||
->setTenant(null)
|
||||
->setNamespace('_' . $project->getSequence());
|
||||
}
|
||||
} elseif (\in_array($dsn->getHost(), $sharedTables)) {
|
||||
$database
|
||||
->setSharedTables(true)
|
||||
->setTenant((int)$project->getSequence())
|
||||
->setTenant($project->getSequence())
|
||||
->setNamespace($dsn->getParam('namespace'));
|
||||
} else {
|
||||
$database
|
||||
|
||||
@@ -383,22 +383,6 @@ $server->onStart(function () use ($stats, $containerId, &$statsDocument) {
|
||||
}
|
||||
});
|
||||
|
||||
function cloudRealtimeLogConnectionHostnames(Http $app, Document $project, Request $request): void
|
||||
{
|
||||
try {
|
||||
/** @var array<int, string> $allowed */
|
||||
$allowed = $app->getResource('allowedHostnames');
|
||||
Console::info(sprintf(
|
||||
'[Realtime] project=%s origin=%s allowedHostnames=%s',
|
||||
$project->getId(),
|
||||
$request->getOrigin(),
|
||||
json_encode(array_values($allowed))
|
||||
));
|
||||
} catch (Throwable $e) {
|
||||
Console::error('[Realtime] allowedHostnames log failed: ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
$server->onWorkerStart(function (int $workerId) use ($server, $register, $stats, $realtime) {
|
||||
Console::success('Worker ' . $workerId . ' started successfully');
|
||||
|
||||
@@ -704,9 +688,6 @@ $server->onOpen(function (int $connection, SwooleRequest $request) use ($server,
|
||||
*/
|
||||
$origin = $request->getOrigin();
|
||||
$originValidator = $app->getResource('originValidator');
|
||||
|
||||
|
||||
cloudRealtimeLogConnectionHostnames($app, $project, $request);
|
||||
|
||||
if (!empty($origin) && !$originValidator->isValid($origin) && $project->getId() !== 'console') {
|
||||
throw new Exception(Exception::REALTIME_POLICY_VIOLATION, $originValidator->getDescription());
|
||||
|
||||
+23
-4
@@ -245,7 +245,8 @@ Server::setResource('getDatabasesDB', function (Cache $cache, Registry $register
|
||||
}
|
||||
|
||||
$pools = $register->get('pools');
|
||||
$pool = $pools->get($databaseDSN->getHost());
|
||||
$databaseHost = $databaseDSN->getHost();
|
||||
$pool = $pools->get($databaseHost);
|
||||
|
||||
$adapter = new DatabasePool($pool);
|
||||
$database = new Database($adapter, $cache);
|
||||
@@ -254,12 +255,30 @@ Server::setResource('getDatabasesDB', function (Cache $cache, Registry $register
|
||||
->setAuthorization($authorization);
|
||||
$database->getAdapter()->setSupportForAttributes($databaseType !== DOCUMENTSDB);
|
||||
|
||||
$sharedTables = \explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', ''));
|
||||
$sharedTables = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_SHARED_TABLES', '')));
|
||||
|
||||
if (\in_array($dsn->getHost(), $sharedTables, true)) {
|
||||
if ($databaseHost !== $dsn->getHost()) {
|
||||
$dbTypeSharedTables = match ($databaseType) {
|
||||
DOCUMENTSDB => \array_filter(\explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', ''))),
|
||||
VECTORSDB => \array_filter(\explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', ''))),
|
||||
default => [],
|
||||
};
|
||||
|
||||
if (\in_array($databaseHost, $dbTypeSharedTables)) {
|
||||
$database
|
||||
->setSharedTables(true)
|
||||
->setTenant($projectDocument->getSequence())
|
||||
->setNamespace($dsn->getParam('namespace'));
|
||||
} else {
|
||||
$database
|
||||
->setSharedTables(false)
|
||||
->setTenant(null)
|
||||
->setNamespace('_' . $projectDocument->getSequence());
|
||||
}
|
||||
} elseif (\in_array($dsn->getHost(), $sharedTables, true)) {
|
||||
$database
|
||||
->setSharedTables(true)
|
||||
->setTenant((int) $projectDocument->getSequence())
|
||||
->setTenant($projectDocument->getSequence())
|
||||
->setNamespace($dsn->getParam('namespace'));
|
||||
} else {
|
||||
$database
|
||||
|
||||
Generated
+6
-6
@@ -3850,16 +3850,16 @@
|
||||
},
|
||||
{
|
||||
"name": "utopia-php/database",
|
||||
"version": "5.3.17",
|
||||
"version": "5.3.19",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/utopia-php/database.git",
|
||||
"reference": "cff2b6ed63d3291b74110d086e16ff089fe05993"
|
||||
"reference": "72ee1614c37e37c7fdd9d4dc87f1f7cdfa1ca691"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/utopia-php/database/zipball/cff2b6ed63d3291b74110d086e16ff089fe05993",
|
||||
"reference": "cff2b6ed63d3291b74110d086e16ff089fe05993",
|
||||
"url": "https://api.github.com/repos/utopia-php/database/zipball/72ee1614c37e37c7fdd9d4dc87f1f7cdfa1ca691",
|
||||
"reference": "72ee1614c37e37c7fdd9d4dc87f1f7cdfa1ca691",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
@@ -3903,9 +3903,9 @@
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/utopia-php/database/issues",
|
||||
"source": "https://github.com/utopia-php/database/tree/5.3.17"
|
||||
"source": "https://github.com/utopia-php/database/tree/5.3.19"
|
||||
},
|
||||
"time": "2026-03-20T01:18:52+00:00"
|
||||
"time": "2026-03-31T15:52:08+00:00"
|
||||
},
|
||||
{
|
||||
"name": "utopia-php/detector",
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
# Test-specific containers for shared tables testing
|
||||
# Provides separate MongoDB and PostgreSQL instances for documentsdb/vectorsdb shared tables
|
||||
|
||||
x-logging: &x-logging
|
||||
logging:
|
||||
driver: "json-file"
|
||||
options:
|
||||
max-file: "5"
|
||||
max-size: "10m"
|
||||
|
||||
services:
|
||||
appwrite:
|
||||
depends_on:
|
||||
mongodb-shared-tables-v1:
|
||||
condition: service_healthy
|
||||
mongodb-shared-tables-v2:
|
||||
condition: service_healthy
|
||||
postgresql-shared-tables-v1:
|
||||
condition: service_healthy
|
||||
postgresql-shared-tables-v2:
|
||||
condition: service_healthy
|
||||
|
||||
appwrite-realtime:
|
||||
depends_on:
|
||||
mongodb-shared-tables-v1:
|
||||
condition: service_healthy
|
||||
mongodb-shared-tables-v2:
|
||||
condition: service_healthy
|
||||
postgresql-shared-tables-v1:
|
||||
condition: service_healthy
|
||||
postgresql-shared-tables-v2:
|
||||
condition: service_healthy
|
||||
|
||||
mongodb-shared-tables-v1:
|
||||
image: mongo:8.2.5
|
||||
container_name: appwrite-mongodb-shared-tables-v1
|
||||
<<: *x-logging
|
||||
networks:
|
||||
- appwrite
|
||||
volumes:
|
||||
- appwrite-mongodb-shared-tables-v1:/data/db
|
||||
- appwrite-mongodb-shared-tables-v1-keyfile:/data/keyfile
|
||||
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
|
||||
- ./mongo-entrypoint.sh:/mongo-entrypoint.sh:ro
|
||||
ports:
|
||||
- "27018:27017"
|
||||
environment:
|
||||
- MONGO_INITDB_ROOT_USERNAME=root
|
||||
- MONGO_INITDB_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
|
||||
- MONGO_INITDB_DATABASE=${_APP_DB_SCHEMA}
|
||||
- MONGO_INITDB_USERNAME=${_APP_DB_USER}
|
||||
- MONGO_INITDB_PASSWORD=${_APP_DB_PASS}
|
||||
entrypoint: ["/bin/bash", "/mongo-entrypoint.sh"]
|
||||
healthcheck:
|
||||
test: |
|
||||
bash -c "
|
||||
if mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval 'rs.status().ok' 2>/dev/null | grep -q 1; then
|
||||
exit 0
|
||||
else
|
||||
mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval \"
|
||||
rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'appwrite-mongodb-shared-tables-v1:27017'}]})
|
||||
\" 2>/dev/null || exit 1
|
||||
fi
|
||||
"
|
||||
interval: 10s
|
||||
timeout: 10s
|
||||
retries: 10
|
||||
start_period: 30s
|
||||
|
||||
mongodb-shared-tables-v2:
|
||||
image: mongo:8.2.5
|
||||
container_name: appwrite-mongodb-shared-tables-v2
|
||||
<<: *x-logging
|
||||
networks:
|
||||
- appwrite
|
||||
volumes:
|
||||
- appwrite-mongodb-shared-tables-v2:/data/db
|
||||
- appwrite-mongodb-shared-tables-v2-keyfile:/data/keyfile
|
||||
- ./mongo-init.js:/docker-entrypoint-initdb.d/mongo-init.js:ro
|
||||
- ./mongo-entrypoint.sh:/mongo-entrypoint.sh:ro
|
||||
ports:
|
||||
- "27019:27017"
|
||||
environment:
|
||||
- MONGO_INITDB_ROOT_USERNAME=root
|
||||
- MONGO_INITDB_ROOT_PASSWORD=${_APP_DB_ROOT_PASS}
|
||||
- MONGO_INITDB_DATABASE=${_APP_DB_SCHEMA}
|
||||
- MONGO_INITDB_USERNAME=${_APP_DB_USER}
|
||||
- MONGO_INITDB_PASSWORD=${_APP_DB_PASS}
|
||||
entrypoint: ["/bin/bash", "/mongo-entrypoint.sh"]
|
||||
healthcheck:
|
||||
test: |
|
||||
bash -c "
|
||||
if mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval 'rs.status().ok' 2>/dev/null | grep -q 1; then
|
||||
exit 0
|
||||
else
|
||||
mongosh -u root -p ${_APP_DB_ROOT_PASS} --authenticationDatabase admin --quiet --eval \"
|
||||
rs.initiate({_id: 'rs0', members: [{_id: 0, host: 'appwrite-mongodb-shared-tables-v2:27017'}]})
|
||||
\" 2>/dev/null || exit 1
|
||||
fi
|
||||
"
|
||||
interval: 10s
|
||||
timeout: 10s
|
||||
retries: 10
|
||||
start_period: 30s
|
||||
|
||||
postgresql-shared-tables-v1:
|
||||
image: appwrite/postgres:0.1.0
|
||||
container_name: appwrite-postgresql-shared-tables-v1
|
||||
<<: *x-logging
|
||||
networks:
|
||||
- appwrite
|
||||
volumes:
|
||||
- appwrite-postgresql-shared-tables-v1:/var/lib/postgresql/18/data:rw
|
||||
ports:
|
||||
- "5433:5432"
|
||||
environment:
|
||||
- POSTGRES_DB=${_APP_DB_SCHEMA}
|
||||
- POSTGRES_USER=${_APP_DB_USER}
|
||||
- POSTGRES_PASSWORD=${_APP_DB_PASS}
|
||||
command: postgres -c 'max_connections=500'
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${_APP_DB_USER} -d ${_APP_DB_SCHEMA}"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
start_period: 30s
|
||||
|
||||
postgresql-shared-tables-v2:
|
||||
image: appwrite/postgres:0.1.0
|
||||
container_name: appwrite-postgresql-shared-tables-v2
|
||||
<<: *x-logging
|
||||
networks:
|
||||
- appwrite
|
||||
volumes:
|
||||
- appwrite-postgresql-shared-tables-v2:/var/lib/postgresql/18/data:rw
|
||||
ports:
|
||||
- "5434:5432"
|
||||
environment:
|
||||
- POSTGRES_DB=${_APP_DB_SCHEMA}
|
||||
- POSTGRES_USER=${_APP_DB_USER}
|
||||
- POSTGRES_PASSWORD=${_APP_DB_PASS}
|
||||
command: postgres -c 'max_connections=500'
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U ${_APP_DB_USER} -d ${_APP_DB_SCHEMA}"]
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
start_period: 30s
|
||||
|
||||
networks:
|
||||
appwrite:
|
||||
name: appwrite
|
||||
|
||||
volumes:
|
||||
appwrite-mongodb-shared-tables-v1:
|
||||
appwrite-mongodb-shared-tables-v1-keyfile:
|
||||
appwrite-mongodb-shared-tables-v2:
|
||||
appwrite-mongodb-shared-tables-v2-keyfile:
|
||||
appwrite-postgresql-shared-tables-v1:
|
||||
appwrite-postgresql-shared-tables-v2:
|
||||
@@ -244,6 +244,14 @@ services:
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_DATABASE_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_SHARED_NAMESPACE
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
- _APP_FUNCTIONS_CREATION_ABUSE_LIMIT
|
||||
- _APP_CUSTOM_DOMAIN_DENY_LIST
|
||||
- _APP_TRUSTED_HEADERS
|
||||
@@ -330,6 +338,14 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_LOGGING_CONFIG_REALTIME
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
- _APP_POOL_ADAPTER=swoole
|
||||
|
||||
appwrite-worker-audits:
|
||||
@@ -363,6 +379,14 @@ services:
|
||||
- _APP_DB_PASS
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-webhooks:
|
||||
entrypoint: worker-webhooks
|
||||
@@ -399,6 +423,14 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_WEBHOOK_MAX_FAILED_ATTEMPTS
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-deletes:
|
||||
entrypoint: worker-deletes
|
||||
@@ -463,6 +495,14 @@ services:
|
||||
- _APP_EXECUTOR_HOST
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_DATABASE_SHARED_TABLES_V1
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
- _APP_EMAIL_CERTIFICATES
|
||||
- _APP_MAINTENANCE_RETENTION_AUDIT
|
||||
- _APP_MAINTENANCE_RETENTION_AUDIT_CONSOLE
|
||||
@@ -507,6 +547,14 @@ services:
|
||||
- _APP_WORKERS_NUM
|
||||
- _APP_QUEUE_NAME
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-builds:
|
||||
entrypoint: worker-builds
|
||||
@@ -580,6 +628,14 @@ services:
|
||||
- _APP_STORAGE_WASABI_REGION
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
- _APP_DOMAIN_SITES
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
@@ -621,6 +677,14 @@ services:
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
# Storage
|
||||
- _APP_STORAGE_DEVICE
|
||||
- _APP_STORAGE_S3_ACCESS_KEY
|
||||
@@ -689,6 +753,14 @@ services:
|
||||
- _APP_DB_PASS
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-executions:
|
||||
entrypoint: worker-executions
|
||||
@@ -719,6 +791,14 @@ services:
|
||||
- _APP_DB_PASS
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-functions:
|
||||
entrypoint: worker-functions
|
||||
@@ -763,6 +843,14 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_LOGGING_PROVIDER
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-mails:
|
||||
entrypoint: worker-mails
|
||||
@@ -805,6 +893,14 @@ services:
|
||||
- _APP_DOMAIN
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-messaging:
|
||||
entrypoint: worker-messaging
|
||||
@@ -862,6 +958,14 @@ services:
|
||||
- _APP_STORAGE_WASABI_REGION
|
||||
- _APP_STORAGE_WASABI_BUCKET
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-migrations:
|
||||
entrypoint: worker-migrations
|
||||
@@ -906,6 +1010,14 @@ services:
|
||||
- _APP_MIGRATIONS_FIREBASE_CLIENT_ID
|
||||
- _APP_MIGRATIONS_FIREBASE_CLIENT_SECRET
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
- _APP_OPTIONS_FORCE_HTTPS
|
||||
- _APP_MIGRATION_HOST
|
||||
|
||||
@@ -954,6 +1066,14 @@ services:
|
||||
- _APP_MAINTENANCE_RETENTION_SCHEDULES
|
||||
- _APP_MAINTENANCE_START_TIME
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-task-interval:
|
||||
entrypoint: interval
|
||||
@@ -992,6 +1112,14 @@ services:
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
- _APP_INTERVAL_DOMAIN_VERIFICATION
|
||||
- _APP_INTERVAL_CLEANUP_STALE_EXECUTIONS
|
||||
|
||||
@@ -1026,6 +1154,14 @@ services:
|
||||
- _APP_USAGE_STATS
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
- _APP_STATS_RESOURCES_INTERVAL
|
||||
|
||||
appwrite-worker-stats-resources:
|
||||
@@ -1060,6 +1196,14 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_USAGE_AGGREGATION_INTERVAL
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-worker-stats-usage:
|
||||
entrypoint: worker-stats-usage
|
||||
@@ -1094,6 +1238,14 @@ services:
|
||||
- _APP_LOGGING_CONFIG
|
||||
- _APP_USAGE_AGGREGATION_INTERVAL
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-task-scheduler-functions:
|
||||
entrypoint: schedule-functions
|
||||
@@ -1125,6 +1277,14 @@ services:
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-task-scheduler-executions:
|
||||
entrypoint: schedule-executions
|
||||
@@ -1156,6 +1316,14 @@ services:
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-task-scheduler-messages:
|
||||
entrypoint: schedule-messages
|
||||
@@ -1187,6 +1355,14 @@ services:
|
||||
- _APP_DB_USER
|
||||
- _APP_DB_PASS
|
||||
- _APP_DATABASE_SHARED_TABLES
|
||||
- _APP_CONNECTIONS_DATABASE_DOCUMENTSDB
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_DOCUMENTSDB_KEYS
|
||||
- _APP_CONNECTIONS_DATABASE_VECTORSDB
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES
|
||||
- _APP_DATABASE_VECTORSDB_SHARED_TABLES_V1
|
||||
- _APP_DATABASE_VECTORSDB_KEYS
|
||||
|
||||
appwrite-assistant:
|
||||
container_name: appwrite-assistant
|
||||
|
||||
@@ -61,16 +61,16 @@ class Create extends Action
|
||||
$databaseKeys = System::getEnv('_APP_DATABASE_DOCUMENTSDB_KEYS', '');
|
||||
$databaseOverride = System::getEnv('_APP_DATABASE_DOCUMENTSDB_OVERRIDE');
|
||||
$dbScheme = System::getEnv('_APP_DB_HOST_DOCUMENTSDB', 'mongodb');
|
||||
$databaseSharedTables = \explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', ''));
|
||||
$databaseSharedTablesV1 = \explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1', ''));
|
||||
$databaseSharedTables = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES', '')));
|
||||
$databaseSharedTablesV1 = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_DOCUMENTSDB_SHARED_TABLES_V1', '')));
|
||||
break;
|
||||
case VECTORSDB:
|
||||
$databases = Config::getParam('pools-vectorsdb', []);
|
||||
$databaseKeys = System::getEnv('_APP_DATABASE_VECTORSDB_KEYS', '');
|
||||
$databaseOverride = System::getEnv('_APP_DATABASE_VECTORSDB_OVERRIDE');
|
||||
$dbScheme = System::getEnv('_APP_DB_HOST_VECTORSDB', 'postgresql');
|
||||
$databaseSharedTables = \explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', ''));
|
||||
$databaseSharedTablesV1 = \explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1', ''));
|
||||
$databaseSharedTables = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES', '')));
|
||||
$databaseSharedTablesV1 = \array_filter(\explode(',', System::getEnv('_APP_DATABASE_VECTORSDB_SHARED_TABLES_V1', '')));
|
||||
break;
|
||||
default:
|
||||
// legacy/tablesdb
|
||||
@@ -108,7 +108,7 @@ class Create extends Action
|
||||
if ($index !== false) {
|
||||
$selectedDsn = $databases[$index];
|
||||
} else {
|
||||
if (!empty($dsn)) {
|
||||
if (!empty($dsn) && !empty($databaseSharedTables)) {
|
||||
$beforeFilter = \array_values($databases);
|
||||
if ($isSharedTablesV1) {
|
||||
$databases = array_filter($databases, fn ($value) => \in_array($value, $databaseSharedTablesV1));
|
||||
@@ -118,7 +118,10 @@ class Create extends Action
|
||||
$databases = array_filter($databases, fn ($value) => !\in_array($value, $databaseSharedTables));
|
||||
}
|
||||
}
|
||||
$selectedDsn = !empty($databases) ? $databases[array_rand($databases)] : '';
|
||||
if (empty($databases)) {
|
||||
throw new Exception(Exception::GENERAL_SERVER_ERROR, "No {$databasetype} database pool available for the current shared-tables mode");
|
||||
}
|
||||
$selectedDsn = $databases[array_rand($databases)];
|
||||
}
|
||||
|
||||
if (\in_array($selectedDsn, $databaseSharedTables)) {
|
||||
|
||||
@@ -17,7 +17,7 @@ class Request extends UtopiaRequest
|
||||
* @var array<Filter>
|
||||
*/
|
||||
private array $filters = [];
|
||||
private ?Route $route = null;
|
||||
private static ?Route $route = null;
|
||||
|
||||
public function __construct(SwooleRequest $request)
|
||||
{
|
||||
@@ -34,11 +34,11 @@ class Request extends UtopiaRequest
|
||||
{
|
||||
$parameters = parent::getParams();
|
||||
|
||||
if (!$this->hasFilters() || !$this->hasRoute()) {
|
||||
if (!$this->hasFilters() || !self::hasRoute()) {
|
||||
return $parameters;
|
||||
}
|
||||
|
||||
$methods = $this->getRoute()?->getLabel('sdk', null);
|
||||
$methods = self::getRoute()->getLabel('sdk', null);
|
||||
|
||||
if (empty($methods)) {
|
||||
return $parameters;
|
||||
@@ -131,9 +131,9 @@ class Request extends UtopiaRequest
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function setRoute(?Route $route): void
|
||||
public static function setRoute(?Route $route): void
|
||||
{
|
||||
$this->route = $route;
|
||||
self::$route = $route;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -141,9 +141,9 @@ class Request extends UtopiaRequest
|
||||
*
|
||||
* @return Route|null
|
||||
*/
|
||||
public function getRoute(): ?Route
|
||||
public static function getRoute(): ?Route
|
||||
{
|
||||
return $this->route;
|
||||
return self::$route;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -151,9 +151,9 @@ class Request extends UtopiaRequest
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function hasRoute(): bool
|
||||
public static function hasRoute(): bool
|
||||
{
|
||||
return $this->route !== null;
|
||||
return self::$route !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -299,7 +299,7 @@ class Response extends SwooleResponse
|
||||
/**
|
||||
* @var bool
|
||||
*/
|
||||
protected bool $showSensitive = false;
|
||||
protected static bool $showSensitive = false;
|
||||
|
||||
/**
|
||||
* @var array<string, Model>
|
||||
@@ -509,7 +509,7 @@ class Response extends SwooleResponse
|
||||
$isPrivilegedUser = $user->isPrivileged($roles);
|
||||
$isAppUser = $user->isApp($roles);
|
||||
|
||||
if ((!$isPrivilegedUser && !$isAppUser) && !$this->showSensitive) {
|
||||
if ((!$isPrivilegedUser && !$isAppUser) && !self::$showSensitive) {
|
||||
$data->setAttribute($key, '');
|
||||
}
|
||||
}
|
||||
@@ -659,20 +659,18 @@ class Response extends SwooleResponse
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper to show sensitive data in response
|
||||
* Static wrapper to show sensitive data in response
|
||||
*
|
||||
* @param callable(): array $callback The callback to show sensitive information for
|
||||
* @return array
|
||||
*/
|
||||
public function showSensitive(callable $callback): array
|
||||
public static function showSensitive(callable $callback): array
|
||||
{
|
||||
$previous = $this->showSensitive;
|
||||
|
||||
try {
|
||||
$this->showSensitive = true;
|
||||
self::$showSensitive = true;
|
||||
return $callback();
|
||||
} finally {
|
||||
$this->showSensitive = $previous;
|
||||
self::$showSensitive = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -147,21 +147,6 @@ class RequestTest extends TestCase
|
||||
$this->assertSame('unexpected', $params['extra']);
|
||||
}
|
||||
|
||||
public function testRouteIsScopedToRequestInstance(): void
|
||||
{
|
||||
$firstRequest = new Request(new SwooleRequest());
|
||||
$secondRequest = new Request(new SwooleRequest());
|
||||
|
||||
$firstRoute = new Route(Request::METHOD_GET, '/first');
|
||||
$secondRoute = new Route(Request::METHOD_GET, '/second');
|
||||
|
||||
$firstRequest->setRoute($firstRoute);
|
||||
$secondRequest->setRoute($secondRoute);
|
||||
|
||||
$this->assertSame($firstRoute, $firstRequest->getRoute());
|
||||
$this->assertSame($secondRoute, $secondRequest->getRoute());
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to attach a route with multiple SDK methods to the request.
|
||||
*/
|
||||
|
||||
@@ -5,7 +5,6 @@ namespace Tests\Unit\Utopia;
|
||||
use Appwrite\Utopia\Response;
|
||||
use Exception;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
use ReflectionProperty;
|
||||
use Swoole\Http\Response as SwooleResponse;
|
||||
use Tests\Unit\Utopia\Response\Filters\First;
|
||||
use Tests\Unit\Utopia\Response\Filters\Second;
|
||||
@@ -177,26 +176,4 @@ class ResponseTest extends TestCase
|
||||
$this->assertArrayHasKey('required', $single);
|
||||
$this->assertArrayNotHasKey('hidden', $singleFromArray);
|
||||
}
|
||||
|
||||
public function testShowSensitiveRestoresPreviousState(): void
|
||||
{
|
||||
$isShowingSensitive = new ReflectionProperty(Response::class, 'showSensitive');
|
||||
|
||||
$this->assertFalse($isShowingSensitive->getValue($this->response));
|
||||
|
||||
$payload = $this->response->showSensitive(function () use ($isShowingSensitive) {
|
||||
return [
|
||||
'outer' => $isShowingSensitive->getValue($this->response),
|
||||
'inner' => $this->response->showSensitive(fn () => [
|
||||
'state' => $isShowingSensitive->getValue($this->response),
|
||||
]),
|
||||
'afterInner' => $isShowingSensitive->getValue($this->response),
|
||||
];
|
||||
});
|
||||
|
||||
$this->assertTrue($payload['outer']);
|
||||
$this->assertTrue($payload['inner']['state']);
|
||||
$this->assertTrue($payload['afterInner']);
|
||||
$this->assertFalse($isShowingSensitive->getValue($this->response));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user