FireFish鯖運用初心者トラブルの思い出
https://media.minazukey.uk/data/43a4eeb7-c444-40dc-818e-96bd50fde23a.gif
どうでもいい前書き
こんにちは!ところで皆さん夢、持ってますか?
私は特に持ってないです!
この導入、特に意味がありません!
というのもこの後の内容が一向にグダグダしていて役に立たないのでこの時点でこいつ鬱陶しいな…と思った方に離脱してもらうためです!夢、持ってますか!?(念押し)
前置きはさておいて、はじめましてもはじめましてではない方も夜坂と申します。 今回の記事は「Firefishアドベントカレンダー、そういうのもあるのか」と井之頭五郎のような軽い気持ちで参加した企画の名前通り、FediverseでSNSを楽しめるソフトウェアであるFirefishにまつわる何かしらの記事を書こうと思って筆を執っている次第です。
Firefishとはなんぞ?!というレベルの人はこの辺を参考にして頂けますと幸いです。私の管理しているSNSの利用者向けに簡易にまとめたページへのリンクで冒頭にそのあたりの説明が書いてます。
私は上述のFirefish(当初はCalckeyという名前でしたが現在の名称に変更されました)を利用して「皆尽村
皆尽村.icon」という因習村っぽい雰囲気のSNSサーバーを建てて管理しています。
なのでそこからFirefish関連について何かかければ…とは思ったのですがしかし、意味のない前置きで離脱を促す程度に他の鯖缶様のような技術的な話だとか何かためになる話とか出来る気が…しません!出来ません!
「なんか完全そういうのわかんねー俺がサーバー建てちまったらかっけーじゃん」!?
「あえてMisskeyにしないってのもカッケーじゃん」!?
っていうマガジンの不良みたいなノリで生きていたのでまじでその辺わからないですたすけて…。
というか、一応少しくらい書いては見たのですが、まあまず初心者過ぎて書いても間違っている気がするので一応そういうところに違うかもよ!?て何度も違う可能性があることを補記しています。予防線を貼りまくってもはやワイヤーギミックで戦うタイプの少年漫画の敵です…。ククク…気付いてなかったのか?この記事中に張り巡らされた予防線に…。
茶番はここまでとして、改めて念押しです。私は人の支えと人類の叡智インターネットのおかげでギリなんとかなっているだけで基本的にニュアンスで生きている鯖缶なので以下はおそらくためになることが書けていません。与太記事として読んで欲しいです。
ちなみに運営してみてどうだったかも下記のnoteに書いてますので興味がある方がいればこちらもあわせてどうぞ。
失敗から得た教訓リスト
じゃあ何書くの、についてですが…企画参加に当たって技術力が無くても書けることが何かあっただろうか…と考えた時に思いついたもの、それは「初心者ゆえのトラブルの数々の体験談とそこから学んだこと」です!おそろしい!
ですから、以下は今回は過去に実際どんなトラブルを経験したのか、その時気づいたことについて触れつつ書いていきます。
私自身、当時はよくわかっていなかったけど多分こうだったと思うとか多分これで直ったと思うとか本当にこれで合っているのかいまいちわからないけど動いているとかそういうのが多すぎて確実な解説は出せていないと思います。
なんなら「説明書とかよんでわからんものの、わかんないとこはなんとなく検索で調べればなんとかいけるんじゃないか?!」程度のわからなさで鯖缶生活を始めているので詳しい方からしたらとんでもないやらかしをしていると思います。
そのため本当に口酸っぱく等も書いていて申し訳ないのですが、以後の内容は初心者の失敗録として温かい目で見守ってください。よろしくお願いします。
0.初心者はサーバーを建てた後が問題
そもそも論なので最初から0番が出現しました。護廷十三隊にも0はあるからいいですよね。ネタバレしやがったな!?
折った話の腰を超医療で再生させます。FediverseのSNSソフト類のサーバーの建て方なんですが、日本語があるかどうかはものによるとしてもソフトウェアの公式ドキュメントには大体一通りは書いてありますし、今だと鯖立て経験者の人数自体もかなり増えているのでこうこうこういう手順でサーバーは建てれますという記事は探せばたくさんHITすると思います。
そういった手順が公開されている以上、料理と一緒でレシピをちゃんと守って変なアレンジを加えたりしなければサーバーは建てられることが多いと思います。
とはいえ、料理と違って完全に解説通りの内容でそろえるのが難しいところもありますし、ソフト側の更新があるのでそこで躓くなどはあると思いますが…。
さて、このあとの問題はサーバーを建てた後のことです。建てた後何かをしようとなるとそこまで完全な解説が得られるわけではない&完全にそろえることが難しいが故の問題がここで起こる場合があります。
ここで素人がアレンジなどしようとすれば失敗しますし、そのつもりがなくても本人が知らなかった環境的な違いによってエラーが発生しうまくいかないということが割と起こりえます。
だれしもアップデートコマンドだけで簡単にアップデートしたりできるというわけではないのです。
このように、アレンジなどしようとしなくても、アップデートに追従して変更をしようとする場合や何かトラブルが起こって対処する場合には、完全な解説が得られる方が当然少ないため、ここはどうすればいいんだろうはどうしても出てくると思います。
追従しなければトラブル対応のみすればいいのかもしれないですが、新機能が追加されたりバグが改善されているとなると今のままでも使えるとはいえ変えてみたいなあとなるのは普通に起こりえますよね。
そのため、どうすればいいのか上手く検索して調べて対応しきることができるかですとか、いざというとき誰かに適切に聞いたり頼ったりできないとここで苦労します。
人に頼るといっても全部操作を任せるわけでもないし限度があると思います。というか任せたいのであればそれこそ金銭を支払ってホスティングサービスを頼るのがベターだと思います。
以下の私の失敗談はだいたいそのへんの悪戦苦闘から得た教訓です…。
1.何か変更する時必ずスナップショット(バックアップ)は保存する
このタイトルものすっごく当たり前のことやんけ!案件なんですが、こんな当たり前のことすらも知らないままの鯖立てだったので…やっちゃいました!
流れは以下の通りです。
ちょっとくらい変更試したけど警告も出るしうまく変更されてなさそう?(起動しっぱなしなのでそれはそう)
↓
とりあえず元に戻せば大丈夫かな?(戻しきれていない)
↓
動いてるから大丈夫だろう(起動しっぱなしで変更をしたので変更が反映された確認するための再起動をしてない)
↓
後日軽い気持ちで再起動したときにエラーでCalckeyが起動しない
↓
どこを変更したのか日数が空いていてる上にパニック状態だしサーバーの事マジでなにもわからんのため詰む/(^o^)\
これは新規登録を開放して4日目くらいだったかの早々の時期にやらかしました。あとからふりかえれば早々の時期でまだよかったとは思いますが…。
今ならわかりますが、欲しい機能のためにファイルの一部を変更を試し、その変更による競合が発生したものの競合への対応が不足しているまま分からず(気付かず)そのまま放置したことがおそらく原因です。
このあたりでもうこのあたりの知識がわからない人は「何の話をしているのかかわからないぜ!」と思うかと思います。当時の私の同じ気持ちです!ダメじゃないですか~
競合だのなんだのって何?
折角なのでここで簡単に説明をしてみます。
私自身が初学者かつざっくり理解なので詳しい方から見たらいろいろ定義が違うかもしれないです。詳しいリンクは後に貼っているのでこの説明で気になった方は後でそれらと合わせて詳しく調べることをお勧めします…。
Firefish(当時はCalckey)はソフトウェアなのでフォルダの中にFirefishを構成するためのいろいろなファイルが入ってる状態でWeb上に公開されています。
多分何かしら経験したことがある人が多いと思うので具体的な例を出しますすが、フリーソフトなんかだとダウンロードした後に色々はいってるフォルダの中にソフト自体を動かしたりインストールすためのexeファイルやらなんかよくわからないファイルやフォルダが入っていたりしますよね?
ざっくりいうとそういう感じでFirefishもWebにソフトの中身のフォルダが公開されています。誰か固有のPCではなく、リモートのPCに複数人の開発者が共同編集している管理フォルダに入っている状態です。このフォルダをリモートリポジトリと呼びます。
しかしそういう共有で管理しているフォルダをあーしたい!こーしたい!このへんおかしいからなおす!などみんなが好き勝手に同時多発で更新したら、Aさんの変更とBさんの変えた内容がかみ合わなかったりして中身がめちゃくちゃになってソフトが上手く動かなくなったりしかねないですよね?
そうならないために使用するのがgitという管理システムです。
さっきの例でいうとAさんとBさんの変更が内容を確認してから問題なく統合する前に上書きしあったり等しないように、それぞれの更新履歴を保存することでAさんが変更する前の状態に戻したり等できる仕組みです。素晴らしい。
「このgitという管理方法で管理しているフォルダの中身をじゃあどうやって編集するの?」というと共有フォルダの内容をローカル(手元のPCや自身でレンタルしているもののように自由に使えるPC)にコピーして保存し、編集してから「変更したよ!」と共有フォルダ当てにgitを利用して変更を伝えるみたいな操作をします。少々脱線しますが、他にも色々手続きがあるんですがそのあたりは私は参加していなくて詳しくないので…開発してくださる皆様には頭が上がらないです。
そしてgitは手元の変更を加えたフォルダの管理にも有効です。だって、手元のフォルダを書き換えたあとに共有フォルダの内容が新しくなったからとダウンロードしたら、折角変更した内容が消えてなくなっちゃいますよね?
なのでgitを利用してリモートの内容を手元にコピーするときに、手元ファイルに独自の変更を加えていたりすると「このあたり変更した内容にみえるね!元のバージョンともさらに違う独自に書き換えた内容みたいだけど…消えちゃっていいの?」と警告が出て、「具体的に言うとこの辺が違うよ!」と分かりやすいように目印のマーカーを引いて、今ダウンロードした内容はこれで、貴方の手元ファイルの内容はこの内容で記述が違うけど……と並べて書いてくれるわけです。ありがたいですね。
当然、ふたつの別なものが余計な印ごと記述されているため、マーカーが引かれたままの状態ではソフトウェアの部品に異物が含まれている状態なのでちゃんとソフトは動きません。なので、マーカーを引いてくれた箇所を確認し採用したい方のみを残しマーカーを消し、その上でマーカーを消したから大丈夫だよ!とgitのシステムに伝えなきゃいけないという手順があります。
参考リンク
元の話に戻ります。
おそらくレベルの記憶に基づいた話ですが、このとき私は手元のファイルをバックアップもとらずに軽率に変更し、警告が出た(変更箇所が競合しているよ!という内容)ので多分マーカーだけ削除してその後のgitのシステムに伝える手順をやっていませんでした。
そのため解決方法がわからず、変更箇所だけ直せばなんとかなったかもしれないものをバックアップしたサーバーの中身丸ごと復旧する手段をとらざるをえなくなりました。
せめてこの変更を行う直前に差分をバックアップしていればまだよかったのですが、何度も書いている通りそんなものはなかった上にこの通り↑の内容とか知るかそんなもん!だったので詰みました。
バックアップをしていたのが4日前だったので結果的に4日分のサーバーに保存してあった変更内容のデータをすべて失うことになりました。
4日分のデータの中にはサーバーの投稿データだけでなくその期間に登録したユーザーのアカウントデータもあったため結果的に数十人分程度新規登録自体が存在ごと無かったことになる大惨事でした…。
初心者過ぎる私が悪いのは100として、事前にスナップショットを保存していれば4日分のデータ消失はせず、せいぜい数時間サーバーが動かなかったりいくらか投稿がなかったことになったくらいで済んだはずです。
つまり私が悪い。
改めて、当時皆尽村に登録したにもかかわらず私の不手際でアカウントが削除されてしまった皆様に本当に申し訳ありませんでした。
https://media.minazukey.uk/data/06810845-f400-4452-ba0c-d2c1e8ad0982.gif
逆に言うと、変更前の差分をまめに保存することで不測の事態に陥った時も巻き戻しは最小限で済むことになります。
以降別トラブルでも初心者ゆえにわからないが発生し何度か巻き戻しを伴う対応は発生しましたが、事前に消える恐れがあることを伝えたうえで毎回メンテナンス作業前にスナップショットを保存しているお陰でどうにか対応できています。
2.使うものがどういう動作をするか仕様を簡単でいいので確認しよう
ソフトウェアのアップデート時にソフトウェア本体以外のアップデートなどが必要になるときがあります。アップデート方法については「〇〇 アップデート方法」検索してすぐ出てくる方法を試せばOKだろうと思って試しましたが、結果としてそれだけではうまく行かないケースがありました。
その時上手くいかなかったのはNode.jsのアップデートです。
私はNodeのバージョンアップが必要と言われ、nvmというNodeのバージョン管理ソフトウェアをいれ最新のNodeインストールすると管理含め簡単であるというAIくんの適切な指示に従い、その方法でNodeをアップデートしました。
実際、コマンドでnodeのバージョンを表示しても最新と表示されましたが、にもかかわらずアップデートに何度も失敗しました。はじめはそもそも原因が何かわからなかったので、それを特定する所から時間がかかったのですが(後述の通りエラーについて調べる知識がこの時点で不足していたため)原因がNodeであること、また私がNodeそのものやバージョン管理ツールというものが何なのか理解が不足していたために起こっていたことが後々わかりました。
Nodeというのはプロジェクト(動かしたいもの)ごとにこのバージョンなら動くといったものが違ったりします。簡単に例を挙げるなら今でも更新され続けてるソフトは最新版のNodeで動くけど古いものでは動かなかったり、更新の止まったソフトが最新版では動かずもっと古いバージョンでしか動かないよという感じでしょうか。
そのため、Nodeというのはプロジェクトごとに複数違ったバージョンを使うこともあるソフトウェアで、普段使いのPCで使っている汎用的なソフトのように必ずしも1カ所にインストールして使うというものではなかったりします。そしてnvmのようなNodeの複数バージョンをインストールして切り替えを簡単にする管理ソフトを使う場合は、nvmに入っているこのバージョンのNodeを使用しますよとプロジェクト側で設定する必要があるわけです。
アップデートに伴いnvmを導入した、ということからもわかると思いますが、もともとFirefish(Calckey)を動かすために使用していた別なインストール済みのNode.jsがあり、そのNodeを使ってソフトウェアを起動する設定になっていたため、設定が紐づいていないnvmでNodeのバージョンをいくら最新にしたところで、使っているものは変わらず古かったため意味がなかったのです。
ここまで原因を突き止めたうえでnvmを使用する設定にして解決しましたが、よく考えてみるとNodeのバージョン管理ソフトを入れる前から私のサーバーは問題なく動いていたわけですから当然どこかしらに別個に入ってるものがあったというわけです。なのでただこれが必要だからインストール、というだけでなく簡単にでもいいのでそもそもどういう仕組みで動いていてるかは確認しておいた方がいざおかしいぞ?!となった時に原因を追究できるので大事です。使う癖に知らない私が悪いですが…。
参考リンク
3.エラーログを確認する方法を調べよう
さて、上述のエラーですが気づいて無事にアップデートするまでに結構な時間を費やしました。その過程で学んで後から大変役に立ったのはエラーログを確認する方法です。とはいえjournaldのような簡単なものから…でしたが。
そもそもエラーログの見方を知らないのにアップデートを?!詰まったらどうするんじゃい!!という話ですが知らないままでもエラーが起こらなければサーバーって動いちゃいますからね。わかんなくてもある程度できてしまうから怖いですよね…。
こういうエラーログの確認方法はソフトウェアや起動方法によって違う場合があるので「〇〇 エラーログ 確認方法」なんかで検索するといいと思います。
参考リンク
4.AIに泣きつけ
前述のとおり私はサーバー管理について無知無知の無知すぎたのでドラえもんに泣きつくのび太君よろしくAIにすぐ聞いてました。私のドラえもんはChatgptです!
上記のエラー対応の時など非常時やわからないことがあるときに大変頼りになります!いい子だ…。
しかしChatGPT, 彼はたまに大嘘をつきます。 仕組み的に仕方ないですが…。大嘘を信じてサーバーが死んだ日もあります。天使の顔をした悪魔かよ!いえ、私が悪いです…。
なので「それ本当に?」「なんかデータあるんですか?」ってこわいくらい詰めた上で、ほんまか?と検索を併用したほうがいいです。課金すればもう少し賢い可能性はありますがその場合であっても彼に対する基本姿勢はこれでいいとおもいます。泣きつきながら詰めてくるのび太ってAI視点から見るとこわいかもしれませんが感情はないはずなのでこれで多分良いでしょう。
もちろん2 にあるように仕様を確認することで「へ~!こんな方法ができるんだ…ってそれはないだろ!」とノリツッコミ出来る程度にに気づきやすくはなるかもしれませんが全員が全員そこまでも勘が冴えわたっているわけでもないので難しいと思います。
ですから、前述のとおり検索を併用しながらアシストをお願いするのがおすすめです。結構的確に助けてくれる時も多いのでこちらの知識が追い付いていてればかなり便利な存在だと思います。BingAIも試しましたが、ChatGPTの方がこの分野では有用な気がします。
参考リンク
まとめ
他にも色々書き出せばある…と思いますがとりあえずこんなところでしょうか。
分かる人から見たら楽しくない内容かもしれないですが、私と同じくらい無知無知の無知だけど自サーバー試してみたいぜ…!というチャレンジ精神を胸に宿した人にはミリくらいでも役に立つといいなあと思って書きました。
正直このようなトラブルにあった後わからない状態から調べたりするのはかなり大変でしたし、先が見えず不安な時もありましたが、サーバーを建てなければそもそもしらなかったことなのでこういったことを学べたのは良いことだったなあと今なら思います。トラブルやエラーなんてないに越したことはないけどね!本当にな!?
というわけで来年2024年も恙なく安定した鯖缶生活を続けられることを願って…〆させていただきます。