Misskeyインスタンスを建てようとしたメモ

# 警告

**V10時点の情報です。現在の最新版はV12であり、**(本家Misskeyを導入する場合において)**最早このメモは使い物になりません。**

ただめいすきー(V10のまま継続開発されているMisskey)およびめいすきーベースの改造リポジトリを使用する場合は多少役に立つかもしれません。
___
注:一応この記事単品でも大体どうにかなるようには書いてるつもりです、が結局最終的に書いてることは最下部の資料と同じなので(それに余分なメモが付いてる感覚)、純粋に建て方を知りたいなら資料見た方が圧倒的にわかりやすいと思います。メモとある通り正直自分用。

あ、何気にこちらでは初めましてですが...まぁ挨拶はいいです。

# そもそもこの記事何
自宅サーバーにMastodonを入れようと思ったけど(技術力皆無には)できる気がしないので同じActivityPubを使用したMisskey建てようとした。  
建てようとしたこと自体や、その際やらかした所とかのメモです。

※結局全部地力は無理だった結果がこのメモ(備忘録)

参考資料は最下部にまとめます。

# 待って、まずMisskeyって？

ここ見て→https://join.misskey.page/

最初は2014年から開発は始まったみたいですが最初はActivityPubには対応してなく、2018年からActivityPub対応したとかどうとか...。

# 前提
･自宅鯖運用
･ドメインは独自ドメイン又はDDNSサービスのサブドメイン取得済みとする。(DDNSの自動更新も設定済みだと好ましい)
･nginxによるリバースプロキシを使用
 要するに、Misskey本体はポート3000(コンフィグによる)に入口開いて動くんだけど、80番ポートや443番ポートへのアクセスをnginxが受け付けてそこから 80→443→3000(Misskeyの既定値ポート) って感じで橋渡ししてくれる機能。
･Ubuntu使用
･今回はCloudflare使ってないけど使った方がいいらしい？(2020年2月現在私の鯖では使ってます。)DDNSのサブドメイン使うなら諦め。

# 建てようとした
やらかしまつりの開始

注意:以降の説明のバージョンは例であり今のメジャーなやつを入れること。
## 穴あけ
自宅鯖なので外から接続できるようにします。

とても大雑把に…

サーバーのローカルIP固定→ルーターの穴あけ→(入れてるなら)OSファイヤーウォールの穴あけ

