Jenkinsの起動構成をカスタマイズする

前提

  • Ubuntu 24.04.1
  • aptでインストール

問題点

jenkins.service内で、port番号などを変更していると、apt upgradeで更新するたびに、元に戻ってしまう。

解決策

sudo systemctl edit jenkins
又は、
sudo vi /etc/systemd/system/jenkins.service.d/override.conf
を使う。

参考手順

以下の手順でJenkinsをインストールする。

sudo wget -O /usr/share/keyrings/jenkins-keyring.asc https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key

echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" https://pkg.jenkins.io/debian-stable binary/ | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null

sudo apt update
sudo apt upgrade
sudo apt install jenkins

Apacheと連携するように設定する。

sudo a2enmod proxy
sudo a2enmod proxy_http
sudo vi /etc/apache2/sites-available/jenkins.conf

ProxyPass         /jenkins  http://localhost:8080/jenkins nocanon
ProxyPassReverse  /jenkins  http://localhost:8080/jenkins
ProxyRequests     Off
AllowEncodedSlashes NoDecode

<Proxy http://localhost:8080/jenkins*>
  Order deny,allow
  Allow from all
</Proxy>

jenkins.confを有効にして、Apacheを再起動する。

sudo a2ensite jenkins.conf
sudo systemctl restart apache2

Jenkinsの起動構成を変更する。

sudo systemctl edit jenkins

又は、

sudo vi /etc/systemd/system/jenkins.service.d/override.conf

先ほど設定したApacheのURLと合うように、JENKINS_PREFIX=/jenkinsとする。

[Unit]
Description=Jenkins Controller

[Service]
Environment="JENKINS_PREFIX=/jenkins"

Jenkinsを再起動する。

sudo systemctl restart jenkins

Ubuntu Server 24.04 LTSをインストールする

インストール用ISOファイルをダウンロード

https://jp.ubuntu.com/download

インストール用ISOファイルをUSBメモリに展開

ダウンロードしたISOファイルを展開してUSBメモリに書き込む。

自分はUSBWriterを使用。

USBメモリから起動しインストール

基本はデフォルトで設定し、以下項目だけ変更した。

  • 静的IPの設定
  • Open SSHのインストール

SSHで繋いで環境構築

sudo apt update
sudo apt upgrade
sudo reboot

Webminのインストール

curl -o setup-repos.sh https://raw.githubusercontent.com/webmin/webmin/master/setup-repos.sh
sudo sh setup-repos.sh
sudo apt install --install-recommends webmin

その他

 →Ubuntu Server 22.04 LTSをインストールする
 →Ubuntu Proを使ってみる

PostgreSQLをダウンロードして、データベースを作成する

テスト用のユーザーと、テスト用のデータベースを作成して、実行する。

PostgreSQLのダウンロード

Zipファイルをダウンロードし、解凍する。

https://www.enterprisedb.com/download-postgresql-binaries

データベースクラスタの作成

データベース等の保存先になるフォルダを指定する。

PostgreSQLインストールフォルダ\bin\initdb.exe -D "任意フォルダ"

起動

PostgreSQLを起動する。

PostgreSQLインストールフォルダ\bin\pg_ctl.exe start -D "データベースクラスタのフォルダ" -l "任意フォルダ\ログファイル名"

以降、起動状態で作業する。

ユーザー作成

パスワード有りで、ユーザーを作成する。

PostgreSQLインストールフォルダ\bin\createuser -P testuser

データベース作成

先ほど作成したユーザーをオーナーに指定しデータベースを作成する。

PostgreSQLインストールフォルダ\bin\createdb -O testuser testdb

終了

PostgreSQLを終了する。

PostgreSQLインストールフォルダ\bin\pg_ctl.exe stop -D "データベースクラスタのフォルダ" -l "任意フォルダ\ログファイル名"

Raspberry pi 2 Clusteringで遊ぶ

発売当時くらいに買ったRaspberry pi 2を一通り遊んだ後、放置して使っていなかったので、またちょっと遊んでみる。

ゴール

Raspberry piが手元に7台あるので、Load Balancer、 Reverse Proxy、Application Server、DB Serverで冗長構成を作成してみる。

Raspberry pi 2はメインメモリが2GB、CPUも32bitと今の基準からすると非力なので、なるべく軽い構成にする。Kubernetesとか使いたかったが、スペック的に無理だった。

Load Balancer: Nginx
Reverse Proxy: Nginx ※無くても良い
Application Server: Apache Tomcat 10 (Java 21)
DB Server: MariaDB

