Termuxからメールを送れるようにするには?

じゃんくはっく
じゃんくはっく

コマンドラインからメールを送れるようにしたいね!

え?メール送れないの?

ぴー
ぴー
じゃんくはっく
じゃんくはっく

今のところはね。よさげなアプリを物色中〜!

てか、最近Lineばっかりでメールあんまりしてないな。

ぴー
ぴー

さて、今回はメールを取り扱います。ですが、別にメールサーバを作るわけではないです。やりたい事は、こんな感じ。

・コマンドラインからメールを送れるようにしたい
・WordPressのプラグインからメールを送れるにしたい
・Cronとかの結果をメールできるようにしたい
・配送先はgmail!

Termux環境でお手軽にメールを送るには?

メールを取り扱うってことは、いろいろ用意する必要がありますが、今回はメールを他のサーバに送るだけです。Termuxでメールを受信したり、imapのメールを読み書きして送受信したり、あるいは他のサーバからリレーしたりということは今回はしません。内部配送もtermux は1ユーザしかいないのでしません。このあたり、MTAとかMUAとかMDAとか用語がありますが、興味のあるかたはここがわかりやすいです。

メール転送エージェント (MTA)

https://wa3.i-3-i.info/word11120.html

そんなこたぁーわかっとる! っていうベテランも改めてどうぞw

メール設定で最初につまずく『SMTP』『POP』『IMAP』 その意味&設定方法は?

https://time-space.kddi.com/ict-keywords/kaisetsu/20170824/2081

つまりは、SMTPクライアントだけあればいいんです。

お手軽なSMTPクライアント!msmtp

一般的なLinuxなら、postfixとかsendmailとかありますよね。でもTermuxのバイナリにはありません。でも、SMTPクライアントならあります。

msmtp

https://marlam.de/msmtp/

これ、実は今まで知りませんでした! 一応、メールサーバ関連はsendmailや、qmailや、postfixはさわった事があるのですが msmtpってのは取り扱う機会もなくて、こんなのがあったのかという印象です。機能は、こんな感じ!

  • Sendmail互換インターフェイス(コマンドラインオプションと終了コード)
  • 複数のアカウントのサポート
  • クライアント証明書を含むTLS / SSLサポート
  • 国際化ドメイン名(IDN)のサポート
  • 多くの認証方法
  • コマンドパイプラインを使用した高速SMTP実装
  • DSN(配信ステータス通知)のサポート
  • SOCKSプロキシサポート

ステップ1 とにかく入れてみる!

まずは、使ってみましょう。インストールは簡単です。

$ pkg install msmtp

このあたりに入るようです。

$ find $PREFIX -name *msmtp*
/data/data/com.termux/files/usr/bin/msmtpd
/data/data/com.termux/files/usr/bin/msmtp
/data/data/com.termux/files/usr/var/lib/dpkg/info/msmtp.list
/data/data/com.termux/files/usr/var/lib/dpkg/info/msmtp.md5sums
/data/data/com.termux/files/usr/share/doc/msmtp
/data/data/com.termux/files/usr/share/info/msmtp.info
/data/data/com.termux/files/usr/share/man/man1/msmtp.1.gz
/data/data/com.termux/files/usr/share/man/man1/msmtpd.1.gz

ステップ2 設定

ここの説明がわかりやすかったです。参考にしました。

msmtp – ArchWiki

https://wiki.archlinux.jp/index.php/Msmtp

つまりは、以下の設定ファイルを書けばOKです。システム全体は etc 配下に書きますが、今回はホームディレクトリ直下です。gmailのsmtpを使います。

~/.msmtprc
------------------
# Set default values for all following accounts.
defaults
auth           on
tls            on
tls_trust_file /data/data/com.termux/files/usr/etc/tls/cert.pem
logfile        ~/.msmtp.log

# Gmail
account        gmail
host           smtp.gmail.com
port           587
from           username@gmail.com
user           username
password       plain-text-password

# Set a default account
account default : gmail

デフォルトのCA証明書は、opensslがどっかに持っていると思い、どこにあるかわからなかったので以下のように調べました。直接ダウンロードしてどこかに保存しておいても良いのですが。

$ which openssl
/data/data/com.termux/files/usr/bin/openssl
$ ldd /data/data/com.termux/files/usr/bin/openssl
libssl.so.1.1
libcrypto.so.1.1
libc.so

$ find $PREFIX -name libcrypto.so
/data/data/com.termux/files/usr/lib/libcrypto.so
$ ls -l /data/data/com.termux/files/usr/lib/libcrypto.so
lrwxrwxrwx 1 u0_a364 u0_a364 18 Sep 30 05:12 /data/data/com.termux/files/usr/lib/libcrypto.so -> libcrypto.so.1.1

$ cd $PREFIX/lib
$ strings libssl.so | grep -P '^/\w+/'
/data/data/com.termux/files/usr/lib

$ strings libcrypto.so | grep -P '^/\w+/'
/data/data/com.termux/files/usr/lib
/data/data/com.termux/files/usr/etc/tls/ct_log_list.cnf
/data/data/com.termux/files/usr/lib/engines-1.1
/dev/urandom
/dev/random
/dev/hwrng
/dev/srandom
/dev/tty
/data/data/com.termux/files/usr/etc/tls/private
/data/data/com.termux/files/usr/etc/tls
/data/data/com.termux/files/usr/etc/tls/certs
/data/data/com.termux/files/usr/etc/tls/cert.pem

