diff --git a/install/bundle/Dockerfile b/install/bundle/Dockerfile index 3d63518..8746126 100644 --- a/install/bundle/Dockerfile +++ b/install/bundle/Dockerfile @@ -1,30 +1,23 @@ -FROM vfleaking/uoj -MAINTAINER vfleaking vfleaking@163.com -COPY docker/sources.list /etc/apt/sources.list -COPY uoj/1 /root/uoj_1 -COPY judge_client/1 /root/judge_client_1 +FROM ubuntu:14.04 +MAINTAINER MascoSkray -COPY docker/new_problem.sh \ - docker/post-commit.sh \ - docker/uoj-passwd \ - docker/uoj-post-commit \ - docker/gen-uoj-config.php \ - docker/app_uoj233.sql \ - /root/ - -COPY docker/jdk-7u76-linux-x64.tar.gz \ - docker/jdk-8u31-linux-x64.tar.gz \ - /home/local_main_judger/ - -COPY docker/install /root/install - -RUN cd /root && php gen-uoj-config.php && chmod +x install -RUN cd /root && ./install && rm * -rf - -COPY docker/up /root/up - -RUN chmod +x /root/up +#Update apt and install git +RUN apt-get update -y && apt-get install -y git +#Clone the latest UOJ Community verison to local +RUN cd ~ && git clone https://github.com/UniversalOJ/UOJ-System.git +#Install environment and set startup script +RUN cd ~/UOJ-System/install/bundle && bash install.sh -e && echo "\ +#!/bin/bash\n\ +if [ ! -f "/var/svn/.UOJSetupDone" ]; then\n\ + cd ~/UOJ-System/install/bundle && bash install.sh -c\n\ +fi\n\ +service ntp start\n\ +service mysql start\n\ +service apache2 start\n\ +svnserve -d -r /var/svn\n\ +su local_main_judger -c \"~/judge_client/judge_client start\"\n\ +exec bash\n" >/root/up && chmod +x /root/up +ENV LANG=C.UTF-8 TZ=Asia/Shanghai EXPOSE 80 3690 - CMD /root/up diff --git a/install/bundle/docker_install_uoj b/install/bundle/docker_install_uoj deleted file mode 100755 index 48753c3..0000000 --- a/install/bundle/docker_install_uoj +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -docker build -f Dockerfile --no-cache=true . -t uoj diff --git a/install/bundle/gen-uoj-config.php b/install/bundle/gen-uoj-config.php deleted file mode 100644 index 491cebf..0000000 --- a/install/bundle/gen-uoj-config.php +++ /dev/null @@ -1,110 +0,0 @@ - $v) { - $content = str_replace("__{$k}__", $v, $content); - } - file_put_contents($target, $content); -} - -$svn_pwd = rand_str(32); -$svn_cert = '--username root --password '.$svn_pwd; - -$config = [ - 'profile' => [ - 'oj-name' => 'Universal Online Judge', - 'oj-name-short' => 'UOJ', - 'administrator' => 'root', - 'admin-email' => 'admin@local_uoj.ac', - 'QQ-group' => '', - 'ICP-license' => '' - ], - 'database' => [ - 'database' => 'app_uoj233', - 'username' => 'root', - 'password' => 'root', - 'host' => '127.0.0.1' - ], - 'web' => [ - 'domain' => null, - 'main' => [ - 'protocol' => 'http', - 'host' => '23333', - 'port' => 80 - ], - 'blog' => [ - 'protocol' => 'http', - 'host' => '23333', - 'port' => 80 - ] - ], - 'security' => [ - 'user' => [ - 'client_salt' => rand_str(32) - ], - 'cookie' => [ - 'checksum_salt' => [rand_str(16), rand_str(16), rand_str(16)] - ], - ], - 'mail' => [ - 'noreply' => [ - 'username' => 'noreply@none', - 'password' => 'noreply' - ] - ], - 'judger' => [ - 'socket' => [ - 'port' => 2333, - 'password' => rand_str(32) - ] - ], - 'svn' => [ - 'our-root' => [ - 'username' => 'our-root', - 'password' => rand_str(32) - ] - ], - 'switch' => [ - 'ICP-license' => false, - 'web-analytics' => false, - 'blog-use-subdomain' => false - ] -]; - -$judge_client_config = [ - 'uoj_protocol' => 'http', - 'uoj_host' => '127.0.0.1', - 'judger_name' => 'main_judger', - 'judger_password' => rand_str(32), - 'socket_port' => $config['judger']['socket']['port'], - 'socket_password' => $config['judger']['socket']['password'], - 'svn_username' => 'root', - 'svn_password' => $svn_pwd -]; - -$translate_table = [ - 'svn_cert' => $svn_cert, - 'svn_pwd' => $svn_pwd, - 'our_root_password' => $config['svn']['our-root']['password'], - 'main_judger_password' => $judge_client_config['judger_password'] -]; - -translate('new_problem.sh', '/var/svn/problem/new_problem.sh', $translate_table); -translate('post-commit.sh', '/var/svn/problem/post-commit.sh', $translate_table); - -translate('uoj-passwd', '/var/svn/uoj/conf/passwd', $translate_table); -translate('uoj-post-commit', '/var/svn/uoj/hooks/post-commit', $translate_table); -file_put_contents('uoj_config.php', "uoj_judger/include/uoj_work_path.h -make -ln -s /var/uoj_data ~/judge_client/uoj_judger/data - -mkdir ~/judge_client/uoj_judger/run/runtime -mv ~/jdk-7u76-linux-x64.tar.gz ~/jdk-8u31-linux-x64.tar.gz ~/judge_client/uoj_judger/run/runtime -cd ~/judge_client/uoj_judger/run/runtime -tar -xzf jdk-7u76-linux-x64.tar.gz -tar -xzf jdk-8u31-linux-x64.tar.gz -EOD - -mv judge_client_config.json /home/local_main_judger/judge_client/.conf.json -chown local_main_judger /home/local_main_judger/judge_client/.conf.json -chmod 600 /home/local_main_judger/judge_client/.conf.json - -echo 'insert into judger_info (judger_name, password) values ("main_judger", "__main_judger_password__")' | mysql app_uoj233 -u root --password=root - -php /var/www/uoj/app/cli.php upgrade:latest diff --git a/install/bundle/install.sh b/install/bundle/install.sh new file mode 100644 index 0000000..7d226a2 --- /dev/null +++ b/install/bundle/install.sh @@ -0,0 +1,251 @@ +#!/bin/bash +genRandStr(){ + cat /dev/urandom | tr -dc [:alnum:] | head -c $1 +} +#Set some vars +_database_password_=root +_judger_socket_port_=2333 +_judger_socket_password_=$(genRandStr 10) +_main_judger_password_=$(genRandStr 32) +_svn_ourroot_password_=$(genRandStr 10) +_svn_certroot_password_=$(genRandStr 32) + +getAptPackage(){ + echo -e "\n\n==> Getting environment packages" + #Set MySQL root password + debconf-set-selections <<< "mysql-server-5.6 mysql-server/root_password password $_database_password_" && debconf-set-selections <<< "mysql-server-5.6 mysql-server/root_password_again password $_database_password_" + #Update apt sources and install + apt-get update -y + apt-get install -y vim ntp zip unzip curl wget subversion apache2 libapache2-mod-xsendfile libapache2-mod-auth-mysql php5 php5-dev php-pear php5-mysql mysql-server-5.6 cmake fp-compiler re2c libv8-dev libyaml-dev python python3 python-requests + #Install PHP extensions + echo -e "\n\n" | pecl install v8js-0.1.3 yaml-1.3.1 +} + +getOracleJDK(){ + echo -e "\n\n==> Getting JDK runtime files" + #Add judger user + useradd -m local_main_judger && usermod -a -G www-data local_main_judger + #Get newest jdk dist file + JDK_MIRROR_LINK=http://ftp.osuosl.org/pub/funtoo/distfiles/oracle-java/ + 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 + wget ${JDK_MIRROR_LINK}$(sed -n '1p' jdkdist.list)-linux-x64.tar.gz && wget ${JDK_MIRROR_LINK}$(sed -n '2p' jdkdist.list)-linux-x64.tar.gz + #Change jdk version to faq.php + sed -i -e "s/jdk-7u76/$(sed -n '1p' jdkdist.list)/g" -e "s/jdk-8u31/$(sed -n '2p' jdkdist.list)/g" ../../uoj/1/app/controllers/faq.php + #Move jdk file to judge user root + chown local_main_judger jdkdist.list jdk-*-linux-x64.tar.gz + mv jdkdist.list jdk-*-linux-x64.tar.gz /home/local_main_judger/ +} + +setLAMPConf(){ + echo -e "\n\n==> Setting LAMP configs" + #Set Apache UOJ site conf + cat >/etc/apache2/sites-available/000-uoj.conf < + #ServerName local_uoj.ac + ServerAdmin vfleaking@163.com + DocumentRoot /var/www/uoj + + #LogLevel info ssl:warn + ErrorLog \${APACHE_LOG_DIR}/uoj_error.log + CustomLog \${APACHE_LOG_DIR}/uoj_access.log combined + + XSendFile On + XSendFilePath /var/uoj_data + XSendFilePath /var/www/uoj/app/storage + XSendFilePath /home/local_main_judger/judge_client/uoj_judger/include + +UOJEOF + #Enable modules and make UOJ site conf enabled + a2ensite 000-uoj.conf && a2dissite 000-default.conf + a2enmod rewrite headers && sed -i -e '166s/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf + #Create UOJ session save dir and make PHP extensions available + mkdir --mode=733 /var/lib/php5/uoj && chmod +t /var/lib/php5/uoj + sed -i -e '866a\extension=v8js.so\nextension=yaml.so' /etc/php5/apache2/php.ini + #Set MySQL user directory and connection config + usermod -d /var/lib/mysql/ mysql + sed -i -e "108a\init_connect='SET collation_connection = utf8_unicode_ci'\ninit_connect='SET NAMES utf8'\ncharacter-set-server=utf8\ncollation-server=utf8_unicode_ci\nskip-character-set-client-handshake" -e "117a\default-character-set=utf8" /etc/mysql/my.cnf +} + +setSVNServe(){ + echo -e "\n\n==> Setting SVN server" + #Make SVN work dir + mkdir /var/svn && svnserve -d -r /var/svn + mkdir /var/svn/problem && chown www-data /var/svn/problem -R + svnadmin create /var/svn/uoj && svnadmin create /var/svn/judge_client + #Set SVN server config file and password db + sed -i -e 's/# store-plaintext-passwords = no/store-plaintext-passwords = yes/g' /etc/subversion/servers + sed -i -e 's/# anon-access/anon-access/g' -e 's/# auth-access/auth-access/g' -e 's/# password-db/password-db/g' /var/svn/uoj/conf/svnserve.conf + rm -r /var/svn/judge_client/conf/passwd && ln -s /var/svn/uoj/conf/passwd /var/svn/judge_client/conf/passwd + cat /var/svn/uoj/conf/svnserve.conf >/var/svn/judge_client/conf/svnserve.conf + cat >/var/svn/uoj/conf/passwd </var/svn/uoj/hooks/post-commit </var/svn/judge_client/hooks/post-commit </var/svn/problem/new_problem.sh <\$path/conf/svnserve.conf <\$path/conf/passwd <\$path/hooks/post-commit </var/svn/problem/post-commit.sh < Setting web files" + #Commit web source file + svn co svn://127.0.0.1/uoj --username root --password $_svn_certroot_password_ + mv ../../uoj/1 uoj/1 && cd uoj + svn add 1 && svn ci -m "Installtion commit" --username root --password $_svn_certroot_password_ + cd .. && rm uoj /var/www/uoj -r + #Set webroot path + ln -s /var/svn/uoj/cur/uoj/1 /var/www/uoj + chown www-data /var/www/uoj/app/storage -R + #Set web config file + php -a < Setting judge_client files" + #Commit judge_client source file + 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 + svn add 1 && svn ci -m "Installation commit" --username root --password $_svn_certroot_password_ + cd .. && rm judge_client -r + #Set uoj_data path + mkdir /var/uoj_data + chown www-data /var/uoj_data -R && chgrp www-data /var/uoj_data -R + #Compile judge_client and set runtime + su local_main_judger <uoj_judger/include/uoj_work_path.h +make +mkdir ~/judge_client/uoj_judger/run/runtime && cd ~/judge_client/uoj_judger/run/runtime +mv ~/jdkdist.list ~/jdk-*-linux-x64.tar.gz . +tar -xzf jdk-7*-linux-x64.tar.gz && tar -xzf jdk-8*-linux-x64.tar.gz +mv jdk1.7* jdk1.7.0_latest && mv jdk1.8* jdk1.8.0_latest +EOD + #Set judge_client config file + cat >/home/local_main_judger/judge_client/.conf.json < Ending progress and start service" + #Using cli upgrade to latest + php /var/www/uoj/app/cli.php upgrade:latest + #Start services + service ntp restart + service mysql restart + service apache2 restart + su local_main_judger -c '~/judge_client/judge_client start' + #Set SetupDone flag file + echo 'Congratulations!' > /var/svn/.UOJSetupDone + echo -e "\n\n***Installation complete. Enjoy!***" +} + +if [ "$1" == "-e" ] ;then + echo 'Setting UOJ System bundle environment...' + getAptPackage + getOracleJDK + setLAMPConf +elif [ "$1" == "-c" ] ;then + echo 'Configuring UOJ System bundle...' + setSVNServe + setWebConf + setJudgeConf + endUpProgress +else + echo 'Installing UOJ System bundle...' + getAptPackage + getOracleJDK + setLAMPConf + setSVNServe + setWebConf + setJudgeConf + endUpProgress +fi diff --git a/install/bundle/new_problem.sh b/install/bundle/new_problem.sh deleted file mode 100644 index 9e4b36c..0000000 --- a/install/bundle/new_problem.sh +++ /dev/null @@ -1,34 +0,0 @@ -if [ $# -ne 1 ] -then - echo 'invalid argument' - exit 1 -fi - -path=/var/svn/problem/$1 -mkdir $path -svnadmin create $path -cat >$path/conf/svnserve.conf <$path/conf/passwd <$path/hooks/post-commit < [ - 'oj-name' => 'Universal Online Judge', + 'oj-name' => 'Universal Online Judge', 'oj-name-short' => 'UOJ', 'administrator' => 'root', 'admin-email' => 'admin@local_uoj.ac', @@ -9,21 +9,21 @@ return [ 'ICP-license' => '' ], 'database' => [ - 'database' => 'app_uoj233', + 'database' => 'app_uoj233', 'username' => 'root', - 'password' => '', + 'password' => '_database_password_', 'host' => '127.0.0.1' ], 'web' => [ 'domain' => null, 'main' => [ 'protocol' => 'http', - 'host' => UOJContext::httpHost(), + 'host' => '_httpHost_', 'port' => 80 ], 'blog' => [ 'protocol' => 'http', - 'host' => UOJContext::httpHost(), + 'host' => '_httpHost_', 'port' => 80 ] ], @@ -37,9 +37,9 @@ return [ ], 'mail' => [ 'noreply' => [ - 'username' => 'noreply@none', - 'password' => 'noreply', - 'host' => 'smtp.sina.com', + 'username' => 'noreply@local_uoj.ac', + 'password' => '_mail_noreply_password_', + 'host' => 'smtp.local_uoj.ac', 'secure' => '', 'port' => 25 ] @@ -47,13 +47,13 @@ return [ 'judger' => [ 'socket' => [ 'port' => '233', - 'password' => 'password233' + 'password' => '_judger_socket_password_' ] ], 'svn' => [ 'our-root' => [ 'username' => 'our-root', - 'password' => 'our-root' + 'password' => '_svn_ourroot_password_' ] ], 'switch' => [