introduction
色々な分散snsを触ってみる一環として、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です。
$ 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はこんな感じになってます。
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
erlang_version=20.1
elixir_version=1.6.0
always_rebuild=false
runtime_path=/app
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を設定してみてどうにかならないかなってことでやってみましたが、どうにもなりませんでした。
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に負担がかかりすぎるみたい。
# 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の初期コマンド等です。
# 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
参考 :