chore(install/bundle): improve installation procedure

In the past, we make the bundle installation as two parts.
Some of the steps such as compile judger is done at local.
And, to make it work, the steps may in a wrong order.
Now we make most of the steps working online automaticly,
and if you start the container you don't need to wait for
a long time to let it prepare. It will only reset passwords.
There are also some works moved to another place in order
to make the installation flow clearer and simpler.
Using more threads to boost judge_client's make.
Deleted some old things and doing something new.

TODAY: **Merry Christmas!**
This commit is contained in:
Masco Skray 2018-12-25 23:58:33 +08:00
parent eff4c8ed9c
commit 46aa7b7005
2 changed files with 49 additions and 54 deletions

View File

@ -2,15 +2,15 @@ FROM ubuntu:18.04
MAINTAINER MascoSkray <MascoSkray@gmail.com> MAINTAINER MascoSkray <MascoSkray@gmail.com>
#Update apt and install git #Update apt and install git
RUN apt-get update && apt-get install -y git gnupg RUN apt-get update && apt-get install -y git
#Clone the latest UOJ Community verison to local #Clone the latest UOJ Community verison to local
RUN cd ~ && git clone https://github.com/UniversalOJ/UOJ-System.git --depth 1 RUN cd ~ && git clone https://github.com/UniversalOJ/UOJ-System.git --depth 1
#Install environment and set startup script #Install environment and set startup script
RUN cd ~/UOJ-System/install/bundle && sh install.sh -e && echo "\ RUN cd ~/UOJ-System/install/bundle && sh install.sh -p && echo "\
#!/bin/sh\n\ #!/bin/sh\n\
chown -R mysql:mysql /var/lib/mysql /var/run/mysqld\n\ chown -R mysql:mysql /var/lib/mysql /var/run/mysqld\n\
if [ ! -f \"/var/svn/.UOJSetupDone\" ]; then\n\ if [ ! -f \"/var/svn/.UOJSetupDone\" ]; then\n\
cd ~/UOJ-System/install/bundle && sh install.sh -c\n\ cd ~/UOJ-System/install/bundle && sh install.sh -i\n\
fi\n\ fi\n\
service ntp start\n\ service ntp start\n\
service mysql start\n\ service mysql start\n\

View File

@ -16,6 +16,7 @@ getAptPackage(){
export DEBIAN_FRONTEND=noninteractive export DEBIAN_FRONTEND=noninteractive
(echo "mysql-server mysql-server/root_password password $_database_password_";echo "mysql-server mysql-server/root_password_again password $_database_password_") | debconf-set-selections (echo "mysql-server mysql-server/root_password password $_database_password_";echo "mysql-server mysql-server/root_password_again password $_database_password_") | debconf-set-selections
#Update apt sources and install #Update apt sources and install
dpkg -s gnupg 2>/dev/null || (apt-get update && apt-get install -y gnupg)
echo "deb http://ppa.launchpad.net/pinepain/libv8/ubuntu artful main" | tee /etc/apt/sources.list.d/pinepain-libv8.list && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 60C60AA4 echo "deb http://ppa.launchpad.net/pinepain/libv8/ubuntu artful main" | tee /etc/apt/sources.list.d/pinepain-libv8.list && apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 60C60AA4
apt-get update && apt-get install -y vim ntp zip unzip curl wget subversion apache2 libapache2-mod-xsendfile libapache2-mod-php php php-dev php-pear php-zip php-mysql php-mbstring mysql-server cmake fp-compiler re2c libv8-6.6-dev libyaml-dev python python3 python-requests apt-get update && apt-get install -y vim ntp zip unzip curl wget subversion apache2 libapache2-mod-xsendfile libapache2-mod-php php php-dev php-pear php-zip php-mysql php-mbstring mysql-server cmake fp-compiler re2c libv8-6.6-dev libyaml-dev python python3 python-requests
#Install PHP extensions #Install PHP extensions
@ -30,14 +31,13 @@ getOracleJDK(){
mkdir -p /etc/oracle/java/ && echo 'com.oracle.usagetracker.track.last.usage=false' >/etc/oracle/java/usagetracker.properties mkdir -p /etc/oracle/java/ && echo 'com.oracle.usagetracker.track.last.usage=false' >/etc/oracle/java/usagetracker.properties
#Get newest jdk dist file #Get newest jdk dist file
JDK_MIRROR_LINK=https://build.funtoo.org/distfiles/oracle-java/ JDK_MIRROR_LINK=https://build.funtoo.org/distfiles/oracle-java/
#Deprecated #JDK_CNMIRROR_LINK=http://funtoo.neu.edu.cn/funtoo/distfiles/oracle-java/
curl -s ${JDK_MIRROR_LINK} | grep -oP '>jdk-[7,8].*-linux-x64.tar' | sed -e 's/[\",>]//g' -e 's/-linux-x64.tar//g' >jdkdist.list curl -s ${JDK_MIRROR_LINK} | grep -oP '>jdk-[7,8].*-linux-x64.tar' | sed -e 's/[\",>]//g' -e 's/-linux-x64.tar//g' >jdkdist.list
wget ${JDK_MIRROR_LINK}$(sed -n '1p' jdkdist.list)-linux-x64.tar.gz && wget ${JDK_MIRROR_LINK}$(sed -n '$p' jdkdist.list)-linux-x64.tar.gz wget --progress=dot:giga ${JDK_MIRROR_LINK}$(sed -n '1p' jdkdist.list)-linux-x64.tar.gz ${JDK_MIRROR_LINK}$(sed -n '$p' jdkdist.list)-linux-x64.tar.gz
#Change jdk and other environment version to faq.php #Change compiler version to faq.php
sed -i -e 's/Ubuntu Linux 14.04 LTS x64/Ubuntu Linux 18.04 LTS x64/' \ sed -i -e 's/Ubuntu Linux 14.04 LTS x64/Ubuntu Linux 18.04 LTS x64/' \
-e 's/g++ 4.8.4/g++ 7.3.0/' -e 's/gcc 4.8.4/gcc 7.3.0/' -e 's/fpc 2.6.2/fpc 3.0.4/' -e 's/Python 2.7和3.4/Python 2.7和3.6/' \ -e 's/g++ 4.8.4/g++ 7.3.0/' -e 's/gcc 4.8.4/gcc 7.3.0/' -e 's/fpc 2.6.2/fpc 3.0.4/' -e 's/Python 2.7和3.4/Python 2.7和3.6/' \
-e "s/jdk-7u76/$(sed -n '1p' jdkdist.list)/g" -e "s/jdk-8u31/$(sed -n '$p' jdkdist.list)/g" ../../uoj/1/app/controllers/faq.php -e "s/jdk-7u76/$(sed -n '1p' jdkdist.list)/g" -e "s/jdk-8u31/$(sed -n '$p' jdkdist.list)/g" ../../uoj/1/app/controllers/faq.php
#Move jdk file to judge user root #Move jdk file to judger user root
chown local_main_judger jdkdist.list jdk-*-linux-x64.tar.gz chown local_main_judger jdkdist.list jdk-*-linux-x64.tar.gz
mv jdkdist.list jdk-*-linux-x64.tar.gz /home/local_main_judger/ mv jdkdist.list jdk-*-linux-x64.tar.gz /home/local_main_judger/
} }
@ -93,12 +93,12 @@ setSVNServe(){
cat /var/svn/uoj/conf/svnserve.conf >/var/svn/judge_client/conf/svnserve.conf cat /var/svn/uoj/conf/svnserve.conf >/var/svn/judge_client/conf/svnserve.conf
cat >/var/svn/uoj/conf/passwd <<UOJEOF cat >/var/svn/uoj/conf/passwd <<UOJEOF
[users] [users]
root = $_svn_certroot_password_ root = _svn_certroot_password_
UOJEOF UOJEOF
#Set SVN hook scripts #Set SVN hook scripts
cat >/var/svn/uoj/hooks/post-commit <<UOJEOF cat >/var/svn/uoj/hooks/post-commit <<UOJEOF
#!/bin/sh #!/bin/sh
cd /var/svn/uoj/cur/uoj && svn update --username root --password $_svn_certroot_password_ cd /var/svn/uoj/cur/uoj && svn update --username root --password _svn_certroot_password_
UOJEOF UOJEOF
chmod +x /var/svn/uoj/hooks/post-commit chmod +x /var/svn/uoj/hooks/post-commit
cat >/var/svn/judge_client/hooks/post-commit <<UOJEOF cat >/var/svn/judge_client/hooks/post-commit <<UOJEOF
@ -125,7 +125,7 @@ password-db = passwd
EOD EOD
svnusr="our-root" svnusr="our-root"
svnpwd="$_svn_ourroot_password_" svnpwd="_svn_ourroot_password_"
cat >\$path/conf/passwd <<EOD cat >\$path/conf/passwd <<EOD
[users] [users]
@ -146,7 +146,7 @@ UOJEOF
cat >/var/svn/problem/post-commit.sh <<UOJEOF cat >/var/svn/problem/post-commit.sh <<UOJEOF
#!/bin/sh #!/bin/sh
svnusr="our-root" svnusr="our-root"
svnpwd="$_svn_ourroot_password_" svnpwd="_svn_ourroot_password_"
cd /var/svn/problem/\$1/cur/\$1 cd /var/svn/problem/\$1/cur/\$1
svn update --username \$svnusr --password \$svnpwd svn update --username \$svnusr --password \$svnpwd
chown -R www-data /var/svn/problem/\$1 chown -R www-data /var/svn/problem/\$1
@ -154,30 +154,26 @@ UOJEOF
chmod +x /var/svn/problem/post-commit.sh chmod +x /var/svn/problem/post-commit.sh
#Precheckout to cur folder #Precheckout to cur folder
mkdir /var/svn/uoj/cur /var/svn/judge_client/cur mkdir /var/svn/uoj/cur /var/svn/judge_client/cur
svn co svn://127.0.0.1/uoj --username root --password $_svn_certroot_password_ /var/svn/uoj/cur/uoj svn co svn://127.0.0.1/uoj --username root --password '_svn_certroot_password_' /var/svn/uoj/cur/uoj
svn co svn://127.0.0.1/judge_client --username root --password $_svn_certroot_password_ /var/svn/judge_client/cur/judge_client svn co svn://127.0.0.1/judge_client --username root --password '_svn_certroot_password_' /var/svn/judge_client/cur/judge_client
chown -R local_main_judger /var/svn/judge_client/cur/judge_client chown -R local_main_judger /var/svn/judge_client/cur/judge_client
} }
setWebConf(){ setWebConf(){
printf "\n\n==> Setting web files\n" printf "\n\n==> Setting web files\n"
#Commit web source file #Commit web source file
svn co svn://127.0.0.1/uoj --username root --password $_svn_certroot_password_ svn co svn://127.0.0.1/uoj --username root --password '_svn_certroot_password_'
mv ../../uoj/1 uoj/1 && cd uoj cp -r ../../uoj/1 uoj/1 && cd uoj
svn add 1 && svn ci -m "Installtion commit" --username root --password $_svn_certroot_password_ svn add 1 && svn ci -m "Installtion commit" --username root --password '_svn_certroot_password_'
cd .. && rm -r uoj /var/www/uoj cd .. && rm -r uoj
#Set webroot path #Set webroot path
ln -s /var/svn/uoj/cur/uoj/1 /var/www/uoj ln -sf /var/svn/uoj/cur/uoj/1 /var/www/uoj
chown -R www-data /var/www/uoj/app/storage chown -R www-data /var/www/uoj/app/storage
#Set web config file #Set web config file
php -a <<UOJEOF php -a <<UOJEOF
\$config = include '/var/www/uoj/app/.default-config.php'; \$config = include '/var/www/uoj/app/.default-config.php';
\$config['database']['password']='$_database_password_'; \$config['database']['password']='$_database_password_';
\$config['security']['user']['client_salt']='$(genRandStr 32)';
\$config['security']['cookie']['checksum_salt']=['$(genRandStr 16)','$(genRandStr 16)','$(genRandStr 16)'];
\$config['judger']['socket']['port']='$_judger_socket_port_'; \$config['judger']['socket']['port']='$_judger_socket_port_';
\$config['judger']['socket']['password']='$_judger_socket_password_';
\$config['svn']['our-root']['password']='$_svn_ourroot_password_';
file_put_contents('/var/www/uoj/app/.config.php', "<?php\nreturn ".str_replace('\'_httpHost_\'','UOJContext::httpHost()',var_export(\$config, true)).";\n"); file_put_contents('/var/www/uoj/app/.config.php', "<?php\nreturn ".str_replace('\'_httpHost_\'','UOJContext::httpHost()',var_export(\$config, true)).";\n");
UOJEOF UOJEOF
#Import MySQL database #Import MySQL database
@ -188,16 +184,16 @@ UOJEOF
setJudgeConf(){ setJudgeConf(){
printf "\n\n==> Setting judge_client files\n" printf "\n\n==> Setting judge_client files\n"
#Commit judge_client source file #Commit judge_client source file
svn co svn://127.0.0.1/judge_client --username root --password $_svn_certroot_password_ svn co svn://127.0.0.1/judge_client --username root --password '_svn_certroot_password_'
mv ../../judge_client/1 judge_client/1 && cd judge_client cp -r ../../judge_client/1 judge_client/1 && cd judge_client
svn add 1 && svn ci -m "Installation commit" --username root --password $_svn_certroot_password_ svn add 1 && svn ci -m "Installation commit" --username root --password '_svn_certroot_password_'
cd .. && rm -r judge_client cd .. && rm -r judge_client
#Set uoj_data path #Set uoj_data path
mkdir /var/uoj_data mkdir /var/uoj_data
chown -R www-data /var/uoj_data && chgrp -R www-data /var/uoj_data chown -R www-data /var/uoj_data && chgrp -R www-data /var/uoj_data
#Compile judge_client and set runtime #Compile judge_client and set runtime
su local_main_judger <<EOD su local_main_judger <<EOD
svn update /var/svn/judge_client/cur/judge_client --username root --password $_svn_certroot_password_ svn update /var/svn/judge_client/cur/judge_client --username root --password '_svn_certroot_password_'
ln -s /var/svn/judge_client/cur/judge_client/1 ~/judge_client ln -s /var/svn/judge_client/cur/judge_client/1 ~/judge_client
ln -s /var/uoj_data ~/judge_client/uoj_judger/data ln -s /var/uoj_data ~/judge_client/uoj_judger/data
cd ~/judge_client && chmod +x judge_client cd ~/judge_client && chmod +x judge_client
@ -207,7 +203,7 @@ cat >uoj_judger/include/uoj_work_path.h <<UOJEOF
#define UOJ_JUDGER_PYTHON3_VERSION "3.6" #define UOJ_JUDGER_PYTHON3_VERSION "3.6"
#define UOJ_JUDGER_FPC_VERSION "3.0.4" #define UOJ_JUDGER_FPC_VERSION "3.0.4"
UOJEOF UOJEOF
make cd uoj_judger && make -j$(($(grep -c ^processor /proc/cpuinfo) + 1))
mkdir ~/judge_client/uoj_judger/run/runtime && cd ~/judge_client/uoj_judger/run/runtime mkdir ~/judge_client/uoj_judger/run/runtime && cd ~/judge_client/uoj_judger/run/runtime
mv ~/jdkdist.list ~/jdk-*-linux-x64.tar.gz . mv ~/jdkdist.list ~/jdk-*-linux-x64.tar.gz .
tar -xzf jdk-7*-linux-x64.tar.gz && tar -xzf jdk-8*-linux-x64.tar.gz tar -xzf jdk-7*-linux-x64.tar.gz && tar -xzf jdk-8*-linux-x64.tar.gz
@ -219,21 +215,27 @@ EOD
"uoj_protocol": "http", "uoj_protocol": "http",
"uoj_host": "127.0.0.1", "uoj_host": "127.0.0.1",
"judger_name": "main_judger", "judger_name": "main_judger",
"judger_password": "$_main_judger_password_", "judger_password": "_main_judger_password_",
"socket_port": $_judger_socket_port_, "socket_port": $_judger_socket_port_,
"socket_password": "$_judger_socket_password_", "socket_password": "_judger_socket_password_",
"svn_username": "root", "svn_username": "root",
"svn_password": "$_svn_certroot_password_" "svn_password": "_svn_certroot_password_"
} }
UOJEOF UOJEOF
chmod 600 /home/local_main_judger/judge_client/.conf.json chmod 600 /home/local_main_judger/judge_client/.conf.json
chown local_main_judger /home/local_main_judger/judge_client/.conf.json chown local_main_judger /home/local_main_judger/judge_client/.conf.json
#Import judge_client to MySQL database
echo "insert into judger_info (judger_name, password) values (\"main_judger\", \"$_main_judger_password_\")" | mysql app_uoj233 -u root --password=$_database_password_
} }
endUpProgress(){ initProgress(){
printf "\n\n==> Ending progress and start service\n" printf "\n\n==> Doing initial config and start service\n"
#Replace password placeholders
sed -i "s/_svn_ourroot_password_/$_svn_ourroot_password_/g" /var/svn/problem/new_problem.sh /var/svn/problem/post-commit.sh /var/www/uoj/app/.config.php
sed -i "s/_svn_certroot_password_/$_svn_certroot_password_/g" /var/svn/uoj/conf/passwd /var/svn/uoj/hooks/post-commit /home/local_main_judger/judge_client/.conf.json
sed -i -e "s/_main_judger_password_/$_main_judger_password_/g" -e "s/_judger_socket_password_/$_judger_socket_password_/g" /home/local_main_judger/judge_client/.conf.json
sed -i -e "s/salt0/$(genRandStr 32)/g" -e "s/salt1/$(genRandStr 16)/g" -e "s/salt2/$(genRandStr 16)/g" -e "s/salt3/$(genRandStr 16)/g" -e "s/_judger_socket_password_/$_judger_socket_password_/g" /var/www/uoj/app/.config.php
#Import judge_client to MySQL database
service mysql start
echo "insert into judger_info (judger_name, password) values (\"main_judger\", \"$_main_judger_password_\")" | mysql app_uoj233 -u root --password=$_database_password_
#Using cli upgrade to latest #Using cli upgrade to latest
php /var/www/uoj/app/cli.php upgrade:latest php /var/www/uoj/app/cli.php upgrade:latest
#Start services #Start services
@ -241,35 +243,28 @@ endUpProgress(){
service mysql restart service mysql restart
service apache2 restart service apache2 restart
su local_main_judger -c '~/judge_client/judge_client start' su local_main_judger -c '~/judge_client/judge_client start'
#Set SetupDone flag file #Touch SetupDone flag file
echo 'Congratulations!' > /var/svn/.UOJSetupDone touch /var/svn/.UOJSetupDone
printf "\n\n***Installation complete. Enjoy!***\n" printf "\n\n***Installation complete. Enjoy!***\n"
} }
prepProgress(){
getAptPackage;getOracleJDK;setLAMPConf;setSVNServe;setWebConf;setJudgeConf
}
if [ $# -le 0 ] ;then if [ $# -le 0 ] ;then
echo 'Installing UOJ System bundle...' echo 'Installing UOJ System bundle...'
getAptPackage prepProgress;initProgress
getOracleJDK
setLAMPConf
setSVNServe
setWebConf
setJudgeConf
endUpProgress
fi fi
while [ $# -gt 0 ]; do while [ $# -gt 0 ]; do
case "$1" in case "$1" in
-e | --environment) -p | --prep)
echo 'Setting UOJ System bundle environment...' echo 'Preparing UOJ System bundle environment...'
getAptPackage prepProgress
getOracleJDK
setLAMPConf
;; ;;
-c | --config) -i | --init)
echo 'Configuring UOJ System bundle...' echo 'Initing UOJ System bundle...'
setSVNServe initProgress
setWebConf
setJudgeConf
endUpProgress
;; ;;
-? | --*) -? | --*)
echo "Illegal option $1" echo "Illegal option $1"