カテゴリー: PC Page 18 of 51

BookStack内のリンクを新しいタブで開く。

とても簡単で、あっさりできるTIPSです。

参照

手順

  1. BookStackに管理者権限でログインします。
  2. 設定>カスタマイズに移動します。
  3. カスタムheadタグに以下を入力し、保存します。
<script type="module">
    const links = document.querySelectorAll('.page-content a');
    for (const link of links) {
        link.target = '_blank';
    }
</script>

動作確認

BookStackでリンクを含む記事をクリックし、新しいタブで開くことができれば完了です。

Ubuntu 22.04系にRedmine5.1をインストール。

OSの刷新に備えて、Ubuntu 22.04に、2024年1月現在の最新版のRedmineを、Ubuntu22.04系にインストールします。

一部を除いてコピペだけで済むように完結しています。

本記事で実施すること

  1. Redmineを動かすためのパッケージがインストールできるように準備をします。
  2. Redmineを動かすためのパッケージ(Ruby/データベース/Webサービスなど)をインストールします。
  3. データベースやWebサービスの基礎設定を行います。
  4. Redmineの動作確認を行います。

想定している読者

  • 「Redmine」をUbuntuにインストールしてみたい
  • まずは動くところまで確認できればいい

前提

  • Ubuntuサーバの初期設定が終わった直後の状態を想定します。
  • DNSでドメインの名前が解決できることを前提としています
  • 環境は以下の通りです。
  • Apache系
  • MySQL
  • Ruby 3.0
  • また、パッケージ管理としてaptitudeを用いています。aptが好みの方はこちらに読み替えてください。

特記事項

  • 本手順ではRedmine 5.1をインストールします。
  • 本記事のredmineの格納ディレクトリは/home/www-data/redmineです。一般的なディレクトリ(/var/lib/redmine)と異なることを最初に注記します。

手順

Apacheのレポジトリを追加します。

sudo add-apt-repository ppa:ondrej/apache2

必要なパッケージをインストールします。

sudo aptitude update

sudo aptitude install build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libcurl4-openssl-dev libffi-dev mysql-server mysql-client apache2 apache2-dev libapr1-dev libaprutil1-dev imagemagick libmagick++-dev fonts-takao-pgothic subversion git ruby libruby ruby-dev libmysqlclient-dev

apacheの追加モジュールをインストールします。

sudo aptitude install libapache2-mod-passenger

rubyのパッケージ管理(gem)を用いて必要なライブラリをインストールします。

sudo gem install bundler racc mysql2
# 「3 gems installed」が表示されればインストール成功です。

必要に応じてmysqlの初期設定を行います。

mysql_secure_installationによる初期設定を行います。

うまくいかない場合は以下を参照してください。

https://atelier.reisalin.com/projects/zettel/questions/5-mysql_secure_installation

mysqlでDBとユーザーを設定します。

mysql -u root -p
# 上記で設定した「mysqlのrootパスワード」を入力し、mysqlにログインします
CREATE DATABASE redmine character set utf8mb4;
/* DB "redmine" を作成します */

CREATE USER 'redmine'@'localhost' IDENTIFIED BY 'password';
/* ユーザ "redmine"を作成し、パスワードを設定します*/
/* この'password'は任意のパスワードに変更してください*/

GRANT ALL ON redmine.* TO 'redmine'@'localhost';
/* DB "redmine"の権限をユーザ "redmine"に委譲します*/

flush privileges;
/* 設定を反映させます*/

exit

設定したDBでログインできることを確認します。

mysql -u redmine -p
SHOW DATABASES;
/* DB:redmineがあることを確認します。 */

exit

Redmineプログラムを配置します。

sudo mkdir -p /home/www-data/redmine

sudo chown -R www-data:www-data /home/www-data

sudo -u www-data svn co https://svn.redmine.org/redmine/branches/5.1-stable /home/www-data/redmine

Redmineのコンフィグを設定します。

sudo cp -pi /home/www-data/redmine/config/database.yml.example /home/www-data/redmine/config/database.yml
  • /home/www-data/redmine/config/database.yml

上記を教義・信仰に従ったエディタで編集してください。

database.yml 編集内容

production:
  adapter: mysql2
  database: redmine
  host: localhost
  username: redmine
  # rootからredmineに変更します
  password: "redmine用のパスワード"
  encoding: utf8mb4
# 本番環境(production)のみ設定を行います

Redmineのマイグレーションを行います。

cd /home/www-data/redmine/ && pwd
# /home/www-data/redmine/ (Redmineを配置したディレクトリ)であることを確認します

sudo -u www-data bundle install --without development test --path vendor/bundle

sudo -u www-data bundle exec rake generate_secret_token

sudo -u www-data RAILS_ENV=production bundle exec rake db:migrate

sudo -u www-data RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

Apacheの設定ファイルを作成します。

cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/redmine.conf
<VirtualHost *:80>
    ServerName hoge.example.com
    # ServerNameは自身が設定したredmineに読み替えてください。
    DocumentRoot /home/www-data/redmine/public
    <Directory /home/www-data/redmine/public>
        Options -MultiViews
        AllowOverride All
        Require all granted
    </Directory>
</VirtualHost>
__EOF__

設定を反映させます。

ls -l /etc/apache2/sites-available/redmine.conf
# ファイルがあることを確認します。

sudo a2ensite redmine.conf
# 設定ファイルを有効化します

sudo a2dissite 000-default.conf
sudo a2dissite default-ssl.conf
# 初期サイト設定を無効化します

sudo apache2ctl configtest
# Syntax OK を確認します

sudo systemctl restart apache2.service

systemctl status apache2.service

Webページの表示を確認します。

http://設定したRedmineドメイン

でRedmineのトップページが表示されれば成功です。

直ちにadmin/adminでログインし、強固なパスワードを設定し直します。

Growiのインストール手順。(Ubuntu 22.04)

GrowiをUbuntu22.04をインストールしたので、そのときの手順です。一気通貫で行ったので、相当手順は長いです。

環境

  • Ubuntu 22.04
  • Apache 2.4

の基本的な設定が済んだという状況です。

前提

  • 名前解決できるドメインが用意されている。
  • どのドメインに応じた証明書が用意されている。

さっくりとはならない手順

  1. Node.js/npmをインストールします。
  2. Redis-serverをインストールします。
  3. Javaをインストールします。
  4. ElasticSearch 8をインストールします。
  5. ElasticSearchの設定変更を行います。
  6. ElasticSearchのプラグインをインストールします。
  7. ElasticSearchの設定変更を反映します。
  8. MongoDBをインストールします。
  9. MongoDBのデータ格納先を変更します。
  10. MongoDBのアップデートを防ぎます。
  11. MongoDBの設定変更を反映します。
  12. yarnのインストールを行います。
  13. 必要パッケージをインストールします。
  14. turboパッケージをインストールします。
  15. Growiのインストールを行います。
  16. yarnを用いてインストールします。
  17. 自動起動のスクリプトを作成します。
  18. Apacheのリバースプロキシの設定を行います。
  19. ブラウザで起動します。

手順

node18をインストールします。

  • レポジトリ追加
sudo curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash
  • パッケージアップグレード
sudo aptitude update
  • Node.jsインストール
sudo aptitude install nodejs
  • Node.jsバージョン確認
node -v

2024/01/10現在:v18.19.0

  • npmバージョン確認
npm -v

2024/01/10現在:10.2.3

redis-serverをインストールします。

  • インストール
sudo  aptitude install redis-server
  • 起動確認
systemctl status redis-server

active(running)を確認します。

  • 自動起動有効化
sudo systemctl enable redis-server

Javaをインストールします。

  • インストール
sudo aptitude install openjdk-17-jdk

ElasticSearhをインストールします。

  • gpg追加
sudo wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
  • 必要パッケージインストール
sudo aptitude install apt-transport-https
  • レポジトリ追加
sudo echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
  • パッケージのアップグレード
sudo aptitude update
  • ElasticSearchインストール
sudo aptitude install elasticsearch

※この後、デフォルトパスワードが表示されますが、控えておく程度にしましょう。

JVM設定変更
  • バックアップディレクトリ作成
sudo mkdir /etc/elasticsearch/old

※任意のバックアップディレクトリを指定します。

  • 設定ファイルバックアップ
sudo cp -pi /etc/elasticsearch/jvm.options /etc/elasticsearch/old/jvm.options.`date +%Y%m%d`
  • 設定ファイル書き換え
echo -e "-Xms256m\n-Xmx256m" | sudo tee -a /etc/elasticsearch/jvm.options
  • 書き換え確認
sudo diff -u /etc/elasticsearch/old/jvm.options.`date +%Y%m%d` /etc/elasticsearch/jvm.options
  • 差分
+-Xms256m
+-Xmx256m
ElasticSearchの設定変更

※この作業だけ管理者権限で実行します。

  • root昇格
sudo su -
  • 設定ファイルバックアップ
cp -pi /etc/elasticsearch/elasticsearch.yml /path/to/backup/elasticsearch.yml.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • ファイル書き換え
sed -i -e 's/xpack.security.enabled: true/xpack.security.enabled: false/' \
       -e '/xpack.security.http.ssl:/{n; s/  enabled: true/  enabled: false/}' \
       -e '/xpack.security.transport.ssl:/{n; s/  enabled: true/  enabled: false/}' /etc/elasticsearch/elasticsearch.yml
  • 差分確認
diff -u /path/to/backup/elasticsearch.yml.$(date +%Y%m%d) /etc/elasticsearch/elasticsearch.yml
  • 差分
 # Enable security features
