NginxProxyManagerではどうかは知らない*1
運用がこれからなのでちゃんと更新されるかまだ分からないけど
とりあえずページが開けるまではできたので手順をまとめておく。
MyDNS.jpはNPMPlusからDNSチャレンジができないので
一旦適当な証明書を作成して、それにワイルドカード証明書を上書きして設定を乗っ取る手を使います。
MyDNS.jpにてワイルドカード証明書のDNSチャレンジ用のスクリプトがあるのでそれを使用します。
github.com
永続ボリュームかホストマウントの場所に展開。*2
cd /your/domain/directory/
wget 'https://github.com/disco-v8/DirectEdit/archive/master.zip' -O DirectEdit-master.zip
unzip ./DirectEdit-master.zip
cd /your/domain/directory/DirectEdit-master/
chmod 700 ./*.php
chmod 600 ./*.conf
ワイ氏ホストパスの権限が面倒なのでchmodを無視
実際に実行したところ全て700(-rwx------)になってしまったが、システムやコンテナでそういうこともあるらしい。ほんまか?*3
外部からアクセスできないパスなのでままえやろ
ここで展開したphpファイルは更新時も使うので、パスを控えておく。
txtedit.confを編集する。
ログインIDとパス、取得している*.mydns.jpのアドレスを入力。
$MYDNSJP_MASTERID = 'yourmasterid';
$MYDNSJP_MASTERPWD = 'yourpasswd';
$MYDNSJP_DOMAIN = 'yourdomain';
certbotを実行…したいのだが、NPMplusのコンテナ内にPHPが無いので
ENVからPHPを有効にする。
該当ENVは
・PHP85=true
・PHP85_APKS=php85-curl php85-openssl php85-mbstring php85-cli
PHP8.3から8.5が選べるようだが違いが分からない。とりあえず最新でいいのでは。
公式のENVリストにはmbstringとcliは含まれていないが、
mbstringが無いとエラーになる*4し、cliを入れないとパスが通らない。*5
TrueNASのappからだとAdditional Environment VariablesからAddして追加。

そして設定されるパスはusr/bin/phpではなくusr/bin/php85なので
txtregist.phpとtxtdelete.phpの1行目に85を付け足しておく。
…と思ったけど書き換えなくていいやつだな?あれ?なんでちゃんとパス通ってるの?*6
/usr/bin
lrwxrwxrwx 1 root root 5 Aug 31 17:05 php -> php85
-rwxr-xr-x 1 root root 15474480 Aug 5 14:45 php85
/usr/bin
/usr/bin/php
もし無かったらphp85に修正してください。多分俺の気のせいです。
次に証明書を手動で取得。
提示されているシェルスクリプトが以下の通りなのですが
certbot certonly --manual \
--preferred-challenges=dns \
--manual-auth-hook /your/domain/directory/DirectEdit-master/txtregist.php \
--manual-cleanup-hook /your/domain/directory/DirectEdit-master/txtdelete.php \
-d yourdomain -d *.yourdomain \
--server https://acme-v02.api.letsencrypt.org/directory \
--agree-tos -m yourmailaddr \
--manual-public-ip-logging-ok
・manual-auth-hookとmanual-cleanup-hookにスクリプトの置いてあるパスを設定する
・yourdomainに自分の取得しているURLを入れる
・yourmailaddrに自分のメールアドレスを入れる…必要?これ
で、--manual-public-ip-logging-okはcertbotのコマンドから廃止されているので削除する。動作には問題ない。*7
実行すると証明書が取得され、情報メール送るぜ!ってメッセージが出てくるのでNoと入力する。なにこれ。
取得した証明書の保存先パスが表示されていると思うので控える。
コンテナ再起動で消えてしまったので正確なパスが不明なのだが
恐らく
/etc/letsencrypt/live/[ドメイン名]/
/etc/letsencrypt/archive/[ドメイン名]/
に保存されています。
これらを一旦保存。
また、
/etc/letsencrypt/renewal/[ドメイン名].conf
というファイルがあると思うのでこれも保存。
で、自分がやってた時気付かなかったんだけど
liveディレクトリ内の証明書ファイルはarchive内のファイルにシンボリックリンクされてるので
liveだけ持っていくと壊れるので注意。
多分相対パスでシンボリックリンクされてると思われるが、念の為移動前に確認してください。*8
移動後確認したらこうなってたので参考までに。
これは証明書更新後なので少なくとも更新に成功したら正常になると思う
8f921edcf15d:/data/tls/certbot/live/npm-21# ls -l
total 15
-rwx------ 1 npmplus npmplus 692 Aug 31 16:11 README
lrwxrwxrwx 1 npmplus npmplus 30 Aug 31 21:21 cert.pem -> ../../archive/npm-21/cert3.pem
lrwxrwxrwx 1 npmplus npmplus 31 Aug 31 21:21 chain.pem -> ../../archive/npm-21/chain3.pem
lrwxrwxrwx 1 npmplus npmplus 35 Aug 31 21:21 fullchain.pem -> ../../archive/npm-21/fullchain3.pem
lrwxrwxrwx 1 npmplus npmplus 33 Aug 31 21:21 privkey.pem -> ../../archive/npm-21/privkey3.pem
ここで一旦NPMplusのWebUIに入り、適当な証明書を作成する。
名前を変更するのが面倒なので、サブドメイン無しで取得するかwww.とかall.とかのサブドメインにするといいかも。*9
この時ID番号を控えておく。

/data/tls/certbot/live/npm-[ID番号]
/data/tls/certbot/archive/npm-[ID番号]
ここに取得した証明書を上書きする。
フォルダ名が違う(リンク先が不正になる)が、更新処理したら全部上書きされるし多分大丈夫!!!*10*11
保存したrenewal/[ドメイン名].confも
/data/tls/certbot/renewal/npm-[ID番号].conf
として保存。
confファイルを開き、移動先のパスに書き換え。
archive_dir = /data/tls/certbot/archive/npm-[ID番号]
cert = /data/tls/certbot/live/npm-[ID番号]/cert.pem
privkey = /data/tls/certbot/live/npm-[ID番号]/privkey.pem
chain = /data/tls/certbot/live/npm-[ID番号]/chain.pem
fullchain = /data/tls/certbot/live/npm-[ID番号]/fullchain.pem
manual_auth_hook = /directedit-master保存先パス(絶対)/txtregist.php
manual_cleanup_hook = /directedit-master保存先パス(絶対)/txtdelete.php
config_dir = /data/tls/certbot
webroot_path = /data/tls/certbot/acme-challenge,
多分これだけだと思う(忘れた)
以上で乗っ取り完了なので、NPMPlusのWebUIから証明書の更新を実行して正常終了したら完了です。

後は設定して接続試験できたらOKです。お疲れ様でした。
自動更新されてるか確認するのでまた来週!
