Git Product home page Git Product logo

rust-playground's Introduction

Rust Playground

This is the home of the Rust Playground, also hosted by Integer 32.

What's it do?

The playground allows you to experiment with Rust before you install it locally, or in any other case where you might not have the compiler available.

It has a number of features, including:

  1. A nice, unobtrusive editor with syntax highlighting.
  2. The ability to compile in debug or release mode against the current stable, beta, or nightly version of Rust.
  3. The top 100 popular crates (ranked by all-time downloads) and their dependencies are available for use. Just add extern foo to use them!
  4. The ability to quickly load and save your code to a GitHub Gist and share it with your friends.
  5. rustfmt and Clippy can be run against the source code.
  6. The ability to see the LLVM IR, assembly, or Rust MIR for the source code.

Architecture

A React frontend communicates with an Iron backend. Docker containers are used to provide the various compilers and tools as well as to help isolate them.

We hope that this frontend and backend stack is comfortable to potential contributors! If you are interested in contributing, please feel free to ask a question and we might even be able to point out some useful resources.

Resource Limits

Network

There is no network connection between the compiler container and the outside world.

Memory

The amount of memory the compiler and resulting executable use is limited by the container.

Execution Time

The total compilation and execution time is limited by the container.

Disk

This sandbox does not provide any disk space limits. It is suggested to run the server such that the temp directory is a space-limited. One bad actor may fill up this shared space, but it should be cleaned when that request ends.

Security Hall of Fame

A large set of thanks go to those individuals who have helped by reporting security holes or other attack vectors against the Playground. Each report helps us make the Playground better!

  • Preliminary sandbox testing (PID limit) by Stefan O'Rear.

If you'd like to perform tests that you think might disrupt service of the Playground, get in touch and we can create an isolated clone to perform tests on! Once fixed, you can choose to be credited here.

Deployment

Amazon EC2 (Amazon Linux)

Here's an example session. This could definitely be improved and automated.

Dependencies (as root)

yum update -y
yum install -y docker git

# Use a production-quality storage driver that doesn't leak disk space
vim /etc/sysconfig/docker
# Add to OPTIONS: --storage-driver=overlay

# Allow controlling the PID limit
vim /etc/cgconfig.conf
# Add:    pids       = /cgroup/pids;

service docker start
usermod -a -G docker ec2-user

fallocate -l 1G /swap.fs
chmod 0600 /swap.fs
mkswap /swap.fs

Set aside disk space (as root)

fallocate -l 512M /playground.fs
device=$(losetup -f --show /playground.fs)
mkfs -t ext3 -m 1 -v $device
mkdir /mnt/playground

Configure disk mountpoints (as root)

cat >>/etc/fstab <<EOF
/swap.fs        none            swap   sw       0   0
/playground.fs /mnt/playground  ext3   loop     0   0
EOF

Reboot the instance at this point.

Get the code

git clone https://github.com/integer32llc/rust-playground.git
cd rust-playground

Build the containers

cd compiler/
./build.sh
cd ../

Set a crontab to rebuild the containers

crontab -e
0 0 * * * cd /home/ec2-user/rust-playground/compiler && ./build.sh
0 * * * * docker images -q --filter "dangling=true" | xargs docker rmi

Build the UI backend

cd ui
docker run -it --rm -v $PWD:/ui --workdir /ui --entrypoint /bin/bash rust-nightly
rustup target add x86_64-unknown-linux-musl
cargo build --target=x86_64-unknown-linux-musl --release
# exit docker
cd ..

Build the UI frontend

cd ui/frontend
docker run -it --rm -v $PWD:/ui --workdir /ui --entrypoint /bin/bash node
yarn
NODE_ENV=production yarn run build
# exit docker
cd ../..

Run the server

cd ui
sudo \
  TMPDIR=/mnt/playground \
  RUST_LOG=info \
  PLAYGROUND_UI_ADDRESS=0.0.0.0 \
  PLAYGROUND_UI_PORT=80 \
  PLAYGROUND_UI_ROOT=$PWD/frontend/build \
  ./target/x86_64-unknown-linux-musl/release/ui

Development

Build the UI

cd ui/frontend
yarn
yarn run watch # Will rebuild and watch for changes

If you don't need the backend running because you are only making basic HTML/CSS/JS changes, directly open in your browser the built ui/frontend/build/index.html.

Build and run the server

cd ui
RUST_LOG=ui=debug \
PLAYGROUND_UI_ROOT=$PWD/frontend/build/ \
cargo run

Build the containers

cd compiler
./build.sh

License

Licensed under either of

rust-playground's People

Contributors

shepmaster avatar dtolnay avatar carols10cents avatar byron avatar atorstling avatar denis-golubev avatar slmt avatar

Watchers

Peter Hall avatar James Cloos avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.