1
0
Fork 0
mirror of synced 2024-06-26 18:20:43 +12:00

Added base env image (POC)

This commit is contained in:
Eldad Fux 2020-11-03 08:54:00 +02:00
parent af41aca527
commit a3c150521a
5 changed files with 231 additions and 4 deletions

View file

@ -2,7 +2,6 @@ FROM composer:2.0 as step0
WORKDIR /usr/local/src/
COPY composer.lock /usr/local/src/
COPY composer.json /usr/local/src/
RUN composer update --ignore-platform-reqs --optimize-autoloader \
@ -20,8 +19,7 @@ RUN \
gcc \
g++ \
git \
zlib-dev \
brotli-dev
zlib-dev
RUN docker-php-ext-install sockets
@ -44,6 +42,9 @@ RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN \
apk update \
&& apk add --no-cache --virtual .deps \
&& apk add --no-cache \
tar \
libstdc++ \
&& docker-php-ext-install sockets opcache \
&& apk del .deps \
&& rm -rf /var/cache/apk/*
@ -53,14 +54,20 @@ WORKDIR /usr/src/code
COPY --from=step0 /usr/local/src/vendor /usr/src/code/vendor
COPY --from=step1 /usr/local/lib/php/extensions/no-debug-non-zts-20190902/swoole.so /usr/local/lib/php/extensions/no-debug-non-zts-20190902/
RUN ls -ll /usr/local/lib/php/extensions/no-debug-non-zts-20190902/
# Add Source Code
COPY ./app /usr/src/code/app
COPY ./start /usr/local/bin/start
RUN chmod +x /usr/local/bin/start
# Enable Extensions
RUN echo extension=swoole.so >> /usr/local/etc/php/conf.d/swoole.ini
# PHP Settings
RUN echo "opcache.enable_cli=1" >> /usr/local/etc/php/conf.d/appwrite.ini
EXPOSE 80
CMD [ "php", "app/http.php" ]
CMD [ "start" ]

View file

@ -0,0 +1,168 @@
<?php
require_once __DIR__.'/../vendor/autoload.php';
use Utopia\App;
use Utopia\CLI\Console;
use Utopia\Validator\Integer;
use Utopia\Validator\Mock;
use Utopia\Swoole\Request;
use Utopia\Swoole\Response;
use Swoole\Process;
use Swoole\Http\Server;
use Swoole\Http\Request as SwooleRequest;
use Swoole\Http\Response as SwooleResponse;
ini_set('memory_limit','512M');
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
App::post('/')
->desc('Progressive app manifest file')
->label('scope', 'public')
->label('docs', false)
->param('command', null, new Mock(), 'Command to execute', false)
->param('timeout', 900, new Integer(), 'Timeout in seconds', false)
->action(function ($command, $timeout, $response) {
/** @var Utopia\Swoole\Response $response */
Console::log('executing command: ' . $command);
$stdout = '';
$stderr = '';
$exitCode = Console::execute($command, '', $stdout, $stderr, $timeout);
$response->json([
'command' => $command,
'timeout' => $timeout,
'exitCode' => $exitCode,
'stdout' => $stdout,
'stderr' => $stderr,
]);
}, ['response']);
App::error(function ($error, $utopia, $request, $response) {
/** @var Exception $error */
/** @var Utopia\App $utopia */
/** @var Utopia\Swoole\Request $request */
/** @var Appwrite\Utopia\Response $response */
/** @var Utopia\View $layout */
/** @var Appwrite\Database\Document $project */
$route = $utopia->match($request);
if (php_sapi_name() === 'cli') {
Console::error('[Error] Method: '.$route->getMethod());
Console::error('[Error] URL: '.$route->getURL());
Console::error('[Error] Type: '.get_class($error));
Console::error('[Error] Message: '.$error->getMessage());
Console::error('[Error] File: '.$error->getFile());
Console::error('[Error] Line: '.$error->getLine());
}
$version = App::getEnv('_APP_VERSION', 'UNKNOWN');
switch ($error->getCode()) {
case 400: // Error allowed publicly
case 401: // Error allowed publicly
case 402: // Error allowed publicly
case 403: // Error allowed publicly
case 404: // Error allowed publicly
case 409: // Error allowed publicly
case 412: // Error allowed publicly
case 429: // Error allowed publicly
$code = $error->getCode();
$message = $error->getMessage();
break;
default:
$code = 500; // All other errors get the generic 500 server error status code
$message = 'Server Error';
}
$output = ((App::isDevelopment())) ? [
'message' => $error->getMessage(),
'code' => $error->getCode(),
'file' => $error->getFile(),
'line' => $error->getLine(),
'trace' => $error->getTrace(),
'version' => $version,
] : [
'message' => $message,
'code' => $code,
'version' => $version,
];
$response
->addHeader('Cache-Control', 'no-cache, no-store, must-revalidate')
->addHeader('Expires', '0')
->addHeader('Pragma', 'no-cache')
->setStatusCode($code)
;
$response->json($output);
}, ['error', 'utopia', 'request', 'response']);
$http = new Server("0.0.0.0", 80);
$payloadSize = 4000000; /* 4mb */
$http
->set([
'open_http2_protocol' => true,
// 'document_root' => __DIR__.'/../public',
// 'enable_static_handler' => true,
'http_compression' => true,
'http_compression_level' => 6,
'package_max_length' => $payloadSize,
])
;
$http->on('WorkerStart', function($serv, $workerId) {
Console::success('Worker '.++$workerId.' started succefully');
});
$http->on('BeforeReload', function($serv, $workerId) {
Console::success('Starting reload...');
});
$http->on('AfterReload', function($serv, $workerId) {
Console::success('Reload completed...');
});
$http->on('start', function (Server $http) use ($payloadSize) {
Console::success('Server started succefully (max payload is '.number_format($payloadSize).' bytes)');
Console::info("Master pid {$http->master_pid}, manager pid {$http->manager_pid}");
// listen ctrl + c
Process::signal(2, function () use ($http) {
Console::log('Stop by Ctrl+C');
$http->shutdown();
});
});
$http->on('request', function (SwooleRequest $swooleRequest, SwooleResponse $swooleResponse) {
$request = new Request($swooleRequest);
$response = new Response($swooleResponse);
$app = new App('America/New_York');
try {
$app->run($request, $response);
} catch (\Throwable $th) {
Console::error('[Error] Type: '.get_class($th));
Console::error('[Error] Message: '.$th->getMessage());
Console::error('[Error] File: '.$th->getFile());
Console::error('[Error] Line: '.$th->getLine());
if(App::isDevelopment()) {
$swooleResponse->end('error: '.$th->getMessage());
}
$swooleResponse->end('500: Server Error');
}
});
$http->start();

View file

@ -0,0 +1,29 @@
{
"name": "appwrite/env-base",
"description": "Appwrite Function HTTP server.",
"type": "project",
"license": "BSD-3-Clause",
"authors": [
{
"name": "Appwrite Team",
"email": "team@appwrite.io"
}
],
"require": {
"php": ">=7.4.0",
"ext-swoole": "*",
"utopia-php/framework": "0.9.7",
"utopia-php/swoole": "0.2.*",
"utopia-php/cli": "0.7.3"
},
"require-dev": {
"swoole/ide-helper": "4.5.5"
},
"minimum-stability": "dev",
"config": {
"platform": {
"php": "7.4"
}
}
}

View file

@ -0,0 +1,14 @@
version: '3'
services:
base:
container_name: base
build:
context: .
ports:
- 9503:80
networks:
- gateway
networks:
gateway:

View file

@ -0,0 +1,9 @@
#!/bin/sh
mv /tmp/code.tar.gz /usr/local/src/code.tar.gz
tar -zxf /usr/local/src/code.tar.gz --strip 1
rm /usr/local/src/code.tar.gz
php /usr/src/code/app/http.php