【Ubuntu20.04】Sakai LMSをセルフホストする
こんにちはdas08です。 最近PandAの周辺開発だけでは物足りなく,自前PandAサーバーを立てて遊ぶようになったので,PandAサーバーの立て方を紹介しようと思います。
PandAは米開発のSakai LMSをベースに京大独自の機能を追加しているため,今回はこのSakai LMSをUbuntu20.04でセルフホストしようと思います。
AWSのEC2でUbuntu20.04を建てる
まずはUbuntuサーバーを用意します。今回はAWSのEC2を使ってサクッと立てようと思います。EC2は従量課金制なので,サーバーを立てっぱなしだと請求額がとんでもないことになります。 請求アラートをつけるか,使っていないときはサーバーを落とすようにしましょう。
インスタンスのスペックですが,
- CPU: 2コア
- メモリ: 4GB
- ストレージ: 10~15GB
程度がおすすめです。Sakai LMSはJavaベースでメモリを結構食うので2GBだとカツカツでしんどいです。
私はc5.large
インスタンスで,ストレージを6GBほど追加しました。
Sakaiのダウンロード
次にSakai LMSをダウンロードします。Sakai LMSはオープンソースソフトウェアなのでGithubからソースコードをダウンロードできます。
1cd ~
2git clone https://github.com/sakaiproject/sakai
Sakaiには色々バージョンがありますが,今回は比較的新しいSakai 20を立てます。京大のPandAもSakai20がベースになっています。
1cd sakai
2git checkout tags/20.1
これでSakaiの準備は完了です。
ソフトウェアの準備
Sakaiをビルドするには以下のソフトウェア環境が必要です。
- Java 1.8
- MySQL 5.6以上
- Maven 3
- Tomcat 9
これらを順にインストールしていきます。
Javaのインストール
Javaは1.8がマストなのでインストールします。
1sudo apt update
2sudo apt install openjdk-8-jdk
MySQLのインストール
MySQLは5.6以上が推奨らしいので,5.6をインストールします。
https://downloads.mysql.com/archives/community/
ここから目的のものを探し,wget
などでサーバーにダウンロードします。
1wget https://downloads.mysql.com/archives/get/p/23/file/mysql-server_5.6.51-1debian9_amd64.deb-bundle.tar
2tar -xf mysql-server_5.6.51-1debian9_amd64.deb-bundle.tar
この内必要なものだけをインストールします。
1sudo dpkg -i mysql-common_5.6.51-1debian9_amd64.deb
2sudo dpkg -i mysql-community-client_5.6.51-1debian9_amd64.deb
3sudo dpkg -i mysql-community-server_5.6.51-1debian9_amd64.deb
次にMySQLにSakaiのデータベースとユーザーを作ります。
1mysql> create database sakaidatabase default character set utf8;
2Query OK, 1 row affected (0.00 sec)
3
4mysql> grant all on sakaidatabase.* to sakaiuser@'localhost' identified by 'sakaipassword';
5Query OK, 0 rows affected (0.00 sec
6
7mysql> grant all on sakaidatabase.* to sakaiuser@'127.0.0.1' identified by 'sakaipassword';
8Query OK, 0 rows affected (0.00 sec)
9
10mysql> flush privileges;
11Query OK, 0 rows affected (0.00 sec)
12
13mysql> quit
これでMySQLの設定は終わりです。
Mavenのインストール
Sakaiをビルドするのに使います。今回はMaven 3.8を入れます。
1cd ~
2wget https://dlcdn.apache.org/maven/maven-3/3.8.2/binaries/apache-maven-3.8.2-bin.tar.gz
3tar -xf apache-maven-3.8.2-bin.tar.gz
ルートディレクトリにapache-maven-3.8.2
ディレクトリができるので,PATHを通します。.bashrc
に,
1export PATH=$PATH:$HOME/apache-maven-3.8.2/bin
と追記します。保存したらsource ~/.bashrc
でPATHを読み込んで終わりです。
Tomcatのインストール
最期にブラウザでSakaiにアクセスできるように,Tomcatを入れます。Sakai20ではTomcat9推奨なので,これをインストールします。
https://tomcat.apache.org/download-90.cgi
このサイトから目的のものを選択してwget
します。
https://mebee.info/2020/05/28/post-11921/
こちらのサイトを参考にTomcatの設定をしていきます。
1cd ~
2wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.53/bin/apache-tomcat-9.0.53.tar.gz
3sudo tar -xf apache-tomcat-9.0.53.tar.gz -C /opt/tomcat/
4sudo ln -s /opt/tomcat/apache-tomcat-9.0.53 /opt/tomcat/latest
5sudo sh -c 'chmod +x /opt/tomcat/latest/bin/*.sh
1sudo nano /etc/systemd/system/tomcat.service
systemdの設定
1[Unit]
2Description=Tomcat 9 servlet container
3After=network.target
4
5[Service]
6Type=forking
7
8User=tomcat
9Group=tomcat
10
11Environment="JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64"
12Environment="JAVA_OPTS=-Djava.security.egd=file:///dev/urandom -Djava.awt.headless=true"
13
14Environment="CATALINA_BASE=/opt/tomcat/latest"
15Environment="CATALINA_HOME=/opt/tomcat/latest"
16Environment="CATALINA_PID=/opt/tomcat/latest/temp/tomcat.pid"
17Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
18
19ExecStart=/opt/tomcat/latest/bin/startup.sh
20ExecStop=/opt/tomcat/latest/bin/shutdown.sh
21
22[Install]
23WantedBy=multi-user.target
最期にEC2のポート8080
をAWSコンソールから開放すれば完了です。
環境変数の設定
.bashrc
にSakaiで必要な環境変数の設定をします。
1# Sakai
2export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
3export CATALINA_HOME=/opt/tomcat/latest
4export MAVEN_HOME=$HOME/apache-maven-3.8.2
5export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin:$CATALINA_HOME/bin:$HOME/apache-maven-3.8.2/bin
6export MAVEN_OPTS='-Xms512m -Xmx1024m'
適宜自分のインストール先やバージョンと置き換えてください。保存したらsource ~/.bashrc
で再読み込みします。
MySQLコネクターの配置
JavaとMySQLをつなげるコネクターを追加します。
https://dev.mysql.com/downloads/connector/j/
ここからコネクターをダウンロードし,$CATALINA_HOME/lib
に入れます。
1cd ~
2wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java_8.0.26-1ubuntu20.04_all.deb
3mkdir gomi
4sudo dpkg -x mysql-connector-java_8.0.26-1ubuntu20.04_all.deb ./gomi
gomi/usr/share/java
の中にあるmysql-connector-java-8.0.26.jar
を$CATALINA_HOME/lib
にコピーします。
Sakaiの設定ファイルの作成
次にSakaiが使うMySQLデータベースの設定を記述します。
先程設定した$CATALINA_HOME
の中にsakai
ディレクトリを作ります。
1cd $CATALINA_HOME
2sudo mkdir sakai
sakai.properties
ファイルをその中に作成します。
1cd sakai
2sudo nano sakai.properties
設定内容はこんな感じにします。データベース名やユーザー情報は適宜置き換えてください。
1## MySQL settings
2# Replace by whatever username you assigned in the database setup
3username@javax.sql.BaseDataSource=sakaiuser
4# Replace by whatever password you assigned to the sakaiuser in the database setup
5password@javax.sql.BaseDataSource=sakaipassword
6
7# use your sakaidatabase name in the URI that starts url@javax.sql.BaseDataSource= , below.
8
9vendor@org.sakaiproject.db.api.SqlService=mysql
10driverClassName@javax.sql.BaseDataSource=com.mysql.jdbc.Driver
11hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
12url@javax.sql.BaseDataSource=jdbc:mysql://127.0.0.1:3306/sakaidatabase?useUnicode=true&characterEncoding=UTF-8
13validationQuery@javax.sql.BaseDataSource=select 1 from DUAL
14defaultTransactionIsolationString@javax.sql.BaseDataSource=TRANSACTION_READ_COMMITTED
起動時間を短くする
Sakaiの起動時間を短くするための設定をします。
1cd $CATALINA_HOME/conf
2sudo nano context.xml
この中に次の記述を加えます
1<Context>
2 <!-- (中略) -->
3 <JarScanner>
4 <!-- This is to speedup startup so that tomcat doesn't scan as much -->
5 <JarScanFilter defaultPluggabilityScan="false" />
6 </JarScanner>
7</Context>
Sakai用の環境変数の設定をする
次にSakaiが使う環境変数の設定ファイルを作成します。
1cd $CATALINA_HOME/bin
2sudo nano setenv.sh
中身は以下を記述します。
1export JAVA_OPTS='-server -Xms512m -Xmx1024m -XX:PermSize=128m -XX:NewSize=192m -XX:MaxNewSize=384m -Djava.awt.headless=true -Dhttp.agent=Sakai -Dorg.apache.jasper.compiler.Parser.STRICT_QUOTE_ESCAPING=false -Dsun.lang.ClassLoader.allowArraySyntax=true -Djava.util.Arrays.useLegacyMergeSort=true -Dsakai.demo=false
Sakaiの初回起動時にデモデータを入れたい場合は-Dsakai.demo
をtrue
にしてください。
最期に,
1sudo chmod +x setenv.sh
をします。
Sakaiのビルド
ようやくSakaiのビルドの準備ができました。sakai
ディレクトリに行き,ビルドを始めます。
1cd ~/sakai
masterのビルド
まずはじめにmasterをビルドします。
1cd master
2mvn clean install
Sakai本体のビルド
次にSakai本体をビルドします。
1cd ../
2mvn clean install -Dmaven.tomcat.home=$CATALINA_HOME -Djava.net.preferIPv4Stack=true -Dmaven.test.skip=true -Dsakai.cleanup=true
ビルドには大体5分から10分かかります。初回は依存関係のダウンロードが入るので,30分程度かかる場合があります。
Sakaiのデプロイ
最期にビルドしたものをデプロイします。
1mvn sakai:deploy -Dmaven.tomcat.home=$CATALINA_HOME -Djava.net.preferIPv4Stack=true -Dmaven.test.skip=true -Dsakai.cleanup=true
これはそこまで時間がかからないと思います。
起動!
最終工程です。Sakaiを起動します。
1cd $CATALINA_HOME
2./startup.sh
でサーバーを起動します。 起動には数分かかるので,気長に待ちます。起動中のログは,
1tail -f $CATALINA_HOME/logs/catalina.out
で確認できます。
うまくいくと,
http://<サーバーのIP>:8080/portal
からSakaiが開けます。
ちなみにデフォルトの管理者はadmin
です。パスワードもadmin
で入れます。
1cd $CATALINA_HOME
2./shutdown.sh
でSakaiをシャットダウンできます。
トラブルシューティング
- ビルド時に401 Unauthorizedがでる
1[ERROR] Failed to execute goal on project sakai-citations-util: Could not resolve dependencies for project org.sakaiproject:sakai-citations-util:jar:20.2:
2Failed to collect dependencies at zing:cql-java:jar:0.7: Failed to read artifact descriptor for zing:cql-java:jar:0.7:
3Could not transfer artifact zing:cql-java:pom:0.7 from/to repository.spring.libs.release (https://repo.spring.io/libs-release):
4Authentication failed for https://repo.spring.io/libs-release/zing/cql-java/0.7/cql-java-0.7.pom 401 Unauthorized
このようなエラーが出る場合は,sakai/master/pom.xml
の中の,
1<repository>
2 <id>repository.spring.libs.release</id>
3 <name>Spring Lib Repository</name>
4 <url>https://repo.spring.io/libs-release</url>
5 <snapshots>
6 <enabled>false</enabled>
7 </snapshots>
8</repository>
をコメントアウトするとビルドできるようになります。
- デプロイ時にエラーが出る
admin-tools
などでNullPointerExceptionが出る場合は,$CATALINA_HOME/webapp
を消すと解決できます。
また,MySQLのデータベースを削除し作り直すとうまくいく場合があります。