クラウドサーバへの導入に関して - kisapapa1227/retrek-ui_V2 GitHub Wiki

環境

  1. uname -a Linux instance-20250410-065246 6.1.0-34-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.135-1 (2025-04-25) x86_64 GNU/Linux
  2. docker -v Docker version 28.1.1, build 4eba377

リソース

docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          6         6         16.99GB   7.834MB (0%)
Containers      6         6         17.76MB   0B (0%)
Local Volumes   2         2         207.3MB   0B (0%)
Build Cache     22        0         6.525kB   6.525kB
df
Filesystem     1K-blocks     Used Available Use% Mounted on
udev             8181412        0   8181412   0% /dev
tmpfs            1638632     1184   1637448   1% /run
/dev/sda1      102956608 23460548  75187220  24% /
tmpfs            8193148        0   8193148   0% /dev/shm
tmpfs               5120        0      5120   0% /run/lock
/dev/sda15        126678    11840    114838  10% /boot/efi
tmpfs            1638628        0   1638628   0% /run/user/1002
overlay        102956608 23460548  75187220  24% /var/lib/docker/overlay2/6c9d01569fdca828a08904b5517e8e3c00ad7b97890cbaca73e0c157908c1b95/merged
...
free
               total        used        free      shared  buff/cache   available
Mem:        16386296     2034188     5903404       67140     8857456    14352108
Swap:              0           0           0

特別な注意

ユーザ管理のデータベース(デフォルト、いわゆる、テスト用)サーバーが、sail up で起動後半日程度で、SHUTDOWN される。

docker ps -a
7267129a0d89   mysql/mysql-server:8.0       "/entrypoint.sh mysq…"   2 days ago   Exited (0) 47 hours ago  retrek-ui_v2-mysql-1

docker logs 7267129a0d89
[Entrypoint] MySQL Docker Image 8.0.32-1.2.11-server
[Entrypoint] Starting MySQL 8.0.32-1.2.11-server
2025-05-23T07:14:04.522389Z 0 [Warning] [MY-011068] [Server] The syntax '--skip-host-cache' is deprecated and will be removed in a future release. Please use SET GLOBAL host_cache_size=0 instead.
2025-05-23T07:14:04.523610Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.32) starting as process 1
2025-05-23T07:14:04.532553Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2025-05-23T07:14:04.743718Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2025-05-23T07:14:04.979991Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2025-05-23T07:14:04.980028Z 0 [System] [MY-013602] [Server] Channel mysql_main configured to support TLS. Encrypted connections are now supported for this channel.
2025-05-23T07:14:05.003947Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2025-05-23T07:14:05.004070Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.0.32'  socket: '/var/lib/mysql/mysql.sock'  port: 3306  MySQL Community Server - GPL.
2025-05-24T02:37:38.103894Z 2485 [System] [MY-013172] [Server] Received SHUTDOWN from user root. Shutting down mysqld (Version: 8.0.32).
2025-05-24T02:37:39.380805Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.32)  MySQL Community Server - GPL.

フロントで立ち上げて、ターミナルを残しておくと回避できる。HUP でも行ってるのでしょう。実害として、shudown に伴い、保存先が消され、ユーザー情報が初期化される。http 通信だから、port scan の後に、DDOS されてるのでは? https にしたいが、CA証明書が必要で、メンテの割が合わない。 「【Docker】https-portalを使ってHTTPS化 & Let’s encryptの自動化」などを参照にすれば可能かもしれない

2025/05/29 mysql が落ちる前提で再起動の手順の確認

下記手順(laravel レベルでの volumeの書き戻し)は、保存データと同じ日に書き戻すと問題ないが、別の日になると読めない。認証にタイムスタンプが含まれているのかと思われる。姑息的対処は不毛なので、データベースレベルでの書き戻しに変更。

ここから没手順

  1. 動作確認
    1. コンテナ id を取得する: docker ps -a | grep mysql | awk '{print $1}' で id を取得する。
    2. 状態を複製する: cp -r -p /var/lib/docker/volumes/retrek-ui_v2_sail-mysql /home/kisa/work/backup
    3. 通常操作 (browser)でユーザを追加する。
    4. mysql コンテナを止める: docker stop $id <-- 落ちてる状態の再現
    5. 状態を書き戻す:cp -r -p /home/kisa/work/backup/retrek-ui_v2_sail-mysql /var/lib/docker/volumes
    6. mysql コンテナーを起動する: sh mySqlctl.sh start/stop/log
  2. 条件の判定:言葉 server と data
    1. 一度 login すれば、その後に data が消されても問題ない(cache かな?)、ただし、logout できない。
    2. 当然、data が無いと、login できない。
    3. server が落ちてると、login できない。
    4. data が無いと、server は立ち上がらない。
    5. 判定1:data/retrek があって、server が動いていれば、cp -rup data backup
    6. 判定2:data/retrek がなければ、cp -rup backup data
    7. 判定3:server が動いていなければ、docker start server
    8. (想定外)server が動いていて、data がなかった時(再起動するか、放置するか)
  3. crontab -e
    1. */5 * * * * sh /home/kisa/work/mySqlWatcher.sh
  4. docker を作り直したときに、前のデータベースを引き継ぐ手順
    1. InstallStep3.sh に、touch /home/kisa/work/initialized を追加
    2. mySqlWatcher で if [ -e initialized ] で、backup から data を書き戻す。 ここまで没手順

2025/06/13 mysql の再起動、及び、ユーザー管理用データベースのリストア

  1. サーバーに mysql のクライアントをインストールする。
  2. docker ps -a で mysql の状態の確認
    1. shutdown されていれば、再起動 docker start #mysql (1分起動待ち)
    2. mysql にテーブル一覧を要求し、ユーザー管理テーブルの存在を確認する。
      1. ユーザ管理テーブルが無ければ、作成して、バックアップデータをリストアする。
      2. あれば、テーブル内容を要求し、差分があれば、バックアップデータを更新する。
  3. crone で回しておく。また、せっかくなので who で部外者が login してないかも確認。

tmux の利用

  1. tmux new -s retrek # 新規
  2. C-b % # 左右に分ける
  3. C-b カーソル # 移動する
  4. tmux a -t retrek # 再接続

これで運用するが、mysql shutdown 問題は解決しない。8時間程度で落ちる。

tmux 上でsail をフロント起動にする。

cd hoge;sudo su
sh InstallStep4.sh;sh InstallStep3.sh;cd retrek;./vendor/bin/sail down
./vendor/bin/sail up