うちの鯖ではDockerで構築したMastodonとPleromaとMisskeyの各インスタンスをVirtualHostでドメインごとに振り分ける運用をしています。
ただ、外部のインスタンスとはフォローし合えるのに内部のインスタンス同士ではフォローできずに困っておりました。
で、原因を探ったら以下の手順を踏むことで回避できました。
■回避方法
- DNSやhostsを使って名前解決できるようにする。
- Mastodonのソースをいじる。
順に説明していきます。
1.DNSやhostsを使って名前解決できるようにする。
まあ、これは真っ先に疑うことですよね^^;
LAN内部からドメインでアクセスするためには内部DNSを構築するかhostsを書き換えなければいけません。
うちは内部DNSを構築済みだったためこいつに設定を追加するだけで済みました。
そして、相互に名前解決できるようになったのですがこれだけでは不十分という・・・・
(一応Mastodonの検索欄で”@名前@ドメイン”で検索した際のエラーが「503 Remote data could not be fetched」→「422 Mastodon::HostValidationError on ドメイン」と変化しました)
2.Mastodonのソースをいじる。
この「422 Mastodon::HostValidationError」ってエラーについて調べてみてもよくわかんない(422ってWebDav拡張のステータスらしいですが・・・)
しょうがないのでMastodonのソースを見て「Mastodon::HostValidationError」がスローされている箇所を見てみると
app/lib/request.rb(135行目)に気になる部分を発見。
Addrinfo.foreach(host, nil, nil, :SOCK_STREAM) do |address| begin raise Mastodon::HostValidationError if PrivateAddressCheck.private_address? IPAddr.new(address.ip_address) return super address.ip_address, *args rescue => e outer_e = e end end
これはプライベートアドレスの場合は問答無用にHostValidationErrorにしている??
で、PrivateAddressCheckについて調べてみるとconfig/environments/development.rbでわざわざfalseを返すように書き換えを行っていました。
ということはここのチェックでfalseとなるようにすればいいのでは??っと思いconfig/environments/production.rb側に以下の記載を追記。
module PrivateAddressCheck def self.private_address?(*) false end end
そしてDockerコンテナをビルドしなおしてみると・・・・
$ docker-compose build web $ docker-compose up -d
無事検索欄で”@名前@ドメイン”で検索してもちゃんとアカウントが表示されるようになりましたv^^v
とりあえずフォローできない問題は解決したんですが以下の2つが気になる。。。
- Mastodonはなぜわざわざプライベートアドレスをはじくようにしているのか?
- この対応の仕方で不都合が起きることはないのか?
そんなわけでこの対処方法は自己責任で行ってください。