2026年 01月 10日

配信画像どうするか悩んでる

既存のをまずは最適化した。トータルで JPEG 以外も含めて 5.9GB ある。

$ jpegoptim -p --all-progressive --total *.jpg
...
Average compression (2467 files): 4.79% (292586k)
jpegoptim -p --all-progressive --total *.jpg  980.72s user 45.35s system 98% cpu 17:24.23 total

約 292MB削減。ロスレス最適化だけで結構減ったなあ。

全体を AVIF 化してしまうのをやったほうがいい気もする。

まず新規アップロードについて JPEG でアップロードしたら自動で AVIF に変換かけることにした。ただ、これが非常に重かったのでいろいろ妥協した以下のようにした。

avifenc --jobs 3 --speed 8 --yuv 420 -q 60

Lightroom からは AVIF で出すので、写真を JPEG でアップロードするのはあんまりこだわらないときに限られるのでいいだろう……

あと PNG に関しても oxipng か optipng が入っていたら自動で通すようにした。スクショとか上げることが多いのでこれは効くはず

全JPEGのAVIF化で問題になるのは、あとはOGP画像。OGP画像は今まではエントリの最初の img の src をそのままブチこむということをしてたけど、これができなくなる。ウーン。まあ諦めて普通のOGP画像を出せばいいか。大して共有されるわけではないから

Ubuntu 20.04 に avifenc を入れる

README.md に書いてある通りだけど、ext/ 以下で libaom をビルドしてそれを static link するのが良いようだ

git clone -b v1.3.0 --depth 1 https://github.com/AOMediaCodec/libavif.git
cd libavif
cd ext
sh aom.cmd
cd ..
cmake -DAVIF_BUILD_APPS=ON -DBUILD_SHARED_LIBS=OFF -DAVIF_CODEC_AOM=LOCAL -DAVIF_LIBYUV=LOCAL . 

v1.3.0 より新しいと要求する cmake があたらしすぎてダメだった

Ubuntu 20 から 24 に do-release-upgrade

LLM にリリースノートと ps aux の結果とかを食わせながら注意点を適当にあらいだしてやった。こういうときペアでやってる感じがあってだいぶ気が楽だ。

そこそこすんなりいったのでよかった。

h2o

openssl のアップグレードがあるので h2o を一時的に static link に。前回アップグレード時もビルドしなおしになってハマった記憶

h2o 用の openssl を配置しとく

 wget https://www.openssl.org/source/openssl-3.0.12.tar.gz
 tar xzvf openssl-3.0.12.tar.gz 
 cd openssl*
./config --prefix=/opt/h2o-ssl no-shared
make
sudo make install

ビルドしなおし

$ git clean -fdx
$ export PKG_CONFIG_PATH=/opt/h2o-ssl/lib64/pkgconfig  
$ cmake -DOPENSSL_ROOT_DIR=/opt/h2o-ssl -DOPENSSL_USE_STATIC_LIBS=TRUE  -DWITH_FUSION=ON -DCMAKE_C_FLAGS="-march=native" .
$ make
$ make install

$ ./h2o -v
h2o version 2.3.0-DEV@afe696c72
OpenSSL: OpenSSL 3.0.12 24 Oct 2023
mruby: YES
capabilities: YES
fusion: YES
ssl-zerocopy: YES
ktls: YES
key-exchanges: secp521r1, secp384r1, x25519, secp256r1

$ ldd ./h2o
        linux-vdso.so.1 (0x00007ffef3ffb000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f411d0e2000)
        libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f411d0dc000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f411cf8d000)
        libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f411cf71000)
        libcap.so.2 => /lib/x86_64-linux-gnu/libcap.so.2 (0x00007f411cf68000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f411cd76000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f411d951000)

バックアップ

念のため

sudo tar czvf /data/vps_config_backup_20260110_v2.tar.gz \
  /home \         
  /etc \
  /usr/local \
  /var/lib \
  /var/spool/cron \
  /root \
  /opt \
  /srv \
  /var/www \
  --exclude=/var/lib/docker \
  --exclude="/home/*/tmp" \
  --exclude="/home/*/swp"

sudo do-release-upgrade

20 → 22 → 24 とあげていった。普通に起動してくれてよかった

rabbitmq

mqtt server としてしか使ってない割に do-release-upgrade のたびに障壁になってたので、使うのをやめた。

mochi-mqtt/server + すこしの実装で、自分の要求には完全な代替を Gemini が書いてくれたので、それをsystemdでデーモン化した。

mackerel-agent

インストールスクリプト流しなおした

certbot

動かなくなっていたので snap 版をつかうようにした。

 sudo apt install snapd
 sudo snap install core; sudo snap refresh core
 sudo snap install --classic certbot
 sudo ln -s /snap/bin/certbot /usr/bin/certbot

systemd と Unix domain socket

2021年にh2oをsystemd管理にしてから、UNIXドメインソケットでの接続 (unix:/tmp/backend とかにしてた) がうまくいかず、ずっと TCP を無駄に通してた。

これがいまさらながら解決した。つまり /tmp は systemd が PrivateTmp で隔離しているので共有できないというだけだった。

なので以下のように RuntimeDirectory の設定を入れる。

RuntimeDirectory=hanrangon
RuntimeDirectoryMode=0755

これで /run/hanrangon が systemd によって作られるので、ここの下に /run/hanrangon/socket として UNIXドメインソケットを作るといいらしい。

フロント(h2o)からは http://[unix:/run/hanrangon/socket] を指定する。