2026/06/04(木)さくらのレンタルサーバでホスティングしていたサイトの大部分を自宅サーバーに移行した

今日は遂に運営サイトの大半をさくらのレンタルサーバーから自宅サーバーへ移行することに成功した。

自宅サーバーでの個人サイト運営は中学時代からの夢だったので、悲願が叶ったようでちょっと嬉しい。

移行したサイトなど

次のサイトやサービスを移行した。

  • lycolia.info - lycolia.info
    • エントランスページ、LPみたいなもん
  • Lycolog - blog.lycolia.info
    • このブログ。このブログは2019年より前のログがないが、実はこのサイトは元からブログとして発祥している。当時はブログという概念はなく、日記サイトだった
  • Webツール置き場 - tool.lycolia.info
    • 適当に作った便利ツールを置いている
  • ECO-Wiki (lycolia) - eco.lycolia.info
    • 最近一言BBSへの書き込みがないのが気がかりなWiki。実はアクセスは落ちてない
  • アクセス解析 Matomo
  • TinyTinyRSS

やったこと

さくらのレンタルサーバから自宅サーバーへファイルを移設し、権限を設定

# サイト単位にtarballに固める
tar -cf hoge.tar hoge
# Windows上のRLoginを使って、NASとしてマウントしている自宅サーバーに転送
cp hoge.tar <ホスティングファイル置き場>
tar -xf hoge.tar hoge
# Apacheから見えるように
chown -R www-data:www-data <ホスティングファイル置き場>/hoge
# www-dataに属するユーザーがいじれるように
chmod -R g+rxw <ホスティングファイル置き場>/hoge

cgi-binフォルダを使っているスクリプトの対策

詳細はトラブルシューティングの該当項目参照

ヘッダーモジュールの有効化

使ってるやつがいたので有効化。

sudo a2enmod headers

さくらのレンタルサーバのMySQLからDBをダンプし、自宅サーバーのMariaDBに取り込み

sudo mysql -u <ユーザー名>
CREATE DATABASE <DB名>;
exit
# 照合順序をMariaDB方式に変換
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' ~/hoge.sql
sudo mysql <DB名> < ~/hoge.sql

nginxとApache2の設定を追加

