summary refs log tree commit diff
path: root/nixos/modules/services/networking/pleroma.xml
blob: 2a81e166d10203e65e9a3d9fbd11c0eb0da68fb1 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" xml:id="module-services-pleroma">
  <title>Pleroma</title>
  <para>
    <link xlink:href="https://pleroma.social/">Pleroma</link> is a
    lightweight activity pub server.
  </para>
  <section xml:id="module-services-pleroma-generate-config">
    <title>Generating the Pleroma config</title>
    <para>
      The <literal>pleroma_ctl</literal> CLI utility will prompt you
      some questions and it will generate an initial config file. This
      is an example of usage
    </para>
    <programlisting>
$ mkdir tmp-pleroma
$ cd tmp-pleroma
$ nix-shell -p pleroma-otp
$ pleroma_ctl instance gen --output config.exs --output-psql setup.psql
</programlisting>
    <para>
      The <literal>config.exs</literal> file can be further customized
      following the instructions on the
      <link xlink:href="https://docs-develop.pleroma.social/backend/configuration/cheatsheet/">upstream
      documentation</link>. Many refinements can be applied also after
      the service is running.
    </para>
  </section>
  <section xml:id="module-services-pleroma-initialize-db">
    <title>Initializing the database</title>
    <para>
      First, the Postgresql service must be enabled in the NixOS
      configuration
    </para>
    <programlisting>
services.postgresql = {
  enable = true;
  package = pkgs.postgresql_13;
};
</programlisting>
    <para>
      and activated with the usual
    </para>
    <programlisting>
$ nixos-rebuild switch
</programlisting>
    <para>
      Then you can create and seed the database, using the
      <literal>setup.psql</literal> file that you generated in the
      previous section, by running
    </para>
    <programlisting>
$ sudo -u postgres psql -f setup.psql
</programlisting>
  </section>
  <section xml:id="module-services-pleroma-enable">
    <title>Enabling the Pleroma service locally</title>
    <para>
      In this section we will enable the Pleroma service only locally,
      so its configurations can be improved incrementally.
    </para>
    <para>
      This is an example of configuration, where
      <xref linkend="opt-services.pleroma.configs" /> option contains
      the content of the file <literal>config.exs</literal>, generated
      <link linkend="module-services-pleroma-generate-config">in the
      first section</link>, but with the secrets (database password,
      endpoint secret key, salts, etc.) removed. Removing secrets is
      important, because otherwise they will be stored publicly in the
      Nix store.
    </para>
    <programlisting>
services.pleroma = {
  enable = true;
  secretConfigFile = &quot;/var/lib/pleroma/secrets.exs&quot;;
  configs = [
    ''
    import Config

    config :pleroma, Pleroma.Web.Endpoint,
      url: [host: &quot;pleroma.example.net&quot;, scheme: &quot;https&quot;, port: 443],
      http: [ip: {127, 0, 0, 1}, port: 4000]

    config :pleroma, :instance,
      name: &quot;Test&quot;,
      email: &quot;admin@example.net&quot;,
      notify_email: &quot;admin@example.net&quot;,
      limit: 5000,
      registrations_open: true

    config :pleroma, :media_proxy,
      enabled: false,
      redirect_on_failure: true

    config :pleroma, Pleroma.Repo,
      adapter: Ecto.Adapters.Postgres,
      username: &quot;pleroma&quot;,
      database: &quot;pleroma&quot;,
      hostname: &quot;localhost&quot;

    # Configure web push notifications
    config :web_push_encryption, :vapid_details,
      subject: &quot;mailto:admin@example.net&quot;

    # ... TO CONTINUE ...
    ''
  ];
};
</programlisting>
    <para>
      Secrets must be moved into a file pointed by
      <xref linkend="opt-services.pleroma.secretConfigFile" />, in our
      case <literal>/var/lib/pleroma/secrets.exs</literal>. This file
      can be created copying the previously generated
      <literal>config.exs</literal> file and then removing all the
      settings, except the secrets. This is an example
    </para>
    <programlisting>
# Pleroma instance passwords

import Config

