Updated Installation (markdown)

master
Martin Kruliš 4 years ago
parent e3c13ad35e
commit 46afcd3466

@ -377,6 +377,10 @@ path (`dst`) needs to be added to `environ-variable` list. Be careful when
editing `PATH` or `LD_LIBRARY_PATH` environmental variables as they may apply
to multiple runtimes.
After you set all runtime environments successfully (will be explained below),
it is recommended to set `cleanup-submission` to `true`, so that worker removes
old data from its working directory when each evaluation concludes.
### Isolate configuration
@ -406,21 +410,35 @@ planning the purchase of your hardware).
### Cleaner configuration
TODO
The cleaner module removes old records from worker cache. It is a separate module
since there may be multiple workers using the same cache.
After installing, edit the `/etc/recodex/cleaner/config.yml`. The most important
parameter is `cache-dir` which holds the path to worker cache directory
(i.e., `/var/recodex-worker-cache` if you followed the previous instructions).
Additionally, you may set the expiration time and logging properties.
Although `recodex-cleaner` is also registered as systemd service, you need to
enable and start the `recodex-cleaner.timer` service, which runs the cleaner
periodically (once a day). An alternative is to add cleaner to cron, but the
systemd timer is the recommended way.
### Runtime environments
Some runtimes require access to `/etc` directory since their compilers or
interprets have their configuration there (e.g., freepascal or PHP). It is not
a good idea to map entire `/etc` in sandbox. One possibility is to prepare
separated config directory (e.g., `/usr/etc`) and place configs visible to sandbox
there (and add it to `bound-directories` list).
interprets have their configuration there (e.g., freepascal or PHP). It could be
a security risk to map entire `/etc` into sandbox (although, some environments
are having `/etc` mapped anyways, but only for the compilation step). Furthermore,
it might be helpful to have separate configuration files for the system and for
the sandbox. One possible solution is to prepare separated config directory
(e.g., `/usr/etc`) and place configs for the sandbox there (and add it to
`bound-directories` list).
Runtimes `bash` and `data-linux` should work out of the box. Other runtimes will
require additional installations and configurations:
#### C and C++ (`c-gcc-linux` and `cxx-gcc-linux`)
#### C and C++
Simply install the GCC compiler.
```
@ -429,14 +447,29 @@ dnf -y install gcc gcc-c++
#### C# and .NET Core
TODO! Currently migrating from Mono to .NET Core.
**We are currently migrating configuration from Mono to .NET Core. This
configuration applies to `cs-dotnet-core` environment, `mono` is considered
deprecated.**
Install .NET core SDK:
```
# dnf -y install dotnet-sdk-3.1
```
Download the following files:
```
https://raw.githubusercontent.com/ReCodEx/utils/master/runners/cs/Reader.cs
https://raw.githubusercontent.com/ReCodEx/utils/master/runners/cs/Wrapper.cs
https://raw.githubusercontent.com/ReCodEx/utils/master/runners/cs/recodex.csproj
```
#### Free Pascal (`freepascal-linux`)
Open your running ReCodEx instance in web browser and log in as administrator.
Open `Pipeline` page, find the *C# .NET Core Compilation* pipeline, and click on
the `Edit` button on the right. Scroll down to *Supplementary files* box
and upload all three downloaded files here.
#### Free Pascal
First you need to install Free Pascal compiler:
```
@ -455,13 +488,36 @@ Simply install the Go language package.
# dnf -y install golang
```
#### Groovy
TODO
This environment requires Java runtime to be installed as well (please do before
venturing forth).
Download latest stable binary of Apache Groovy from `https://groovy.apache.org/download.html`
(e.g., `https://dl.bintray.com/groovy/maven/apache-groovy-binary-3.0.5.zip`)
And unzip the content into `/opt/groovy`.
Add environmental variable in worker configuration (`environ-variable` list)
`GROOVY_HOME` with value `/opt/groovy` and enable access to this directory by
adding it into `bound-directories`.
Create a symlink `/opt/groovy/groovy.jar` referring to
`/opt/groovy/libs/groovy-3.0.5.jar` (where `3.0.5` is the actual version of
downloaded Groovy).
Create the following symlinks in `/usr/bin`, each referring to the binary of the
same name in `/opt/groovy/bin`: `groovy`, `groovyc`, `groovyConsole`,
`groovydoc`, `groovysh`.
#### Haskell
TODO
Simply install the Haskell compiler.
```
# dnf -y install ghc
```
#### Java
@ -485,7 +541,18 @@ and upload the compiled `javarun.class`.
#### Kotlin
TODO
This environment requires Java runtime to be installed as well (please do before
venturing forth).
Download latest Kotlin compiler release from [GitHub](https://github.com/JetBrains/kotlin)
and unzip it to `/opt/kotlin`.
Create a symlink `/usr/bin/kotlinc` referring to `/opt/kotlin/bin/kotlinc` and
make sure `kotlinc` have executable flag set.
Make the `/opt/kotlin` directory accessible by the sandbox (add it to
`bound-directories` list).
#### Node.js (JavaScript)
@ -521,19 +588,74 @@ Optionally, you might want to consider installing User Operations for Zend
(`uopz`) PECL package for PHP. This package could help you creating hooks or
mock existing functions, which is helpful when testing PHP assignments. If you
enable this module, it is important to re-allow the source code control over the
exit opcode as follows:
Create a PHP script in a folder accessible by sandbox (e.g., `/usr/etc`):
exit opcode by adding
```
<?php
uopz_allow_exit(true);
uopz.exit = 1
```
Make sure this script is executed before any other (tested) code by setting
its path to `auto_prepend_file` in `/usr/etc/php.ini`.
Into `/usr/etc/php.ini`.
**If you share PHP installation between core API and worker, make sure the `uopz`
extension is either disabled or allows the exit code override for the API module!!!**
#### Prolog
Unfortunately, SWI Prolog has to be compiled manually. Do not forget to have
EPEL 8 and PowerTools repositories enabled.
Install dependencies:
```
# dnf -y install \
gcc \
gcc-c++ \
cmake3 \
ninja-build \
libunwind \
freetype-devel \
gmp-devel \
java-1.8.0-openjdk-devel \
jpackage-utils \
libICE-devel \
libjpeg-turbo-devel \
libSM-devel \
libX11-devel \
libXaw-devel \
libXext-devel \
libXft-devel \
libXinerama-devel \
libXmu-devel \
libXpm-devel \
libXrender-devel \
libXt-devel \
ncurses-devel \
openssl-devel \
pkgconfig \
readline-devel \
libedit-devel \
unixODBC-devel \
zlib-devel \
uuid-devel \
libarchive-devel \
libyaml-devel
```
Download SWI-Prolog 8.0.1. and compile it (it is recommended to do this in
dedicated directory as regular user):
```
$ wget http://www.swi-prolog.org/download/stable/src/swipl-8.0.1.tar.gz
$ tar xvf ./swipl-8.0.1.tar.gz
$ cd ./swipl-8.0.1
$ mkdir build
$ cd ./build
$ cmake3 ..
$ make
$ sudo make install
```
For technical reasons, the ReCodEx requires that the `swipl` is present in
`/usr/bin`. The simplest way is to create symlink `/usr/bin/swipl` that refers
to `/usr/local/lib/swipl/bin/x86_64-linux/swipl`.
Download `recodex-init.pl`, `recodex-swipl-wrapper.sh`, and `recodex-wrapper.pl`
from
```
@ -544,9 +666,7 @@ Open `Pipeline` page, find the *Prolog Compilation* pipeline, and click on
the `Edit` button on the right. Scroll down to *Supplementary files* box
and upload all three downloaded files here.
TODO
#### Python (`python3`)
#### Python
Python is executed in a wrapper script that handles exceptions and translates
them in exit codes (which is necessary for error reporting). Download
@ -575,7 +695,6 @@ VIRTUAL_ENV: /var/recodex-worker-python-venv
And register directory mapping in `bound-directories` list:
```
- src: "/var/recodex-worker-python-venv"
dst: "/var/recodex-worker-python-venv"
```
#### Rust
@ -601,3 +720,37 @@ configure the system to use latest java as default:
```
## Are we done?
Not quite yet. There are at least two things you should consider.
### Backup
The data are stored at two places -- in the database and in the file server.
The database can be easily dumped thusly:
```
mysqldump --default-character-set=utf8mb4 -uroot -p recodex > /path/to/backup/file.sql
```
Where `recodex` is the database name.
Furthermore, you need to backup the fileserver main directory
(`/var/recodex-fileserver` by default), preferably using tools like `rsync`.
In addition, it is a good idea to backup the `/opt/recodex-code/uploaded_data`
directory. Important uploaded files will be eventually all transferred to
fileserver, but at present, some of them are still kept here.
It might be a good idea to perform a backup every night and to keep several last
copies. For instance, in our setup, we keep last 7 daily backups, all backups made
on the 1st of every month for the last year, and all backups made on January 1st
of every year.
### Monitoring
For mission-critical systems, some form of monitoring is a must. Depending on your
needs, the monitoring could be as simple as setting up a script that uses ping
or wget to verify the ReCodEx is running, or you can use more sophisticated tools.
For our main instance, we use [Prometheus](https://prometheus.io/) with
`node_exporter` and `mysqld_exporter` to gather performance statistics and
[Grafana](https://grafana.com/) to visualize them.

Loading…
Cancel
Save