Ubuntu 22のインストール

Raspberry Pi Imagerを使ってUbuntuをSDカードにインストールする。

OSでOther general-purpose OS > Ubuntu > Ubuntu Server 22.04.4 LTS (32bit)を選択する。

初期設定

適当に選んだRaspberry Piで起動し、共通の設定を行ってから、SDカードのイメージを取り、他のSDカードにコピーしていく。

sudo apt update
sudo apt upgrade
sudo apt install net-tools


ローカルで使うだけなので、SSH接続でパスワード認証出来るようにしてしまう。

sudo vi /etc/ssh/sshd_config.d/60-cloudimg-settings.conf
下記の通り修正

PasswordAuthentication yes


静的なIPを割り当てる。
イメージを他の機器にコピーするときはIPを変更する。

sudo vi /etc/netplan/50-cloud-init.yaml
下記の通り修正

network:
    ethernets:
        eth0:
            dhcp4: false
            dhcp6: false
            addresses: [ローカルIP/24] #設定したIPは機器ごとに後で変更すること
            routes:
                - to: default
                  via: ゲートウェイIP #無いならroutesの設定いらない
            nameservers:
                addresses: [8.8.8.8, 8.8.4.4]
    version: 2


ホスト名を変更可能にする。

sudo netplan try
sudo vi /etc/cloud/cloud.cfg
下記の通り修正

preserve_hostname: true


ホスト名を設定する。
イメージを他の機器にコピーするときはホスト名を変更する。

sudo hostnamectl set-hostname rp1 #設定したホスト名は機器ごとに後で変更すること

Load Balancer

初期設定したイメージから作業を始める。

nginxをインストールする。

sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
sudo vi /etc/nginx/nginx.conf
下記の通り修正

worker_connections 16;


Web Serverとしては使用しないのでdefaultの設定は読み込まないようにし、Load Balancer用の設定ファイルを作成する。

sudo rm /etc/nginx/sites-enabled/default
sudo vi /etc/nginx/conf.d/loadbalancer.conf
下記の通り新規作成

upstream backend {
    #least_conn;
    #ip_hash; #設定しても良いが、ラウンドロビンされていることを直ぐに確認したいので今回はなし
    server Reverse Proxy Server No.1のIP:80;
    server Reverse Proxy Server No.2のIP:80;
}

server {
    listen 80 default_server;
    server_name _;

    location / {
        proxy_pass http://backend;
    }
}


設定ファイルに誤りがないことを確認し、nginxを再起動する。

sudo nginx -t
sudo systemctl restart nginx

Reverse Proxy

初期設定したイメージから作業を始める。
Reverse Proxy Serverは2台作成する。

nginxをインストールする。

sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx
sudo vi /etc/nginx/nginx.conf
下記の通り修正

worker_connections 16;


Web Serverとしては使用しないのでdefaultの設定は読み込まれないようにし、Reverse Proxy用の設定ファイルを作成する。

sudo rm /etc/nginx/sites-enabled/default
sudo vi /etc/nginx/conf.d/proxy.conf
下記の通り新規作成

server {
    listen 80 default_server;
    server_name _;

    location / {
        proxy_pass http://Application Server1のIP:8080;
    }
}


もう1台のReverse Proxy Serverも同様に設定する。

Application Serverも2台構成にする予定のため、
proxy_pass http://Application Server1のIP:8080;のIPはそれぞれ別のIPになる。

設定ファイルに誤りがないことを確認し、nginxを再起動する。

sudo nginx -t
sudo systemctl restart nginx

Application Server

Java 21のインストール
Tomcat 10のインストール

Tomcat 10はインストールパッケージがなかったため、Apache Tomcatのページからダウンロードして解凍する。実行ユーザー、シンボリックリンクも作っておく。

sudo apt install openjdk-21-jdk

cd /opt
sudo tar xvfz /mnt/nfs/apache-tomcat-10.1.20.tar.gz
sudo ln -s /opt/apache-tomcat-10.1.20 tomcat
sudo useradd -m -U -d /opt/tomcat -s /bin/false tomcat
sudo chown -R tomcat: /opt/apache-tomcat-10.1.20


起動用のスクリプトを作成する。

sudo vi /usr/lib/systemd/system/tomcat.service
下記の通り新規作成

