あひるの勉強部屋

つらつらつら~と不定期にカキコするブログ

mastodon 4.3バージョンアップ報告

12/20 11:30よりsmhn(s25t)のmastodonバージョンアップ対応を実施しました。 先日行ったPostgreSQLマイナーバージョンアップ対応によって4.3バージョンアップの条件を満たしたため、4.2→4.3と更新しました。

この際にいくつかオペレーションミスを重ねたため、自戒と再発防止を兼ねてまとめを書きます。

やらかし

いくつかやらかしました

最新のコンテナイメージを持ってきていない状態でのマイグレーション作業

今回の移行に際してマイグレーションを実施していますが、これを旧イメージで行っていました。 当然旧イメージだとマイグレーション差分がないので何も起こりません。
何も起こらなかったのは不幸中の幸いではありますが、pre・postの二段階あるマイグレーションのうち最初に特にログ出力されない時点で作業を止めて確認するべきでした。
出力が期待するものかの確認をしっかりして、異なれば立ち止まるところまでやらないと意味がないですね。 違和感止まりで先に進んでしまいました。

誤ったイメージにタグを設定

そもそもイメージ取得後にタグを変える運用がマズイので、そこをまずは変えるべきですが一旦置いておきます。

先の作業に気づき若干の焦りが発生したのか、streamingサーバー側にwebサーバーのイメージタグをつけてマイグレーションを実施しようとしてました。(実行して失敗しました)
幸いなことにwebとstreamingでそもそも実装言語も役割も異なるのでマイグレーションが走ることはないので、実害はなく実行時エラー止まりでした。

要因

概ね以下の点に集約されると思います。

今回のメンテ用の手順を作成していなかった

今回は複数の手順を横断して確認しながら進めていました。 通常更新時に私が自分用に作った手順と、mastodonがリリースに際して必要な作業を記した手順です。
通常であれば自分用の手順で完結しますが、今回は別途コマンドや設定が必要なリリースでした。
これらを横着して複数手順を確認しながら進める方針をとったことで、色々と取っ散らかりました。

コンテナイメージのタグを一々変えている運用

運用開始当初からの惰性で続けている手順で非常によくないです。

イメージタグの変更漏れで旧イメージを使って無を実行することは過去にもやらかしています。

対応

再発を防止するために以下の対応をします。

  • メンテごとの手順作成
    テンプレートは存在するので、メンテごとに面倒がらずに単一の手順書としてまとまるようにします。 また、手順には期待するアウトプットも記載し確認するようにします。

  • コンテナイメージのタグを変える運用の廃止
    何度かやらかしているので流石に変えます。 今のデプロイフローだと、どのタイミングでdocker-compose.ymlのイメージタグを変えるかなどちょっと考える必要はありますが、何かしら対応します。

  • 寝間着をまとった状態での作業をしない
    意外と着ている物の状態に引っ張られるところがあるので、寝間着を着てぼんやりとしないように、キッチリ外に出られるくらいの格好をします。 これは結構大事だと思います。

まとめ

久々にヒヤリとしました。 ヒヤリハットで終わってよかったです。 漫然とした作業は減らしていきます。

なお、デプロイ自動化はしないつもりです。 デブロイ頻度が高くない環境で自動化したデプロイ機構のメンテは面倒事増やすだけなので…

那須塩原旅2025秋

秋のておくれ旅の記録。 今回の行き先は那須塩原
去年の11月末に弾丸で行って以来2回目となる。

メンバーはosa_kさん、Phenomerさん、百貫、そたえぬの5人旅。
車移動は今回もosa_kさんとPhenomerさんに乗せていただいた。 毎度ありがとうございます。

1日目

あいにくの雨の中、まずは日光東照宮へ向かった。

東照宮に向かう前に昼時ということで蕎麦を食べた。
弦庵というお店に行ったが、店内は世界中の弦楽器がインテリアとして飾られててかなりユニーク。

弦庵の外観

店内の壁に飾られた様々な弦楽器
壁一面の弦楽器

ゆばせいろ大盛りとサイドの天ぷらを注文したけど、蕎麦が想定の1.5倍量出てきて満腹になった。
ゆば巻きと高野豆腐のゆば巻きは出汁がしっかりとしみてて美味しかった。