-xpack.security.enabled: true
+xpack.security.enabled: false

 xpack.security.enrollment.enabled: true

 # Enable encryption for HTTP API client connections, such as Kibana, Logstash, and Agents
 xpack.security.http.ssl:
-  enabled: true
+  enabled: false
   keystore.path: certs/http.p12

 # Enable encryption and mutual authentication between cluster nodes
 xpack.security.transport.ssl:
-  enabled: true
+  enabled: false
  • rootから抜ける
exit
ElasticSearchのプラグインを追加
  • analysis-kuromoji インストール
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
  • analysis-isu インストール
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-icu
自動起動設定反映
  • 起動
sudo systemctl start elasticsearch
  • 起動確認
systemctl status elasticsearch

active(running)を確認します。

  • 自動起動有効化
sudo systemctl enable elasticsearch

MongoDBインストール

レポジトリ追加

  • 必要パッケージインストール
sudo aptitude install gnupg
  • gpg追加
curl -fsSL https://pgp.mongodb.com/server-6.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-6.0.gpg --dearmor
  • レポジトリ追加
echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-6.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/6.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-6.0.list
MongoDBインストール
  • パッケージのアップグレード
sudo aptitude update
  • MongoDBインストール
sudo aptitude install mongodb-org mongodb-org-server mongodb-org-shell mongodb-org-mongos mongodb-org-tools
MongoDBバージョン固定

※2024/01/10現在、GrowiはMongoDBのバージョンが固定されているので、自動更新されないようにします。

sudo aptitude hold mongodb-org

sudo aptitude hold mongodb-org-server

sudo aptitude hold mongodb-org-shell

sudo aptitude hold mongodb-org-mongos

sudo aptitude hold mongodb-org-tools hold
保存先変更(オプション)

MongoDBの格納先を、冗長化構成されているパーティションにするため対応しました。

  • 格納ディレクトリ作成
sudo mkdir /home/mongodb

保存先を変えたいところにします

  • 所有者変更
sudo chown -R mongodb:mongodb /home/mongodb
  • 所有者変更確認
ls -ld /home/mongodb
  • 設定ファイルのバックアップ取得
sudo cp -pi /etc/mongod.conf /path/to/backup/mongod.conf.$(date +%Y%m%d)

任意のバックアップディレクトリを指定します。

  • バックアップ確認
sudo diff -u /etc/mongod.conf /path/to/backup/mongod.conf.$(date +%Y%m%d)

バックアップが保存されたか、差分がないことで確認します。

  • ファイル書き換え
sudo sed -i 's/dbPath: \/var\/lib\/mongodb/dbPath: \/home\/mongodb/' /etc/mongod.conf
  • 差分確認
sudo diff -u /path/to/backup/mongod.conf.$(date +%Y%m%d) /etc/mongodb.conf
  • 差分
-  dbPath: /var/lib/mongodb
+  dbPath: /home/mongodb
自動起動有効
  • mongodサービス起動
sudo systemctl start mongod
  • サービス起動確認
systemctl status mongod

active (running)を確認します

  • 自動起動有効化
sudo systemctl enable mongod

yarnインストール

  • npmでyarnインストール
sudo npm install -g yarn
  • turboインストール

※Growi v6.1.0から必須パッケージとなりました。

sudo yarn global add turbo

Growiインストール

  • git clone
sudo git clone https://github.com/weseek/growi /home/www-data/growi

※任意のディレクトリを指定します。

  • ディレクトリ移動
cd /home/www-data/growi && pwd

先ほどcloneしたディレクトリです。

  • チェックアウト
sudo git checkout -b v6.3.0 refs/tags/v6.3.0

2024/01/09現在の最新版です。

  • yarnによるインストール
sudo yarn

CPUのスペックによっては相当な時間がかかります。

自動起動スクリプトの作成

  • systemd作成
cat <<- __EOF__ | sudo tee -a /etc/systemd/system/growi.service
[Unit]
Description = growi
After=network-online.target mongod.service
ConditionPathExists=【/home/www-data/growi】

[Service]
ExecStart=【/home/www-data/growi/】growi-start.sh
Restart=no
Type=simple

[Install]
WantedBy=multi-user.target
__EOF__

※【】内を、git cloneしたディレクトリにします。

  • Growiインストールディレクトリに作成
cat <<- __EOF__ | sudo tee -a 【/home/www-data/growi】/growi-start.sh
#!/bin/sh
cd 【/home/www-data/growi】
NODE_ENV=production \
AUDIT_LOG_ENABLED=true \
FORCE_WIKI_MODE=private \
MONGO_URI=mongodb://localhost:27017/growi \
ELASTICSEARCH_URI=http://localhost:9200/growi \
REDIS_URI=redis://localhost:6379 \
PASSWORD_SEED=[任意の文字列] \
FILE_UPLOAD=local \
npm start
__EOF__

※【】内を、git cloneしたディレクトリにします。
[]内には任意の文字列を入れます。

  • 権限変更