#
# Systemd unit file for Apache Tomcat
#
[Unit]
Description=Apache Tomcat 10 Web Application Server
After=network.target
[Service]
# Configuration
Environment="JAVA_OPTS=-Djava.awt.headless=true"
Environment="CATALINA_BASE=/opt/tomcat"
Environment="CATALINA_HOME=/opt/tomcat"
Environment="CATALINA_OPTS=-Xmx1024m -server"
Environment="CATALINA_PID=/opt/tomcat/temp/tomcat.pid"
# Lifecycle
Type=forking
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=always
PIDFile=/opt/tomcat/temp/tomcat.pid
# Logging
SyslogIdentifier=tomcat
# Security
User=tomcat
Group=tomcat
[Install]
WantedBy=multi-user.target


自動起動は設定しない。

sudo systemctl daemon-reload
sudo systemctl start tomcat


もう1台のApplication Serverも同様に設定する。

起動確認が終わったら一度Tomcatを停止して、レプリケーションの設定をserver.xmlに追記する。

今回は簡単に確認するため、SimpleTcpClusterを使用している。別の機会にSpring Sessionを使用した方法を試してみたい。

<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
         channelSendOptions="6">
  <Manager className="org.apache.catalina.ha.session.BackupManager"
           expireSessionsOnShutdown="false"
           notifyListenersOnReplication="true"
           mapSendOptions="6"/>
  <Channel className="org.apache.catalina.tribes.group.GroupChannel">
    <Membership className="org.apache.catalina.tribes.membership.McastService"
                address="228.0.0.4"
                port="45564"
                frequency="500"
                dropTime="3000"/>
    <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
              address="auto"
              port="5000"
              selectorTimeout="100"
              maxThreads="6"/>

    <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
      <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
    </Sender>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
    <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>
  </Channel>

  <Valve className="org.apache.catalina.ha.tcp.ReplicationValve" filter=""/>

  <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
</Cluster>


もう1台のApplication Serverも同様に設定する。

DB Server

まずは3台に対してMariaDBをインストールして初期設定を実行する。

sudo apt install mariadb-server
sudo systemctl stop mariadb
sudo mkdir /mnt/ssd/mariadb


データの保存先を変更し、リモートアクセス可能にする。

sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
下記の通り修正

datadir                 = /mnt/ssd/mariadb
#bind-address            = 127.0.0.1


MariaDBが外部フォルダにアクセス出来るようにApplication Armorのセキュリティ設定を変更する。

sudo vi /etc/apparmor.d/tunables/alias
下記の通り修正

alias /var/lib/mysql/ -> /mnt/ssd/mariadb/,


Application Armorを再起動し、MariaDBのデータフォルダをコピーする。

sudo systemctl restart apparmor
sudo rsync -avuz /var/lib/mysql/ /mnt/ssd/mariadb


MariaDBを起動し、初期設定する。

sudo systemctl start mariadb
sudo mysql_secure_installation
Enter current password for root (enter for none):
Switch to unix_socket authentication [Y/n] n
Change the root password? [Y/n] 
New password:
Re-enter new password:
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] n
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

mysql -u root -p
grant all privileges on *.* to root@"%" identified by 'password' with grant option;
exit;

sudo systemctl restart mariadb


接続確認を行ったら、一度停止する。

MariaDBをインストールすると自動的にGalera Clusterがインストールされているはず。

自動起動を無効にし、バイナリロギングを有効にする。

sudo systemctl disable mariadb
sudo mkdir -p /mnt/ssd/log/mariadb
sudo chown -R mysql: /mnt/ssd/log/mariadb
sudo vi /etc/mysql/mariadb.conf.d/50-server.cnf
下記の通り修正

server-id               = 1 # サーバー毎に変更
log_bin                 = /mnt/ssd/log/mariadb/mariadb-bin.log


Galera Clusterの設定を行う。

sudo vi /etc/mysql/mariadb.conf.d/60-galera.cnf
下記の通り修正

[galera]
# Mandatory settings
wsrep_on                 = ON
wsrep_cluster_name       = "MariaDB Galera Cluster"
wsrep_cluster_address    = gcomm://サーバーIP1,サーバーIP2,サーバーIP3
binlog_format            = row
default_storage_engine   = InnoDB
innodb_autoinc_lock_mode = 2
wsrep_provider           = /usr/lib/galera/libgalera_smm.so

# Allow server to accept connections on all interfaces.
bind-address = 0.0.0.0


最初の1台は下記コマンドで実行する。以降は通常の起動コマンドで起動する。

sudo galera_new_cluster
※再起動時の注意

データが保存されているフォルダにgrastate.datというファイルがあるので、safe_to_bootstrap: 1となっているサーバーからgalera_new_clusterで起動する。

sudo less /mnt/ssd/mariadb/grastate.dat