ゆばせいろの定食
ゆばせいろ

お昼を食べたら東照宮へ。
あいにくの雨とは言ったものの、境内の苔や石段などがいい具合に雨に濡れておりよかった。

日光東照宮入口
日光東照宮入口

敷地はかなり広く、今回はメインどころのみをざっと見た感じではあるが、全部を見て回ろうとすると半日じゃ足りなさそうな感じ。

日光東照宮といえばということで三猿もちゃんと見てきた。

三猿
三猿

また、奥宮まで207段の石段を登ったり眠り猫なども見てきたりした。
他にはガンダムが奉納されてて面白かった。 どうやら世界遺産登録25周年を祝って奉納されたらしい。

MG 1/100 武者ガンダムMk-Ⅱ 徳川家康 南蛮胴具足Ver.

一通り見たところで日光東照宮を後にして那須塩原に向かった。

那須塩原駅でそたえぬと合流し、そのまま宿の東急バケーションズ那須へ。

宿の写真は撮り忘れたが、昨年と同じくログハウスなので見た目・内装はほぼ同じ。 相変わらず最高だった。

honobono-ahiru.hatenablog.com

夕飯はカレーとスーパーで買った餃子とか。 美味しかった。

カレー
カレー

食後は宿の露天にダラダラと入り、風呂上がりは酒を飲みながら雑談タイム。
持ち込んだ電気ブランをコーラ割りで飲んでみたら、とんでもなく合ってグイグイ飲めた。
40度あるのに飲みやすくて危険。

電気ブラン
電気ブラン

2日目

朝はパン香房ベル・フルールでパンを買った。
写真を撮り忘れてるけど、どのパンも味と風味がよかった。 特にパーネアランチャというオレンジのバケットが美味しかった。

朝食後は那須ロープウェイに向かったがロープウェイまで残り2km地点で渋滞で車が一切動かなくなったので断念。 シーズンはマジでヤバいことを体感できた。
南ヶ丘牧場でソフトクリームを食べて、ジンギスカンセットを買ってロッジで焼くことにした。
外食もいいけどキッチンつきのロッジでわちゃわちゃ焼いて食べてダベるのもまたよかった。

ジンギスカン

夜は20分ずつ雑多に発表する会をやった。
他の人は見せるものを色々と用意してたりした中で、資料なしで喋ってたので次は何かしら用意しようかなとなった。
次回があれば技術的に面白い話とかを持っていこうと思う。

3日目

朝食は南ヶ丘牧場ジンギスカンセットとともに買ったソーセージと、Phenomerさんが持ってきてくれたメロンと梨。

のんびり過ごしてチェックアウト。 Phenomerさんとは宿で解散して東京まで4人旅。

東京に向かう前にオルゴール美術館と回顧の吊橋と道の駅に行った。

オルゴール美術館には色々なタイプのオルゴールが展示されており、時間によってはスタッフの方が実際にオルゴールを解説を交えて演奏してくれた。
ピアノの自動演奏の実演や、連弾を再現するオルゴールとかが特によかった。

nasuorgel.jp

オルゴール美術館の外観
オルゴール美術館

回顧の吊り橋は景色がよかった。
多分これから紅葉のシーズンになるともっと綺麗な景色が見られそう。
すれ違った人がちょいちょい鈴を装備していて緊張感があった。
ちなみに回顧は「みかえり」と読むっぽい。

回顧の吊り橋

吊り橋からの景色

熊出没の注意書き

回顧の吊り橋のあとは近くにある道の駅アグリパル塩原に向かった。

agripal-shiobara.com

お土産を物色したり和栗のジェラートを食べたりした。
道の駅から見える景色も開放的でとてもよかった。

和栗ジェラート

アグリパル塩原

まとめ

那須塩原は2回目だったけど、改めて魅力の多さを認識した。
知見も溜まってきたし、いつか親とかも連れて行きたい。

全体的に気候だったり景色だったり秋の始まりを感じる旅でよかった。

川口ハイウェイオアシスの夕焼け