sudo chmod +x /home/www-data/growi/growi-start.sh
  • systemd設定反映
sudo systemctl daemon-reload
  • growi有効化
sudo systemctl start growi.service
  • growi有効化確認
systemctl status growi.service

active(running)を確認

  • 自動起動有効化
sudo systemctl enable growi.service

Apacheによるリバースプロキシの設定

  • モジュールインストール
sudo a2enmod proxy_http
  • apache再起動
sudo systemctl restart apache2.service
  • ログ保存ディレクトリ作成
suod mkdir /var/log/growi/
  • 所有者変更
sudo chown -R www-data:www-data /var/log/growi
  • 設定ファイル作成
cat <<- __EOF__ | sudo tee -a /etc/apache2/sites-available/growi.conf
#!/bin/sh
<VirtualHost _default_:80>
    ServerName 【hoge.example.com】
    # ドメイン名を指定します
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTPアクセスを強制的にHTTPSにリダイレクトします
</VirtualHost>

<VirtualHost _default_:443>
    ServerName 【hoge.example.com】
    # ドメイン名を指定します
    CustomLog /var/log/growi/growi_access.log combined 
    ErrorLog /var/log/growi/growi_error.log

#SSL設定
  SSLEngine on
    Protocols h2 http/1.1
  # SSLを有効化します

SSLCertificateFile 【/etc/certs/hoge.example.com.crt】
# SSL証明書を指定します
SSLCertificateKeyFile 【/etc/private/hoge.example.com.key】
# 秘密鍵を指定します

    # Header に Host: example.com を追加するため
    ProxyPreserveHost On
    # HTTPS利用時: Header に x-forwarded-proto: https を追加するため
    RequestHeader set x-forwarded-proto 'https'
    # Apache では static assets で 304 が返らないことがあるので ETag を無効化する
    <ifModule mod_headers.c>
            Header unset ETag
    </ifModule>
    FileETag None

    # socket.io の path を rewrite する
    RewriteEngine On
    RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
    RewriteCond %{QUERY_STRING} transport=websocket    [NC]
    RewriteRule /(.*) ws://localhost:3000/$1 [P,L]

    ProxyPass / http://localhost:3000/
    ProxyPassReverse / http://localhost:3000/

</VirtualHost>

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off
__EOF__

【】内を自分の環境に変更してください。

  • 設定反映
sudo a2ensite growi.conf
  • コンフィグ確認
sudo apache2ctl configtest

Syntax OKを確認します。

  • Apache2再起動
sudo systemctl restart apache2.service

Growiインストール確認

http://設定したドメイン でアクセスします。

この初期サイトが表示されたらインストール完了です。

Ubuntu 20.04インストール後に行うこと。

2025年にサポートされなくなるOSではありますが、まだ現役というパターンがあるため、メモに残しておきます。

SSH設定

Ubuntu系OSをメディアからインストールした場合、SSHがインストールされていないことがほとんどです。

sudo apt install ssh

SSH鍵ペア作成

鍵認証でログインできるようにします。

ssh-keygen -t ed25519

# 鍵の格納場所は空Enter。(/home/hoge/.ssh/
# パスワードを設定します。

SSH鍵ペア作成確認

  • 秘密鍵の管理は慎重に行ってください。
  • パスワードも可能な限り設定して安全性を保ってください。
cd .ssh
ls -l
# 以下のファイルを確認します
# └id_ed25519
# └id_ed25519.pub
# ※これらのファイルはscp等で自分のクライアントにコピーします

鍵の設定変更

  • 公開鍵をauthorized_keysに変更し、パーミッションを厳密にします
mv id_ed25519.pub authorized_keys
chmod 600 authorized_keys

接続確認

この後、ローカルにコピーしたid_ed25519をSSHターミナルクライアントに保存して設定し、接続確認を行います。

SSHのパスワード認証を禁止

  • バックアップディレクトリ作成
sudo mkdir /etc/old

任意のバックアップディレクトリを作成します。

  • SSH設定ファイルバックアップ
sudo cp -pi /etc/ssh/sshd_config /etc/old/sshd_config.$(date +%Y%m%d)
  • バックアップ確認
diff -u /etc/ssh/sshd_config /etc/old/sshd_config.$(date +%Y%m%d)

エラーがない(差分がない)ことでバックアップを確認します。

  • ファイル書き換え
sudo sed -i -e 's/^#PasswordAuthentication yes/PasswordAuthentication no/' -e 's/^#PermitEmptyPasswords no/PermitEmptyPasswords no/' /etc/ssh/sshd_config
  • 差分確認
diff -u /etc/old/sshd_config.$(date +%Y%m%d) /etc/ssh/sshd_config
  • 差分
-#PasswordAuthentication yes
-#PermitEmptyPasswords no
+PasswordAuthentication no
+PermitEmptyPasswords no
  • SSH再起動

※この作業の前に、必ず、SSH接続は別に開けておいてください。※

