Misskeyへのアイスシュリンプからの移行
AmaseCocoa @cocoa@hackers.pub
Misskeyに移行する理由
- アイスシュリンプは現在.NETで再実装中(Iceshrimp.NET; Iceshrimp.JSは非アクティブではない)
 - Iceshrimp.JSはメディアプロキシからのメディアを正しくレンダリングしない(報告したかもしれませんが、原因がブラウザかアイスシュリンプかわかりませんでした)
 - Misskeyが好き
 
アイスシュリンプとMisskeyの比較
| アイスシュリンプ | Misskey (2025.10.x) | |
|---|---|---|
| ベース | Firefish (Misskey v12) | Misskey v13~ (フォークではない) | 
| 翻訳API | LibreTranslate, DeepL | DeepL | 
| 既存ノートの編集 | ⭕️ | ❌️ | 
| MOTD | ⭕️ | ❌️ | 
| ノート長さ制限 | 可変 | 3000 | 
| 検索エンジン | gin_trgm | LIKE, PGroonga, Meilisearch | 
| FTT (ファンアウトタイムライン技術) | ❌️ | ⭕️ | 
| ソーシャルログイン | ⭕️ | ❌️ | 
警告
これを推奨しているわけではありません。そもそも、MisskeyとIceshrimp/Firefishの間には多くの変更があるため、一部の情報が失われるリスクがあります。
それでもこの移行を希望する場合は、以下の設定を確認する必要があります:
- SMTP(パスワードリセットに必要)
- SMTPが利用できない場合は、この移行を中止するか、バックエンドを一時的に書き換えてMisskeyのサインインロジックがargon2をサポートするように適応させ、さらにargon2ハッシュをbcryptハッシュに自動的に置き換えるように変更してください。
 
 
方法
0. アイスシュリンプインスタンスをシャットダウンする
安全のため、この移行前にアイスシュリンプインスタンスをシャットダウンしてください。
systemd:
sudo systemctl stop iceshrimp
1. データベースのバックアップ
これを進める場合は、必ずバックアップを作成してください。
pg_dump -Fc (あなたのデータベース) > iceshrimp.dump
2. データベースのロールバック
次に、データベースをFirefishと同等のものにロールバックします。
次のログが表示されるまで、以下のコマンドを実行し続けてください:
$ pnpm revert
# 任意のログ
Migration IceshrimpRepo1689965609061 has been reverted successfully.
3. SQLの実行
Sharkeyに移行したい場合は、このドキュメントを続けてください。
BEGIN;
-- Misskey used to have a Reversi game, Firefish dropped the tables,
-- now Misskey uses them again
CREATE TABLE "reversi_game" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "startedAt" TIMESTAMP WITH TIME ZONE, "user1Id" character varying(32) NOT NULL, "user2Id" character varying(32) NOT NULL, "user1Accepted" boolean NOT NULL DEFAULT false, "user2Accepted" boolean NOT NULL DEFAULT false, "black" integer, "isStarted" boolean NOT NULL DEFAULT false, "isEnded" boolean NOT NULL DEFAULT false, "winnerId" character varying(32), "surrendered" character varying(32), "logs" jsonb NOT NULL DEFAULT '[]', "map" character varying(64) array NOT NULL, "bw" character varying(32) NOT NULL, "isLlotheo" boolean NOT NULL DEFAULT false, "canPutEverywhere" boolean NOT NULL DEFAULT false, "loopedBoard" boolean NOT NULL DEFAULT false, "form1" jsonb DEFAULT null, "form2" jsonb DEFAULT null, "crc32" character varying(32), CONSTRAINT "PK_76b30eeba71b1193ad7c5311c3f" PRIMARY KEY ("id"));
CREATE INDEX "IDX_b46ec40746efceac604142be1c" ON "reversi_game" ("createdAt");
CREATE TABLE "reversi_matching" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "parentId" character varying(32) NOT NULL, "childId" character varying(32) NOT NULL, CONSTRAINT "PK_880bd0afbab232f21c8b9d146cf" PRIMARY KEY ("id"));
CREATE INDEX "IDX_b604d92d6c7aec38627f6eaf16" ON "reversi_matching" ("createdAt");
CREATE INDEX "IDX_3b25402709dd9882048c2bbade" ON "reversi_matching" ("parentId");
CREATE INDEX "IDX_e247b23a3c9b45f89ec1299d06" ON "reversi_matching" ("childId");
-- this column was added by both Firefish and Misskey, but with
-- different names, let's fix it
ALTER TABLE "meta" RENAME COLUMN "ToSUrl" TO "termsOfServiceUrl";
-- fix antenna
CREATE TYPE public.new_antenna_src_enum AS ENUM ('home', 'all', 'users', 'list');
ALTER TABLE antenna ADD COLUMN new_src public.new_antenna_src_enum;
DELETE FROM antenna WHERE src NOT IN ('home', 'all', 'users', 'list');
UPDATE antenna SET new_src = src::text::new_antenna_src_enum;
ALTER TABLE antenna DROP COLUMN src;
ALTER TABLE antenna RENAME COLUMN new_src TO src;
DROP TYPE public.antenna_src_enum;
ALTER TYPE new_antenna_src_enum RENAME TO antenna_src_enum;
COMMIT;
4. Misskeyのインストール
次に、この方法でMisskeyをインストールできます。
ただし、pnpm run initは実行しないでください。テストしていませんが、データベースが破損する可能性があります。
トラブルシューティング
ログインできない
上記の設定を忘れたということです。諦めてください。
クライアントのAPP_IMPORTでのロード失敗 
/flashにアクセスしてクライアントを初期化してください。これによりすべてのデータが削除されますが、少なくともサーバーが単なる飾りになることを防ぎます。
pg_trgmを削除できない 
サーバーのデータベースにアクセスしてDROP EXTENSION pg_trgm CASCADE;を実行し、強制的に削除してください。
ヒント
ルートアカウントの変更方法
現在のバージョンのMisskeyでは、isRootパラメータが削除されています。以下のパラメータを使用して、ルートユーザーを別のユーザーに変更できます:
BEGIN;
UPDATE meta SET "rootUserId" = '(ユーザーID)' WHERE id = 'x';
COMMIT;
そしてMisskeyを再起動してください。
参考文献
この移行の成功を確実にするために閲覧したドキュメントのすべての著者に感謝の意を表します。