PleromaをHerokuにたててみた

![](https://raw.githubusercontent.com/mba-hack/images/master/pleroma-01.png)

## introduction

色々な分散snsを触ってみる一環として、[pleroma](https://git.pleroma.social/pleroma/pleroma)も触ってみました。

順番的には、`mastodon -> pleroma -> gnu-social`という順です。

## deploy pleroma on heroku

pleromaは、elixirの`phoenix(phx)`というweb frameworkで書かれています。

個人的には、phxで書かれたappは、非常に軽量で扱いやすいという印象です。

ただし、pleromaは、phx-exampleにあるようなディレクトリ構造とは少し違うので、使用する`heroku buildpacks`も違ってきます。

具体的には、`https://github.com/gjaldon/heroku-buildpack-phoenix-static.git`は、`assets/package.json`を`npm i`するのですが、pleromaは、heroku deployする際に、npm(node)が必要ありません。

ということで、buildpacksはelixirのやつだけでOKです。

```sh
$ heroku create $APP_NAME

$ git clone https://git.pleroma.social/pleroma/pleroma
$ cd !$:t
$ rm -rf .git

$ heroku git:remote -a $APP_NAME 

$ cat elixir_buildpack.config
erlang_version=20.1
elixir_version=1.6.0
always_rebuild=false
runtime_path=/app

$ cat Procfile
web: MIX_ENV=prod POOL_SIZE=2 mix ecto.migrate && mix phx.server

$ cat config/prod.exs
use Mix.Config
config :pleroma, Pleroma.Web.Endpoint,
 http: [port: {:system, "PORT"}],
  url: [scheme: "https", host: "pleroma.syui.cf", port: 443],
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  #cache_static_manifest: "priv/static/manifest.json",
  secret_key_base: System.get_env("SECRET_KEY_BASE")
config :logger, level: :info
config :logger, :console, format: "[$level] $message\n"
config :phoenix, :stacktrace_depth, 20
config :pleroma, Pleroma.Repo,
  adapter: Ecto.Adapters.Postgres,
  url: System.get_env("DATABASE_URL"),
  pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
  ssl: true

$ mix deps.get
$ mix phx.gen.secret
XXX
$ heroku config:set SECRET_KEY_BASE="XXX" -a $APP_NAME
$ heroku addons:create heroku-postgresql:hobby-dev -a $APP_NAME
$ heroku buildpacks:set https://github.com/HashNuke/heroku-buildpack-elixir.git -a $APP_NAME

$ echo mix.lock >> .gitignore
$ git add .
$ git commit -m "first"
$ git push heroku master
```

大抵、srcを読めばわかりますが、config/prod.exsはこんな感じになってます。

```elixir:config/prod.exs
use Mix.Config

config :pleroma, Pleroma.Web.Endpoint,
 http: [port: {:system, "PORT"}],
  url: [scheme: "https", host: "pleroma.syui.cf", port: 443],
  force_ssl: [rewrite_on: [:x_forwarded_proto]],
  #cache_static_manifest: "priv/static/manifest.json",
  secret_key_base: System.get_env("SECRET_KEY_BASE")

config :logger, level: :info
config :logger, :console, format: "[$level] $message\n"

config :phoenix, :stacktrace_depth, 20

config :pleroma, Pleroma.Repo,
  adapter: Ecto.Adapters.Postgres,
  url: System.get_env("DATABASE_URL"),
  pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10"),
  ssl: true
```

```sh:elixir_buildpack.config
erlang_version=20.1
elixir_version=1.6.0
always_rebuild=false
runtime_path=/app
```

```sh:Procfile
web: MIX_ENV=prod POOL_SIZE=2 mix ecto.migrate && mix phx.server
```

pleromaもそうですが、imgをuploadするserverが必要で、通常はhostingしているserverにuploadするんですけど、herokuは再起動と同時に、upload(write)されたものを消します。なので、この際にuploadしたavatarも消えます。

ということで、media_proxyを設定してみてどうにかならないかなってことでやってみましたが、どうにもなりませんでした。

```elixir:config/prod.exs
config :pleroma, :media_proxy,
  enabled: true,
  redirect_on_failure: true,
  base_url: "https://syui.gitlab.io/img/pleroma"
```

これに関しては、srcの`lib/pleroma/upload.ex`をいじって対応しています。けど、やりたいこと事自体は単純なので上記の設定でなんとなく分かると思います(それ自体は有効ではないけど)。

heroku webは、アクセスがないとM30ごとに落ちます。多分そんな感じ。立ち上がるまで結構時間がかかるので、schedulerを設定してみたわけですが、heroku logsみてみると、Stopping all processes with SIGTERMしたことがありました。なのでやめといたほうがいいですね。特にprocess-schedulerです。herokuに負担がかかりすぎるみたい。

```sh
# heroku addons:add process-scheduler -a $APP_NAME
# heroku addons:open process-scheduler -a $APP_NAME
$ heroku addons:create scheduler:standard -a $APP_NAME
$ heroku addons:open scheduler -a $APP_NAME
```

こちらは、pleromaの初期コマンド等です。

```sh
# sign up
# example : $ heroku run "mix register_user syui syui user@github.com . password123" -a pleroma
$ heroku run "mix register_user <name> <username> <email> <bio> <password>" -a $APP_NAME

# admin user
$ heroku run "mix set_moderator $USER" -a $APP_NAME

# single user mode
$ vim config/config.exs
+ config :pleroma, :instance, registrations_open: false,
+ config :pleroma, :chat, enabled: false
```

参考 :

https://git.pleroma.social/pleroma/pleroma/wikis/Pleroma%E3%81%AE%E5%85%A5%E3%82%8C%E6%96%B9

https://git.pleroma.social/pleroma/pleroma/wikis/Admin%20tasks