sudo systemctl restart ssh.service 

SSH設定反映確認

  1. 新しくターミナルを起動します。
  2. パスワードでSSHログインできないことを確認します。
  3. 事前に転送しておいた秘密鍵でログインできることを確認します。

最初のアップデートとアップグレード

パッケージ全体のアップグレードを行います。

sudo apt update && sudo apt upgrade

アップグレード後、再起動を行います。

sudo reboot

ホスト名をドメインつきにする

Ubuntu系OSはインストール時にhoge.example.comと設定しても、

uname -n

# hoge(インストール時に設定したホスト名のみ)となっています。

とホスト名だけになるパターンが多いです。そこで、

sudo hostnamectl set-hostname hoge.example.com

として、(ホスト名やドメインや設定に合わせます)

設定語、

uname -n

# hoge.example.comを確認します。

プロンプト設定

最初期のプロンプトは

hoge@hoge$

になっているので、好みに沿って設定していきます。

  • 一般ユーザの.bashrc設定
cat << ___EOF___ | tee -a ~/.bashrc
PS1="[\u@\H \W]\\$ "

# 一般ユーザ向けのプロンプト設定
if [ "\$PS1" ]; then
  if [ "\$(id -u)" -eq 0 ]; then # rootユーザの場合
    PS1='\[\e[0;31m\][\u@\H \W]#\[\e[0m\] '
  else # 一般ユーザの場合
    PS1='\[\e[0;32m\][\u@\H \W]\$\[\e[0m\] '
  fi
fi
___EOF___
  • root

Ubuntu系は.bashrcが統一されないので、やむなくこの方法をとります。

sudo su -
cat << ___EOF___ | tee -a ~/.bashrc
PS1="[\u@\H \W]\\$ "

# 一般ユーザ向けのプロンプト設定
if [ "\$PS1" ]; then
  if [ "\$(id -u)" -eq 0 ]; then # rootユーザの場合
    PS1='\[\e[0;31m\][\u@\H \W]#\[\e[0m\] '
  else # 一般ユーザの場合
    PS1='\[\e[0;32m\][\u@\H \W]\$\[\e[0m\] '
  fi
fi
___EOF___

設定後、SSHセッションを開き直します。以下を確認します。

  1. 緑文字で[hoge@hoge.example.com~]$のように表示される。(一般ユーザー)
  2. 赤文字で[root@hoge.example.com~]#のように表示される。(root)

aptitudeインストール

これは完全に筆者の好みです。パッケージ管理をaptではなくaptitudeに変えます。

sudo apt install aptitude

他にもありますので、改めて別に記事を上げます。

Ubuntu22.04検証環境に最新版のnginxとphp8.3をインストール。

概要

Ubuntu 22.04を検証機にインストールしたので、nginx環境を構築します。

前提

  • OSインストール済み
  • 初期設定完了済み

さっくりとした手順

  1. 必要なパッケージをインストールします。
  2. nginxのレポジトリを追加します。
  3. aptitudeでnginxのインストールを行います。
  4. phpのレポジトリを追加します。
  5. aptitudeでphpのインストールを行います。
  6. apache2を停止し、nginxサービスを有効化します。
  7. php8.3用のfpmをインストールします。

パッケージのインストール

sudo aptitude install curl gnupg2 ca-certificates lsb-release ubuntu-keyring build-essential zlib1g-dev libssl-dev libreadline-dev libyaml-dev libcurl4-openssl-dev git

先を見据えてgit等もついでにインストールします。

レポジトリ追加

  • レポジトリ追加
cat <<- __EOF__ | sudo tee -a /etc/apt/sources.list.d/nginx.list
deb https://nginx.org/packages/ubuntu/ jammy nginx
deb-src https://nginx.org/packages/ubuntu/ jammy nginx
__EOF__
  • 鍵追加
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ABF5BD827BD9BF62

nginxで統一されている鍵を利用します

nginxインストール

  • パッケージ更新
sudo aptitude update

実行時、W: https://nginx.org/packages/ubuntu/dists/jammy/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.の警告は無視して大丈夫です。

  • インストール
sudo aptitude install nginx
  • バージョン確認
nginx -v

2023/12/29時点ではnginx/1.24.0と表示されていました

php8.3インストール

  • レポジトリ追加
sudo add-apt-repository ppa:ondrej/php
  • パッケージアップグレード
sudo aptitude update
sudo aptitude install php8.3

sudo aptitude install php8.3-{opcache,pdo,bcmath,calendar,ctype,fileinfo,ftp,gd,intl,json,ldap,mbstring,mysql,posix,readline,sockets,bz2,tokenizer,zip,curl,iconv,phar,xml,dev}

sudo aptitude install php8.3-{imagick,gmp}
  • バージョン確認
php -v

2023/12/29時点では PHP 8.3.1と表示されていました

apache2の無効化とnginxの再開

