先日リリースされたオープンソースの音声合成エンジン VOICEVOX は、作者によると普通に HTTP で叩けば外部プログラムから好きな文章を喋らせられる模様。
とりあえず Node-RED から叩いてみた。
デスクトップマスコット的なアプリと組み合わせてみたいところ。
なお Wine を噛ませば Linux でも動く模様。
先日リリースされたオープンソースの音声合成エンジン VOICEVOX は、作者によると普通に HTTP で叩けば外部プログラムから好きな文章を喋らせられる模様。
「 #VOICEVOX を外部のソフトウェアから使えますか?」という質問をよく貰います。すごく簡単に使えます!
— ヒホ(ヒロシバ)🗑️ (@hiho_karuta) August 4, 2021
VOICEVOXの音声合成エンジンはローカルにHTTPサーバーが立っているだけなので、こんな感じでPOSTを叩けばテキスト読み上げができます。
詳しくは localhost:50021/docs をご覧ください。 pic.twitter.com/JFg2xMLgGK
とりあえず Node-RED から叩いてみた。
デスクトップマスコット的なアプリと組み合わせてみたいところ。
なお Wine を噛ませば Linux でも動く模様。
NanoBSD は組み込みシステム向けに FreeBSD の起動イメージを作成するためのツールで、FreeBSD の一部として配布されている。これを使うことで USB メモリに FreeBSD をインストールして、ルータやファイルサーバとして運用することができる。
以下を /root/mynas.conf というファイル名で保存する。各設定値の意味は /usr/src/tools/tools/nanobsd/defaults.sh に書いてある。
メモリが少なくて ZFS が使えない環境のため、ZFS は無効にした。
NANO_NAME=mynas
NANO_KERNEL=GENERIC
NANO_MODULES=default
NANO_ARCH=amd64
NANO_PMAKE="make -j8"
NANO_BOOT0CFG="-o packet -s 1 -m 3 -t 18"
NANO_BOOTLOADER=boot/boot0
NANO_DRIVE=da0
PPLEVEL=3
FlashDevice generic 8g
CONF_BUILD='
WITHOUT_NETGRAPH=YES
'
CONF_INSTALL='
WITHOUT_INSTALLLIB=YES
WITHOUT_MAKE=YES
WITHOUT_TOOLCHAIN=YES
WITHOUT_INCLUDES=YES
WITHOUT_ATM=YES
WITHOUT_NETGRAPH=YES
WITHOUT_ACPI=NO
WITHOUT_FLOPPY=YES
WITHOUT_BLUETOOTH=YES
WITHOUT_FORTRAN=YES
WITHOUT_FORTH=YES
WITHOUT_OBJC=YES
WITHOUT_HTML=YES
WITHOUT_LPR=YES
WITHOUT_MAN=YES
WITHOUT_IPX_SUPPORT=YES
WITHOUT_NCP=YES
WITHOUT_RCS=YES
WITHOUT_RCMDS=YES
WITHOUT_SHAREDOCS=YES
WITHOUT_EXAMPLES=YES
WITHOUT_INSTALLLIB=YES
WITHOUT_CALENDAR=YES
WITHOUT_MISC=YES
WITHOUT_PPP=YES
WITHOUT_WIRELESS_SUPPORT=YES
WITHOUT_MAIL=YES
'
CONF_WORLD='
WITHOUT_CROSS_COMPILER=YES
WITHOUT_BINUTILS_BOOTSTRAP=YES
WITHOUT_BINUTILS=YES
WITHOUT_CLANG_BOOTSTRAP=YES
WITHOUT_CLANG=YES
WITHOUT_CLANG_EXTRAS=YES
WITHOUT_ELFTOOLCHAIN_BOOTSTRAP=YES
WITHOUT_ELFTOOLCHAIN=YES
WITHOUT_ELFTOOLCHAIN_TOOLS=YES
WITHOUT_GCC_BOOTSTRAP=YES
WITHOUT_GCC=YES
WITHOUT_LLD_BOOTSTRAP=YES
WITHOUT_LLD=YES
XCC=/usr/bin/cc
XCXX=/usr/bin/c++
XCPP=/usr/bin/cpp
XAS=/usr/bin/as
XAR=/usr/bin/ar
XLD=/usr/bin/ld
XNM=/usr/bin/nm
XOBJDUMP=/usr/bin/objdump
XRANLIB=/usr/bin/ranlib
XSTRINGS=/usr/bin/strings
XSTRIPBIN=/usr/bin/strip
COMPILER_TYPE=clang
WITHOUT_BIND=YES
WITHOUT_INFO=YES
WITHOUT_GAMES=YES
WITHOUT_KERBEROS=YES
WITHOUT_ZFS=YES
'
customize_cmd cust_install_files
customize_cmd cust_allow_ssh_root
cust_install_packages() {
# /dev/null がないとコケる
mount -t devfs devfs ${NANO_WORLDDIR}/dev
cust_pkgng
umount ${NANO_WORLDDIR}/dev
}
customize_cmd cust_install_packages
# ソフトウェアRAIDとジャーナリングに必要なカーネルモジュールを読み込む
cust_loader_conf() (
touch ${NANO_WORLDDIR}/boot/loader.conf
echo "beastie_disable=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
echo "geom_stripe_load=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
echo "geom_mirror_load=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
echo "geom_journal_load=\"YES\"" >> ${NANO_WORLDDIR}/boot/loader.conf
)
customize_cmd cust_loader_conf
NanoBSD には任意のパッケージを組み込むことができる。
以下のように所定の場所にパッケージを置けば、イメージのビルド中にパッケージが自動的にインストールされる。
# pkg -d -o ./pkg pkg samba413 smartmontools
# cp -R ./pkg/All /usr/src/tools/tools/nanobsd/Pkg
以下のコマンドでイメージのビルドを実行。そこそこ時間がかかる。ビルド中のログは /usr/obj/nanobsd.mynas 以下に出力されるので、うまくいかった場合はこのディレクトリ下のログを調べて原因を調査する。
# /usr/src/tools/tools/nanobsd/nanobsd.sh -c mynas.conf
完成したイメージは普通に dd で書き込むことができる。
# dd if=/usr/obj/nanobsd.mynas/_.disk.full of=/dev/da2 bs=64k status=progress
書き込み完了したら、サーバに USB メモリを指して起動。無事ログインプロンプトが表示されて、root でログインできればビルド成功である。初期状態では root はパスワード無しに設定されているため、ログインプロンプトに root とだけ入力すればログインできるはずである。
まずは root のパスワードを変更。
# sh change_password
次にホスト名、IPアドレスを設定。SSHDも自動起動にしておく。
# sysrc hostname="mynas"
# sysrc ifconfig_em0="inet 192.168.1.10 netmask 255.255.255.0"
# sysrc sshd_enable=YES
NanoBSD では設定ファイルは /root/save_cfg スクリプトを実行しないと保存されない。実は設定ファイル保存用のパーティションが別にあり、save_cfg スクリプトを実行するたびに別パーティションに保存される仕組みになっている。
save_cfg を実行したらここで再起動して、設定が正しく保存されていることを確認する。
# sh save_cfg
# reboot
GEOM Software RAID を使用して RAID 1+0 のアレイを構築する。
なお GEOM Mirror を GPT パーティションで使う場合は、必ずパーティションを切ってそのパーティションでミラーを作らなければならない。RAID がメタデータで使う領域と GPT が使用する領域が被っているため、パーティションを切らずにミラーを組むと corrupted などのエラーに苦しめられることになる。
# gpart create -s GPT ada0
# gpart create -s GPT ada1
# gpart create -s GPT ada2
# gpart create -s GPT ada3
# gpart add -t freebsd ada0
# gpart add -t freebsd ada1
# gpart add -t freebsd ada2
# gpart add -t freebsd ada3
# gmirror label pair0 ada0s1 ada1s1
# gmirror label pair1 ada2s1 ada3s1
# gpart create -s MBR mirror/pair0
# gpart create -s MBR mirror/pair1
# gpart add -t freebsd mirror/pair0
# gpart add -t freebsd mirror/pair1
# gstripe label storage0 mirror/pair0s1 mirror/pair1s1
# gpart create -s MBR stripe/storage0
RAID アレイができたらファイルシステムを作成する。ジャーナリングを有効にするため、gjournal で初期化する。
# gjournal label stripe/storage0s1
# newfs -J stripe/storage0s1.journal
ファイルシステムができたら /etc/fstab にマウントポイントの定義を記入する。
/dev/stripe/storage0s1.journal /mnt ufs 0 2
マウントできるかテスト。
# mount /mnt
Windows から共有フォルダにアクセスできるように Samba の設定をする。
まず Samba に必要なディレクトリ一式を、上記で構築・マウントしたストレージ領域に作成する。
# mkdir -p /mnt/system/samba4
# mkdir -p /mnt/system/samba4/private
# mkdir -p /mnt/system/samba4/logs
# mkdir -p /mnt/share/pub
# mkdir -p /mnt/share/jsaito
Samba にアクセスするユーザは UNIX ユーザとして事前に登録する必要がある。adduser コマンドで追加する。
Samba は独自でパスワードを管理しているため、UNIX ユーザを追加したら pdbedit コマンドで Samba 側にもユーザを登録する。なお UNIX ユーザを作成せずに登録することはできない。
# adduser
# chown -R jsaito:jsaito /mnt/share/jsaito
# pdbedit -a jsaito
Samba の設定は /usr/local/etc/smb4.conf に置く。内容は以下の通り。
[global]
workgroup = WORKGROUP
server string = My NAS (FreeBSD)
passdb backend = tdbsam:/mnt/system/samba4/passdb.tdb
private directory = /mnt/system/samba4/private
lock directory = /mnt/system/samba4
state directory = /mnt/system/samba4
cache directory = /mnt/system/samba4
log file = /mnt/system/samba4/logs/%m.log
security = user
hosts allow = 192.168.1.
interfaces = 192.168.1.10/24
map to guest = Bad User
guest account = nobody
load printers = no
max log size = 50
dns proxy = no
unix charset = UTF-8
dos charset = CP932
create mask = 600
directory mask = 700
printing = bsd
[pub]
comment = Public share folder
path = /mnt/share/pub
browseable = yes
writable = yes
read only = no
guest ok = yes
[jsaito]
comment = jsaito private share folder
path = /mnt/share/jsaito
browseable = yes
writable = yes
read only = no
guest ok = no
valid users = jsaito
設定ファイルを置いたら以下で Samba を起動。
# sysrc samba_server_enable=YES
# service samba_server start
\\192.168.1.10\pub や \\192.168.1.10\jsaito にアクセスできたら成功である。
うまくいくことを確認したら忘れずに /root/save_cfg を実行すること。忘れると再起動したときにやり直しになってしまう。
# cd /root
# sh save_cfg
NanoBSD に新たにパッケージを追加したり、カーネルをカスタマイズするなどした場合は、ビルドしたときにできた _.disk.image ファイル書き込むことで、設定を失わずにアップデートすることができる。
NanoBSD はデフォルトでは2つのパーティションがあり、起動時に好きな方のパーティションで起動することができる(YAMAHAルータのCONFIG0、CONFIG1、に似てる)。
以下のコマンドを実行すると、パーティション2の方に新しいイメージを書き込むことができる。書き込み後再起動して、ブートローダの画面で F2 キーを押せば、パーティション2で起動できる。
# sh updatep2 < /mnt/share/nanobsd/_.disk.image
このようにしておけば、もし新しいイメージで起動に失敗しても、パーティション1の方で起動すれば回復できるというわけである。
うっかり CentOS 8 で構築してしまったため、自宅のサーバーでは Docker ではなく Podman を使っている。Docker ほど Web 上に情報がないので以下にまとめておく。
まず Pod を作る。これがないと WordPress のコンテナと MariaDB のコンテナ間通信ができない。
$ podman pod create \
--name wordpress_pod \
-p 20080:80 \
-p 20443:443
外側に公開するポートは 20080/tcp と 20443/tcp とする。80/tcp, 443/tcp でもいいけど、well-known ポートをルートレスコンテナ、すなわち非root権限で動かすのはやや抵抗があったのでこのようにした。
ポート番号を決めたら firewalld の設定も必要。
$ sudo firewall-cmd --add-port=20080/tcp --permanent
$ sudo firewall-cmd --add-port=20443/tcp --permanent
$ sudo firewall-cmd --reload
次に MariaDB コンテナを作る。DBのデータは mariadb-data という名前のデータボリュームに置く。これでコンテナを作り直してもDBのデータは保持されるようになる。
$ podman run -d \
--pod wordpress_pod \
--name mariadb \
--restart=unless-stopped \
-e MARIADB_ROOT_PASSWORD=supersecretpassword \
-v mariadb-data:/var/lib/mysql \
mariadb:10.6
WordPress 用には root とは別にユーザを作成した。今思うとどうせ WordPress からしか使わない DB コンテナなのであれば、わざわざユーザ分けなくてもよかったかもしれない。
$ podman exec -ti mariadb mysql -uroot -p
MariaDB [(none)]> CREATE DATABASE wordpress charset utf8mb4;
MariaDB [(none)]> CREATE USER 'wordpress'@'%' IDENTIFIED BY 'supersecretpassword';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON wordpress.* to 'wordpress'@'%';
MariaDB [(none)]> FLUSH PRIVILEGES;
WordPress コンテナは SSL (Let’s Encrypt) 対応にしたかったため、コンテナ内部に certbot をインストールすることにした。
以下の Dockerfile を作成。
FROM wordpress:5.8-apache
RUN apt update -y && apt install -y certbot python-certbot-apache && apt clean && rm -rf /var/lib/apt/lists/*
そしてビルド。
$ podman build -t wordpress_certbot .
ビルドできたらコンテナを実行する。コンテナを作り直してもデータが消えないように、WordPress の wp-content/ と Let’s Encrypt の証明書、certbot によって書き換えられる /etc/apache2 以下のコンフィグはデータボリュームに置く。
$ podman run -d \
--pod=wordpress_pod \
--restart=unless-stopped \
-e WORDPRESS_DB_HOST=mariadb \
-e WORDPRESS_DB_USER=wordpress \
-e WORDPRESS_DB_PASSWORD=supersecretpassword \
-e WORDPRESS_DB_NAME=wordpress \
-v wordpress-data:/var/www/html \
-v wordpress-certificate:/etc/letsencrypt \
-v wordpress-config:/etc/apache2 \
--name wordpress \
wordpress_certbot
この段階ではまだ HTTPS で接続できない。WordPress コンテナに入って certbot を実行し、証明書をインストールする。もちろんドメインのバリデーションが発生するので、ドメインやDNSレコードの設定を別途事前にやっておく必要がある。
またバリデーションを通すにはインターネット側から 80/tcp でコンテナにつながるように、ルーターなりファイアウォールなりで 80/tcp -> 20080/tcp, 443/tcp -> 20443/tcp のポートフォワードを設定する必要がある。
$ podman exec -ti wordpress /bin/bash
# certbot run
インストールできたらコンテナを再起動。
$ podman restart wordpress
公式アプリで投稿テスト。
評判の悪いGutenbergプラグインを入れてるけど、これは慣れたらこっちの方が使いやすいんではないか。