config :pleroma, Pleroma.Web.Endpoint,
   secret_key_base: &quot;&lt;the secret generated by pleroma_ctl&gt;&quot;,
   signing_salt: &quot;&lt;the secret generated by pleroma_ctl&gt;&quot;

config :pleroma, Pleroma.Repo,
  password: &quot;&lt;the secret generated by pleroma_ctl&gt;&quot;

# Configure web push notifications
config :web_push_encryption, :vapid_details,
  public_key: &quot;&lt;the secret generated by pleroma_ctl&gt;&quot;,
  private_key: &quot;&lt;the secret generated by pleroma_ctl&gt;&quot;

# ... TO CONTINUE ...
</programlisting>
    <para>
      Note that the lines of the same configuration group are comma
      separated (i.e. all the lines end with a comma, except the last
      one), so when the lines with passwords are added or removed,
      commas must be adjusted accordingly.
    </para>
    <para>
      The service can be enabled with the usual
    </para>
    <programlisting>
$ nixos-rebuild switch
</programlisting>
    <para>
      The service is accessible only from the local
      <literal>127.0.0.1:4000</literal> port. It can be tested using a
      port forwarding like this
    </para>
    <programlisting>
$ ssh -L 4000:localhost:4000 myuser@example.net
</programlisting>
    <para>
      and then accessing
      <link xlink:href="http://localhost:4000">http://localhost:4000</link>
      from a web browser.
    </para>
  </section>
  <section xml:id="module-services-pleroma-admin-user">
    <title>Creating the admin user</title>
    <para>
      After Pleroma service is running, all
      <link xlink:href="https://docs-develop.pleroma.social/">Pleroma
      administration utilities</link> can be used. In particular an
      admin user can be created with
    </para>
    <programlisting>
$ pleroma_ctl user new &lt;nickname&gt; &lt;email&gt;  --admin --moderator --password &lt;password&gt;
</programlisting>
  </section>
  <section xml:id="module-services-pleroma-nginx">
    <title>Configuring Nginx</title>
    <para>
      In this configuration, Pleroma is listening only on the local port
      4000. Nginx can be configured as a Reverse Proxy, for forwarding
      requests from public ports to the Pleroma service. This is an
      example of configuration, using
      <link xlink:href="https://letsencrypt.org/">Let’s Encrypt</link>
      for the TLS certificates
    </para>
    <programlisting>
security.acme = {
  email = &quot;root@example.net&quot;;
  acceptTerms = true;
};

services.nginx = {
  enable = true;
  addSSL = true;

  recommendedTlsSettings = true;
  recommendedOptimisation = true;
  recommendedGzipSettings = true;

  recommendedProxySettings = false;
  # NOTE: if enabled, the NixOS proxy optimizations will override the Pleroma
  # specific settings, and they will enter in conflict.

  virtualHosts = {
    &quot;pleroma.example.net&quot; = {
      http2 = true;
      enableACME = true;
      forceSSL = true;

      locations.&quot;/&quot; = {
        proxyPass = &quot;http://127.0.0.1:4000&quot;;

        extraConfig = ''
          etag on;
          gzip on;

          add_header 'Access-Control-Allow-Origin' '*' always;
          add_header 'Access-Control-Allow-Methods' 'POST, PUT, DELETE, GET, PATCH, OPTIONS' always;
          add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, Idempotency-Key' always;
          add_header 'Access-Control-Expose-Headers' 'Link, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining, X-Request-Id' always;
          if ($request_method = OPTIONS) {
            return 204;
          }
          add_header X-XSS-Protection &quot;1; mode=block&quot;;
          add_header X-Permitted-Cross-Domain-Policies none;
          add_header X-Frame-Options DENY;
          add_header X-Content-Type-Options nosniff;
          add_header Referrer-Policy same-origin;
          add_header X-Download-Options noopen;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection &quot;upgrade&quot;;
          proxy_set_header Host $host;

          client_max_body_size 16m;
          # NOTE: increase if users need to upload very big files
        '';
      };
    };
  };
};
</programlisting>
  </section>
</chapter>