# GALERA saved state
version: 2.1
uuid:    xxx
seqno:   -1
safe_to_bootstrap: 1


それ以外だと、エラー(WSREP: It may not be safe to bootstrap the cluster from this node. It was not the last one to leave the cluster and may not contain all the updates. To force cluster bootstrap with this node, edit the grastate.dat)となって起動できない。

動作確認

Javaアプリを作りクラスタリングされているか確認する。

Ubuntu Proを使ってみる

少し前に個人利用であれば、Proバージョンを無償で使用できるようになった。そこで、このサイトとは別に個人で利用しているサーバーのUbuntuをProにアップグレードしてみる。

Ubuntu Oneアカウント作成

Proバージョンの利用を始めるには、Ubuntu Oneアカウント作成しTokenを発行する必要がある。まだ持っていない場合は、以下のURLにアクセスしてアカウントを作成する。
https://login.ubuntu.com/

ログイン後、トップ画面に戻り、右上メニューのUbuntu Pro dashboadをクリックする。

画面が切り替わり少し待つと以下のような画面が表示されFree Personal Tokenが発行される。

Ubuntu Proにアップグレードする

Ubuntu Proを利用したいサーバー上で以下のコマンドを入力する。

sudo apt update
sudo apt upgrade
# 必要ならここでサーバー再起動
sudo pro attach 先ほどのトークン
sudo apt install ubuntu-advantage-tools
sudo apt update
sudo apt upgrade

NextCloudをUbuntu 22.04で動かす

前提条件

下記が導入済みであること
Apache 2
PHP 8.1
MariaDB

NextCloudのインストール

NextCloudのダウンロード

NextCloudのページからzipファイルをダウンロードする。

cd /var/www/html
wget https://download.nextcloud.com/server/releases/nextcloud-25.0.1.zip

NextCloudの配置

unzip nextcloud-25.0.1.zip
chown -R www-data:www-data /var/www/html/nextcloud

Apacheの設定

vi /etc/apache2/sites-available/nextcloud.conf
<Directory /var/www/html/nextcloud/>
  Require all granted
  Options FollowSymlinks MultiViews
  AllowOverride All
  <IfModule mod_dav.c>
    Dav off
  </IfModule>
</Directory>
sudo a2ensite nextcloud.conf
sudo a2enmod rewrite
sudo systemctl restart apache2
メモリエラーの解消
/etc/php/8.1/apache2/php.ini
memory_limit = 512M

Raspberry Pi 4のBiosは表示されるがOSが起動しない

Raspberry Pi 4のBiosは表示されるがOSが起動しない問題が発生した。

SSDの破損、モニタとの相性等確認したが問題なしで、確認を進めた結果、原因は電源供給のUSBアダプタにあった。

最近下記のUSBアダプタを購入したので、それをRaspberry Piの電源に使用したところ、今回の現象が発生した。Biosは表示されるがOSが起動する段階になるとRaspberry Piの電源が落ちてしまう。

下記の少し古いモデルに変更すると問題なくRaspberry OSが起動した。

USBケーブル等全て同じにして、USBアダプタのみの変更で問題が解決したので、おそらくUSBアダプタとの相性に問題があったのだと思う。

Postfixのrelayhostにsmtp.gmail.comを使用する

Googleアカウント側の設定

smtp.gmail.comを使用するにはGoogleアカウントが必要になる。Googleアカウントの設定を開き、セキュリティにあるアプリパスワードをクリックする。

アプリはメールを選択する。

デバイスはその他を選択し、わかりやすい名前を入力する。


生成ボタンをクリックすると下記の黄色の枠内にアプリパスワードが表示されるので、Postfix側の設定に使用する。

Postfix側の設定

Postfixをインストールして、SMTP認証を有効にする。

sudo apt install postfix

sudo postconf -e "relayhost = [smtp.gmail.com]:587"
sudo postconf -e "smtp_sasl_auth_enable = yes" / 
"smtp_sasl_security_options = noanonymous" / 
"smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd"

sudo postconf -e "smtp_use_tls = yes" /
"smtp_tls_loglevel = 1" /
"smtp_tls_security_level = encrypt" /
"smtp_tls_note_starttls_offer = yes" /
"smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt"

sudo postconf -e "mynetworks = 127.0.0.0/8"

Googleアカウント側の設定を参照し、smtp.gmail.comのログインID、パスワードを設定する。

sudo vi /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 Gmailアドレス:アプリパスワード

sudo chmod 600 /etc/postfix/sasl_passwd
sudo postmap hash:/etc/postfix/sasl_passwd
sudo service postfix restart

