A remote code running service.
Remote Code Runner is a simple code service for running code on remote server side. Docker is used to execute untrusted code in a sandbox environment.
Environment:
MAKE SURE the login user has sudo
privileges and does not require entering a password.
Install all required software:
$ sudo apt install git docker.io python3.8
Get source:
$ cd /srv
$ sudo git clone https://github.com/michaelliao/remote-code-runner.git
Generate all from source:
$ cd /srv/remote-code-runner
$ sudo python3.8 generate.py
Download required docker images by warm up script (this may take a long time):
$ cd /srv/remote-code-runner/bin
$ sudo sh warm-up-docker.sh
Start server:
$ cd /srv/remote-code-runner/bin
$ sudo start-runner.sh
Using simple HTTP JSON API:
$ curl http://server-ip:8080/run -H 'Content-Type: application/json' -d '{"language":"python","code":"import math\nprint(math.pi)"}'
{"error": false, "timeout": false, "truncated": false, "output": "3.141592653589793\n"}
API input:
java
, python
, ruby
.import math\nprint(math.pi)
API output:
How code are executed on the remote server side:
runner.py
got language name and code from API;/tmp/remote-code-runner/1
;sudo docker run -t --rm -w /app -v /tmp/dir:/app <image-tag> python3 main.py
;Remote code runner should only be served in private network. User identity check, rate limit must be done in application server or reverse proxy like Nginx.
How to add a new language:
config.json
:{
...
"languages": {
...
"node": {
"file": "main.js",
"image": "node:14.17-slim",
"command": "node main.js"
}
}
}
The key node
is the language name.
$ sudo docker run -t --rm node:13.12-slim ls
start-runner.sh
.