依存関係で、apacheが同時にインストールされます。本検証ではnginxを用いるので、apache2を無効化します。

  • apache2停止
sudo systemctl stop apache2.service
  • apache2自動起動停止
sudo systemctl disable apache2.service
  • apache2停止確認
systemctl status apache2.service

inactive(dead)を確認します

  • nginx再開
sudo systemctl start nginx
  • nginx自動起動有効化
sudo systemctl enable apache2.service
  • nginx起動確認
sudo systemctl status nginx
  • curlによる起動確認
curl http://localhost

Welcome to nginx! を確認します。

php-fpmインストール

nginxとphpを連携させるfpmをインストールします。

  • インストール
sudo aptitude install php8.3-fpm
  • インストール確認
systemctl status php8.3-fpm

active(running)を確認します。

2023年の主な出来事-サーバ編-

概要

2023年もじきに終わるということで、今年のまとめ。趣味のサーバ運用という点では大きなものがいくつかありました。

新たにインターネット上に構築したサイト

公開用Redmine作成

これが一番大きいです。

推しの名前でドメインが取得できたことにより、「これでWebを公開しよう」と思い立ち、正月休みから行動スタート。

ゲーム『ライザのアトリエ3』リリースに間に合わせ、様々な攻略情報を載せることができました。

Redmine自身の各種情報も掲載できたのも満足です。

アクセス解析システム:matomo作成

  • 非公開

公開用サイトのアクセス状況を知りたくて、このシステムをインストール。

Redmineとの連携はView_Customize_Pluginでなんとかなりましたし、その際、本邦のRedmineメンテナ様自身直々のアドバイスをいただけたことが印象に残っています。

フォトアルバムサイト:piwigo作成

フォトアルバムもついでに作成。

写真の拡充を図っていくのが来年度の目標になりそうです。

ドキュメント保存システム:BookStack作成

Redmineのプラグイン「knowlegebase」に代わるシステムを探していたら見つけました。

  • 本棚や本という概念
  • Markdownフレンドリー
  • 見出しに合わせたスクロール

など、おおよその欲しかった機能が備わっていて、今後のメインウェポンとなる予感です。

ローカルに構築したサイト

Nextcloud

2022年から継続利用。

Growi

2022年から利用しているマークダウンエディタ、growi。

2023年はmermaid.jsにようやく対応したので、デジタルでのメモ残しに大きく貢献しました。

firefly-iii

つい先日ではありますが、この財務管理システムを知ったおかげで「お金関係のロギング」を始められるようになりました。

来年度の目標

Ubuntu 20.04リプレース。

LTSのEOL2025年に備えます。そのためのボトルネックとなっている

  • Redmineのメジャーバージョンアップ
  • およびknoledgebaseの代替システム(現状候補はBookStack)

と検証を進めます。

サーバのスペックアップ

これに関しては予算と相談しながら。

ChatGPTによるシェルスクリプト(SSL証明書の更新)

Let's Encryptで更新しているワイルドカード証明書。

他のサーバにも適用するのを更に簡便にするため、自動化するスクリプトを出力しました。

動作を確認した環境

  • Ubuntu 20.o4
  • Apache2.4

要件

1. 証明書と鍵ペアがあるディレクトリを引数にしてコマンドを実行
 → ファイルがなければエラーを返す
 → ファイルが次の形式でなくてもエラーを返す
 ・hoge.example.com.crt.$(date +%Y%m) ← hoge.example.com.crtの部分を変数化
 ・hoge.example.com.key.$(date +%Y%m) ← hoge.example.com.keyの部分を変数化
2. 引数内のディレクトリのcrt.$(date +%Y%m)を対象に、以下のコマンドを実行する
  2.1 次のハッシュ値をそれぞれ参照し合っていれば後続
  openssl x509 -pubkey -in hoge.example.com.crt.$(date +%Y%m) -noout | openssl md5
  openssl pkey -pubout -in hoge.example.com.key.$(date +%Y%m)  | openssl md5
  2.2 次のハッシュ値をそれぞれ参照し合っていれば後続
  openssl x509 -issuer_hash -noout -in hoge.example.com.crt.$(date +%Y%m)
  sed -n -e'1d' -e'/BEGIN/,$p' hoge.example.com.crt.$(date +%Y%m) | openssl x509 -subject_hash -noout
3. openssl x509 -noout -dates -subject -in hoge.example.com.crt.$(date +%Y%m)
 のnotAfterを参照し、
 「ドメイン『hoge.example.com』有効期限:notAfterで出力した値 で更新します。よろしいですか?」
 を出力。y/nで後続判断
4. 整合性を確認したファイルを以下のディレクトリにコピー
 ・hoge.example.com.crt.$(date +%Y%m) → /etc/certs
 ・hoge.example.com.key.$(date +%Y%m) → /etc/private
 コピー完了の出力をする