テストメールを送信する。

echo 'Hellow World!' | mail -s test toメールアドレス

無料のSSL証明書をインストールする(Ubuntu 22.04版)

No-IPドメインでLet’s Encryptの証明書を使うことが出来る。

事前確認

・ドメイン名を取得していること(今回はNo-IPを使用する)
・80、443ポートが外部に開放されていること

Certbotをインストールする

sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

SSL証明書の取得とApacheへの設定の追加

sudo certbot --apache

取得と設定に成功すれば、下記の通り表示される。

Successfully deployed certificate forドメイン名 to /etc/apache2/sites-available/000-default-le-ssl.conf
Congratulations! You have successfully enabled HTTPS on https://ドメイン名

自動更新のタスクもこの処理で設定されるので、特にこれ以上することはないが、念のため下記のコマンドで自動更新のテストが可能となっている。

sudo certbot renew --dry-run

Ubuntu Server 22.04 LTSをインストールする

目的

開発用のサーバーをUbuntu Server 22.04で再構築する。

Ubuntu Serverのインストール

下記からISOファイルをダウンロードして、USBフラッシュドライブに書き込む。
https://jp.ubuntu.com/download

SSHのインストールのチェックを入れるのを忘れずに、他はインストーラーの指示通りに入力する。

MariaDBのインストール

ここではインストールのみ行い、設定は後程行う。

sudo apt install mariadb-server
sudo mysql_secure_installation

Apache、phpのインストール

phpを使用することを前提としたインストールと、設定を行う。

sudo apt install apache2
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo apt install php libapache2-mod-php php-fpm php-common php-mbstring php-xmlrpc php-gd php-xml php-mysql php-cli php-zip php-curl php-imagick php-intl

.htaccesによる、設定の上書きを有効にする。

sudo vi /etc/apache2/apache2.conf

<Directory /var/www/>
	Options Indexes FollowSymLinks
	AllowOverride all
	Require all granted
</Directory>

sudo service apache2 restart

Webminのインストール

sudo apt install wget apt-transport-https software-properties-common

wget https://download.webmin.com/jcameron-key.asc
cat jcameron-key.asc | gpg --dearmor >jcameron-key.gpg
sudo cp jcameron-key.gpg /etc/apt/trusted.gpg.d/jcameron-key.gpg

sudo apt update
sudo apt install webmin
sudo /usr/share/webmin/changepass.pl /etc/webmin ユーザー名 パスワード

日本語設定

sudo apt install language-pack-ja
localectl list-locales | grep ja
sudo localectl set-locale LANG=ja_JP.UTF-8

Tomcat 9のインストール

sudo apt install tomcat9 tomcat9-admin

Jenkins運用のため、/etc/tomcat9/context.xmlに下記を追記する。

    <Resources cacheMaxSize="102400" />

/etc/tomcat9/server.xmlのAJP/1.3の設定を下記の通り変更する。

    <Connector protocol="AJP/1.3"
               address="localhost"
               port="8009"
               redirectPort="8443"
               secretRequired="false" />

/etc/tomcat9/tomcat-users.xmlに下記を追記する。

  <role rolename="manager-script"/>
  <user username="ユーザー名" password="パスワード" roles="manager-script"/>

/usr/lib/systemd/system/tomcat9.serviceに下記を追記する。

Environment="CATALINA_OPTS=-DJENKINS_HOME=/opt/jenkins/"
ReadWritePaths=/opt/jenkins/

/etc/tomcat9/policy.d/50local.policyに下記を追記する。

grant codeBase "file:${catalina.base}/webapps/jenkins/-" {
    permission java.security.AllPermission;
};
grant codeBase "file:/opt/jenkins/-" {
    permission java.security.AllPermission;
};
sudo systemctl daemon-reload
sudo service tomcat9 restart

Jenkinsのインストール

/opt/jenkinsフォルダを作成し、フォルダにTomcatから書き込み可能な権限を付与する。

jenkins.warファイルをダウンロードし、/var/lib/tomcat9/webapps/に配置する。

ApacheとTomcatの連携の設定

sudo a2enmod proxy
sudo a2enmod proxy_ajp

/etc/apache2/conf-enabled/tomcat.confを作成し、下記の通り記載する。

ProxyPass /jenkins/ ajp://localhost:8009/jenkins/
ProxyPassReverse /jenkins/ ajp://localhost:8009/jenkins/
sudo service apache2 restart

Postfixのインストール

こちらのページにインストールと設定方法を記載した。