Skip to content

Serverless runtimes executor for container based environments ⚡️

License

Notifications You must be signed in to change notification settings

open-runtimes/executor

Repository files navigation

Open Runtimes Executor 🤖

open-runtimes-box-bg-cover


Discord Build Status Twitter Account Docker Pulls

Executor for Open Runtimes, a runtime environments for serverless cloud computing for multiple coding languages.

Executor is responsible for providing HTTP API for creating and executing Open Runtimes. Executor is stateless and can be scaled horizontally when a load balancer is introduced in front of it. You could use any load balancer but we highly recommend using Open Runtimes Proxy for it's ease of setup with Open Runtimes Executor.

Features

  • Flexibility - Configuring custom image lets you use any runtime for your functions.
  • Performance - Coroutine-style HTTP servers allows asynchronous operations without blocking. We. Run. Fast! ⚡
  • Open Source - Released under the MIT license, free to use and extend.

Getting Started

  1. Pull Open Runtimes Executor image:
docker pull openruntimes/executor
  1. Create docker-compose.yml file:
version: '3'
services:
  openruntimes-executor:
    container_name: openruntimes-executor
    hostname: executor
    stop_signal: SIGINT
    image: openruntimes/executor
    networks:
      openruntimes-runtimes:
    ports:
      - 9900:80
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - openruntimes-builds:/storage/builds:rw
      - openruntimes-functions:/storage/functions:rw
      - /tmp:/tmp:rw
      - ./functions:/storage/functions:rw
    environment:
      - OPR_EXECUTOR_ENV
      - OPR_EXECUTOR_RUNTIMES
      - OPR_EXECUTOR_CONNECTION_STORAGE
      - OPR_EXECUTOR_INACTIVE_TRESHOLD
      - OPR_EXECUTOR_MAINTENANCE_INTERVAL
      - OPR_EXECUTOR_NETWORK
      - OPR_EXECUTOR_SECRET
      - OPR_EXECUTOR_LOGGING_PROVIDER
      - OPR_EXECUTOR_LOGGING_CONFIG
      - OPR_EXECUTOR_DOCKER_HUB_USERNAME
      - OPR_EXECUTOR_DOCKER_HUB_PASSWORD
      - OPR_EXECUTOR_RUNTIME_VERSIONS
      - OPR_EXECUTOR_RETRY_ATTEMPTS
      - OPR_EXECUTOR_RETRY_DELAY_MS

networks:
  openruntimes-runtimes:
    name: openruntimes-runtimes

volumes:
  openruntimes-builds:
  openruntimes-functions:

Notice we added bind to local ./functions directory. That is only nessessary for this getting started, since we will be executing our custom function.

  1. Create .env file:
OPR_EXECUTOR_ENV=development
OPR_EXECUTOR_RUNTIMES=php-8.0
OPR_EXECUTOR_CONNECTION_STORAGE=file://localhost
OPR_EXECUTOR_INACTIVE_TRESHOLD=60
OPR_EXECUTOR_MAINTENANCE_INTERVAL=60
OPR_EXECUTOR_NETWORK=openruntimes-runtimes
OPR_EXECUTOR_SECRET=executor-secret-key
OPR_EXECUTOR_LOGGING_PROVIDER=
OPR_EXECUTOR_LOGGING_CONFIG=
OPR_EXECUTOR_DOCKER_HUB_USERNAME=
OPR_EXECUTOR_DOCKER_HUB_PASSWORD=
OPR_EXECUTOR_RUNTIME_VERSIONS=v4
OPR_EXECUTOR_RETRY_ATTEMPTS=5
OPR_EXECUTOR_RETRY_DELAY_MS=500

OPR_EXECUTOR_CONNECTION_STORAGE takes a DSN string that represents a connection to your storage device. If you would like to use your local filesystem, you can use file://localhost. If using S3 or any other provider for storage, use a DSN of the following format s3://access_key:access_secret@host:port/bucket_name?region=us-east-1

For backwards compatibility, executor also supports OPR_EXECUTOR_STORAGE_* variables as replacement for OPR_EXECUTOR_CONNECTION_STORAGE, as seen in Appwrite repository.

  1. Start Docker container:
docker compose up -d
  1. Prepare a function we will ask executor to run:
mkdir -p functions && cd functions && mkdir -p php-function && cd php-function
printf "<?\nreturn function(\$req, \$res) {\n    \$res->json([ 'n' => \mt_rand() / \mt_getrandmax() ]);\n};" > index.php
tar -czf ../my-function.tar.gz .
cd .. && rm -r php-function

This created my-function.tar.gz that includes index.php with a simple Open Runtimes script.

  1. Send a HTTP request to executor server:
curl -H "authorization: Bearer executor-secret-key" -H "Content-Type: application/json" -X POST http://localhost:9900/v1/runtimes/my-function/execution -d '{"image":"openruntimes/php:v2-8.0","source":"/storage/functions/my-function.tar.gz","entrypoint":"index.php"}'
  1. Stop Docker containers:
docker compose down

API Endpoints

Method Endpoint Description Params
GET /v1/runtimes/{runtimeId}/logs Get live stream of logs of a runtime JSON
POST /v1/runtimes Create a new runtime server JSON
GET /v1/runtimes List currently active runtimes X
GET /v1/runtimes/{runtimeId} Get a runtime by its ID JSON
DELETE /v1/runtimes/{runtimeId} Delete a runtime JSON
POST /v1/runtimes/{runtimeId}/executions Create an execution JSON
GET /v1/health Get health status of host machine and runtimes X

/v1/runtimes/{runtimeId}/logs

Param Type Description Required Default
runtimeId string Runtime unique ID
timeout string Maximum logs timeout in seconds '600'

/v1/runtimes

Param Type Description Required Default
runtimeId string Runtime unique ID
image string Base image name of the runtime
entrypoint string Entrypoint of the code file ' '
source string Path to source files ' '
destination string Destination folder to store runtime files into ' '
variables json Environment variables passed into runtime [ ]
runtimeEntrypoint string Commands to run when creating a container. Maximum of 100 commands are allowed, each 1024 characters long. ' '
command string Commands to run after container is created. Maximum of 100 commands are allowed, each 1024 characters long. ' '
timeout integer Commands execution time in seconds 600
remove boolean Remove a runtime after execution false
cpus float Maximum CPU cores runtime can utilize 1
memory integer Container RAM memory in MBs 512
version string Runtime Open Runtime version (allowed values: 'v2', 'v4') 'v4'

/v1/runtimes/{runtimeId}

Param Type Description Required Default
runtimeId string Runtime unique ID

/v1/runtimes/{runtimeId}/executions

Param Type Description Required Default
runtimeId string The runtimeID to execute
body string Data to be forwarded to the function, this is user specified. ' '
path string Path from which execution comes '/'
method array Path from which execution comes 'GET'
headers json Headers passed into runtime [ ]
timeout integer Function maximum execution time in seconds 15
image string Base image name of the runtime ' '
source string Path to source files ' '
entrypoint string Entrypoint of the code file ' '
variables json Environment variables passed into runtime [ ]
cpus floats Maximum CPU cores runtime can utilize 1
memory integer Container RAM memory in MBs 512
version string Runtime Open Runtime version (allowed values: 'v2', 'v4') 'v4'
runtimeEntrypoint string Commands to run when creating a container. Maximum of 100 commands are allowed, each 1024 characters long. ' '

Environment variables

Variable name Description
OPR_EXECUTOR_ENV Environment mode of the executor, ex. development
OPR_EXECUTOR_RUNTIMES Comma-separated list of supported runtimes (ex: php-8.1,dart-2.18,deno-1.24,..). These runtimes should be available as container images.
OPR_EXECUTOR_CONNECTION_STORAGE DSN string that represents a connection to your storage device, ex: file://localhost for local storage
OPR_EXECUTOR_INACTIVE_TRESHOLD Threshold time (in seconds) for detecting inactive runtimes, ex: 60
OPR_EXECUTOR_MAINTENANCE_INTERVAL Interval (in seconds) at which the Executor performs maintenance tasks, ex: 60
OPR_EXECUTOR_NETWORK Network used by the executor for runtimes, ex: openruntimes-runtimes
OPR_EXECUTOR_SECRET Secret key used by the executor for authentication
OPR_EXECUTOR_LOGGING_PROVIDER Deprecated: use OPR_EXECUTOR_LOGGING_CONFIG with DSN instead. External logging provider used by the executor, ex: sentry
OPR_EXECUTOR_LOGGING_CONFIG External logging provider DSN used by the executor, ex: sentry://PROJECT_ID:SENTRY_API_KEY@SENTRY_HOST/
OPR_EXECUTOR_DOCKER_HUB_USERNAME Username for Docker Hub authentication (if applicable)
OPR_EXECUTOR_DOCKER_HUB_PASSWORD Password for Docker Hub authentication (if applicable)
OPR_EXECUTOR_RUNTIME_VERSIONS Version tag for runtime environments, ex: v4
OPR_EXECUTOR_RETRY_ATTEMPTS Number of retry attempts for failed executions, ex: 5
OPR_EXECUTOR_RETRY_DELAY_MS Delay (in milliseconds) between retry attempts, ex: 500

Contributing

All code contributions - including those of people having commit access - must go through a pull request and be approved by a core developer before being merged. This is to ensure a proper review of all the code.

We truly ❤️ pull requests! If you wish to help, you can learn more about how you can contribute to this project in the contribution guide.

Security

For security issues, kindly email us at security@appwrite.io instead of posting a public issue on GitHub.

Follow Us

Join our growing community around the world! See our official Blog. Follow us on Twitter, Facebook Page, Facebook Group , Dev Community or join our live Discord server for more help, ideas, and discussions.

License

This repository is available under the MIT License.