5. 証明書のシンボリックリンクを貼り替える
  5.1 cd /etc/certs
  5.2 sudo ln -sf hoge.sample.com.crt.$(date +%Y%m) hoge.sample.com.crt
  5.3 1のコピーとリンクしたファイルのハッシュ値が同じであることを確認
6. 秘密鍵のシンボリックリンクを貼り替える
  6.1 cd /etc/private
  6.2 sudo ln -sf hoge.sample.com.key.$(date +%Y%m) hoge.sample.com.key
  6.3 1のコピーとリンクしたファイルのハッシュ値が同じであることを確認
7. 「Webサービスを再起動しますか?」y/n
 → yの場合は systemctl restart apache2.serviceして後続
 → nの場合はスクリプトを抜ける
8. 「証明書更新が完了しました」のメッセージを出してスクリプト終了

結果

出て来たのはこちら。

ssl_update.sh

#!/bin/bash

# 変更するドメイン
domain="hoge.example.com"

# OpenSSLのパス
openssl_path="/usr/local/ssl/bin/openssl"

# 証明書ファイルの格納位置
cert_dir="/etc/certs"

# 秘密鍵ファイルの格納位置
private_dir="/etc/private"

# 引数の数を確認
if [ "$#" -ne 1 ]; then
  echo "Usage: $0 <directory>"
  exit 1
fi

# ディレクトリが存在するか確認
directory="$1"
if [ ! -d "$directory" ]; then
  echo "Error: Directory not found"
  exit 1
fi

# 証明書と鍵のファイルパスを設定
cert_file="$directory/$domain.crt.$(date +%Y%m)"
key_file="$directory/$domain.key.$(date +%Y%m)"

# ファイルの存在を確認
if [ ! -e "$cert_file" ] || [ ! -e "$key_file" ]; then
  echo "Error: Certificate or key file not found"
  exit 1
fi

# ハッシュの確認
cert_hash=$("$openssl_path" x509 -pubkey -in "$cert_file" -noout | "$openssl_path" md5)
key_hash=$("$openssl_path" pkey -pubout -in "$key_file" | "$openssl_path" md5)

if [ "$cert_hash" != "$key_hash" ]; then
  echo "Error: Certificate and key do not match"
  exit 1
fi

issuer_hash=$("$openssl_path" x509 -issuer_hash -noout -in "$cert_file")
subject_hash=$(sed -n -e '1d' -e '/BEGIN/,$p' "$cert_file" | "$openssl_path" x509 -subject_hash -noout)

if [ "$issuer_hash" != "$subject_hash" ]; then
  echo "Error: Issuer hash and subject hash do not match"
  exit 1
fi

# 有効期限の確認
expiration_date=$("$openssl_path" x509 -noout -dates -subject -in "$cert_file" | grep "notAfter" | cut -d "=" -f 2)

echo "ドメイン『$domain』有効期限:$expiration_date で更新します。よろしいですか? (y/n)"
read response

if [ "$response" != "y" ]; then
  echo "証明書更新がキャンセルされました"
  exit 1
fi

# ファイルをコピー
sudo cp "$cert_file" "$cert_dir"
sudo cp "$key_file" "$private_dir"

# シンボリックリンクを貼り替え
cd "$cert_dir"
sudo ln -sf "$(basename $cert_file)" "$domain.crt"
cd "$private_dir"
sudo ln -sf "$(basename $key_file)" "$domain.key"

# リンクとコピーのハッシュが一致しているか確認
if [ "$("$openssl_path" x509 -pubkey -in "$cert_dir/$domain.crt" -noout | "$openssl_path" md5)" != "$cert_hash" ]; then
  echo "Error: Certificate hash mismatch after linking"
  exit 1
fi

if [ "$("$openssl_path" pkey -pubout -in "$private_dir/$domain.key" | "$openssl_path" md5)" != "$key_hash" ]; then
  echo "Error: Key hash mismatch after linking"
  exit 1
fi

echo "Webサービスを再起動しますか? (y/n)"
read restart_response

if [ "$restart_response" == "y" ]; then
  sudo systemctl restart apache2.service
  echo "Webサービスが再起動しました"
fi

echo "証明書更新が完了しました"
exit 0

作成後、

sudo chmod 744 ssl_update.sh

使う前の準備

  1. 変数を適度に修正します。
  2. 任意のディレクトリにドメインの条件に沿った証明書を格納します。

使い方

sudo bash ssl_update.sh [証明書を格納したディレクトリへのパス]

この後、各種を確認して

証明書更新が完了しました

まで出してくれます。

サーバ:OSの入れ替えに向けて。

昨日のfirefly-iiiのインストール失敗を受けて、

計画の見直しを迫られました。

根本的原因

OSとミドルウェア(PHP)のミスマッチ。というよりも、Ubuntu 20.04 系の限界が見えてきます。

LTSバージョンのEOLが2025年4月。

猶予が1年ほどあるものの、見直しが必要なものが沢山です。

