Merge branch 'develop' into issue/1383
[akkoma] / lib / pleroma / application.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.Application do
6 import Cachex.Spec
7 use Application
8
9 @name Mix.Project.config()[:name]
10 @version Mix.Project.config()[:version]
11 @repository Mix.Project.config()[:source_url]
12 @env Mix.env()
13
14 def name, do: @name
15 def version, do: @version
16 def named_version, do: @name <> " " <> @version
17 def repository, do: @repository
18
19 def user_agent do
20 case Pleroma.Config.get([:http, :user_agent], :default) do
21 :default ->
22 info = "#{Pleroma.Web.base_url()} <#{Pleroma.Config.get([:instance, :email], "")}>"
23 named_version() <> "; " <> info
24
25 custom ->
26 custom
27 end
28 end
29
30 # See http://elixir-lang.org/docs/stable/elixir/Application.html
31 # for more information on OTP Applications
32 def start(_type, _args) do
33 Pleroma.Config.DeprecationWarnings.warn()
34 setup_instrumenters()
35
36 # Define workers and child supervisors to be supervised
37 children =
38 [
39 Pleroma.Repo,
40 Pleroma.Config.TransferTask,
41 Pleroma.Emoji,
42 Pleroma.Captcha,
43 Pleroma.Plugs.RateLimiter.Supervisor
44 ] ++
45 cachex_children() ++
46 hackney_pool_children() ++
47 [
48 Pleroma.Stats,
49 Pleroma.JobQueueMonitor,
50 {Oban, Pleroma.Config.get(Oban)}
51 ] ++
52 task_children(@env) ++
53 streamer_child(@env) ++
54 chat_child(@env, chat_enabled?()) ++
55 [
56 Pleroma.Web.Endpoint,
57 Pleroma.Gopher.Server
58 ]
59
60 # See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
61 # for other strategies and supported options
62 opts = [strategy: :one_for_one, name: Pleroma.Supervisor]
63 Supervisor.start_link(children, opts)
64 end
65
66 defp setup_instrumenters do
67 require Prometheus.Registry
68
69 if Application.get_env(:prometheus, Pleroma.Repo.Instrumenter) do
70 :ok =
71 :telemetry.attach(
72 "prometheus-ecto",
73 [:pleroma, :repo, :query],
74 &Pleroma.Repo.Instrumenter.handle_event/4,
75 %{}
76 )
77
78 Pleroma.Repo.Instrumenter.setup()
79 end
80
81 Pleroma.Web.Endpoint.MetricsExporter.setup()
82 Pleroma.Web.Endpoint.PipelineInstrumenter.setup()
83 Pleroma.Web.Endpoint.Instrumenter.setup()
84 end
85
86 def enabled_hackney_pools do
87 [:media] ++
88 if Application.get_env(:tesla, :adapter) == Tesla.Adapter.Hackney do
89 [:federation]
90 else
91 []
92 end ++
93 if Pleroma.Config.get([Pleroma.Upload, :proxy_remote]) do
94 [:upload]
95 else
96 []
97 end
98 end
99
100 defp cachex_children do
101 [
102 build_cachex("used_captcha", ttl_interval: seconds_valid_interval()),
103 build_cachex("user", default_ttl: 25_000, ttl_interval: 1000, limit: 2500),
104 build_cachex("object", default_ttl: 25_000, ttl_interval: 1000, limit: 2500),
105 build_cachex("rich_media", default_ttl: :timer.minutes(120), limit: 5000),
106 build_cachex("scrubber", limit: 2500),
107 build_cachex("idempotency", expiration: idempotency_expiration(), limit: 2500),
108 build_cachex("web_resp", limit: 2500),
109 build_cachex("emoji_packs", expiration: emoji_packs_expiration(), limit: 10),
110 build_cachex("failed_proxy_url", limit: 2500)
111 ]
112 end
113
114 defp emoji_packs_expiration,
115 do: expiration(default: :timer.seconds(5 * 60), interval: :timer.seconds(60))
116
117 defp idempotency_expiration,
118 do: expiration(default: :timer.seconds(6 * 60 * 60), interval: :timer.seconds(60))
119
120 defp seconds_valid_interval,
121 do: :timer.seconds(Pleroma.Config.get!([Pleroma.Captcha, :seconds_valid]))
122
123 defp build_cachex(type, opts),
124 do: %{
125 id: String.to_atom("cachex_" <> type),
126 start: {Cachex, :start_link, [String.to_atom(type <> "_cache"), opts]},
127 type: :worker
128 }
129
130 defp chat_enabled?, do: Pleroma.Config.get([:chat, :enabled])
131
132 defp streamer_child(:test), do: []
133
134 defp streamer_child(_) do
135 [Pleroma.Web.Streamer.supervisor()]
136 end
137
138 defp chat_child(:test, _), do: []
139
140 defp chat_child(_env, true) do
141 [Pleroma.Web.ChatChannel.ChatChannelState]
142 end
143
144 defp chat_child(_, _), do: []
145
146 defp hackney_pool_children do
147 for pool <- enabled_hackney_pools() do
148 options = Pleroma.Config.get([:hackney_pools, pool])
149 :hackney_pool.child_spec(pool, options)
150 end
151 end
152
153 defp task_children(:test) do
154 [
155 %{
156 id: :web_push_init,
157 start: {Task, :start_link, [&Pleroma.Web.Push.init/0]},
158 restart: :temporary
159 }
160 ]
161 end
162
163 defp task_children(_) do
164 [
165 %{
166 id: :web_push_init,
167 start: {Task, :start_link, [&Pleroma.Web.Push.init/0]},
168 restart: :temporary
169 },
170 %{
171 id: :internal_fetch_init,
172 start: {Task, :start_link, [&Pleroma.Web.ActivityPub.InternalFetchActor.init/0]},
173 restart: :temporary
174 }
175 ]
176 end
177 end