【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ほど追加しました。

EC2

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.demotrueにしてください。

最期に,

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が開けます。

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のデータベースを削除し作り直すとうまくいく場合があります。