2022-07-07 / @syui

pleroma , heroku , docker

pleromaをherokuで立てる[2022年度版]

この前、#stackoverflowでelixirのphoenixが好きなフレームワーク1位に選ばれていました。

ref : https://www.publickey1.jp/blog/22/7itrustdbpostgresqlvscodeneovimstack_overflow_2022_developer_survey.html

正直、驚きました。しかも、好きな言語ランキングでも1位のrustに続いてelixirが2位でした。elixir、そんな人気だったん…?

そんなelixirのphoenixですが、mastodonに似たblog(sns)サービスであるpleromaがphoenixで書かれています。pleromaを触ってると、phoenixのことも自然にわかってくると思います。

ということで、今回は、herokuでpleromaを立ててみます。herokuのelixir, phoenix対応はstackやbuildpackの関係上、かなりつらい状況です。buildpackを自身で動くよう調整し公開する必要があるかもしれません。

したがって、dockerで立てたほうがいいでしょう。もしcontainerを利用しない場合、現在のelixir対応では運用が行き詰まる可能性があります。

https://github.com/angristan/docker-pleroma

基本的には、DockerfileのENTRYPOINTを削除して、heroku.ymlを書きます。

#ENTRYPOINT ["/pleroma/docker-entrypoint.sh"]
build:
  docker:
    web: Dockerfile
  config:
    MIX_ENV: prod
    SECRET_KEY_BASE: $SECRET_KEY_BASE
    DATABASE_URL: $DATABASE_URL
    DB_NAME: $DB_NAME
    DB_HOST: $DB_HOST
    DB_USER: $DB_USER
    DB_PASS: $DB_PASS
    DOMAIN: $DOMAIN
    ADMIN_EMAIL: $ADMIN_EMAIL
    NOTIFY_EMAIL: $NOTIFY_EMAIL

run:
  web: $HOME/bin/pleroma_ctl migrate && exec $HOME/bin/pleroma start

それぞれの環境変数は、以下のコマンドで入れていけばいいでしょう。

$ heroku addons:create heroku-postgresql:hobby-dev
$ heroku pg:credentials:url
$ heroku config:set DB_USER=xxx
.
.
.

次に、config.exsを書きますが、herokuに対応した書き方が必要です。

config :pleroma, Pleroma.Web.Endpoint,
  url: [scheme: "https", host: "xxx.herokuapp.com", port: {:system, "PORT"}],
  http: [ip: {0, 0, 0, 0}, port: {:system, "PORT"}]

config :pleroma, :instance,
  name: System.get_env("INSTANCE_NAME", "pleroma.syui.cf"),
  email: System.get_env("ADMIN_EMAIL"),
  notify_email: System.get_env("NOTIFY_EMAIL"),
  limit: 5000,
  registrations_open: false,
  federating: true,
  healthcheck: true

config :pleroma, :media_proxy,
  enabled: false,
  redirect_on_failure: true,
  base_url: "https://cache.domain.tld"

config :pleroma, Pleroma.Repo,
  adapter: Ecto.Adapters.Postgres,
  #url: System.get_env("DATABASE_URL"),
  username: System.get_env("DB_USER", "pleroma"),
  password: System.fetch_env!("DB_PASS"),
  database: System.get_env("DB_NAME", "pleroma"),
  hostname: System.get_env("DB_HOST", "db"),
  pool_size: 10,
  ssl: true

インスタンスの新規登録を禁止するにはregistrations_openfalseに変更します。

$ heroku stack:set container
$ git add .
$ git commit -m "first"
$ git push heroku main

ref : https://docs-develop.pleroma.social/backend/administration/CLI_tasks/user/#create-a-user