Instalando os pacotes necessários para compilar e rodar a aplicação.
apt install --no-install-recommends acl apache2 build-essential coreutils debconf debootstrap debhelper git libany-uri-escape-perl makepasswd makepasswd openssl php php-cli php-fpm php-gd php-pgsql php-xml php-zip postgresql postgresql-client quota quotatool sharutils schroot
Compilando e instalando os pacotes do BOCA
git clone https://github.com/cassiopc/boca
cd boca
dpkg-buildpackage -us -uc
cd ..
dpkg -i {boca-{common,web,db,autojudge},boca}_*.deb
Nos diálogos que se seguem selecione com a tecla TAB e confirme com a tecla ENTER.
- localhost
- Senha do usuario do banco de dados
- Yes
Configurando o VirtualHost do BOCA
cat << EOF > /etc/apache2/sites-available/000-boca-ssl.conf
<VirtualHost *:80>
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/\.well\-known/acme\-challenge/
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
<IfModule mod_ssl.c>
<VirtualHost *:443>
ServerAdmin boca@bombonera.org
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
Protocols h2 http/1.1
DocumentRoot /var/www/boca
<FilesMatch "\.(php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory "/var/www/boca/src">
AllowOverride Options AuthConfig Limit
Order Allow,Deny
Allow from all
AddDefaultCharset utf-8
</Directory>
<Directory "/var/www/boca/src/private">
AllowOverride Options AuthConfig Limit
Deny from all
</Directory>
<Directory /var/www/boca>
AllowOverride Options AuthConfig Limit
Deny from all
</Directory>
Alias /boca /var/www/boca/src
</VirtualHost>
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
EOF
cp /etc/apache2/sites-enabled/000-boca.conf /etc/apache2/sites-available/
rm /etc/apache2/sites-enabled/000-boca.conf
a2enconf $(a2query -c | awk '/php.*fpm/ {print $1}')
a2enmod rewrite
a2ensite 000-boca-ssl.conf
systemctl reload apache2
Configurando o banco de dados
su - postgres -c "psql -U postgres postgres <<EOF
CREATE USER bocauser PASSWORD '<SENHA>';
ALTER USER bocauser CREATEDB;
EOF"
echo YES | boca-createdb
cat << EOF > /lib/systemd/system/boca-autojudge.service
[Unit]
Description=Auto Judge Boca Contest
After=network.target
[Service]
ExecStart=/usr/sbin/boca-autojudge
[Install]
WantedBy=multi-user.target
EOF
systemctl enable boca-autojudge
systemctl start boca-autojudge
Corrigiremos alguns bugs na criação da jaula. O arquivo lsb-release não é mais suportado na maioria das distribuições Linux. A versão atual do systemd não suporta um diretório raiz em que o dono não é "root". https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=950684
NUID=$[$(sort -t: -hk3 /etc/passwd | awk -F: '{if ($3 > 999 && $3 < 60000) print $3}' | tail -n1)+1]
JAIL=/home/bocajail
echo "DISTRIB_CODENAME=$(lsb_release -cs)" > /etc/lsb-release
mkdir -p /var/lib/AccountsService/users/ $JAIL
setfacl -m u:$NUID:rwx,g:users:rwx $JAIL
Ativando o suporte a cota de disco na partição home com sistema de arquivos ext4
umount /home
tune2fs -O quota $(mount | awk '/\/home/ {print $1}')
mount -a
quotaon -va
Criando a jaula
boca-createjail
O pacote "maratona-linguagens" não possui versão para distribuições diferentes do ubuntu. Deveremos instalar os pacotes requeridos manualmente. A lista de versões atualizadas do kotlin encontram-se em https://github.com/JetBrains/kotlin/releases, atualize a url da versão atual caso necessário no script do here-document abaixo.
cat << EOF > $JAIL/root/linguagens.sh
#!/bin/bash
apt install --no-install-recommends build-essential debconf default-jre default-jdk gdb nodejs python3 pyflakes3 python3-distutils unzip wget valgrind
wget --tries=3 --wait=2 --random-wait -O /tmp/kotlin.zip https://github.com/JetBrains/kotlin/releases/download/v1.6.21/kotlin-compiler-1.6.21.zip
unzip /tmp/kotlin.zip -d /opt
echo 'PATH="$PATH:/opt/kotlinc/bin"' > /etc/profile.d/kotlin.sh
rm /tmp/kotlin.zip
apt clean
rm -rf /var/lib/apt/lists/*
EOF
schroot -u root -c chroot:bocajail -- bash linguagens.sh