$ tree -N /data/data/com.termux/files/usr/etc/tls
/data/data/com.termux/files/usr/etc/tls
 ├── cert.pem
 └── openssl.cnf

今回必須ではないですが、このサーバのIPをSPFテキストレコードに追加しておきました。MTAをビルドしてテストするかもしれません。この機会に書いておきます。

$ dig -t txt gpl.jp
::
;; ANSWER SECTION:
gpl.jp.			3599	IN	TXT	"v=spf1 +ip4:124.41.83.243 +ip4:106.185.159.254 +ip4:116.58.181.140 +a:www.gpl.jp +a:mail.gpl.jp include:aspmx.googlemail.com include:_spf.google.com ~all"

ステップ3 送信テスト

とりあえず、送信テストです。

$ msmtp -t
To: who@example.jp
Subject: Hello World.

Hi.
これはテストメールです。

認証でエラーが出る場合は、Gmailの以下を確認してみてください。

安全性の低いアプリのアクセス

https://myaccount.google.com/lesssecureapps

これをOnにすれば、認証に通りメール送信できます。ちゃんと届いていました!gmailはUTF-8でも文字化けしませんね。

SPFもパスしていて、問題ないようでした。

DKIMは、googleのやつです。

ステップ4 コマンドラインでメール!

当初やりたかったことの1つです。コマンドラインの結果などをメールしたかったんです。例えば、lsの結果をメールしておきたい場合とか、

$ ls -l /system/etc | msmtp junkhack@gpl.jp

topの結果を送っておきたいとか、

$ top -b -d 1 -n 30 | msmtp junkhack@gpl.jp

なにかの設定ファイルを送っておきたいとか、

$ cat php-fpm.conf | msmtp junkhack@gpl.jp

こんな感じです。題名のないメールですが送れます。同じようにcrontab にもパイプしておけばメールが飛んできます。cronをシステムワイドに設定する方法は詳細を省きますが、いろいろ試してうまく行きませんでした。

ステップ5 PHP でメールを送信

自作のメールフォームを作ることはないかもしれませんが、PHPの設定をしておくと何かと便利かなと。php.ini に以下を記載。termux のphp.ini は自分で作成です。

パスは、/data/data/com.termux/files/usr/lib/php.ini

[mail function]
sendmail_path = "/data/data/com.termux/files/usr/bin/msmtp -C /data/data/com.termux/files/home/.msmtprc -t"

php-fpm を再起動して、テスト用のphpで確認しておきます。

<?php
     mail("hoge@example.jp", "Test email from PHP", "msmtp as sendmail for PHP");
?>

ブラウザーから、このPHPを叩くとメールが送られるはずです。届いたメールヘッダーは、SPFもDKIMもPASSです。

他、以下のサンプルコード(mb_send_mail関数)とかも問題なく動作します。

誰でも実装できる!PHPでメール送信を行う方法【初心者向け】

https://techacademy.jp/magazine/11629

ステップ6 WordPress でメールを送信

WordPressのプラグインからメールするっていうことはPHPの設定をそのまま引き継ぐと思っていたのですが、実際にやってみるとWordPressは、PHPMailerを使って、直接MXへ配送しているようです。