引き続き定期的にこうやって旅をやっていきたい。 次は冬かな。

patchelfの--add-neededの挙動確認

ruby で jemalloc を使うにあたり patchelf を使う方法がある。
これが実際にやっているであろうことを手元で確認してみた。

検証

検証にあたり、main 関数を持つ main.c と共有ライブラリとして mylib1.c および mylib2.c を用意した。
先に mylib1 を動的リンクさせてビルドし、その後に patchelf で mylib2 をリンクさせて挙動が変わることを確認してみる。

検証コード

void func();

int main() {
  func();

  return 0;
}
#include <stdio.h>

void func(void) {
  printf("Hello World!\n");
}
#include <stdio.h>

void func(void) {
  printf("Bye World!\n");
}

ビルド手順

$ gcc -c -o main.o main.c
$ gcc -fPIC -shared -o libmylib1.so mylib1.c
$ gcc -fPIC -shared -o libmylib2.so mylib2.c
$ gcc -o main main.c -L. -lmylib1 -Wl,-rpath,.

確認

この時点で main を実行してみると以下のような結果となる。

$ ./main
Hello World!

期待通り mylib1func によって Hello World! が出力されているのを確認しました。

続いて patchelf してみます。

$ patchelf --add-needed ./libmylib2.so main

この状態で main を実行すると以下のようになる。

$ ./main
Bye World!

ちゃんと切り替わってそう。

readelf -d main でみてみると NEEDED として ./libmylib2.so がロードされているのを確認できた。

$ readelf -d main

Dynamic section at offset 0x20000 contains 29 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [./libmylib2.so]
 0x0000000000000001 (NEEDED)             Shared library: [libmylib1.so]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000001d (RUNPATH)            Library runpath: [.]
 0x000000000000000c (INIT)               0x5c8
 ...

patchelf でさらに mylib1 を追加すると mylib1 の挙動になり、mylib2 にすると mylib2 の挙動となり、NEEDED に追加した分積み重なっていくのも確認できた。

ておくれGW旅2025

今年もGWにておくれ達と旅に行ってきたのでその記録。
今回の行き先は秋田・青森・福島。 日程はGW後半の5/3 - 5/6の3泊4日と長め。
メンバーはosa_kさん、Phenomerさん、百貫の4人旅。
車は毎度のことながらosa_kさんとPhonomerさんに乗せてもらった。今回もありがとうございました。

移動

他メンバーは前日金曜日に休みを取って移動を始めていたが、私は5/3からの移動。
東京駅から盛岡駅までやまびこで3時間の旅。
東京駅の東海道線改札は終わっていたが、東北新幹線は混んでいたものの比較的マシだった。
やまびこは1ヶ月前の予約時点で普通席は全席埋まっており、グリーン・グランクラスがわずかに残っている程度だったのでグリーン車での移動となった。
いつかグランクラスに乗ってみたい。

盛岡駅

駅前は石川啄木スポットがいくつかあった。
生誕の地と終焉の地で友好都市の提携があるとのこと。そんな繋がりがあるのかと面白かった。

盛岡駅
啄木の詩
文京区との提携
啄木の文字でもりおか

盛岡駅周辺を散策したかったけど、電車の予約の都合に加えて当日15分程度の遅延で半端な時間になってしまったので断念。
岩手銀行赤レンガ館とか気になってたけど、いつかまた盛岡に行った時の楽しみとした。

盛岡駅でosa_kさんに拾ってもらっていざ湯瀬ホテルへ。

湯瀬ホテル

2024/04にできた新しめのお宿でこちらに2泊ほど滞在した。
設備は綺麗で広くて快適で満足度の高い宿だった。
温泉も広く、露天も眺めがよい。

外観
エントランス
宿泊室

宿泊者が使えるラウンジではお酒やジュースがいただける。
そこにクラムチャウダーもあり美味しかった。

ラウンジ

ご飯は朝夕ともにビュッフェ形式。
写真にはないが、比内地鶏やきりたんぽ鍋、比内地鶏スープ、稲庭うどんなどなど秋田名物が盛り沢山で、どれも丁寧な味付けで美味しかった。
特に鳥が美味しかった。ビュッフェに出ている唐揚げですらジューシーで美味しい。

