DjangoサイトをAL2からAL2023に移設

2025/02 の作業


AL2 から AL2023 に移設

ついでにパッケージも新しいのに更新

・基本的にdnfでいれる
・Libreoffice はレポジトリに無いのでダウンロードしていれる
・各パッケージの設定は(旧サーバ)のものを基本に設定
・代表的なものは、

Libreoffice 7.2  -> 24.8
Postgresql  13   -> 16
Python      3.9  -> 3.12
Django      3.2  -> 4.2
nginx       1.22 -> 1.26


AL2のデータを吸い上げ

postgresqlのデータ

$ su - postgres
$ pg_dump --verbose -Fc -f old_db.dump appdb


必要なファイル

$ sudo su - appuser
$ find ./appsite \( -path "./appsite/massive1" -o -path "./appsite/massive2" \) -prune -o  -type f -not -name '*.pyc' -print0 | xargs -0 -r tar -zcvf /tmp/appsite.tar.gz

全部だとでかいので、上記の様に不要ファイルを除外して固めようとしたけど、xargs はファイルのリストをバッファに展開するらしく、多すぎるとバッファを上書きするのでファイルが消えるので注意。
結局、必要なディレクトリを個別に固める事にした。
gzip で固めてたけど、最近は zstd の方が良いみたい。


AL2023インスタンス(x86_64)作成と移設


swapの作成

/tmpがAL2023からtmpfsになって、メモリの半分しかなくて小さいから増やす(今回は1G)。

# swap用のブロックを作成
$ sudo dd if=/dev/zero of=/var/swap.1 bs=1M count=1024

1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 6.60108 s, 163 MB/s

# ブロックをswap領域にする
$ sudo mkswap /var/swap.1
mkswap: /var/swap.1: insecure permissions 0644, fix with: chmod 0600 /var/swap.1
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=cc06cbf1-174c-4fba-a236-ce404ed97315

# swap領域を有効にする
$ sudo swapon /var/swap.1
swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.

# 再起動時に有効になる様に fstab に設定
$ echo '/var/swap.1 none swap sw 0 0' | sudo tee -a /etc/fstab
/var/swap.1 none swap sw 0 0


こんな感じになる

# 作成前
$ free -m
               total        used        free      shared  buff/cache   available
Mem:             904         245         160          36         498         486
Swap:              0           0           0

# 作成後
$ free -m
               total        used        free      shared  buff/cache   available
Mem:             904         240          64          36         599         490
Swap:           1023           0        1023




タイムゾーンを日本時間に設定


LibreOffice

レポジトリに無いので、ダウンロードしてインストール。
LibreOffice(この時点の長くテストされていますバージョン LibreOffice_24.8.4_Linux_x86-64_rpm.tar.gz)を/tmpにダウンロード。

# インストール
$ cd /tmp
$ tar zxvf LibreOffice_24.8.4_Linux_x86-64_rpm.tar.gz
$ cd LibreOffice_24.8.4.2_Linux_x86-64_rpm/RPMS/
$ sudo rpm -Uvh *.rpm

# 動作確認(エラーいっぱい)
$ libreoffice24.8 --help

# 足りないライブラリを入れる
$ sudo dnf install libXinerama.x86_64
$ sudo dnf install cairo.x86_64
$ sudo dnf install libxslt.x86_64$ sudo dnf install cups.x86_64
$ sudo dnf install libX11-xcb.x86_64

# 動作確認
LibreOffice 24.8.4.2 bb3cfa12c7b1bf994ecc5649a80400d06cd71002
・・・・

$ libreoffice24.8 --headless --convert-to pdf --outdir /tmp /tmp/test.xlsx
javaldx: Could not find a Java Runtime Environment!
Warning: failed to read path from javaldx
convert /tmp/test.xlsx as a Calc document -> /tmp/test.pdf using filter : calc_pdf_Export

# 日本語フォント入れ
# /usr/local/share/fonts/ に日本語フォント xx.ttc 等を入れる


postgresql

# インストールからの初期設定
$ sudo dnf install postgresql16.x86_64 postgresql16-server.x86_64
# ・・・・
# 他いろいろ初期設定は過去の内容を参照

# AL2のpostgresqlのデータをインポート
$ su - postgres
$ pg_restore --verbose -d appdb -Fc /tmp/old_db.dump


git

# クライアントインストール
$ sudo dnf install git.x86_64
# ssh の秘密鍵(~/.ssh/鍵)と設定(~/.ssh/config)を移設。権限に気を付けて。


python3.12

$ sudo dnf install python3.12.x86_64


Django

# venv 作って
$ python3.12 -m venv app_venv

# 必要なものを pip
$ source app_venv/bin/activate
(app_venv)$ pip install -r requirements.txt

# AL2のファイルを展開

# 今回のソースの変更は、tmpfs になった事に対するrenameの修正、不要になったアプリの削除などなどしたソースをpull
$ git pull
# モジュールをチェック
(app_venv)$ python manage.py check --settings appsite.settings.production
# マイグレーション
(app_venv)$ python manage.py makemigrations --settings appsite.settings.production

Nginx

$ sudo dnf install nginx.x86_64

# 設定をもろもろ移設

# 設定値をチェック
$ sudo nginx -t


certbot

# 必要なライブラリ
$ sudo dnf install augeas-libs

# certbot 用の venv 作って
$ sudo python3.12 -m venv certbot_venv
(certbot_venv)$ sudo pip install certbot certbot-nginx

# 証明書取得
$ sudo certbot --nginx

今まで、certbot のサイトを参考に、内容をコピペしてたけど、その内容をシェルにして、そのシェルについでにログも削除する様にしておいた(logrotateでいい感じにできなかった)。


uwsgi

$ sudo dnf install gcc.x86_64 python3.12-devel.x86_64
(app_venv)$ pip install uwsgi

# 設定をもろもろ移設


supervisor

# supervisor 用の venv 作って
$ sudo python3.12 -m venv supervisor_venv
(supervisor_venv)$ sudo pip install supervisor

# 設定をもろもろ移設。systemdの設定も。


これまで設定したものを起動や、サービスに登録

postgresql、nginx、supervisor、certbot辺り

# サービス登録
$ sudo systemctl enable xxxx
# サービス起動
$ sudo systemctl start xxxx


logrotate

nginx、supervisor の設定を移設

# 強制的にログローテして、ちゃんと動くか確認
$ sudo logrotate -f /etc/logrotate.d/nginx
$ sudo logrotate -f /etc/logrotate.d/supervisor


スケジューラの設定

cron が標準ではなくなったので、systemd.timer に移行

$ vi /etc/systemd/system/xxx.service
$ vi /etc/systemd/system/xxx.timer

# スケジューラ有効化
$ sudo systemctl enable xxx.timer
# スケジューラ開始
$ sudo systemctl start xxx.timer

# スケジュール一覧の確認
$ sudo systemctl list-timers

# 設定編集後の再読み込み
$ sudo systemctl daemon-reload

# 動作ログの確認
$ journalctl -e


大まかな設定は以上でおしまい。