hustoj itself provides the installation script. The following manual installation is mainly to be familiar with its composition.
sed -i 's/tencentyun/aliyun/g' /etc/apt/sources.list
If it is Tencent cloud, change it to Alibaba cloud. We don't need this operation.
apt-get update apt-get install -y subversion /usr/sbin/useradd -m -u 1536 judge cd /home/judge/ || exit
To install subversion, I have written down the code git clone, which should not be required. Add the account judge, add the home directory for it, and specify the user ID as 1536. This step requires. Then enter the home directory. We execute sudo useradd -m -u 1536 judge, cd /home/judge
#using tgz src files wget -O hustoj.tar.gz http://dl.hustoj.com/hustoj.tar.gz tar xzf hustoj.tar.gz svn up src #svn co https://github.com/zhblue/hustoj/trunk/trunk/ src
Get the source code, decompress and synchronize with svn. We don't need these anymore.
for pkg in net-tools make flex g++ clang libmysqlclient-dev libmysql++-dev php-fpm nginx mysql-server php-mysql php-common php-gd php-zip fp-compiler openjdk-11-jdk mono-devel php-mbstring php-xml php-curl php-intl php-xmlrpc php-soap do while ! apt-get install -y "$pkg" do echo "Network fail, retry... you might want to change another apt source for install" done done
Here are some software packages installed. We use nginx, php8 0 (ppa required), mariadb combination:
sudo apt-get install nginx, sudo apt-get install mariadb-server,sudo apt-get install software-properties-common,sudo add-apt-repository ppa:ondrej/php,sudo apt-get install php8.0-fpm,
sudo apt-get install php8.0-mysql php8.0-gd php8.0-zip php8.0-mbstring php8.0-xml php8.0-curl php8.0-intl php8.0-xmlrpc php8.0-soap
Install the compiler tool , sudo apt get install , make flex , g + + clang. net tools for ifconfig support are not required. pascal, java net compilation or execution environment.
https://downloads.mariadb.org/connector-c/+releases/ You can download the connector and documentation of mariadb C language https://mariadb.com/kb/en/mariadb-connector-c/ , please refer to the website https://www.cnblogs.com/life2refuel/p/5574544.html , it's complicated to replace this part with mariadb. Let's ignore it first.
USER=$(grep user /etc/mysql/debian.cnf|head -1|awk '{print $3}') PASSWORD=$(grep password /etc/mysql/debian.cnf|head -1|awk '{print $3}') CPU=$(grep "cpu cores" /proc/cpuinfo |head -1|awk '{print $4}')
This is to extract some information from / etc / MySQL / Debian CNF extracts the database user name (root in the default configuration file) and password (empty in the default configuration file because there is no secure mariadb), and obtains the number of CPU cores from the process information file / etc/cpuinfo, such as 2. We can know this information without writing or modifying.
mkdir etc data log backup cp src/install/java0.policy /home/judge/etc cp src/install/judge.conf /home/judge/etc chmod +x src/install/ans2out if grep "OJ_SHM_RUN=0" etc/judge.conf ; then mkdir run0 run1 run2 run3 chown judge run0 run1 run2 run3 fi sed -i "s/OJ_USER_NAME=root/OJ_USER_NAME=$USER/g" etc/judge.conf sed -i "s/OJ_PASSWORD=root/OJ_PASSWORD=$PASSWORD/g" etc/judge.conf sed -i "s/OJ_COMPILE_CHROOT=1/OJ_COMPILE_CHROOT=0/g" etc/judge.conf sed -i "s/OJ_RUNNING=1/OJ_RUNNING=$CPU/g" etc/judge.conf chmod 700 backup chmod 700 etc/judge.conf
Create four directories in the judge user's home directory: sudo mkdir etc data log backup in / home / judge, and copy the two files from the source code: sudo CP / home / zime / hustoj / trunk / install / java0 policy /home/judge/etc,sudo cp /home/zime/hustoj/trunk/install/judge.conf / home / judge / etc, add execution permission to the ans2out file in the source code. The script is internally cd to the directory specified by the command line parameter $1, and then execute for I in * ans; do mv $i `basename -s . ans $i`.out; done; For all under the directory Rename the ANS file to Out file. We will operate it manually later. We don't need this script. Configuration file etc / judge If OJ is set in conf_ SHM_ Run = 0 (whether to use / dev/shm as the working directory, the default is 0), create four directories run0, run1, run2 and run3 in the main directory, and change the owners of these four directories to judge accounts: sudo mkdir # run0 # run1 # run2 # run3, sudo chown # judge # run0 # run1 # run2 # run3.
According to the previous information, modify the configuration file etc / judge Four parameters in conf: sudo Emacs etc / judge conf,OJ_USER_NAME = database user name, OJ_PASSWORD = database user password, OJ_COMPILE_CHROOT=0 do not use chroot to prevent compile time attacks and OJ_ Running = number of CPU cores
The backup subdirectory and the configuration file, etc / judge The permission of conf is changed to 700: sudo chmod 700 # backup, sudo chmod 700 # etc / judge conf
sed -i "s/DB_USER[[:space:]]*=[[:space:]]*\"root\"/DB_USER=\"$USER\"/g" src/web/include/db_info.inc.php sed -i "s/DB_PASS[[:space:]]*=[[:space:]]*\"root\"/DB_PASS=\"$PASSWORD\"/g" src/web/include/db_info.inc.php chmod 700 src/web/include/db_info.inc.php chown -R www-data src/web/ chown -R root:root src/web/.svn chmod 750 -R src/web/.svn
This is to modify the configuration file of the website sudo emacs /home/zime/hustoj/trunk/web/include/db_info.inc.php, modify DB_USER row and DB_PASS line. Change the permission of the website configuration file to 700, sudo chmod 700 / home/zime/hustoj/trunk/web/include/db_info.inc.php, change the owner of the root directory of the website to the nginx process account www data, sudo chown - R www data / home/zime/hustoj/trunk/web /. We don't need svn, and there is no source code in git svn directory, so don't use the last two sentences.
chown www-data:judge src/web/upload chown www-data:judge data chmod 711 -R data if grep "client_max_body_size" /etc/nginx/nginx.conf ; then echo "client_max_body_size already added" ; else sed -i "s:include /etc/nginx/mime.types;:client_max_body_size 80m;\n\tinclude /etc/nginx/mime.types;:g" /etc/nginx/nginx.conf fi
Modify the owner of upload directory and data directory as nginx process account www data, sudo chown , www data: judge / home/zime/hustoj/trunk/web/upload, sudo , chown , www data: judge / home/judge/data. The permission to modify data directory is 711, sudo , chmod , 711 - R / home/judge/data. sudo emacs /etc/nginx/nginx.conf, modify the nginx main configuration file in include / etc / nginx / mime type; Add a line of client before_ max_ body_ size 80m; That is, the http request body can be up to 80MB
mysql -h localhost -u"$USER" -p"$PASSWORD" < src/install/db.sql echo "insert into jol.privilege values('admin','administrator','true','N');"|mysql -h localhost -u"$USER" -p"$PASSWORD"
Create database mysql - H localhost - uroot - P < / home / zime / hustoj / trunk / install / DB SQL. At this time, you will find that you do not have permission to access, because the default reason is that Ubuntu is packaged in Mariadb root@localhost It's UNIX with plug-ins_ Socket verification, we can use UNIX for all_ The socket authentication method is changed to the traditional password method. Of course, it is more appropriate to give hustoj a special database account.
Sudo mysql, select user, host, plugin from mysql user; Verify whether it is a problem of verification method, update mysql user SET plugin = '' WHERE plugin = 'unix_ socket'; FLUSH PRIVILEGES; Verify that the problem is solved. source /home/zime/hustoj/trunk/install/db.sql} found 42000 syntax errors in lines 253, 256, 257, 259 and 260 or HY000 system variable not found. sudo cp /home/zime/hustoj/trunk/install/db.sql /home/zime/hustoj/trunk/install/db_old.sql, sudo emacs /home/zime/hustoj/trunk/install/db.sql, find the corresponding location, and find that there is an error in the last place to create the stored procedure. Look carefully, the delimiter is set in front of the stored procedure; The procedure function has;, Therefore, we put the end before the stored procedure// Start changing this line
end // CREATE PROCEDURE DEFAULT_ADMINISTRATOR(user_name VARCHAR(48)) BEGIN DECLARE privileged_count INT DEFAULT 0; SET privileged_count=(SELECT COUNT(1) FROM `privilege`); IF privileged_count=0 THEN INSERT INTO privilege values(user_name, 'administrator', 'true', 'N'); end if; end // delimiter ;
Use source to build the database on the mysql command line, or use input redirection to create the database as before. Use mysql -hlocalhost - uroot - p - e "USE jol; call" DEFAULT_ADMINISTRATOR('admin '); " Or USE jol in mysql command line; CALL DEFAULT_ADMINISTRATOR('admin'); Create the default administrator account admin (since the author has created a stored procedure to create subsequent administrators, we can call the stored procedure directly here, so the consistency is better)
if grep "added by hustoj" /etc/nginx/sites-enabled/default ; then echo "default site modified!" else echo "modify the default site" sed -i "s#root /var/www/html;#root /home/judge/src/web;#g" /etc/nginx/sites-enabled/default sed -i "s:index index.html:index index.php:g" /etc/nginx/sites-enabled/default sed -i "s:#location ~ \\\.php\\$:location ~ \\\.php\\$:g" /etc/nginx/sites-enabled/default sed -i "s:#\tinclude snippets:\tinclude snippets:g" /etc/nginx/sites-enabled/default sed -i "s|#\tfastcgi_pass unix|\tfastcgi_pass unix|g" /etc/nginx/sites-enabled/default sed -i "s:}#added by hustoj::g" /etc/nginx/sites-enabled/default sed -i "s:php7.0:php7.4:g" /etc/nginx/sites-enabled/default sed -i "s|# deny access to .htaccess files|}#added by hustoj\n\n\n\t# deny access to .htaccess files|g" /etc/nginx/sites-enabled/default fi /etc/init.d/nginx restart
This part is the website configuration. The author directly implements it by replacing and modifying the default configuration file. For the time being, we'd better write a configuration file and put it under sites available, and then create symbols under sites enabled to the new configuration file: sudo Emacs / etc / nginx / sites enabled / default
root /home/zime/hustoj/trunk/web; index index.php; Remove location ~ \ At the same time, the front of PHP {include #} is also removed_ The pass line changes 7.4 to 8.0
sed -i "s/post_max_size = 8M/post_max_size = 80M/g" /etc/php/7.4/fpm/php.ini sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 80M/g" /etc/php/7.4/fpm/php.ini WWW_CONF=$(find /etc/php -name www.conf) sed -i 's/;request_terminate_timeout = 0/request_terminate_timeout = 128/g' "$WWW_CONF" sed -i 's/pm.max_children = 5/pm.max_children = 200/g' "$WWW_CONF"
sudo emacs /etc/php/8.0/fpm/php.ini, and modify some configuration of PHP_ max_ size=80M, upload_ max_ Filesize = 80m, find /etc/php -name www.conf find the location of www.conf file, and then edit sudo Emacs / etc / PHP / 8.0 / FPM / pool d/www.conf, request_terminate_timeout=128. kill a single request after 128 seconds, PM max_ Children = 200, and the number of concurrency is 200. These two parameters need to be adjusted according to your own situation.
COMPENSATION=$(grep 'mips' /proc/cpuinfo|head -1|awk -F: '{printf("%.2f",$2/5000)}') sed -i "s/OJ_CPU_COMPENSATION=1.0/OJ_CPU_COMPENSATION=$COMPENSATION/g" etc/judge.conf
Learn the CPU speed from bogomips in / proc/cpuinfo file: the roughly calculated CPU speed (Millennium instructions per second) when the system kernel starts, so as to set the penalty time parameter. My virtual machine bogomips=4608.00, divided by 5000 is 0.92, sudo Emacs etc / judge Conf can be modified. Let's skip here. Anyway, the default 1 does not affect the test.
PHP_FPM=$(find /etc/init.d/ -name "php*-fpm") $PHP_FPM restart PHP_FPM=$(service --status-all|grep php|awk '{print $4}') if [ "$PHP_FPM" != "" ]; then service "$PHP_FPM" restart ;else echo "NO PHP FPM";fi;
This part is to restart the service and check sudo systemctl # restart # php8 0-fpm and # sudo systemctl # status # php8 0-fpm
cd src/core || exit chmod +x ./make.sh ./make.sh if grep "/usr/bin/judged" /etc/rc.local ; then echo "auto start judged added!" else sed -i "s/exit 0//g" /etc/rc.local echo "/usr/bin/judged" >> /etc/rc.local echo "exit 0" >> /etc/rc.local fi if grep "bak.sh" /var/spool/cron/crontabs/root ; then echo "auto backup added!" else crontab -l > conf && echo "1 0 * * * /home/judge/src/install/bak.sh" >> conf && crontab conf && rm -f conf fi ln -s /usr/bin/mcs /usr/bin/gmcs /usr/bin/judged cp /home/judge/src/install/hustoj /etc/init.d/hustoj update-rc.d hustoj defaults systemctl enable hustoj systemctl enable nginx systemctl enable mysql systemctl enable php7.4-fpm #systemctl enable judged mkdir /var/log/hustoj/ chown www-data -R /var/log/hustoj/ cls reset echo "Remember your database account for HUST Online Judge:" echo "username:$USER" echo "password:$PASSWORD"
This is the most troublesome part because we replaced mysql with mariadb.
cd /home/zime/hustoj/trunk/core/, sudo chmod a+x ./make.sh, it can't go on. The code from git doesn't have a make file, but there is a makefile, and there will certainly be less things, because we have a software package that hasn't been installed. Please refer to https://www.cnblogs.com/life2refuel/p/5574544.html , https://packages.ubuntu.com/source/bionic/mariadb-connector-c Combined with the connector version we use, try the following:
Sudo apt get install libmariadb3, sudo apt get install libmariadb dev, sudo apt get install libmariadb dev compat the third package is a compatible package. After installation, it is found that there are both mariadb subdirectories and mysql subdirectories in the / usr/include directory, and the file names are the same. In this way, we can include mysql in the name, In fact, mariadb is included to complete the task (/ usr/include/mysql is a symbolic link to / usr/include/mariadb).
Sudo apt get install make, cd / home / zime / hustoj / trunk / core / gadget, make build, there will be several warnings, generate gadget O target file and judged execution file (the judged generated by make itself has x permission, so chmod +x judged in make.sh is not necessary), sudo cp judged /usr/bin , copy the problem server to / usr/bin
cd ../ judge_client, make build and generate judge_client.o and judge_client,sudo cp judge_client / usr/bin: copy the problem determination client to / usr/bin
cd ../ sim/sim_3_01. sudo , apt get install , flex, make , fresh clean up some old generated files that may exist, build make , exes, there are some warnings, and many will be generated o .c . exe file, copy the executable file to / usr/bin
sudo cp sim_c.exe /usr/bin/sim_c,
sudo cp sim_c++.exe /usr/bin/sim_cc,
sudo cp sim_java.exe /usr/bin/sim_java,
sudo cp sim_pasc.exe /usr/bin/sim_pas,
sudo cp sim_text.exe /usr/bin/sim_text,
sudo cp sim_lisp.exe /usr/bin/sim_scm,
cd .. , sudo cp sim.sh / usr/bin , this part of the work is to copy the cheating judgment program (for different languages) to / usr/bin, and then copy the general sim SH copy to / usr/bin, sim SH accepts a parameter, identifies the source code with an extension, and then calls the corresponding cheats.
The above is make SH's work
Next, add judged to the self startup. There is no / etc / rc Local file, self startup is managed by systemd, and self startup services are configured in / lib/systemd/system with RC local Service is actually found from / etc/systemd/system / during startup, so a soft link needs to be established (see https://blog.csdn.net/qq_43685040/article/details/111574332 https://www.trojansun.com/ubuntu-20-04-rc-local.html)
sudo emacs /lib/systemd/system/rc-local. Edit service and add the [Install] section at the end
[Install]
WantedBy=multi-user.target
Alias=rc-local.service
sudo emacs /etc/rc.local edit (New), the contents are as follows (if there are other auto start contents, add / usr / bin / judge before exit 0)
#!/bin/sh
/usr/bin/judged
exit 0
sudo chmod +x /etc/rc.local to RC Add the execution permission to local, and then | sudo systemctl start RC local, sudo | systemctl | restart RC local, sudo | systemctl | status | RC local verify whether the service is active, ps -aux | grep | judged check whether the server program is running
Backup script bak SH and cron perform backups regularly. We skip C#, and skip gmcs
sudo cp /home/zime/hustoj/trunk/install/hustoj /etc/init.d/hustoj
sudo update-rc.d hustoj defaults
sudo systemctl enable hustoj
sudo systemctl enable nginx
sudo systemctl enable mariadb
sudo systemctl enable php8.0-fpm
sudo mkdir /var/log/hustoj/
sudo chown www-data -R /var/log/hustoj/