1 { pkgs, lib, config, ... }:
3 domain = "autogeree.net";
5 owner = "${srv}-${domain}";
6 db = "${srv}-${domain}";
8 inherit (config.services) postgresql;
9 inherit (config.users) groups;
11 # pleroma_ctl instance gen
12 # https://git.pleroma.social/pleroma/pleroma/blob/develop/config/config.exs
16 config :pleroma, Pleroma.Web.Endpoint,
17 url: [host: "${srv}.${domain}", scheme: "https", port: 443],
18 http: [ip: {127, 0, 0, 1}, port: ${toString port}]
20 config :pleroma, :http_security,
23 config :pleroma, Pleroma.Web.WebFinger, domain: "${domain}"
25 # RELEASE_COOKIE="/var/lib/pleroma/.cookie" \
26 # pleroma_ctl user new $user $user+pleroma@autogeree.net --password "$password" --moderator --admin -y
27 config :pleroma, :instance,
29 email: "root+${srv}@${domain}",
30 notify_email: "root+${srv}@${domain}",
32 registrations_open: false,
33 invites_enabled: true,
34 description: "Pleroma: An efficient and flexible fediverse server",
35 short_description: "",
36 background_image: "/images/city.jpg",
37 instance_thumbnail: "/instance/thumbnail.jpeg",
38 max_pinned_statuses: 4
40 config :pleroma, :media_proxy,
42 redirect_on_failure: true
43 #base_url: "https://cache.pleroma.social"
45 config :pleroma, :markup,
46 allow_inline_images: true,
50 # pleroma_ctl email test --to julm+pleroma@autogeree.net
51 config :pleroma, Pleroma.Emails.Mailer, [
52 adapter: Swoosh.Adapters.Sendmail,
54 cmd_path: "/run/wrappers/bin/sendmail",
58 config :pleroma, :dangerzone,
59 override_repo_pool_size: true
61 config :pleroma, Pleroma.Repo,
62 adapter: Ecto.Adapters.Postgres,
64 socket_dir: "/run/postgresql",
66 migration_lock: :pg_advisory_lock,
68 # Database task queue timeout to avoid timeouts on the front end
69 # due to a slow postgresql, eg. because of a CPUQuota= hardening.
71 queue_interval: 1_000,
72 ownership_timeout: 20_000,
75 # https://docs-develop.pleroma.social/backend/configuration/postgresql/#disable-generic-query-plans
77 plan_cache_mode: "force_custom_plan"
80 config :pleroma, :database, rum_enabled: false
81 config :pleroma, :instance, static_dir: "/var/lib/${srv}/static"
82 config :pleroma, Pleroma.Uploaders.Local, uploads: "/var/lib/${srv}/uploads"
83 config :pleroma, configurable_from_database: false
84 config :pleroma, Pleroma.Upload, filters: [
85 Pleroma.Upload.Filter.Exiftool.StripLocation,
86 Pleroma.Upload.Filter.Exiftool.ReadDescription
89 # https://docs-develop.pleroma.social/backend/configuration/howto_proxy/
90 #config :pleroma, :http, proxy_url: {:socks5, :localhost, 9050}
91 config :pleroma, :mrf,
93 Pleroma.Web.ActivityPub.MRF.ObjectAgePolicy,
94 Pleroma.Web.ActivityPub.MRF.TagPolicy,
95 Pleroma.Web.ActivityPub.MRF.SimplePolicy
98 config :pleroma, :media_proxy,
101 redirect_on_failure: true
111 # Use $CREDENTIALS_DIRECTORY to work with both pleroma.service and pleroma-migrations.service
114 cred_dir = System.get_env("CREDENTIALS_DIRECTORY")
115 import_config "#{cred_dir}/config.exs"
118 secretConfigFile = "/dev/null";
123 servers."127.0.0.1:${toString port}" = {
125 fail_timeout = "60s";
130 proxyCachePath."${domain}/${srv}/proxy" = {
133 keysZoneName = "${domain}/${srv}/proxy";
134 keysZoneSize = "10m";
140 virtualHosts.${domain} = {
141 locations."/.well-known/host-meta" = {
142 return = "301 https://${srv}.${domain}$request_uri";
145 virtualHosts."${srv}.${domain}" = {
147 useACMEHost = domain;
149 access_log /var/log/nginx/${domain}/${srv}/access.log json buffer=32k;
150 error_log /var/log/nginx/${domain}/${srv}/error.log;
153 proxyPass = "http://${srv}";
155 add_header 'Access-Control-Allow-Origin' '*' always;
156 add_header 'Access-Control-Allow-Methods' 'POST, PUT, DELETE, GET, PATCH, OPTIONS' always;
157 add_header 'Access-Control-Allow-Headers' 'Authorization, Content-Type, Idempotency-Key' always;
158 add_header 'Access-Control-Expose-Headers' 'Link, X-RateLimit-Reset, X-RateLimit-Limit, X-RateLimit-Remaining, X-Request-Id' always;
159 if ($request_method = OPTIONS) {
162 add_header Referrer-Policy same-origin;
163 add_header X-Content-Type-Options nosniff;
164 add_header X-Download-Options noopen;
165 add_header X-Frame-Options DENY;
166 add_header X-Permitted-Cross-Domain-Policies none;
167 add_header X-XSS-Protection "1; mode=block";
168 client_max_body_size 16m;
169 proxy_connect_timeout 90;
170 proxy_http_version 1.1;
171 proxy_read_timeout 90;
173 proxy_send_timeout 90;
174 proxy_set_header Connection "upgrade";
175 proxy_set_header Upgrade $http_upgrade;
178 locations."/proxy" = {
179 proxyPass = "http://${srv}";
181 proxy_cache ${domain}/${srv}/proxy;
183 proxy_ignore_client_abort on;
190 # MAPNAME SYSTEM-USERNAME PG-USERNAME
195 sanoid.datasets."rpool/var/lib/${srv}" = {
196 use_template = [ "snap" ];
205 LogsDirectory = lib.mkForce [ "nginx/${domain}/${srv}" ];
208 pleroma-migrations = {
210 LoadCredentialEncrypted = [ "config.exs:${./pleroma/config.exs.cred}" ];
211 SupplementaryGroups = [ groups."postgres".name ];
222 environment.RELEASE_VM_ARGS = pkgs.writeText "vm.args" ''
223 # Disable the busy-waiting.
224 # https://docs-develop.pleroma.social/backend/configuration/optimizing_beam/#virtual-machine-andor-few-cpu-cores
231 StartLimitIntervalSec = "600s";
234 LoadCredentialEncrypted = [ "config.exs:${./pleroma/config.exs.cred}" ];
235 SupplementaryGroups = [ groups."postgres".name ];
236 TimeoutStopSec = "10s";
237 Restart = "on-failure";
239 MemoryAccounting = true;
243 NoNewPrivileges = lib.mkForce false;
247 postStart = lib.mkAfter ''
248 connection_limit=64 \
250 lc_collate=fr_FR.UTF-8 \
251 lc_type=fr_FR.UTF-8 \
254 pg_createdb "${db}" >/dev/null
255 pg_adduser "${db}" "${owner}" >/dev/null
257 $PSQL -d "${db}" -AqtX --set ON_ERROR_STOP=1 -f - <<EOF
258 --Extensions made by ecto.migrate that need superuser access
259 CREATE EXTENSION IF NOT EXISTS citext;
260 CREATE EXTENSION IF NOT EXISTS pg_trgm;
261 CREATE EXTENSION IF NOT EXISTS "uuid-ossp";