二日目の夕飯には連泊向けとして選べるメニューから比内地鶏のすき焼きをいただいた。
案の定、毎食食べ過ぎ。美味しいのが悪い。

初日の夕飯
二日目朝食
二日目夕飯
三日目朝食

www.yuzehotel.jp

弘前

二日目の5/4は湯瀬ホテルから弘前に向かった。
車で大体1時間強ほど。
この時期だが弘前は寒く、気温は忘れたが極暖タートルネックを着てちょうどよいくらいだった。

弘前花まつり

まずは弘前市りんご公園に向かった。
ちょうど弘前りんご花まつりが開催されており賑わっていた。
りんご植栽150周年という節目の年だったらしい。

園内から見える岩木山
りんごポスト
りんごの家

散策しつつ、園内にあるシードル工房でシードルをいただいた。 3種類ほどあるうちで一番甘いやつを飲んだが、しっかりとりんごの味が出ており美味しかった。

りんごの花とシードル工房
シードル

弘前公園

続いて弘前公園に向かった。 こちらは弘前さくら祭りが開催されており、桜がたくさん咲いていた。
今年はあまりさくらを見る余裕がなかったので、思わぬ形でちゃんとみれてよかった。
さくらミクもいっぱいいた。

いつか夜のライトアップも見に行ってみたい。

入り口
園内
枝垂れ桜
さくらミク

福島移動

3日目は湯瀬ホテルを後にして福島方面へ移動した。

紫波SAのレストランで盛岡冷麺を頂いた。美味しい。

紫波SA
盛岡冷麺