ミドルウェアがパッケージされなくなったのも問題です。

等の延命策を採ってきましたが、限界が来るのは否めません。

まずは

Ubuntuのバージョンアップ検証

が必要になってきます。現状のメインツールである

  • Redmine
  • Nextcloud

をはじめとして、スムーズに移行できるかが問われます。

取り急ぎ:

  1. 空いているデスクトップPCにUbuntu 22(23)を入れてみる
  2. そこに、現在稼働しているデータを移行する。
  3. それと同時に検証を行う。
  4. 問題が無かったら自宅内の運用環境に改めて移行する

という順番です。

検証:firefly-iii v6.1.0をUbuntu 20.04にインストール(失敗)

概要

PHPもDBも入っていない検証機があったので、Firefly iii 6系を入れようとしましたが、失敗しました。

以下は失敗の記録です。

環境

  • Ubuntu 20.04
  • Nginx

結論

php8.3-bcmatchがインストールできないことによるComposerエラーです。

やってみた手順

1.Postgresqlのインストール
1.PostgresのDB作成
1.PHPのインストール
1.composerのインストール
1.firefly iiiの配置
1.Composerによるインストール

PostgreSQLのインストール

  • パッケージアップデート
sudo aptitude update
  • PostgreSQLインストール
sudo aptitude install postgresql postgresql-contrib
  • PostgreSQLの軌道確認
 systemctl status postgresql.service 

Active: active (exited) を確認します

PostgreSQLのDB作成

  • コンソールログイン
sudo -u postgres psql
  • DBとユーザ作成
CREATE DATABASE firefly;
CREATE USER firefly_user WITH PASSWORD 'your_password';
ALTER ROLE firefly_user SET client_encoding TO 'utf8';
ALTER ROLE firefly_user SET timezone TO 'Asia/Tokyo';
GRANT ALL PRIVILEGES ON DATABASE firefly TO firefly_user;
quit

パスワードはポリシーに沿って適切なものを指定します

PHP8.3インストール

  • リポジトリ追加
sudo aptitude install software-properties-common

sudo curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg

sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
  • パッケージアップデート
sudo aptitude update
  • PHP8.3インストール
sudo aptitude install php8.3 php8.3-cli php8.3-fpm php8.3-pgsql php8.3-xml php8.3-mbstring php8.3-gd 
  • バージョン確認
php -v

8.3系であることを確認します。

Composerインストール

cd /hoge
# 任意の作業ディレクトリに移動します
sudo php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo php composer-setup.php
sudo mv composer.phar /usr/bin/composer
  • パス確認
which composer

/usr/bin/composerにあることを確認します

  • バージョン確認
composer --version

2023/12/23現在、2.6.6でした

プログラム配置

  • ディレクトリ移動
cd /var/www/html/ && pwd

任意の公開用ディレクトリを指定します

  • gitでファイル取得
sudo -u www-data git clone https://github.com/firefly-iii/firefly-iii.git
  • ディレクトリ移動
cd firefly-iii && pwd

※失敗:Composerでインストール※

sudo -u www-data composer install --no-dev --prefer-dist

以下のエラーが出て来ました。

Installing dependencies from lock file
Verifying lock file contents can be installed on current platform.
Your lock file does not contain a compatible set of packages. Please run composer update.

  Problem 1
    - Root composer.json requires PHP extension ext-bcmath * but it is missing from your system. Install or enable PHP's bcmath extension.
sudo apittude install php8.3-bcmatch

としてもプログラムは見つからず。

まずは記録として遺しておきます。

今後の展望

Ubuntuそのもののバージョンアップを見据えて動きます。

Firefly III とGmail連携

概要

インストールが完了したFirefly iiiと、Gmailを連携させていきます。

基本的にRedmineのGmail連携と同じ手順でした。

前提

https://atelier.reisalin.com/projects/zettel/knowledgebase/articles/22

に従って、アプリパスワードを設定していることが条件です。

※Googleアカウントにフルアクセス可能なパスワードのため、取り扱いは注意してください。※

手順

ディレクトリ移動

cd /home/www-data/firefly-iii &&pwd

自分がインストールしたディレクトリを指定します。

ファイル編集

  • .env

以下の箇所を変更して保存します。

MAIL_MAILER=smtp
MAIL_HOST=[googleから指定されたメールアドレス]
MAIL_PORT=587
MAIL_FROM=[Gmailアドレス]
MAIL_USERNAME=[Gmailアドレス]
MAIL_PASSWORD=[アプリパスワード]
MAIL_ENCRYPTION=true

設定反映

sudo systemctl restart apache2.service

自分がインストールしているWebサービスを利用します

設定確認

  1. firefly-iiiのサイトにアクセスします。
  2. ログインします。
  3. 管理>メッセージを送信をクリックします。
  4. メールが送信されていれば設定完了です。

Page 18 of 51

Powered by WordPress & Theme by Anders Norén