PHPMailer 6.1.6 (https://github.com/PHPMailer/PHPMailer) 

なので、php.ini のsendmail_pathを使った配送にはならないのがデフォルトの挙動のようです。ヘッダーには、SPFもDKIMもありません。これだと、迷惑メールフォルダに分類されてしまいます。

なので、WP Mail SMTPプラグインを使った方法でやっておきます。これは、SMTPクライアントの機能を持っています。つまりは、msmtpと同じようなことができます。この辺りはいくらでも情報があるので省略です。

まとめ

今回、なんとなくわかったのは以下となります。

・msmtpは、お手軽でスマホで作るサーバにはぴったりのSMTPクライアント
・gmailにTLSで送れる
・コマンドラインからパイプでメールが送れるようになった
・cron にも、パイプしておけばメールは飛んでくる
・php.ini のsendmail_path にmsmtpを指定しておけばPHPプログラムのmail関数から配送可能
・しかし、WordPressは、PHPMailerを使って直接MXへ配送しているようだ
・なので、とりあえずWP Mail SMTPプラグインを使う
・直接、WordPressからphp.ini のsendmail_path に配送するにはどうしたらいいだろう?
・機会があれば、wp_mail()を上書きするプラグインを作ってみる

あとがき

とりあえず、やりたいことはほぼ満たせました。msmtpは、スマホで動作するTermux環境にぴったりですね。ただ、配送に失敗した場合などキューにたまらない設計だと思いますので、そのあたりいろいろ考えると面倒です。が、今回は割り切って使うことにします。

著者にメッセージ

コメントじゃなくて、個人的にやりとりしたい場合はこちらからどうぞ。お返事が遅くなるときもありますが、ご了承を。

    備忘録:Termuxで、 HUAWEI P20 liteのUnixBench

    じゃんくはっく
    じゃんくはっく

    ちょっと備忘録、書いておきます!

    メモ的なものをブログに書くの?

    ぴー
    ぴー
    じゃんくはっく
    じゃんくはっく

    あとで検索して参照できるようにね。それに書いておけば誰かの役に立つかも。

    あ〜、それはあるかもね。

    ぴー
    ぴー

    ちょっと、手持ちのスマホでTermux入れてUnixBenchを取っておきました。今回は、HUAWEI P20 liteです。

    スコアは?

    結果から。

    シングル:260.3
    マルチ:932.8

    詳細は以下。インストール方法は、以下参照してね。

    衝撃価格7500円でゲットしたRedmi Note 9SにLinux入れてUnixBenchを計測

    $ uname -a
    Linux localhost 4.9.148 #1 SMP PREEMPT Wed Jul 1 02:47:50 CST 2020 aarch64 Android
    ::
    $ cat /proc/cpuinfo
    Processor	: AArch64 Processor rev 4 (aarch64)
    processor	: 0
    BogoMIPS	: 3.84
    Features	: fp asimd evtstrm aes pmull crc32
    CPU implementer	: 0x41
    CPU architecture: 8
    CPU variant	: 0x0
    CPU part	: 0xd03
    CPU revision	: 4
    ::
    ========================================================================
       BYTE UNIX Benchmarks (Version 5.1.3)
    
       System: localhost: Android
       OS: Android -- 4.9.148 -- #1 SMP PREEMPT Wed Jul 1 02:47:50 CST 2020
       Machine: aarch64 (unknown)
       Language: en_US.utf8 (charmap=, collate=)
       16:18:43 up 10 days, 23:58,  load average: 38.42, 38.42, 38.81; runlevel 
    
    ------------------------------------------------------------------------
    Benchmark Run: Mon Sep 28 2020 16:18:43 - 16:46:46
    8 CPUs in system; running 1 parallel copy of tests
    
    Dhrystone 2 using register variables        8363204.1 lps   (10.0 s, 7 samples)
    Double-Precision Whetstone                     2047.9 MWIPS (9.8 s, 7 samples)
    Execl Throughput                                128.2 lps   (29.8 s, 2 samples)
    File Copy 1024 bufsize 2000 maxblocks        167326.5 KBps  (30.0 s, 2 samples)
    File Copy 256 bufsize 500 maxblocks           50941.4 KBps  (30.0 s, 2 samples)
    File Copy 4096 bufsize 8000 maxblocks        451669.2 KBps  (30.0 s, 2 samples)
    Pipe Throughput                              317299.2 lps   (10.0 s, 7 samples)
    Pipe-based Context Switching                  59343.3 lps   (10.0 s, 7 samples)
    Process Creation                               1418.5 lps   (30.0 s, 2 samples)
    Shell Scripts (1 concurrent)                    762.5 lpm   (60.1 s, 2 samples)
    Shell Scripts (8 concurrent)                    305.9 lpm   (60.1 s, 2 samples)
    System Call Overhead                         460331.9 lps   (10.0 s, 7 samples)
    
    System Benchmarks Index Values               BASELINE       RESULT    INDEX
    Dhrystone 2 using register variables         116700.0    8363204.1    716.6
    Double-Precision Whetstone                       55.0       2047.9    372.4
    Execl Throughput                                 43.0        128.2     29.8
    File Copy 1024 bufsize 2000 maxblocks          3960.0     167326.5    422.5
    File Copy 256 bufsize 500 maxblocks            1655.0      50941.4    307.8
    File Copy 4096 bufsize 8000 maxblocks          5800.0     451669.2    778.7
    Pipe Throughput                               12440.0     317299.2    255.1
    Pipe-based Context Switching                   4000.0      59343.3    148.4
    Process Creation                                126.0       1418.5    112.6
    Shell Scripts (1 concurrent)                     42.4        762.5    179.8
    Shell Scripts (8 concurrent)                      6.0        305.9    509.8
    System Call Overhead                          15000.0     460331.9    306.9
                                                                       ========
    System Benchmarks Index Score                                         260.3
    
    ------------------------------------------------------------------------
    Benchmark Run: Mon Sep 28 2020 16:46:46 - 17:14:54
    8 CPUs in system; running 8 parallel copies of tests
    
    Dhrystone 2 using register variables       64563351.9 lps   (10.0 s, 7 samples)
    Double-Precision Whetstone                    15851.2 MWIPS (9.8 s, 7 samples)
    Execl Throughput                                689.2 lps   (29.7 s, 2 samples)
    File Copy 1024 bufsize 2000 maxblocks        285983.5 KBps  (30.0 s, 2 samples)
    File Copy 256 bufsize 500 maxblocks           80097.8 KBps  (30.0 s, 2 samples)
    File Copy 4096 bufsize 8000 maxblocks        758680.0 KBps  (30.0 s, 2 samples)
    Pipe Throughput                             2020594.4 lps   (10.0 s, 7 samples)
    Pipe-based Context Switching                 427478.4 lps   (10.0 s, 7 samples)
    Process Creation                               4981.4 lps   (30.0 s, 2 samples)
    Shell Scripts (1 concurrent)                   2721.2 lpm   (60.1 s, 2 samples)
    Shell Scripts (8 concurrent)                    326.6 lpm   (60.4 s, 2 samples)
    System Call Overhead                        2323008.0 lps   (10.0 s, 7 samples)
    
    System Benchmarks Index Values               BASELINE       RESULT    INDEX
    Dhrystone 2 using register variables         116700.0   64563351.9   5532.4
    Double-Precision Whetstone                       55.0      15851.2   2882.0
    Execl Throughput                                 43.0        689.2    160.3
    File Copy 1024 bufsize 2000 maxblocks          3960.0     285983.5    722.2
    File Copy 256 bufsize 500 maxblocks            1655.0      80097.8    484.0
    File Copy 4096 bufsize 8000 maxblocks          5800.0     758680.0   1308.1
    Pipe Throughput                               12440.0    2020594.4   1624.3
    Pipe-based Context Switching                   4000.0     427478.4   1068.7
    Process Creation                                126.0       4981.4    395.4
    Shell Scripts (1 concurrent)                     42.4       2721.2    641.8
    Shell Scripts (8 concurrent)                      6.0        326.6    544.3
    System Call Overhead                          15000.0    2323008.0   1548.7
                                                                       ========
    System Benchmarks Index Score                                         932.8

    あとがき

    結局CPU性能しか使わないから、CPU性能だけ高いスマホって他、何かないですかねー。1500-2000くらい出るやつでお手頃のがあればいいんだけど。電力ほとんど使わないから、結構使い勝手はあると思うんですよね。

    あと、HUAWEIはブートローダーのロックが無料で外せないようになったから今後、買うことはないかなー。結構ファンだったんですが。

    Termuxネイティブ環境でWordPressのバックアップをどうするか考える。その3

    じゃんくはっく
    じゃんくはっく

    上書き保存して版数管理のバックアップができました!

    あ〜!あのせこい作戦工夫した方法できたの?

    ぴー
    ぴー
    じゃんくはっく
    じゃんくはっく

    はい!できました〜。

    私も参考にするから、わかりやすくよろしくね。

    ぴー
    ぴー

    ということで、今回は完結編です。わかりやすくはできないかもですが、要点を記録しておきますね。

    バックアップスクリプトはプラグインで

    BackWPup – WordPress Backup Plugin

    https://ja.wordpress.org/plugins/backwpup/

    結局、DBのバックアップスクリプトやファイルの指定などシェルで書かずにワードプレスの↑のプラグインでやることにしました。BackWPupの操作方法はググって貰えばわかると思うので、省きますが以下のように7つのジョブをつくることにしました。

    BackWPupは、ジョブをwp-cliで叩けるようになっています。そして、それをcronで定期実行するという方法です。wp-cliでは、以下のようにコマンド叩くと、ジョブIDがわかります。

    $ wp backwpup jobs
    +--------+--------------------+
    | Job ID | Name               |
    +--------+--------------------+
    | 1      | hackgpljp_db       |DBのバックアップ
    | 2      | hackgpljp_uploads  |uploadsの必要なものだけ
    | 3      | hackgpljp_etc      |Termuxのetc配下の設定ファイル
    | 4      | hackgpljp_themes   |テーマファイル
    | 5      | hackgpljp_plugins  |プラグイン全部
    | 6      | hackgpljp_wpconfig |WordPressの設定関連
    | 7      | hackgpljp_log      |Termuxのログ全部
    +--------+--------------------+

    これらのジョブを実行すると、指定したバックアップディレクトリに圧縮されて保存されます。

    スクリプトは最低限

    プラグインでバックアップしたファイル名にはハッシュ文字列が付いています。このハッシュ文字列は、プラグイン中の設定で消すことができなかったので、スクリプトでファイル名を固定します。rcloneでGoogleDriveに同期したときに上書きされるようにして版数が作られるようにするためです。以下のようなファイルツリーを目指します。

    ├── hackgpljp_db.zip
    ├── hackgpljp_etc.zip
    ├── hackgpljp_log.zip
    ├── hackgpljp_plugins.zip
    ├── hackgpljp_themes.zip
    ├── hackgpljp_uploads.zip
    ├── hackgpljp_wpconfig.zip
    ├── log
    │   └── backwpup_log.html.gz
    └── php.ini

    手抜きですが、以下のようなスクリプトができました。

    #!/bin/bash
    PATH=$PATH:/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/home/bin
    
    #バックアップ先
    BACKUP_PATH="/backup/dir/path"
    LOG_PATH="/backup/dir/path/log"
    
    # GoogleDrive のrcloneドライブ名
    DRIVENAME=01bup
    # GoogleDrive の保存ディレクトリ
    CPATH=hackgpljp
    
    mv  $BACKUP_PATH/hackgpljp_db_* $BACKUP_PATH/hackgpljp_db.zip
    mv  $BACKUP_PATH/hackgpljp_etc_* $BACKUP_PATH/hackgpljp_etc.zip
    mv  $BACKUP_PATH/hackgpljp_log_* $BACKUP_PATH/hackgpljp_log.zip
    mv  $BACKUP_PATH/hackgpljp_plugins_* $BACKUP_PATH/hackgpljp_plugins.zip
    mv  $BACKUP_PATH/hackgpljp_themes_* $BACKUP_PATH/hackgpljp_themes.zip
    mv  $BACKUP_PATH/hackgpljp_uploads_* $BACKUP_PATH/hackgpljp_uploads.zip
    mv  $BACKUP_PATH/hackgpljp_wpconfig_* $BACKUP_PATH/hackgpljp_wpconfig.zip
    cp -p /data/data/com.termux/files/usr/lib/php.ini $BACKUP_PATH/php.ini
    mv $LOG_PATH/backwpup_log_* $LOG_PATH/backwpup_log.html.gz
    
    tree -N $BACKUP_PATH
    echo ''
    echo "rclone sync start : "  `date +'%H:%M:%S.%3N'`
    rclone sync $BACKUP_PATH/ $DRIVENAME:$CPATH
    echo "rclone sync end   : "  `date +'%H:%M:%S.%3N'`

    cronで定期実行

    termuxはcronもちゃんと動くようです。一番、ネットワークが空いている時間帯に動作させます。まず、WordPressのバックアップジョブを動作させ、一番最後の4:00から動くのは、先ほどのスクリプトです。

    # hackgpljp_db
    30 03 * * * /data/data/com.termux/files/usr/bin/wp backwpup start 1 --path=/data/data/com.termux/files/home/htdocs_nginx/
    # hackgpljp_etc
    31 03 * * * /data/data/com.termux/files/usr/bin/wp backwpup start 3 --path=/data/data/com.termux/files/home/htdocs_nginx/
    # hackgpljp_themes
    31 03 * * * /data/data/com.termux/files/usr/bin/wp backwpup start 4 --path=/data/data/com.termux/files/home/htdocs_nginx/
    # hackgpljp_plugins 5m
    32 03 * * * /data/data/com.termux/files/usr/bin/wp backwpup start 5 --path=/data/data/com.termux/files/home/htdocs_nginx/
    # hackgpljp_wpconfig
    37 03 * * * /data/data/com.termux/files/usr/bin/wp backwpup start 6 --path=/data/data/com.termux/files/home/htdocs_nginx/
    # hackgpljp_uploads maybe 10m
    38 03 * * * /data/data/com.termux/files/usr/bin/wp backwpup start 2 --path=/data/data/com.termux/files/home/htdocs_nginx/
    # hackgpljp_log
    48 03 * * * /data/data/com.termux/files/usr/bin/wp backwpup start 7 --path=/data/data/com.termux/files/home/htdocs_nginx/
    ##
    ## Sync Google Drive
    ##
    00 04 * * * /data/data/com.termux/files/home/backup/0_bup_to_googledrive.sh

    一応、テストはしてきます。ちなみに、このファイルツリー・約1.1GBのファイルをsyncするのにかかった時間は、約2分10秒でした。

    rclone sync start :  19:48:41.010
    rclone sync end   :  19:50:52.552

    GoogleDrive側は?

    ちゃんと上書きされて、版ができるか確認しておきます。

    土曜日にテストしていたのですが、日・月とちゃんと動作しているようですね! この画像はuploadsの画像フォルダのバックアップですが圧縮しても1GBはあります。現行版を含めて4つファイルはあり、普通にバックアップしていれば4GBになりますが、ディスク消費は1.1GBです。

    版を消さないようにすると、

    保存容量にカウントされるようです。(リロード後、容量は変わります)

    なるほど、「この履歴を削除しない」は必要な時だけ使うようにします。

    まとめ

    今後の課題も見つかりましたのでまとめにメモをしておきます。

    ・GoogleDriveの版は、保存容量を消費しない。
    ・しかし、「この履歴を削除しない」とすると消費される
    ・cronのメールはsendmailが動作してないので、飛んでこない
    ・sendmailの代わりに、msmtpが良さそうかも。
    ・版は100個まで保存されるが、過去30日で消えるそうなので実質、30日前までは戻せる。(たぶん)

    あとがき

    termuxで、cronのメールを飛んでくるようにするには、sendmail相当の何かを入れる必要があります。定番は、msmtpということのようです。

    稼働率・SLA99.95%をスマホ自宅サーバで目指せ!まずは1ヶ月間

    じゃんくはっく
    じゃんくはっく

    SLAって知ってる?

    聞いたことはあるけど、品質の合意だっけ?

    ぴー
    ぴー
    じゃんくはっく
    じゃんくはっく

    そうそう!稼働率のSLA99.95%とかって意味でよく使われてるよね。99.95%稼働してるってことは1ヶ月で約21分はダウンしたってこと。

    それを自宅サーバでがんばってみるのね!

    ぴー
    ぴー

    目標を持つのは、大事だよなということで、せっかく自宅サーバを運用しているので遊び感覚で、稼働率SLA99.95%を目指してみることにします。今、検討しているsite24x7のサービスは、この稼働率を算出する仕組みもあるようです。

    SLA99.95%とはどのくらいダウンが許されるのか?

    稼働率 => 月間ダウンタイム計算ツール

    https://cloned.jp/sla-calc/

    こんな便利な計算サイトがありました。ここで計算してみると、99.95%とは1ヶ月に21.6分以内であればOKということです。年間だと、262.8分(4.4時間)以内であればOK。

    じゃんくはっく
    じゃんくはっく

    少ないような多いような、う〜ん。あまり体感できないね!

    1ヶ月に21.6分しか休憩できないって思うとぞっとするわ!

    相当なブラック企業よ!

    ぴー
    ぴー
    じゃんくはっく
    じゃんくはっく

    ・・・なんか、すごく大変な気がしてきた!w

    site24x7で、SLA設定をしてみる!

    現在、検討中の監視サービス・site24x7は、目標のSLAを設定できます。世界各地の拠点、8箇所から1分間隔で監視しています。そこから算出してくれる大変、便利な機能です。設定は、管理>SLA設定 から行えます。

    営業時間は設定していませんので、24時間が対象ということです。

    現在の稼働率はどのくらい?

    まだ、9/20から始めたので1ヶ月は経過していませんが現状は以下の通りです。

    9/21と23日に停止時間があり、落ちていた時間は8分40秒ということです。現在は、99.852%の稼働率ということがわかりました。

    評価期間・1ヶ月でSLAをチャレンジ!

    良い目標ができたので、とりあえず1ヶ月後の10/20にSLA目標が達成できるかチャレンジしてみようと思います。今のところ、8分40秒ダウンしていますので、あと猶予は約12分間です。あと25日間で12分ダウンさせなければSLA99.95%を達成できます。

     うーん、こうして計算してみると結構大変な気がします。まず、1台のスマホサーバでやっているのでダウンしたら12分なんてあっという間でしょう。あと寝ている時間とかに、ダウンしたら終わりですね。年間を通じて、99.95%を維持しようとするなら、ロードバランサーや複数台構成が必須だと思います。停電っていうのもありますしね。スマホ自体は電池があるから無停電電源装置がついているようなものですが、ルータ周りやHUBなど対応する必要がありそうです。

    やるしかないでしょ!期待してるわよ。

    ぴー
    ぴー

    まとめ

    だいぶ煽られていますがまとめます。今回、なんとなくわかったのは以下ですね。

    ・稼働率SLA99.95%とは1ヶ月に21.6分以内であればOK
    ・1年なら、262.8分(4.4時間)以内であればOK
    ・監視サービス・site24x7は、サイトを客観的に見るために有用だ
    ・監視サービス・site24x7(有料版)は、SLA目標を設定できレポートが作れる

    あとがき

    こうして自分で体験してみると結構大変そうだなって思いました。また1ヶ月後に具体的な数字が出るのでそこで、何かまた発見があるかもしれません。

    余談ですが、世界各地8箇所から応答時間をモニタリングしていますが、なんと国内からよりもロサンゼルスからが一番品質が良いようです。

    東京など国内は、ロスからのように平坦ではないです。今、InterLinkのPPoEのIP固定使っています。国内のほうが速いだろうと思っていましたがこれは以外な発見でした。site24x7のサービス、すごく良いと思います。

    Termuxネイティブ環境でWordPressのバックアップをどうするか考える。その2

    じゃんくはっく
    じゃんくはっく

    GoogleDriveの版数管理を今日はテストしてみるよ!

    版数って、バージョンとかってこと?

    ぴー
    ぴー
    じゃんくはっく
    じゃんくはっく

    そうそう、同じファイルを上書きすると過去の変更前の状態に戻せる機能だよ。詳細はここ見てね。

    なんとなくわかった! けど、バックアップと関係あるの?

    ぴー
    ぴー

    この版数管理、実は前から気になっていたんですよね。今日はテストがてら、この機能をtermuxから、GoogleDriveなどクラウドストレージにコピーや同期させる rclone を使って実際に試してみたいと思います。

    テストするクラウド環境の用意

    クラウドは、GoogleのGoogle Apps(グーグルアップス)にします。gpl.jpドメインは、ここに関連付けてありますので1つ新規のアカウントを用意しました。

    15GBの保存容量がありますね! また何も保存していない状態です。

    rcloneという、すごいやつをTermuxに入れる!

    rcloneは、以下のオフィシャルサイトにもarm用がビルドされていてダウンロードできますが、これはtermux では使ってはいけません。

    Rclone Download v1.53.1

    https://rclone.org/downloads/

    なぜなら、名前解決の仕組みが違うからです。Termux にはバイナリが用意されていますので、pkg installで入れておきます。

    $ pkg install rclone
    ::
    $ rclone --version
    rclone v1.53.1-DEV
    - os/arch: android/arm64
    - go version: go1.15.2

    なぜ、こっちを使うのかと言うと名前解決の方法が違うからです。termuxパッケージのrcloneを使わないと、認証するとき、エラーになりますので。筆者は、ここで途方に暮れました。

    rcloneとgoogle driveの初期設定

    先ほど用意した、GoogleDriveのアカウントを使えるようセットアップします。

    Google Drive

    https://rclone.org/drive/

    ここに詳しく書いてありますが、要点は1つ。リモートでセットアップしている場合は、以下の選択肢を n として作業しているPCのブラウザから Googleにログインしてverification codeを入力しましょう。

    Remote config
    Use auto config?
     * Say Y if not sure
     * Say N if you are working on a remote or headless machine
    y) Yes (default)
    n) No
    y/n> n

    以下のリンクを作業しているPCのブラウザで開き認証します。認証するとverification codeが出るのでこれを、貼り付けます。

    Please go to the following link: https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=(省略)
    Log in and authorize rclone for access
    Enter verification code> ここに認証したコードを

    確認は、このコマンドでリモート名称一覧が出てきます。この名称は rclone コマンド中に使うので短く覚えやすいのが良いかなと思います。今回は、01bupとしてみました。

    $ rclone listremotes
    01bup:

    設定ファイルはホームディレクトリの以下にあります。

    $ tree .config/rclone/
    .config/rclone/
    └── rclone.conf

    rcloneを使ってみる

    まず、何もGoogleDriveには入っていませんが一覧を出してみます。

    $ rclone ls 01bup:
    $ 

    ではディレクトリを作ってみましょう。

    $ rclone mkdir 01bup:hackgpljp 

    確認。

    $ rclone lsd 01bup:
              -1 2020-09-24 17:46:29        -1 hackgpljp
    または、
    $ rclone lsf 01bup:
    hackgpljp/

    ちゃんと作られているか、ブラウザでも見て見ましょう。

    おお〜! ちゃんとディレクトリが作られていますね。

    テストコードでファイルの履歴を作ってみる

    同じファイル名を更新していくと、版ができるので確認してみたいと思います。tmpディレクトリを作り、そこで作業します。

    $ cd
    $ mkdir tmp
    $ cd tmp
    $ pwd
    /data/data/com.termux/files/home/tmp

    テストプログラムを作ります。今回は、test.shとしてこのような内容にしました。

    $ cat test.sh 
    #!/bin/bash
    
    PATH=$PATH:/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/home/bin
    BACKUP=/data/data/com.termux/files/home/tmp
    TXTFILE=a.txt
    DRIVENAME=01bup
    CPATH=hackgpljp
    
    echo '' >> $BACKUP/$TXTFILE
    max=30
    
    for ((i=0; i < $max; i++)); do
        echo $i ":" `date +'%H:%M:%S.%3N'` >> $BACKUP/$TXTFILE
        echo "rclone sync start : "$i  `date +'%H:%M:%S.%3N'`
        rclone sync $BACKUP/ $DRIVENAME:$CPATH
        echo "rclone sync end   : "$i  `date +'%H:%M:%S.%3N'`
        sleep 1
    done

    動作概要としては、以下となります。

    ・a.txt に、日付ファイルを追記して、rcloneで同期させる
    ・回数は、30回(つまり、版が30個できる)
    ・rclone syncがどのくらい時間がかかるか前後で時刻を出しておく

    やっと実験です。tmpディレクトリにはテストPGしかまだありません。

    $ ll
    total 24K
    drwx------  2 u0_a364 u0_a364 4.0K Sep 25 02:51 ./
    drwx------ 24 u0_a364 u0_a364 4.0K Sep 25 02:51 ../
    -rwx------  1 u0_a364 u0_a364  490 Sep 25 02:51 test.sh*

    では、動かしてみましょう!

    $ ./test.sh 
    rclone sync start : 0 03:00:19.515
    rclone sync end   : 0 03:00:24.202
    rclone sync start : 1 03:00:25.237
    rclone sync end   : 1 03:00:28.314
    ::(省略)
    rclone sync start : 5 03:00:43.284
    2020/09/24 18:00:43 Failed to create file system for "01bup:hackgpljp": couldn't find root directory ID: googleapi: Error 403: Rate Limit Exceeded, rateLimitExceeded
    rclone sync end   : 5 03:00:43.915
    ::(省略)
    rclone sync start : 8 03:00:54.008
    2020/09/24 18:00:54 Failed to create file system for "01bup:hackgpljp": couldn't find root directory ID: googleapi: Error 403: Rate Limit Exceeded, rateLimitExceeded
    rclone sync end   : 8 03:00:54.603
    ::(省略)
    rclone sync start : 29 03:02:24.355
    rclone sync end   : 29 03:02:27.609

    一部、Rate Limitのエラーが出ていますね。テストPGは1秒の待ち時間を入れてありますが、速すぎると制限にひっかかるのでしょうか。rclone syncの処理時間は、このくらいのテキストサイズで3秒〜5秒くらいのようです。

    気になることはいろいろありますが、GoogleDriveにバックアップされたか見て見ましょう。

    $ rclone ls 01bup:hackgpljp
          531 a.txt
          490 test.sh

    ちゃんと、ローカルのtmpディレクトリ が同期されていますね。

    ブラウザーでも見て見ましょう。

    大丈夫そうです。a.txtを右クリックして「版を管理」から版数が保存されているか確認してみます。

    おー! 版は現行版を含めて28個ありました。途中2回失敗していたからですね。では、1つ目の版をダウンロードしてみてみましょう。

    ちゃんと、最初の1回目のタイムスタンプだけでしたね!

    では、1つだけ古い28版を見て見ましょう。

    最新のは、29 こ目のタイムスタンプがあるやつなので、ちゃんと1つ前にアップロードされたファイルのようです。

    版は100個以上になるとどうなるのか?

    先ほどの、ダイアログ中に版は100個まででそれ以上は削除される可能性があると書いてありました。

    「a.txt」の旧版は、保存してから 30 日間経過した場合、または保存した版が 100 個に達した場合に削除される可能性があります。削除されないようにするには、ファイルのコンテキスト メニューで [この履歴を削除しない] を選択します。

    どうなるか実験してみましょう。テストプログラムをb.txtとして、回数は110回の上書き保存としてみます。

    $ ./test.sh 
    rclone sync start : 0 03:22:16.889
    rclone sync end   : 0 03:22:20.567
    ::
    rclone sync start : 109 03:30:25.700
    rclone sync end   : 109 03:30:29.008

    今回はレートリミットのエラーは出ませんでした。ブラウザーで履歴を見て見ます。

    ふむふむ! 版は100までしかないですね。このファイルを見てみます。

    108のタイムスタンプなので、最新の1つ前ですね。では、版1を見てみます。

    あー、なるほどですね。100個以上前の版は流れているようです。

    まとめ

    今回、簡単な実験からなんとなく雰囲気がつかめました。

    ・rclone syncで同期されるが、3〜5秒と同期するファイルサイズにより時間はそれなりにかかる。
    ・あまり短い間に、上書きするとレートリミットの制限にひっかかるようだ。
    ・版数は、ちゃんと保存されていて100個を越えると一番古いのが流れる。

    容量節約してバックアップを効率的に保存しておくってことだったのね! やっと意味がわかった〜!っていうか、せこいこと考えるわね!

    ぴー
    ぴー

    あとがき

    おそらく30日を越えると、履歴は消えるのでしょう。どのように消えるのか興味はあります。また、削除したくない場合は、「この履歴を削除しない」にチェックを入れておけば大丈夫のようですが、まだ未確認です。これを確認するには、30日以上かかりますので。

     でもまぁ、うまく使えば、ログや画像ファイルなどバックアップデータを1日1回、同じファイル名で保存すれば、30日前までは引っ張ってこれるみたいなので容量は節約できそうですね。

    Termuxネイティブ環境でWordPressのバックアップをどうするか考える。その1

    じゃんくはっく
    じゃんくはっく

    今日も自宅サーバいじるよ〜!

    ほんと、好きねぇ〜。今日は何するんですか〜?

    ぴー
    ぴー
    じゃんくはっく
    じゃんくはっく

    好きというか、まだ設定いろいろあってw。とりあえず、バックアップをどうしようかなと。

    プラグインとか便利なのあるでしょ?あれじゃだめ?

    ぴー
    ぴー

    はい、ぴーちゃんの言う通り便利なプラグインがあります。

    超有名なWordPressバックアッププラグイン

    この2つが特に有名じゃないでしょうか?

    UpdraftPlus WordPress Backup Plugin

    あと、これ。

    BackWPup – WordPress Backup Plugin

    前者のUpdraftPlusは、一度使ったことがあります。通常ならこれでバックアップはOKじゃないでしょうか。でも、今回はちょっと自宅サーバ構成に難があって、自分のドメインに自分でアクセスできない問題があります。

    自分のドメインに自分でアクセスできない問題!

    これはつまり、https://www.gpl.jp や、https://www.gpl.jp で自分自身にアクセスできないということです。こういう場合、WordPressのcronやジェットパックなどいろんな部分で問題が発生します。これは、wp-cliで診断すると以下のようになります。

    $ wp cron test
    Error: WP-Cron spawn failed with error: cURL error 28: Connection timed out after 3000 milliseconds

    この、cURL error 28 エラーはいろんなケースで出るのですが自分の場合は、登録されているURLに自分自身でアクセスできないことが原因です。この問題の根本は以下で紹介しています。まだ解消していません。

    ポートフォワードの経路で、Uターン NATとかヘアピンNATが使えないルータの場合のあれこれ

    https://www.gpl.jp/2020/09/07/ポートフォワードの経路で、uターン-natとかヘアピ/

    この解消はまた別の機会にやるとして、今回はこういう中途半端な環境で wp-cronが動作しない中、どうやってバックアップを行うかという感じです。

    さて、どんな方法があるの?

    王道としては、バックアップスクリプトを書いて、どこかクラウドストレージへコピーする方法です。データベースと、WordPress側で更新される画像など uploads以下にできるファイル、またカスタマイズするテーマなどもバックアップしておきたいです。それらをスクリプト中に記載してLinuxのcronで実行するという、めんどくさいやり方です。世の中、便利になりすぎてこういうスクリプト書くのが面倒になってきています。

    バックアップ方針とTermux環境で使えそうなツール

    バックアップ方針は、やってる最中に気が変わるとして、下調べしてみると必要なツールは以下となりそうです。

    ・クラウドへのバックアップ 
     → GoogleDriveにバックアップしたい
     → rcloneがある!
    ・uploadsは差分バックアップしたい
     → rsyncがある
     → Termuxもバイナリがある
    ・全部、スクリプトで書くと面倒
     → wp-cli を使って、プラグインと併用してみる
    ・DBは30日分保存、uploadsは差分保存

    幸い、Termuxのバイナリにはこれらのツールが揃っていることがわかりました。rclone は、今回はじめて使います。

    Rclone syncs your files to cloud storage

    https://rclone.org/

    まとめ

    今回、なんとなくわかったのは以下となります。

    ・WordPressのcronは、自己のURLで自分自身をcurlで叩いている。
    ・それが出来ないと、cURL error 28のエラーが発生する。
    ・wp-cliで、wordpress の jobを linux の cron で叩けば動く
    ・クラウドへの保存ツールは、rcloneで解決

    あとがき

    まぁ、そもそもネットワーク構成をちゃんとやって自分自身をちゃんと参照できるようにしないとだめだよなーと。ただ、NATとポートフォワードをしていて内部LAN側に違うポートで提供している環境は他にもあると思うので、もしかすると誰かの参考になるかなとも。たぶん、その2へ続くと思います。