Pleroma를 Heroku에 갚았다.
introduction
다양한 분산 sns를 만져 보는 일환으로 pleroma도 만져 보았습니다.
순차적으로는
mastodon -> pleroma -> gnu-social
라는 순서입니다.deploy pleroma on heroku
pleroma는 elixir의
phoenix(phx)
라는 웹 프레임 워크로 작성되었습니다.개인적으로 phx로 작성된 앱은 매우 가볍고 다루기 쉽다는 인상입니다.
다만, 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의 녀석만으로 괜찮습니다.
$ 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는 이런 느낌이 듭니다.
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
elixir_buildpack.config
erlang_version=20.1
elixir_version=1.6.0
always_rebuild=false
runtime_path=/app
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를 설정해 보면 어떻게 될지 궁금합니다.
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 웹은 액세스가 없으면 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 [email protected] . 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
참고 :
Reference
이 문제에 관하여(Pleroma를 Heroku에 갚았다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/syui/items/baac85b2ea4d41969121텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)