This project was originally meant as a way to allow code written in Swift to be executed safely on a remote server. The project has since taken on a new life to allow all modern languages to be executed on a server in a safe manner. Thus, removing the need for people to have an expensive computer to compile code.
Disclaimer: This project is only meant to be a base. It does not contain all the necessary security features to combat arbitrary code execution. Please fork and harden the code before you use it in production.
We use Ktor as it's a fast and easy to learn framework for server creation. This project is meant to run inside a Docker instance to prevent any malicious code from hurting your server instance.
The number one way to support this project is by donating to Empowr. If you are technically inclined and would like to submit code, then feel free to contribute to any area on the following list.
- Security. While this serves only serves as a base, we would like to ensure it is as secure as possible.
- More Languages. We would love to support more languages on the server side.
- Bugs & Features. We are open to adding new features. So if you have a cool idea, create it!
The command module is responsible for running commands locally on the server hardware
This file is used for executing commands locally. You simply pass in the command
to your Commander
's execute()
method
The purpose of this module is for executing code.
The executor interface is meant to be generic enough that any language could have its own implementation.
Here is a list of the executors and the language(s) they support.
Files | Languages | Supports Unit Tests |
---|---|---|
SwiftExecutor | Apple's Swift | ✅ |
Kotlin Executor | Kotlin | |
PythonExecutor | Python | |
TypescriptExecutor | Typescript | |
JavascriptExecutor | Javascript | |
RustExecutor | Rust |
Students may want to download the code they wrote in an easily executable way.
A list of supported downloadable executables.
- Swift
This module contains an api /download
that if hit, will package up the code sent to it, and return a fully working swift playground.
This is a module used solely for dependency management.
Note - Uncomment the line ARG DEBIAN_FRONTEND=noninteractive
in the Dockerfile if the build hangs
To build and tag a new docker image, navigate to the root of this repository and run:
docker build . --platform <platform> -t empowrco/doctor:<tag_name>
Where:
<platform>
is the target platform that the image will run on, usuallylinux/x86_64
orlinux/arm64/v8
if running on an M1 Mac.<tag_name>
is a unique string tag.
Example:
docker build . --platform linux/arm64/v8 -t empowrco/doctor:latest
To run the built docker image as a container locally, do:
docker run --platform linux/arm64/v8 -p 8080:8080 empowrco/doctor:latest
This command includes a port-forward argument that will forward your machine's 8080 to 8080 on the container.
Navigate to http://localhost:8080
to hit the server. (For a quick check, try http://localhost:8080/health
)