nginx -> Apache2の構成にしているので、これの設定。基本的にレンサバでホスティングしていたものはApacheの上にのせておくと色々と楽だ。.htaccessは神だし、静的ファイルやCGIのホスティングをする場合、Apacheは取り回しがとても良い。

  1. /etc/nginx/conf.d/にサイトごとのリバプロの設定を置く。一例としてはこんな感じ

    server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name  eco.lycolia.info;
    
    client_max_body_size 100M;
    
    ssl_certificate     /etc/letsencrypt/live/lycolia.info/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/lycolia.info/privkey.pem;
    
    location / {
        proxy_pass http://apache/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    }
    
  2. /etc/apache2/sites-enabled/にもサイトごとの設定を書く。一例としてはこんな感じ

    <VirtualHost *:8080>
            ServerName eco.lycolia.info
    
            ServerAdmin webmaster@localhost
            DocumentRoot /var/www/path/to
    
            # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
            # error, crit, alert, emerg.
            # It is also possible to configure the loglevel for particular
            # modules, e.g.
            #LogLevel info ssl:warn
    
            ErrorLog ${APACHE_LOG_DIR}/eco-error.log
            CustomLog ${APACHE_LOG_DIR}/eco-access.log combined
    </VirtualHost>
    

このリバプロの設定の意味合いについては過去に書いたnginxからApache2のバーチャルホストにいい感じにリバプロする方法nginxからApache2へセキュアにリバプロしたときに真のクライアントIPを取得できるようにするを参照。

SSIの有効化

今時SSIを使ってる人なんてまずいないと思うが、令和最新版ということで…。

やり方

  1. SSIモジュールを有効化する
    sudo a2enmod include
    
  2. /etc/apache2/apache2.confを開き、全域でSSIを有効化。ついでにDirectoryIndexにも入れとく。SSIの設定はDirectoryディレクティブの中でないと効かない
    <Directory /var/www/>
            AllowOverride All
            DirectoryIndex index.php index.cgi index.shtml index.html index.txt
            # Optionsに+Includesの部分を追加する
            Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch +Includes
            AddHandler cgi-script .cgi
            Require all granted
    </Directory>
    

.shtmlの場合にSSIを許可するように管理しているのは恐らく/etc/apache2/mods-enabled/mime.confだと思われる。ここでMIME-TYPEも付与していると思われる。

バーチャルホストやんいやパス単位にしたい場合は適当なDirectoryディレクティブにOptions +Includesを書けば機能する。

余談だがSSIはエントランスページの更新日時を出すのに使っていて、過去に記事のネタにしたこともある。

アプリケーションのDBの向き先を変更

移設したMatomoとTTRSSは共にMySQLを使っていたためMySQLの接続情報を書き換えた。

DBの接続先はlocalhostでなく、127.0.0.1でないと上手くいかなかった。::1も通らなかったため、恐らくIPv6でListenしていないのだと思う。

Matomoの設定

  1. 無限リダイレクト抑制のためconfig/config.ini.phpのeneralセクションにassume_secure_protocol = 1を追加する。詳細はトラブルシューティングの該当項目参照
  2. gd2以上を入れろと言われるので使っているPHPのバージョンにあったものを入れる
    sudo apt install php8.3-gd
    
  3. MySQLのmax_allowed_packetが少なすぎると言われるので/etc/mysql/my.cnfを開きmysqldセクションに設定を足す
    [mysqld]
    + max_allowed_packet=64MB
    

ドメインの切り替え

  1. Value-DomainのDNS管理画面を開き、移設したドメインを全て自宅サーバーに向けた
  2. 移設前はAレコードとMXレコードのIPが同一だが、今回からAレコードとMXレコードのIPが変わるので分離した。これで合っているのか怪しいが一応メールが届くことは確認している
    +mx mx.lycolia.info. 10
    +a mx 133.167.8.98
    +aaaa mx 2403:3a00:101:13:133:167:8:98
     mx lycolia.info. 10
    -a 133.167.8.98
    -aaaa 2403:3a00:101:13:133:167:8:98
    +aaaa @ 2400:4153:8f01:c800:c14b:3f7a:2b54:353a
    +a @ 133.167.8.98
    
  3. 今回移設したドメインを対象にvalue-domain-dns-utilvd-ddns-v4.plでDDNSを行う設定を追加

トラブルシューティング

cgi-binを含むパスが/usr/lib/にマップされた

例えば/var/www/html/hoge/cgi-bin/mgcount/mgcount.cgiを実行すると/usr/lib/cgi-bin/mgcountを叩こうとしてコケる問題と出会った。

実際に出たログの一例としては以下のような状態だった(IPはマスクしているが他はそのまま)

[Wed Jun 03 21:02:12.751027 2026] [cgid:error] [pid 865047] [client xxxx:xxxx:xxxx:xxxx:xx:xxxx:x:x:x] AH01264: script not found or unable to stat: /usr/lib/cgi-bin/mgcount, referer: https://lycolia.info/index.shtml

これはどうも規定ではcgi-binが入ったパスを/usr/lib/cgi-bin/にバインドする振る舞いがあるらしく、sites-enabled/の設定に次の記述をすることで正しいパスを呼び出すことができるようになった。

<VirtualHost *:8080>
        ServerName hoge.lycolia.info

        ServerAdmin webmaster@localhost
        DocumentRoot /var/www/html/hoge

        # Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
        # error, crit, alert, emerg.
        # It is also possible to configure the loglevel for particular
        # modules, e.g.
        #LogLevel info ssl:warn

        ErrorLog ${APACHE_LOG_DIR}/hoge-error.log
        CustomLog ${APACHE_LOG_DIR}/hoge-access.log combined

        # ScriptAliasで既存のバインドを上書きする
        ScriptAlias /cgi-bin/ /var/www/html/hoge/cgi-bin/
</VirtualHost>

ダンプ取り込み時にERROR 1273 (HY000) at line 30: Unknown collation: 'utf8mb4_0900_ai_ciが出る

MySQLとMariaDBで照合順序の名前が違うらしいのでダンプファイルをMariaDB流で置換する。

sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_general_ci/g' ~/hoge.sql

MySQLを叩くCGI実行時にException while creating PDO object:SQLSTATE[HY000] [2002] Connection refusedが出る

DBに繋がっていないのが原因。ポート番号やIDPWなどに間違いがなく、ローカルDBに繋ぐ場合、DBの接続先をlocalhostでなく、127.0.0.1にすれば直る。

CGI実行時にEnd of script output before headers: hoge.cgi,が出る

これはHeaderを吐く前にエラーが標準出力されているので出るエラーと思われる。昔PHPやってた人にはお馴染みのやつ。

Shebangに書かれているパスにPerlがないのが原因なのでShebangのパスを見てそこにシンボリックリンクを張っておく。

sudo ln -s /usr/bin/perl /usr/local/bin/perl

.htaccess: Invalid command 'Header', perhaps misspelled or defined by a module not included in the server configuration

ヘッダーモジュールを有効化する。

sudo a2enmod headers

nginx -> Apache2のリバプロ環境でMatomoが無限リダイレクトしたり、エラーログを吐きまくる

一般的に内部リバプロはhttpで送るが、これが原因。

Matomoはhttpリクエストをhttpsにリダイレクトするが、リバプロがhttpでリクエストしてくるため無限ループになって発生する。MatomoのGitHubリポジトリのIssueに山ほどある問題

解消法としては以下の様にconfig/config.ini.phpGeneralセクションでassume_secure_protocol = 1を設定すればよい。

 [General]
+assume_secure_protocol = 1

504エラーが出たり、やたらめったら凄く重い

アクセスが集中してるときにMatomoがDBエラーを吐いてるとAMD Ryzen 5 8500Gでメモリ32GBのNVMe SSDを積んだマシンですら504が出る程度には重かった。

エラーを潰したら平和になった。

あとがき

2017年から自宅サーバーをマイペースに運用しており、初期はSSHDを立てただけの簡易NASやシンクラ環境として使っていたが、去年からMastodonの運用をはじめ、中学のころの夢だった鯖缶になることができた。そして更に今回、死活監視用に確保しているサイト(未構築)を除き、全てのサイトを自鯖に移行できたので、まさに中学生のころに夢見た、Webサイトを運用する鯖缶になることができ、感激もひとしおだ。

移設作業中は通信トラフィックやディスクI/Oが一気に跳ね上がったりだとか、CPUやメモリも結構頑張っていて、運用しているMastodonがやたら重くなったのが印象的だった。

何せこのブログだけでファイル数15,197の容量13GBもあるのだから無理もない。

あと移設作業中にadiaryのOGPが出なくてなんでだ?と思ったら、HTTPSの判定処理に漏れがあり、HTTPでURLが出ていたので、リバプロのヘッダもみるように改修した。実装上、リバプロしていない場合に子のヘッダが送られてきてもHTTPSになってしまうが、困るのはそんな不正な要求を送った本人なので、特に問題ないだろう。

さて、ここまで来たら次は以前も話に出した、Anubisを導入してWAFを掛けたり、現在日々増強中の監視体制の強化を続けていくなどして、自作サーバーライフを楽しんでいきたいところだ。

振り返ってみたら2025/08/21から今日までの間になんと三回も言及しており、これで四回目らしい。草。

特に意味はないが、過去にあったAnubisへの言及を以下にまとめてみた。

なんと言うか一年くらい塩漬けにしていたプロジェクトが最近はじわじわ進んでいる気がしていて、非常に清々しい。

そういえばadiaryをサーバーモードで動かすと早いという話があるので、そっちも試してみたいところだ。これは最近記事の増加に伴い中々重くなってきているのを感じているからだ。

やりたい事がたくさん湧いてくるのは充実していてとても良い。

2026/05/30(土)このブログにやってくる海外IPのBOTの挙動を軽く調べた

投稿日:

アクセス解析にノイズが出て鬱陶しいので、海外IPのUAを幾らか調べてみたまとめ。

今年の1月末付近と、5月末に調査を実施している。

集計条件

https://blog.lycolia.info/配下にHTTPリクエストが来た時で、そのURLにファイルが存在しない場合に、海外IP判定が出たものについて次の基準で集計している。

  • 2026-01-29 19:30:25 -> 2026-02-03 07:23:22
    • UAに次を含まない
      • bot | curl | wget | google | bing | mastodon | misskey | pleroma | akkoma | lemmy | activitypub | hatena | github | tumblr
    • 日本、韓国、台湾のIP以外
  • 2026-05-25 20:15:52 -> 2026-05-29 23:19:00
    • UAに次を含まない
      • bot | curl | wget | google | bing | mastodon | misskey | pleroma | akkoma | lemmy | activitypub | hatena | github | tumblr | meta
    • 日本のIP以外

IPの国判定にはその月のDBIP-City.mmdbを使用した。

2026-01-29 19:30:25 -> 2026-02-03 07:23:22

UA別

  • meta-externalagent/1.1はFacebookやInstagramのOGP収集クローラーらしいが、異常にアクセスが多い。無害なので5月のログでは許可している
  • Baiduspiderは百度のクローラー、個人的にいい印象はない。
  • NULL、UA未設定。まともなアクセスでない可能性が高い。PHPのfile_get_contents()だとデフォは空。curlはcurl/8.19.0みたいなのがデフォルトで入る。
  • FaradayはRubyのHTTPクライアントらしい
  • Twingly Recon-Sjostromは何かしらのフィードリーダーの可能性がある
UserAgent 件数
meta-externalagent/1.1 (+https://developers.facebook.com/docs/sharing/webmasters/crawler) 975
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) 490
NULL 273
Faraday v1.10.4 104
Chrome Privacy Preserving Prefetch Proxy 58
Apache-HttpClient/4.5.2 (Java/1.8.0_161) 40
Apache-HttpClient/4.5.2 (Java/1.8.0_151) 40
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36 21
Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 20
node 19
Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 18
Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 17
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.517 Safari/537.36 12
Mozilla/5.0 (X11; CrOS i686 3912.101.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 11
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) 10
Twingly Recon-Sjostrom/1.0 (+https://app.twingly.com/public-docs/crawler) 10
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.137 Safari/4E423F 10
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36 8
Mozilla/5.0 (compatible; crawler) 7
NotionEmbedder 6
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36 6
python-requests/2.32.4 5
Python/3.9 aiohttp/3.10.6 5
Go-http-client/2.0 5
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:72.0) Gecko/20100101 Firefox/72.0 3
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 3
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 3
Go-http-client/1.1 3
Fedineko (crabo/0.3.1; +https://fedineko.org/about) 3
python-httpx/0.28.1 2
imgproxy/3.30.0 2
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Perplexity-User/1.0; +https://perplexity.ai/perplexity-user) 2
Mozilla/5.0 (X11; Ubuntu; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 2
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:114.0) Gecko/20100101 Firefox/114.0 2
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 2
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36 2
ALittle Client 2
undici 1
ktor-client 1
aria2/1.36.0 1
Python/3.11 aiohttp/3.13.3 1
Mozilla/5.0 (compatible; VulnScanner/1.0; +https://example.com/) 1
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0 1
Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:128.3) Gecko/20100101 Firefox/128.3 1
Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:79.0) Gecko/20100101 Firefox/79.0 1
Mozilla/5.0 (X11; Linux x86_64; rv:123.0) Gecko/20100101 Firefox/123.0 1
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36 1
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36 1
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 1
Mozilla/5.0 (X11; Linux i686; rv:1.9.7.20) Gecko/5137-01-18 15:15:18.309540 Firefox/6.0 1
Mozilla/5.0 1
More Internet Explorer 8.0 user agents strings -->> 1
Iframely/1.3.1 (+https://iframely.com/docs/about) Atlassian 1
BaiduSpider 1

国別

アメリカが最多で、中国、インドと続いた。

件数
US 1,329
CN 575
IN 125
VN 67
JM 19
BR 15
SG 14
IE 9
CA 8
MX 6
IQ 6
NL 5
BD 5
UA 3
AR 3
ZA 2
PL 2
GB 2
FR 2
EE 2
DE 2
TR 1
TN 1
TM 1
SE 1
PY 1
PT 1
ID 1
HK 1
GE 1
ES 1
DZ 1
CO 1
CL 1
BH 1
BE 1
AT 1
AD 1

UAがNULLの国別

アメリカにNULLのUAが多く、意外と中国にはなかった。偽装UAであれ設定してるだけまともといえる。

件数
US 143
IN 124
IE 4
SG 2

アクセス先URL

ほとんどが公開URLへのアクセスで有害なURLへのアクセスは思ったよりなかった。

URL 件数
無害なURL 1,196
有害なURL 467

2026-05-25 20:15:52 -> 2026-05-29 23:19:00

UA別

  • metaを弾くようにした結果NULLがトップに上がってきた
  • Baiduspiderが来なくなった
  • Faradayがrururu.appからのクロールであることが判明した(rururu.appに出た瞬間にログを確認したところ、これしかいなかったため)
  • Fediverse系のUAが増えた気がする
UserAgent 件数
NULL 801
python-httpx/0.28.1 109
Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html) 105
Faraday v2.14.2 99
amazon-Quick-on-behalf-of-e1871480 85
Chrome Privacy Preserving Prefetch Proxy 62
Mozilla/5.0 three-stage-hot-model-probe/2.0 45
Go-http-client/2.0 35
Apache-HttpClient/4.5.2 (Java/1.8.0_161) 20
facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php) 18
Twingly Recon-Sjostrom/1.0 (+https://app.twingly.com/public-docs/crawler) 14
Python/3.12 aiohttp/3.13.3 6
Mozilla/5.0 6
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.86 Safari/537.36 4
fediway-ingest/0.1 3
Mozilla/5.0 (compatible; NuxtFyi/0.1; +https://nuxt.fyi) 3
ALittle Client 3
facebookexternalhit/1.1 2
Ruby 2
Python/3.11 aiohttp/3.9.5 2
PubkyWebIndex/0.1 (+https://pubky.app) 2
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Claude-User/1.0; +claude-user@anthropic.com) 2
Mozilla/5.0 (compatible; LinkRing/1.0; +https://linkring.lol) 2
Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/144.0.0.0 Safari/537.36 2
Iframely/1.3.1 (+https://iframely.com/docs/about) Atlassian 2
Amethyst/1.08.0 2
Amethyst/0.94.3 2
python-httpx/0.27.2 1
git/2.34.1 1
SubstackContentFetch/1.0 (https://substack.com/) 1
Python/3.9 aiohttp/3.13.5 1
Python/3.12 aiohttp/3.13.5 1
Mozilla/5.0 AppleWebKit/537.36 (KHTML, like Gecko; compatible; Bluesky Cardyb/1.1; +mailto:support@bsky.app) Chrome/W.X.Y.Z Safari/537.36 1
Mozilla/5.0 (compatible; crawler) 1
Mozilla/5.0 (compatible; InternetMeasurement/1.0; +https://internet-measurement.com/) 1
Mozilla/5.0 (compatible; ClarityPlatformCrawler/1.0; +https://clarity.microsoft.com) 1
Mozilla/5.0 (compatible; CensysInspect/1.1; +https://about.censys.io/) 1
Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36 1
Mozilla/5.0 (X11; NetBSD) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36 1
Mozilla/5.0 (X11; CrOS i686 4319.74.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36 1
Java/25.0.3 1
Hello from Palo Alto Networks, find out more about our scans in https://docs-cortex.paloaltonetworks.com/r/1/Cortex-Xpanse/Scanning-activity 1

国別

前回15件しかなかったブラジルが425件に増えてトップに躍り出た。ブラジルに何があるんだ…。AWSのデータセンター?

そしてアメリカ、カナダ、中国、台湾と次ぐ。アメリカはAWSとかが多い気がする。カナダは知らん。中国は多分人間が来ている気がしているがよくわかっていない。台湾は今回ログの範囲に含めたため初登場。韓国からのアクセスはなかったようだ。

件数
BR 425
US 358
CA 282
CN 276
TW 62
SE 16
SG 8
NL 4
GB 4
DE 4
UA 2
SI 2
RU 2
MG 2
BE 2
VN 1
LU 1
BD 1
AD 1

UAがNULLの国別

ブラジルからのアクセスに悪質なものが多かったことが推測できる。

件数
BR 424
CA 282
US 94
UA 1

アクセス先URL

圧倒的に有害なアクセスが増えていた。

URL 件数
無害なURL 207
有害なURL 1,075

集計クエリ

事後分析するためにデータをSQLiteに保存していたので、そのクエリ。実は1月のデータはTSVだったので、地味にコンバートに苦労したが、SQLiteクライアントがTSVからのインポートをサポートしていたので、引っかかったのはTSVのタイムスタンプがSat May 30 00:50:56 2026だったのを、DBのタイムスタンプのYYYY-MM-DD HH:mm:ssに変えるくらいだった。これはLLMに変換SQLを出してもらって良しなにしてもらった。

集計テーブルのDDL

CREATE TABLE "deny_log" (
	"id"	INTEGER,
	"url"	TEXT,
	"country"	TEXT,
	"remote_addr"	TEXT,
	"user_agent"	TEXT,
	"timestamp"	TEXT,
	PRIMARY KEY("id" AUTOINCREMENT)
)

UA別

SELECT
	T.UA,
	COUNT(T.UA)
FROM
	(
		SELECT
			CASE
				WHEN user_agent IS NULL
				THEN "NULL"
				ELSE user_agent
			END AS UA
		FROM
			deny_log
		WHERE
			timestamp < '2026-05-20'
	) T
GROUP BY
	UA
ORDER BY
	COUNT(T.UA) DESC

国別

SELECT
	country,
	COUNT(country)
FROM
	deny_log
WHERE
	timestamp < '2026-05-20'
GROUP BY
	country
ORDER BY
	COUNT(country) DESC

UAがNULLの国別

SELECT
	country,
	COUNT(country)
FROM
	deny_log
WHERE
	timestamp < '2026-05-20'
AND user_agent IS NULL
GROUP BY
	country
ORDER BY
	COUNT(country) DESC

アクセス先URL

URLの善悪分類はエクセルを使って手動。

無害=robot.txtや記事URLなどの公開URL、有害=管理画面や何かのスクリプトのURLを叩いているもの。

SELECT
	url,
	COUNT(url)
FROM
	deny_log
WHERE
	timestamp < '2026-05-20'
AND (
	url != '/'
	AND url NOT LIKE '/0%'
)
GROUP BY
	url
ORDER BY
	COUNT(url) DESC

あとがき

元々はアクセス解析に出ないようにブロックするために集計していたが(robot.txtが尊重されるとか思ってないので)、善良なBOTの大半が海外IPで対応が面倒なのでいったんブロックはやめることにした。

将来的にはAnubis辺りを導入してWAFを掛けることで対応したいと思う。

あとこれをやってて思ったこととしてUAの中に自分が何者かを入れてくれてるクライアントは凄く親切だなと思った。

2026/05/26(火)直近でやりたいことリスト

更新日:
投稿日:

やりたいことが多すぎて消化が追い付かない!

サイト運営周り

自作サーバー近隣

  • 監視周りの整備
    • OpenWrtのメトリクス集め
    • データソースのセットアップはしたものの整備されてないGrafanaのダッシュボード整理
    • 発報体制の整備
    • 外形監視とステータスページの導入
  • 自宅サーバーのリプレース
    • Ubuntu -> Debian
  • WAF(Anubis)の導入
    • Claudflareより自由ソフトウェアだろ!
    • かわいいし!

CMS開発回り

まずは何が欲しいのかの要件整理からしていかないといけない奴ら。

  • adiary代替CMSの作成
    • adiaryの基本機能は保ったままプラガブルでメンテナンスがしやすいCMSの作成
    • MCP対応もしたい
    • パフォーマンスはadiaryほどギチギチに詰めない予定
    • CGI動作
    • Markdown parserの全面刷新
  • Wikiの作成
    • 上記CMSの基盤を転用して整備したい
    • PukiwikiがMarkdownで書けず、既存の改造品もしっくりこないため
    • ブログには日々のログを、Wikiにはあとで見返す情報の集約を、というので役割分担をしたい

書きたいけど書けてない日記のネタを書く

全部書くかどうかはわからないが書いてないと忘れてしまいそうなのと、発生日が不明だと日付ベースで管理している行動メモから引き出せないのでメモっておく。

ネタの発生日 内容
2025-10-25 ゾンビランドサガ現地鑑賞
2025-10-31 ゾンビランドサガ マンホール巡礼
2025-11-15 神戸→川崎のスーパー映画館はしご、チネチッタ突貫記
2025-11-21 伊万里湾大花火大会2025+マンホール回収
2025-11-29 去年、香川漆器を修理に出した話の続き、修理を受け取ってきたときの旅行記
2026-05-02 超かぐや姫!を観に高知に行った話
2026-05-02 超かぐや姫!感想2
2026-05-23 須磨浦山上遊園に行った話

ゾンサガの鑑賞録も書いてないが、これについては書くかどうかがとても怪しい。

旅行回り

それ以前にやりたいことが多すぎるため、いずれも優先度は低い。

  • 姫路市立水族館でナマコを触りたい
    • ナマコ触れる場所では恐らく三宮から最も近く、他だと和歌山や豊岡、玉野になってくる
  • 冬雨文庫に行ってみる
    • 岡山市・オランダ通りの古書店「よつば文庫」
  • 鷲羽山ハイランドでバンジージャンプをする

2026/04/24(金)このサイトがブログである必要性について考えてみた その2

投稿日:

前回このサイトがブログである必要性について考えてみた訳だが、やはり過去の情報を引いたり更新しようとしたときにブログだと都合が悪いことも思った。

例えば私のブログにはセットアップ方法を書いた記事が、かなりの数あるが、時系列で並んでいるため探しづらい。

Ubuntuのセットアップ方法を読んだ後に、そこに書いていなかったSSHやGPGの設定方法を見ようとすると探すのが大変だ。一応現状でも相当量のタグをつけて記事を当てやすくしているが、当てやすくはあるもののタグを選ぶのが手間というのもある。

Wikiであれば階層構造にして似たものを寄せておけるから、その手間は少ないし、過去の記事を更新しても違和感は少ないと思う。

ただ読み物としてみたときに都合がいいのはブログだし、悩ましいところでもある。

似たことを考えている人は他にもいるようで、ググったら以下の記事がヒットした。

読んでいて思ったこととしてはブログに向くものはブログへ、Wikiに向くものはWikiに置くのがよいのではないかと思えてきた。

例えばマニュアルみたいなやつはWiki、日記や旅行記のようなものはブログというのは一つありかもしれない。その場合レシピもWikiだろう。

adiaryに思うところがあるところや、PukiwikiもMarkdownに対応していないし、他に思うところがないわけでもないので、一度これらを自前で作ってみてやるのも一つかもしれないなと思った。いや、ブログを自作することについては実は去年から構想だけはある。

一度落ち着いたタイミングで、この辺りも考えていきたいなと思うが、その境界も結構難しいとは思う。ブログでもやろうと思えばできるわけだし…。

例えばインデックス用の記事を置いてそこからぶら下げるというのは、記事の到達容易性を高めるための方策として一つあるだろうから、中々悩みどころではある。

実際記事とページが混在したブログは普通にあるし、WordPressにもその機能はある。adiaryにも実はある。

2026/04/20(月)このサイトがブログである必要性について考えてみた

投稿日:

このブログでは過去記事の更新を割とよくするし、個人的にタグなどを基に過去記事を引っかけて調べ物をすることがあるのだが、それならMECEな構成にしやすいWikiのほうがよく、ブログである必要はないのではないか?という疑問が、ふと浮かんだが、やっぱりブログでいいなと思った話。

確かにWikiにすれば階層構造にして、インデックスを張ることでブログと比べてMECE性を高めることができそうだし、一般的には履歴管理もできる。adiaryには履歴管理機能がないため、履歴管理ができるのはうれしい。

しかし逆説的に言えばブログはMECEでないことが売りではないかとも思った。Amazonの怪しい中華製品ではないが2026年版、2025年版だとか、Ubuntu 24, Ubuntu 22といった記事はスナップショット、つまり年輪として機能する。

Wikiの履歴で過去を探索するのは一般的に検索機能がなく、追いづらいし、見づらい。そう考えたときにMECEでないからこそ、過去のログとして機能させやすいのはブログではないかと思った。

もちろん、その代償として似た記事が多いと過去ログが追いづらいとか、情報が分散して追いづらい、流れる、ストック型ではなくフロー型に近いなどの欠点もある。

別にWikiでも2026年版、2025年版だとか、Ubuntu 24, Ubuntu 22といった記事は作れるので、Wikiでもいい気がするが、今のところはブログでいいかなと思った。そもそも編集者が一人しかいないサイトでWikiを採用している例は私の知る限り少ないし、標準化などを考慮の外に追いやったフリースタイルでやるのは構造に縛られづらいブログは最も向いているだろう。Wikiはツリー構造を変えようと思たっと気に大変だが、ブログにはそもそもツリーがない。

というわけで、深く考えるものでもないし、ブログでいいかというところに落ち着いた。

あとがき

Mastodonのほうもブログに近い運用をしており、それなりにタグを張って過去を見れるように管理していて、フロー性が高いものはMastodon、ストック性が高いものはブログという感じで書く先を分けていたりする。結果として、Mastodonで書いたことをブログにまとめてあげていることもしばしばあるので、この運用はうまく回っていると思う。

例えばMastodonは2025年8月20日に開始し、既に8,093投稿もあるが、このブログは2019年1月12日から起算して626記事[1]しかない。

これはMastodonだと開始日から今日までの一日平均の投稿数が33.30だが、ブログだと0.23になる。投稿頻度が昔と今で異なるので、ブログもMastodon同様に2025年8月20日から起算すると0.51投稿にまで増えるが、それでも投稿頻度には65.29倍ほどの差がある。

このことから、このブログはMastodonと比べたときに65.29倍ほどストック性が高いと言えるかもしれない。


  1. CMSの度重なるマイグレーションで吹き飛んだ記事数も考慮すると実際はもう少しあると思うが、それを考慮しても、なお少ないのは間違いない。