さらに菅生SAではパン屋で牛タンカレーパンとりんごパイを食べるなど。これも美味しい。(語彙力のNASA

菅生SA
タンカレーパンとりんごパイ

道中、へたれガンダムという珍スポットがあるとのことで行ってみた。
このガンダム、あまりにもへっぴり腰である。
里山に唐突に現れるへたれガンダム。写真では伝わりきらないシュールさがあって良かった。
道中明らかに地元民しか通らないような道で地元ではないナンバーの車両とすれ違って面白かった。結構見に来ている人はいるみたい。

後光輝くへたれガンダム
へたれガンダム

3日目の宿は夕飯なしのため、笑門そば峰亀で天ぷらそばをいただいた。
量もガッツリあり、味も美味しかった。 目の前で600gを誰よりも早く食い尽くすやつがおって怖かった。

笑門そば峰亀
天ぷらそば

光雲閣

3日目の宿は、ながめの湯 光雲閣に泊まった。

山の上にあるので景色がよかった。
朝風呂で山の湯という露天に入ったが、雲海に包まれる景色が綺麗だった。

部屋からの景色

朝ごはんに出てきた玉豆腐の開封に失敗して豆腐が飛び散った。

四日目朝食

www.kounkaku.co.jp

最終日移動

光雲閣をちょっと降ったところにある鏡ヶ池公園に行ってみたが、あいにくの天気ということもあり鏡な感じはあまりなかった。
多分紅葉シーズンの天気の良い時に来ると綺麗に映って見えそうだった。

鏡ヶ池公園

GW最終日ということもあり、渋滞に巻き込まれないように早めの移動ということで、ここでPhenomerさんとは別れて帰路に。

お昼は上河内SAで味噌ラーメンを食べた。
これより後のSAは入り口から詰まるほどの混在だったので、ここで入っておいて良かった。

上河内SA
味噌ラーメン

15:30くらいに池袋まで送ってもらい解散。
お疲れ様でした。

まとめ

今回も全体的に楽しく、日頃の疲れもだいぶ回復して良かった。
あと気候の違いを体感できてよかった。 北から南下するにつれて高速道路から見える景色から桜がなくなっていき新緑に移りゆく様は面白かった。

ただ、気候が違いすぎて服装にはちょっと困った。
冬の装いと初夏の装いの両方を詰め込んで向かったので荷物がいつもより多くなってしまった。
ただ、結果的に最適な服装で過ごせたのでよかった。

次は夏か秋か。
また旅に行きたい。

MS Graph APIの予定におけるTeams会議の挙動

Microsoft 365の提供するGraph APIを使ってカレンダーの予定を作成・更新することができる。
今回はこの予定を更新する際に困ったことをまとめていく。
というか結論を読めばよく、以降はそれに至るまでの思考のrawで特にとっ散らかった文になってる。

結論

Teams会議を有効化した予定を更新する際は body.content に含まれる会議情報(厳密には joinUrl 相当の内容)が残されている必要がある。
これが残っていないとTeams会議が消えてしまう。
たとえリクエストにTeams会議を有効化する設定を含んでいたとしても。

また、これはドキュメントに記載のある挙動となっている。 learn.microsoft.com

とはいえ、 body.content に自アプリケーションから情報を入れたい場合などもある。
特にミーティング情報をユーザーに触らせたくなく、自アプリケーションのメッセージのみを編集させたい。
その際は、ユニークなcssなど要素が特定できるHTML要素と作って情報を入れたら良さそう。
そうすることで、すでに何か自アプリケーション経由で記述しているかの確認ができる。

また、body.content の戻り値は html タグから始まるHTML構造だが、タグ外の先頭に任意のメッセージを追加してリクエストしてもちゃんとハンドルしてくれて、レスポンスの body.content では html タグ内に追記される。 追記のみひたすらすれば良いならそれでも良さそう。(そんなケースは現実なさそうだが)

確認

前置き

例えば、あるUPNのユーザーの予定を作成する場合は下記のようなリクエストになる。(参考資料に記載のAPI仕様書より他にもエンドポイントは存在する)

POST https://graph.microsoft.com/beta/users/{upn}/events

この時、bodyに isOnlineMeetingonlineMeetingProvider を指定することで予定にTeams会議を追加することができる。 Teams会議を追加したいときは "onlineMeetingProview": "teamsForBusiness" とすればよい。

{
    "subject": "test event",
    "body": {
        "contentType": "HTML",
        "content": "test"
    },
    "start": {
        "dateTime": "2025-04-13T19:00:00",
        "timeZone": "Asia/Tokyo"
    },
    "end": {
        "dateTime": "2025-04-13T20:00:00",
        "timeZone": "Asia/Tokyo"
    },
    "attendees": [],
    "isOnlineMeeting": true,
    "onlineMeetingProvider": "teamsForBusiness"
}

これのレスポンスには下記のようにオンラインミーティングの情報が含まれる。 一部プロパティは除外したのと各種IDやらは適当に書き換えた。

{
    "id": "some_event_id",
    ...
    "subject": "test event",
    "bodyPreview": "ほげほげ\r\n________________________________________________________________________________\r\nMicrosoft Teams ヘルプが必要ですか?\r\n今すぐ会議に参加する\r\n会議 ID: 000 000 000 000 0\r\nパスコード: hoge\r\n________________________________\r\n開催者向け: 会議オプション\r\n__________________________________",
    "webLink": "https://outlook.office365.com/owa/?itemid=hoge&exvsurl=1&path=/calendar/item",
    "onlineMeetingUrl": null,
    "isOnlineMeeting": true,
    "onlineMeetingProvider": "teamsForBusiness",
    "body": {
        "contentType": "html",
        "content": "<html>\r\n<head>\r\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\r\n</head>\r\n<body>\r\ntest<br>\r\n<div class=\"me-email-text\" style=\"max-width:520px; color:#242424; font-family:'Segoe UI','Helvetica Neue',Helvetica,Arial,sans-serif\">\r\n<div style=\"margin-bottom:24px; overflow:hidden; white-space:nowrap\">________________________________________________________________________________</div>\r\n<div style=\"margin-bottom:12px\"><span class=\"me-email-text\" style=\"font-size:24px; font-weight:700; margin-right:12px\">Microsoft Teams</span>\r\n<a href=\"https://aka.ms/JoinTeamsMeeting?omkt=ja-JP\" id=\"meet_invite_block.action.help\" class=\"me-email-link\" style=\"font-size:14px; text-decoration:underline; color:#5B5FC7\">\r\nヘルプが必要ですか?</a> </div>\r\n<div style=\"margin-bottom:6px\"><a href=\"https://teams.microsoft.com/l/meetup-join/hoge\" id=\"meet_invite_block.action.join_link\" title=\"Meeting join link\" class=\"me-email-headline\" style=\"font-size:20px; font-weight:600; text-decoration:underline; color:#5B5FC7\">今すぐ会議に参加する</a>\r\n</div>\r\n<div style=\"margin-bottom:6px\"><span class=\"me-email-text-secondary\" style=\"font-size:14px; color:#616161\">会議 ID:\r\n</span><span class=\"me-email-text\" style=\"font-size:14px; color:#242424\">000 000 000 000 0</span>\r\n</div>\r\n<div style=\"margin-bottom:24px\"><span class=\"me-email-text-secondary\" style=\"font-size:14px; color:#616161\">パスコード:\r\n</span><span class=\"me-email-text\" style=\"font-size:14px; color:#242424\">hoge</span>\r\n</div>\r\n<div style=\"margin-bottom:24px; max-width:532px\">\r\n<hr style=\"border:0; background:#D1D1D1; height:1px\">\r\n</div>\r\n<div><span class=\"me-email-text-secondary\" style=\"font-size:14px; color:#616161\">開催者向け:\r\n</span><a href=\"https://teams.microsoft.com/meetingOptions/?hoge\" id=\"meet_invite_block.action.organizer_meet_options\" class=\"me-email-link\" style=\"font-size:14px; text-decoration:underline; color:#5B5FC7\">会議オプション</a>\r\n</div>\r\n<div style=\"margin-top:24px; margin-bottom:6px\"></div>\r\n<div style=\"margin-bottom:24px\"></div>\r\n<div style=\"margin-bottom:24px; overflow:hidden; white-space:nowrap\">________________________________________________________________________________</div>\r\n</div>\r\n</body>\r\n</html>\r\n"
    },
    ...
    "onlineMeeting": {
        "joinUrl": "https://teams.microsoft.com/l/meetup-join/hoge"
    }
}

さて、作成においては特段困ったことはない。
Teams会議の案内文が body.content に追記され、会議のURLは onlineMeeting.joinUrl から取得可能となっている。
ここまではいい。
問題は更新時だ。

問題

更新時は以下のようなリクエストを送ってみる。
PATCHリクエストなので、変更したいフィールドだけ指定して変更したい値を送る。
下記は test と送っていた body.contentfoobar に更新しようとしている。

PATCH https://graph.microsoft.com/beta/users/{upn}/events/{event_id}
{
    "body": {
        "contentType": "HTML",
        "content": "foobar"
    }
}

するとレスポンスからTeams会議に関する情報が一切合切消え、Outlookのカレンダーを見てもTeams会議ではなくなっているので実際に消えているらしい。
これは結論で記載した通りの挙動ではあるものの、アプリ内で body.content にカスタムメッセージを含めた場合などに困ってしまう。

対策

body.content のHTML構造を特に考えずに先頭にメッセージを入れてリクエストすると、レスポンスでは body.contentbody タグ内にメッセージが設定される。
ひたすら追記するのみであればこれで良さそう。 ただし、これだと編集が困難になる。

ここで自アプリケーションからのメッセージを適当にdivタグなどで囲い、クラスをつけたらどうなるか。
これはちゃんと保持されてレスポンスにも含まれる。
これを使うことで、戻り値のHTMLをパースして特定のクラスの要素を取得して中身のメッセージを編集したり、なければ文頭に特定クラスをつけた要素を作ってメッセージを詰め込んでリクエストすれば良い。

ここまで書いたところで、最初のメッセージ送付時点で「以下のミーティング情報を編集するな」といった文言を追加したら、それで終わりでもいいのでは?とか気づきを得てしまった。

参考資料

s25t障害に関する事後報告20250228

2025年2月27日に social.mikutter.hachune.net(以下s25t)においてサーバーにアクセスができない問題が発生しました。

障害発生期間

2025/02/27 20:00 - 22:20

障害内容

ディスクフルによってDBが停止しました。

被害

原因

mastodonとは別に立ち上げていたサービスがストレージを食い尽くしていました。
概ね230GB程度の容量が消費されていました。
当該サービスはDockerコンテナで運用されていましたが、ダウンさせたところ容量が回復したため揮発性の高い領域が食い潰していたと思われます。

また、mackerelにメトリクスは送付していたものの、アラートの設定が漏れており障害発生まで状況を把握できていませんでした。

対応

  • 原因となったサービスの停止をしました。
  • mackerelでファイルシステムの使用量のアラートを設定しました。

対応経緯

時分 事象
20:03 外形監視によるヘルスチェックに失敗し始める。
20:05 ヘルスチェックアラートが通知される。
20:42 仕事を終え、アラートに気づく。
20:45 帰宅中、実家に連絡して状況確認。ネットワークの疎通や電源に問題ないことを確認。
21:40 帰宅。腹痛でお手洗いに籠る。
21:55 調査開始。
22:05 DBのログよりディスクフルを確認。df -h を見て絶望。
22:10 調査の過程で適当にサービスを落としたら容量が回復。意図せず原因が判明。
22:20 mastodonのサービスを再起動。復旧。
23:50 監視ルールの追加。

Appendix

ディスクフルのログ

PANIC:  could not write file "/var/lib/postgresql/data/global/pg_control": No space left on device

消えないdockerネットワーク

異常終了した影響で、すでに停止しているコンテナがネットワークを握っているような状況になっていたため、強制的に削除しました。

docker network inspect [container_name]
docker network disconnect --force [network_name] [container_name]
docker compose down 

アラートの追加

mackerel-agentのcheck-pluginによるファイルシステムの監視ルールの追加をしました。 mackerel.io

また、上記と重複する形になり意味はないですが、式による監視も勉強がてら追加しました。 dev.classmethod.jp

まとめ

周囲がディスクフルで死ぬ様はたまに観測していましたが、遂に当事者になりました。
メトリクスだけでアラート忘れ、要因がmastodonではなく別サービスなどツッコミどころ多数の障害となりましたが学びになりました。
焼けていなくてよかったです。

s25tユーザーの皆様におかれましては、サーバの復旧を待っていただきありがとうございました。
39.39

OSC 2025 Tokyo/Springに行ってきた

OSC 2025 Tokyo/Springに行ってきた。
会場は駒沢大学だったので、吉祥寺から京王井の頭線で渋谷を経由して田園都市線に乗り換えての移動。

抗えない眠気に負けて、予定より遅めの出発。
12時からの東海道らぐのLT大会にギリギリ間に合った。
飛び込みのLTができればいいなということで、電車の中でスマホで資料を突貫で錬成。
このヒリつく感じは久々。
ブログには書いてたけどスライド発表してなかったやらかしをLTで供養してきた。
正直LT自体が久々すぎて心配だったけど、なんとか5分ジャストで発表しきることができてよかった。
shimadahさん、hashimomさん、飛び込みさせていただきありがとうございました。

他気になってたセミナーを見たり、ブースをちょろっと回ったりしたりした。
ちょろいのでセミナーで気になったナレッジグラフの本をマイナビさんの本のブースで買ったり。
積読がまた増えた。

展示では特にプラレールのブレークスルーが半端ではなく、感動してた。
近日中にスシローに行こうかな。

OSCのLT大会で無事閉幕したあとは、オタクたちと打ち上げ的な何かに行った。
金だけど写楽が飲めたのでよかった。 あれは飲みやすくて危険。
TLでは見かけるけどリアルでのエンカウント率の低いオタクとも会えたりとよかった。


こういった勉強とかカンファレンスに行くたびに、モチベーションが上がる。
仕事では仕事であるがゆえの制約に囚われがちだけど、OSCではそういった制約に囚われず(実際にはあるかもしれないけど)バリバリモノづくりしてる人たちがいて、すごいと思うしすごくいい。

流石に一人暮らしも3年弱となり生活に慣れたし、昨年末にプライベートでやることを減らした結果、時間的にもメンタル的にも余裕が若干できたりなどあったので、勉強会の参加などここ数年あまりできていなかったことをやっていきしようかな