## マニュアルは熟読しよう。
悪いことは言わないから。
とりあえず[本家マニュアル(リンク先はV10用)](https://github.com/misskey-dev/misskey/blob/v10/docs/setup.ja.md)を見ればとりあえずできる...はずだったんだけどね、他の古い資料への寄り道はやめましょう絶対。(要するに私が死んだ決定的な原因)

## 必要パッケージのインストール

## 前提

流石にいつものアップデートコマンドはやっとく。

## 資料確認して最初の操作→いきなり躓く

公式ドキュメントだけじゃなんか怖いなぁと思ったのが運のつきでした。
記事の更新日時を見ないのが悪い。
別資料でImageMagic7を手動ビルドとか聞いてそこで引っかかりまくってた。

PNGのツールがビルド出来なかったんですね。(それはそれで自分の力不足が過ぎるって点は置いといて。)

で、悲鳴上げてたのですが、そもそも**imagemagic自体が要らない**というオチで終わるんですね。

参考資料の更新日時を見てない自爆。

寄り道ダメ。ゼッタイ。

## Node.jsインストール

メジャーバージョンどんどん上がるからコマンドの数字はググって最新のに変えて。(現にこれ追記なんだけど2020年2月19日現在既に最新版が13.9だから下手すればメジャーバージョン14が秒読み)(追記、2020年5月時点で既に14も出てます。)

参考にするバージョンはLTSではなく最新版。LTSだと…詰む。
だからって最新が出た瞬間それにしてもそれはそれで事故る。
そこら辺はリリースノートとにらめっこしてください。

だからって入れたあともnかnvmか何か使ってバージョン上げてかないと突然Misskeyが要求するバージョンより古くなる日が来るかもしれない。個人的にはn。

```bash
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt-get install -y nodejs
```

## MongoDBインストール

ここら辺よぐわがんね

```bash

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 9DA31620334BD75D9DCB49F368818C72E52529D4
echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.0.list
sudo apt-get update
sudo apt-get install mongodb-org
```

## その他必要パッケージのインストール
letsencryptはCloudflare使うなら多分不要(原因よくわからんけど自分は絵文字コピーの時Cloudflare使用時用の自己証明で事故ったのでいちいちやってる)。後述するnginxのコンフィグも基本コメントアウト書き換える必要は無いです。(厳密な暗号化でも求めない限りは自己証明でおkって事です。)

```bash
sudo apt -y install redis git yarn build-essential nginx ssl-cert letsencrypt
```


# Misskeyの用意

## Misskey用ユーザー作成
```bash
sudo adduser --disabled-password --disabled-login misskey
```
普通はこれでいいのですが私の場合ユーザー切り替え時に毎回毎回sudo入れ忘れてパス聞かれてるのでパスワード設定もやりました(無論割愛)。
さすがにこんな人私だけでしょうし。

## misskeyユーザーに変更
```bash

sudo su - misskey
```

以降基本的にはMisskeyユーザーを。

一応:sudoは使えない(一般ユーザー)

## Misskeyのクローン&ディレクトリ移動

今回はV10用の記事ということと、私がこのリポジトリを使用しているという理由で、[改造インスタンス(めいすきー)](https://github.com/mei23/misskey)をクローン元として使用。

```bash
git clone -b master https://github.com/mei23/misskey.git

cd ~/misskey
```

# コンフィグの編集

ここから鬼門の中の鬼門

## コピーして編集開始

```bash
cp .config/example.yml .config/default.yml

vim .config/default.yml
```

## 編集

**※2020年4月現在、この部分全く編集してないので最初から参考資料とか見た方が確実です。というか普通は直感で行けるレベルなのですが...**

example.tldは自分のドメインに適時置き換えること。(コメントアウトされてるとこは変えないでおk)

これコピペしても多分ずれるから公式資料とめいめいさん資料もガン見すべし。

条件:MongoDBは認証無し(この場合ポートはキッチリガード),Redis及び**Elasticsearchを有効(使わないならコメントアウトのまま)**,リバースプロキシ

```vim

# Final accessible URL seen by a user.  
url: https://example.tld/

### Port and TLS settings ######################################  
#  
# Misskey supports two deployment options for public.  
#

# Option 1: With Reverse Proxy  
#  
# +----- https://example.tld/ ------------+  
# +------+ |+-------------+ +----------------+|  
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||  
# +------+ |+-------------+ +----------------+|  
# +---------------------------------------+  
#  
# You need to setup reverse proxy. (eg. nginx)  
# You do not define 'https' section.

# Option 2: Standalone  
#  
# +- https://example.tld/ -+  
# +------+ | +---------------+ |  
# | User | ---> | | Misskey (443) | |  
# +------+ | +---------------+ |  
# +------------------------+  
#  
# You need to run Misskey as root.  
# You need to set Certificate in 'https' section.

# To use option 1, uncomment below line.  
port: 3000 # A port that your Misskey server should listen.

# To use option 2, uncomment below lines.  
# port: 443  
#  
# https:  
# # path for certification  
# key: /etc/letsencrypt/live/example.tld/privkey.pem  
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem

################################################################

mongodb:  
host: localhost  
port: 27017  
db: misskey  
# user: example-misskey-user  
# pass: example-misskey-pass

drive:  
storage: 'db'

# OR

# storage: 'minio'  
# bucket:  
# prefix:  
# config:  
# endPoint:  
# port:  
# useSSL:  
# accessKey:  
# secretKey:

# S3 example  
# storage: 'minio'  
# bucket: bucket-name  
# prefix: files  
# config:  
# endPoint: s3-us-west-2.amazonaws.com  
# region: us-west-2  
# useSSL: true  
# accessKey: XXX  
# secretKey: YYY

# S3 example (with CDN, custom domain)  
# storage: 'minio'  
# bucket: drive.example.com  
# prefix: files  
# baseUrl: https://drive.example.com  
# config:  
# endPoint: s3-us-west-2.amazonaws.com  
# region: us-west-2  
# useSSL: true  
# accessKey: XXX  
# secretKey: YYY

# If enabled:  
# The first account created is automatically marked as Admin.  
autoAdmin: true

#  
# Below settings are optional  
#

# Redis  
redis:  
host: localhost  
port: 6379  
# pass: example-pass

# Elasticsearch  
elasticsearch:  
host: localhost  
port: 9200  
# pass: null

# Whether disable HSTS  
#disableHsts: true

Clustering  
#clusterLimit: 1
```

# ビルド

私ね、コンフィグ編集する度にビルド欲しいと思ってたんですよ...全然違った(更新履歴漁ってて初めて知った)

もしディレクトリ変わってたら~/misskeyへ

```bash
yarn install && NODE_ENV=production yarn run build
```

90%からが本番。

もしここで失敗劇が起きたらここら辺に追記されてるだろうけど今は無いです今は。

## 補足

一応だがPythonは入れてね。私はなかったけどPython無いと怒られた人を見たので。てか普通は最初から入ってるんじゃなかった？

# NginxとSSL証明書の設定

Misskey既にこの段階で起動可能だけど、起動の前にリバースプロキシ組みましょう。

もうここらへん完全に[めいめいさんのメモ](https://github.com/mei23/memo/blob/master/misskey/Setup-Ubuntu1804-Quick.md#%E7%AE%A1%E7%90%86%E8%80%85%E3%83%A6%E3%83%BC%E3%82%B6%E3%81%A7nginx%E3%81%A8ssl%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E8%A8%AD%E5%AE%9A)と完全に同じなのでMisskeyユーザーに戻すとこまでは割愛します。

# いざ起動

ここで泣いても笑っても今までの行いが良かったか決まる

```bash
cd ~/misskey
NODE_ENV=production yarn start
```

※ デバッグログ等を参照したい場合は以下のコマンドで起動する

```bash
yarn start
```

## 私の行いは悪かったそうです

**原因はインデントというかコメントアウトの消し忘れでした。(2020年2月追記)**

まぁコンフィグのRedisの記述でインデントエラー起こしただけなんですけど...何回本家以外の資料とか見てもなぜか拒否られる。

しびれを切らして一文字分ずつずらして全部確認したけどダメ...しびれを切らして(二回目)めいめいさん作成の資料から該当部分をコピペ上書きという手段を取りました。

正直それだけで動くとは思わなかったが余裕でビルドできたのでわけわかめ。

追記:多分 **redis:** の記述のコメントアウト忘れだった気がします。アホ。


とにかくこれで起動しました。

ちなみにコンフィグなおす度にビルドしてました...コンフィグ変えるだけなら再ビルドは要らないんだってね...コンフィグ編集後のビルドを何回やったと...。

# 起動したら？

本当に起動してるか見ましょう。

ローカルネット内の端末からならブラウザ起動して

http://サーバーのローカルipアドレス:3000

にアクセスします(無論ポートはコンフィグで設定したやつに書き換えること)

またはhosts設定してドメインアクセスという手段もあり。

CloudFlare使ってたらhostsなくても行けた気がする。

無いと思うけどローカルネット外から接続するなら設定したドメインを。  
スマホのモバイル通信とか。

## え、起動してるけど画像とか全滅ですけど

ローカルネットから接続するとドメインに接続できんから画像もアクセス不能で見えない。

とりあえずその他管理面で面倒な場合あるので対処はすべきです。

それこそ対処法はhostsファイルの設定です。

## 動画が見れない！
先述のhosts設定してもだめならFFMPEGがなぜか入ってない。再試行して。
私はなぜか入れたはずが再試行したら新規インストールされたので...つもりは危険。

## 一回落とす

なぜか？デーモン設定...もあるけど私の場合今回もう一つやる。

### Elasticsearchを入れる(管理者ユーザー)
入れる入れない自由だし負荷もデカいらしいが自鯖どうせ人も来ないしいいだろと導入((

追記:現在は自鯖の負荷酷くなってきたので停止してます。

```bash
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get install apt-transport-https
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
sudo apt-get update
sudo apt-get install elasticsearch
sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable elasticsearch.service
sudo systemctl start elasticsearch.service

```
おそらくこれで起動まで持って行けるはずです。

#### kromojiプラグイン入れる

```bash
sudo /usr/share/elasticsearch/bin/elasticsearch-plugin install analysis-kuromoji
sudo systemctl restart elasticsearch.service
```

多分これで入る

# とりあえずデーモン設定(管理者ユーザー)

追記:npmじゃなくてyarn？


```bash
sudo vim /etc/systemd/system/misskey.service
```

```vim


    [Unit]
    Description=Misskey daemon

    [Service]
    Type=simple
    User=misskey
    ExecStart=/usr/bin/npm start
    WorkingDirectory=/home/misskey/misskey
    Environment="NODE_ENV=production"
    TimeoutSec=60
    StandardOutput=syslog
    StandardError=syslog
    SyslogIdentifier=misskey
    Restart=always

    [Install]
    WantedBy=multi-user.target
```

```bash

sudo systemctl daemon-reload  
sudo systemctl enable misskey 
sudo systemctl start misskey  
```
これで正式に稼働するはずです。あとは URL/admin へアクセスしてインスタンス名とか設定してくださいはい。

# 問題
これはハード側の問題だが1日1回HDDがずっとアクセス状態(=PCのHDDランプが常時点灯)になってフリーズ→新PCかつSSDへ乗り換え様子見中。以降については別記事にする。

追記:乗り換えた。別記事参考。

# 以上

今回は以上。最後らへん書くだけで疲れたし修正多々になるかもしれない。  
なんならBotとか移行とかもこれに書くつもりがすでに長ったらしいので別で投稿します。

んじゃっ

# 参考資料

Misskey開発者や協力者の資料ばかりというこのね。

いやそれはそうだけど。

[めいめいさんのメモ(聖書)](https://github.com/mei23/memo/blob/master/misskey/Setup-Ubuntu_Debian.md)~~(&ご本人)~~

[tamainaさんのガイド](https://qiita.com/tamaina/items/d7c1a758cb6c9d3eaaa5#misskey%E3%82%92daemon%E3%81%A8%E3%81%97%E3%81%A6%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B)/[2](https://qiita.com/tamaina/items/3395cfac4fe03d89e8f8)

[ゆずりょーさんの備忘録](https://qiita.com/YuzuRyo61/items/7105d16ac75c78899f1c)