diff --git a/.env b/.env index 1c260bc3fc..f650d0bc88 100644 --- a/.env +++ b/.env @@ -25,7 +25,7 @@ _APP_INFLUXDB_PORT=8086 _APP_STATSD_HOST=telegraf _APP_STATSD_PORT=8125 _APP_SMTP_HOST=maildev -_APP_SMTP_PORT=25 +_APP_SMTP_PORT=1025 _APP_SMTP_SECURE= _APP_SMTP_USERNAME= _APP_SMTP_PASSWORD= diff --git a/.travis.yml b/.travis.yml index b82fc05c1d..f3e66e8e73 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,7 @@ dist: xenial arch: - amd64 + - arm64 os: linux @@ -10,9 +11,6 @@ language: shell notifications: email: - team@appwrite.io - -services: -- docker before_install: - curl -fsSL https://get.docker.com | sh @@ -27,6 +25,7 @@ before_install: - docker --version - docker buildx create --use - chmod -R u+x ./.travis-ci +- export COMPOSE_INTERACTIVE_NO_CLI=1 install: - docker-compose up -d diff --git a/CHANGES.md b/CHANGES.md index 39a51d80c5..391e69dc53 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -5,13 +5,14 @@ - Added Anonymous Login ([RFC-010](https://github.com/appwrite/rfc/blob/main/010-anonymous-login.md), #914) - Added events for functions and executions (#971) - Added JWT support +- Added ARM support - Splited token & session models to become 2 different internal entities (#922) - Added Dart 2.12 as a new Cloud Functions runtime (#989) +- Added Python 3.9 as a new Cloud Functions runtime +- Added Deno 1.8 as a new Cloud Functions runtime (#989) - ClamAV is now disabled by default to allow lower min requirments for Appwrite (#1064) - Added a new env var named `_APP_LOCALE` that allow to change the default `en` locale value (#1056) - Updated all the console bottom control to be consistent. Dropped the `+` icon (#1062) -- Added runtime functions environment for Python 3.9 -- Added runtime functions environment for Deno 1.8 ## Bugs diff --git a/app/config/environments.php b/app/config/environments.php index f304cf777a..cd3868d72c 100644 --- a/app/config/environments.php +++ b/app/config/environments.php @@ -86,7 +86,7 @@ $environments = [ 'image' => 'appwrite/env-deno-1.2:1.0.0', 'build' => '/usr/src/code/docker/environments/deno-1.2', 'logo' => 'deno.png', - 'supports' => [System::X86, System::PPC, System::ARM], + 'supports' => [System::X86], ], 'deno-1.5' => [ 'name' => 'Deno', @@ -95,7 +95,7 @@ $environments = [ 'image' => 'appwrite/env-deno-1.5:1.0.0', 'build' => '/usr/src/code/docker/environments/deno-1.5', 'logo' => 'deno.png', - 'supports' => [System::X86, System::PPC, System::ARM], + 'supports' => [System::X86], ], 'deno-1.6' => [ 'name' => 'Deno', @@ -104,7 +104,7 @@ $environments = [ 'image' => 'appwrite/env-deno-1.6:1.0.0', 'build' => '/usr/src/code/docker/environments/deno-1.6', 'logo' => 'deno.png', - 'supports' => [System::X86, System::PPC, System::ARM], + 'supports' => [System::X86], ], 'deno-1.8' => [ 'name' => 'Deno', @@ -113,7 +113,7 @@ $environments = [ 'image' => 'appwrite/env-deno-1.8:1.0.0', 'build' => '/usr/src/code/docker/environments/deno-1.8', 'logo' => 'deno.png', - 'supports' => [System::X86, System::PPC, System::ARM], + 'supports' => [System::X86], ], 'dart-2.10' => [ 'name' => 'Dart', @@ -140,7 +140,7 @@ $environments = [ 'image' => 'appwrite/env-dotnet-3.1:1.0.0', 'build' => '/usr/src/code/docker/environments/dotnet-3.1', 'logo' => 'dotnet.png', - 'supports' => [System::X86, System::ARM], + 'supports' => [System::X86], ], 'dotnet-5.0' => [ 'name' => '.NET', diff --git a/docker-compose.yml b/docker-compose.yml index 9942707854..29e882fcb6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -423,7 +423,7 @@ services: # - appwrite-uploads:/storage/uploads influxdb: - image: influxdb:1.8-alpine + image: appwrite/influxdb:1.0.0 container_name: appwrite-influxdb networks: - appwrite @@ -431,7 +431,7 @@ services: - appwrite-influxdb:/var/lib/influxdb:rw telegraf: - image: appwrite/telegraf:1.0.0 + image: appwrite/telegraf:1.1.0 container_name: appwrite-telegraf networks: - appwrite @@ -450,16 +450,16 @@ services: # Webgrind - A nice UI for exploring and debugging code-level stuff maildev: # used mainly for dev tests - image: djfarrelly/maildev - container_name: appwrite-maildev + image: appwrite/mailcatcher:1.0.0 + container_name: appwrite-mailcatcher ports: - - '9503:80' + - '9503:1080' networks: - appwrite request-catcher: # used mainly for dev tests - image: smarterdm/http-request-catcher - container_name: appwrite-request-catcher + image: appwrite/requestcatcher:1.0.0 + container_name: appwrite-requestcatcher ports: - '9504:5000' networks: diff --git a/docker/environments/build.sh b/docker/environments/build.sh index 8087a2165b..887aeb0713 100644 --- a/docker/environments/build.sh +++ b/docker/environments/build.sh @@ -43,7 +43,7 @@ echo 'Dart 2.12...' docker buildx build --platform linux/amd64 -t appwrite/env-dart-2.12:1.0.0 ./docker/environments/dart-2.12/ --push echo '.NET 3.1...' -docker buildx build --platform linux/amd64,linux/arm64 -t appwrite/env-dotnet-3.1:1.0.0 ./docker/environments/dotnet-3.1/ --push +docker buildx build --platform linux/amd64 -t appwrite/env-dotnet-3.1:1.0.0 ./docker/environments/dotnet-3.1/ --push echo '.NET 5.0...' docker buildx build --platform linux/amd64,linux/arm64 -t appwrite/env-dotnet-5.0:1.0.0 ./docker/environments/dotnet-5.0/ --push diff --git a/docs/tutorials/multi-architecture-support.md b/docs/tutorials/multi-architecture-support.md new file mode 100644 index 0000000000..f76eda047f --- /dev/null +++ b/docs/tutorials/multi-architecture-support.md @@ -0,0 +1,13 @@ +# Multi Architecture Support + +A list of Appwrite CPU architecture support status. We use this list to track the status of all Appwrite related Docker images and which architecture is supported by each image. + +| | linux/amd64 | linux/arm64 | linux/arm/v6 | linux/arm/v7 | linux/arm64/v8 | linux/ppc64le | linux/s390x | +|---|---|---|---|---|---|---|---| +| appwrite/appwrite | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | +| appwrite/mariadb | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | 🟢 | 🔴 | +| appwrite/influxdb | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | +| appwrite/telegraf | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🔴 | 🔴 | +| appwrite/clamav | 🟢 | 🟢 | 🟢 | 🟢 | 🔴 | 🟢 | 🟢 | +| traefik | 🟢 | 🔴 | 🟢 | 🔴 | 🟢 | 🔴 | 🔴 | +| redis | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | 🟢 | diff --git a/tests/e2e/Scopes/Scope.php b/tests/e2e/Scopes/Scope.php index fae34a87fb..64332a3e61 100644 --- a/tests/e2e/Scopes/Scope.php +++ b/tests/e2e/Scopes/Scope.php @@ -35,7 +35,7 @@ abstract class Scope extends TestCase { sleep(10); - $emails = json_decode(file_get_contents('http://maildev/email'), true); + $emails = json_decode(file_get_contents('http://maildev:1080/email'), true); if ($emails && is_array($emails)) { return end($emails); diff --git a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php index b402852aa8..1184ba7730 100644 --- a/tests/e2e/Services/Functions/FunctionsCustomServerTest.php +++ b/tests/e2e/Services/Functions/FunctionsCustomServerTest.php @@ -454,135 +454,101 @@ class FunctionsCustomServerTest extends Scope public function testENVS():array { - $functions = realpath(__DIR__ . '/../../../resources/functions'); + $functionsDir = realpath(__DIR__ . '/../../../resources/functions'); + $envs = require('app/config/environments.php'); + /** * Command for rebuilding code packages: * bash tests/resources/functions/package-*.sh */ - $envs = [ - [ - 'language' => 'PHP', - 'version' => '7.4', - 'name' => 'php-7.4', - 'code' => $functions.'/php.tar.gz', - 'command' => 'php index.php', - 'timeout' => 15, - ], - [ - 'language' => 'PHP', - 'version' => '8.0', - 'name' => 'php-8.0', - 'code' => $functions.'/php.tar.gz', - 'command' => 'php index.php', - 'timeout' => 15, - ], - [ - 'language' => 'Python', - 'version' => '3.8', - 'name' => 'python-3.8', - 'code' => $functions.'/python.tar.gz', - 'command' => 'python main.py', - 'timeout' => 15, - ], - [ - 'language' => 'Python', - 'version' => '3.9', - 'name' => 'python-3.9', - 'code' => $functions.'/python.tar.gz', - 'command' => 'python main.py', - 'timeout' => 15, - ], - [ - 'language' => 'Node.js', - 'version' => '14.5', - 'name' => 'node-14.5', - 'code' => $functions.'/node.tar.gz', + $functions = [ + 'node-14.5' => [ + 'code' => $functionsDir.'/node.tar.gz', 'command' => 'node index.js', 'timeout' => 15, ], - [ - 'language' => 'Node.js', - 'version' => '15.5', - 'name' => 'node-15.5', - 'code' => $functions.'/node.tar.gz', + 'node-15.5' => [ + 'code' => $functionsDir.'/node.tar.gz', 'command' => 'node index.js', 'timeout' => 15, ], - [ - 'language' => 'Ruby', - 'version' => '2.7', - 'name' => 'ruby-2.7', - 'code' => $functions.'/ruby.tar.gz', + 'php-7.4' => [ + 'code' => $functionsDir.'/php.tar.gz', + 'command' => 'php index.php', + 'timeout' => 15, + ], + 'php-8.0' => [ + 'code' => $functionsDir.'/php.tar.gz', + 'command' => 'php index.php', + 'timeout' => 15, + ], + 'ruby-2.7' => [ + 'code' => $functionsDir.'/ruby.tar.gz', 'command' => 'ruby app.rb', 'timeout' => 15, ], - [ - 'language' => 'Ruby', - 'version' => '3.0', - 'name' => 'ruby-3.0', - 'code' => $functions.'/ruby.tar.gz', + 'ruby-3.0' => [ + 'code' => $functionsDir.'/ruby.tar.gz', 'command' => 'ruby app.rb', 'timeout' => 15, ], - [ - 'language' => 'Deno', - 'version' => '1.5', - 'name' => 'deno-1.5', - 'code' => $functions.'/deno.tar.gz', + 'python-3.8' => [ + 'code' => $functionsDir.'/python.tar.gz', + 'command' => 'python main.py', + 'timeout' => 15, + ], + 'python-3.9' => [ + 'code' => $functionsDir.'/python.tar.gz', + 'command' => 'python main.py', + 'timeout' => 15, + ], + 'deno-1.2' => [ + 'code' => $functionsDir.'/deno.tar.gz', 'command' => 'deno run --allow-env index.ts', 'timeout' => 15, ], - [ - 'language' => 'Deno', - 'version' => '1.6', - 'name' => 'deno-1.6', - 'code' => $functions.'/deno.tar.gz', + 'deno-1.5' => [ + 'code' => $functionsDir.'/deno.tar.gz', 'command' => 'deno run --allow-env index.ts', 'timeout' => 15, ], - [ - 'language' => 'Deno', - 'version' => '1.8', - 'name' => 'deno-1.8', - 'code' => $functions.'/deno.tar.gz', + 'deno-1.6' => [ + 'code' => $functionsDir.'/deno.tar.gz', 'command' => 'deno run --allow-env index.ts', 'timeout' => 15, ], - [ - 'language' => 'Dart', - 'version' => '2.10', - 'name' => 'dart-2.10', - 'code' => $functions.'/dart.tar.gz', + 'deno-1.8' => [ + 'code' => $functionsDir.'/deno.tar.gz', + 'command' => 'deno run --allow-env index.ts', + 'timeout' => 15, + ], + 'dart-2.10' => [ + 'code' => $functionsDir.'/dart.tar.gz', 'command' => 'dart main.dart', 'timeout' => 15, ], - [ - 'language' => 'Dart', - 'version' => '2.12', - 'name' => 'dart-2.12', - 'code' => $functions.'/dart.tar.gz', + 'dart-2.12' => [ + 'code' => $functionsDir.'/dart.tar.gz', 'command' => 'dart main.dart', 'timeout' => 15, ], - [ - 'language' => '.NET', - 'version' => '3.1', - 'name' => 'dotnet-3.1', - 'code' => $functions.'/dotnet-3.1.tar.gz', + 'dotnet-3.1' => [ + 'code' => $functionsDir.'/dotnet-3.1.tar.gz', 'command' => 'dotnet dotnet.dll', 'timeout' => 15, ], - [ - 'language' => '.NET', - 'version' => '5.0', - 'name' => 'dotnet-5.0', - 'code' => $functions.'/dotnet-5.0.tar.gz', + 'dotnet-5.0' => [ + 'code' => $functionsDir.'/dotnet-5.0.tar.gz', 'command' => 'dotnet dotnet.dll', 'timeout' => 15, - ], + ] ]; + foreach ($envs as $key => $env) { + $envs[$key] = array_merge($env, $functions[$key]); + } + sleep(count($envs) * 20); fwrite(STDERR, "."); @@ -605,9 +571,9 @@ class FunctionsCustomServerTest extends Scope $fileId = $file['body']['$id'] ?? ''; foreach ($envs as $key => $env) { - $language = $env['language'] ?? ''; + $name = $key ?? ''; + $language = $env['name'] ?? ''; $version = $env['version'] ?? ''; - $name = $env['name'] ?? ''; $code = $env['code'] ?? ''; $command = $env['command'] ?? ''; $timeout = $env['timeout'] ?? 15;