misskey + heroku

[misskey](https://github.com/syuilo/misskey) on [heroku](https://heroku.com).


`misskey`という分散snsをherokuというpaasで動かしてみた記録です。

```bash:heroku-info
remote:        * Stack heroku-18

remote:        NPM_CONFIG_LOGLEVEL=error
remote:        NODE_ENV=production
remote:        NODE_MODULES_CACHE=true
remote:        NODE_VERBOSE=false

remote:        Resolving node version 10.x...
remote:        Downloading and installing node 10.15.3...
remote:        Using default npm version: 6.4.1

remote:        > misskey@10.98.3 install 
```

misskeyをherokuで動作させるポイントとしては、`.config/default.yml`と`heroku $PORT`です。

herokuは、deployする度にPORTが変動し、その値は、PORTの環境変数に入っています。しかし、misskeyのsource codeはそれに対応していないようなので、少しだけcodeをPaaS向きに書き換える必要があります。

追記 : 環境変数のPORTが設定されている場合、それが適用されるようになったので、この処理は不要になりました。　

```sh
$ git clone https://github.com/syuilo/misskey
$ cd !$:t

# git reset --hard 551d1b7f8624d2e9c19a99dd80aaf49f096ce836

$ git branch
$ git checkout -b master

$ heroku create $APP_NAME
$ heroku git:remote -a $APP_NAME
$ heroku buildpacks:set https://github.com/heroku/heroku-buildpack-nodejs
# heroku buildpacks:set https://github.com/heroku/heroku-buildpack-nodejs#v143

# gitignoreに注意、.configが入っている可能性
$ cat .gitignore
$ cat ~/.gitignore

$ cd .config/
$ mv example.yml default.yml
$ mv mongo_initdb_example.js mongo_initdb.js 

$ heroku addons:create mongolab:sandbox
$ heroku addons:create heroku-redis:hobby-dev
$ heroku config

$ vim default.yml
```

```yml:default.yml
# Final accessible URL seen by a user.
url: https://$APP_NAME.herokuapp.com
#url: http://localhost
port: 80
#port: 8000

# mongodb://${DB_USER}:${DB_PASS}@${DB_HOST}:${DB_PORT}/${DB_NAME}
mongodb:
  host: $DB_HOST
  port: $DB_PORT
  db: $DB_NAME
  user: $DB_USER
  pass: $DB_PASS

drive:
  storage: 'db'

# redis://h:${REDIS_PASS}@${REDIS_HOST}:${REDIS_PORT}
redis:
  host: $REDIS_HOST
  port: $REDIS_PORT
  pass: $REDIS_PASS

autoAdmin: true
disableHsts: true
clusterLimit: 1
```

```bash
# repo rootに移動
$ cd ..

$ heroku config
$ cat docs/setup.ja.md

$ mongo ${DB_HOST}:${DB_PORT}/${DB_NAME} -u ${DB_USER} -p ${DB_PASS}
 2. `use misskey` misskeyデータベースを使用
 3. `db.createUser( { user: "$USER", pwd: "$PASS", roles: [ { role: "readWrite", db: "misskey" } ] } )` misskeyユーザーを作成
 4. `exit` mongoシェルを終了



## herokuのPORT対応(最新のcommitで対応されていますので、この処理は不要になりました)
# grep -R 'config.port' src/
## default.yml
# vim ./src/config/load.ts
+ config.port = process.env.PORT;
## production
# vim ./src/server/index.ts
- server.listen(config.port);
+ server.listen(process.env.PORT || 8000);

# previewするには、`.config/default.yml`の値を`url:localhost`と`port:8000`とかにする
$ npm i
$ npm run build
$ NODE_ENV=production npm start

$ vim Procfile
web: NODE_ENV=production npm start

# gitignoreに注意、.configが入っている可能性
$ cat .gitignore
$ cat ~/.gitignore

$ git add .
$ git commit -m "first"
$ git push -u heroku master

# 問題の調査
$ heroku logs
$ heroku run bash
```

## misskeyの管理について

`autoAdmin: true`で最初に作成されたユーザーが管理者になります。

single user mode(個人インスタンス)にするには、ログイン後に`/admin`にアクセスして、`インスタンス -> ユーザー登録を停止する`です。


動いた日 : 2019/04/04

## Heroku Deploy Button

misskeyがmongodbからpgsqlに移行しました。これによって、heroku上では動作しなくなりました。pgsqlにデータが送られるとき、エラーが出ているみたいで、それが解消できません。おそらく、devlopが開発版で、master(or v10)が安定版なので、master(or v10)で使えば、動くと思います。

よって、mongodbで動いている最新(v10)のmisskeyをheroku用に書き換えて、`heroku deploy button`を動くようにしてみました。

これによって、ボタンをクリックして必要な値を入力すれば(`LOCAL_DOMAIN=https://APP_NAME.herokuapp.com`のところだけ書き換えればあとはデフォルトでOK)、ほぼ確実にheroku上で動作させることができます。

[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://dashboard.heroku.com/new?button-url=https://github.com/syui/misskey/tree/v10&template=https://github.com/syui/misskey/tree/v10)