Merge remote-tracking branch 'remotes/origin/develop' into feature/object-hashtags...
[akkoma] / config / description.exs
1 use Mix.Config
2
3 websocket_config = [
4 path: "/websocket",
5 serializer: [
6 {Phoenix.Socket.V1.JSONSerializer, "~> 1.0.0"},
7 {Phoenix.Socket.V2.JSONSerializer, "~> 2.0.0"}
8 ],
9 timeout: 60_000,
10 transport_log: false,
11 compress: false
12 ]
13
14 installed_frontend_options = [
15 %{
16 key: "name",
17 label: "Name",
18 type: :string,
19 description:
20 "Name of the installed frontend. Valid config must include both `Name` and `Reference` values."
21 },
22 %{
23 key: "ref",
24 label: "Reference",
25 type: :string,
26 description:
27 "Reference of the installed frontend to be used. Valid config must include both `Name` and `Reference` values."
28 }
29 ]
30
31 frontend_options = [
32 %{
33 key: "name",
34 label: "Name",
35 type: :string,
36 description: "Name of the frontend."
37 },
38 %{
39 key: "ref",
40 label: "Reference",
41 type: :string,
42 description: "Reference of the frontend to be used."
43 },
44 %{
45 key: "git",
46 label: "Git Repository URL",
47 type: :string,
48 description: "URL of the git repository of the frontend"
49 },
50 %{
51 key: "build_url",
52 label: "Build URL",
53 type: :string,
54 description:
55 "Either an url to a zip file containing the frontend or a template to build it by inserting the `ref`. The string `${ref}` will be replaced by the configured `ref`.",
56 example: "https://some.url/builds/${ref}.zip"
57 },
58 %{
59 key: "build_dir",
60 label: "Build directory",
61 type: :string,
62 description: "The directory inside the zip file "
63 },
64 %{
65 key: "custom-http-headers",
66 label: "Custom HTTP headers",
67 type: {:list, :string},
68 description: "The custom HTTP headers for the frontend"
69 }
70 ]
71
72 config :pleroma, :config_description, [
73 %{
74 group: :pleroma,
75 key: Pleroma.Upload,
76 type: :group,
77 description: "Upload general settings",
78 children: [
79 %{
80 key: :uploader,
81 type: :module,
82 description: "Module which will be used for uploads",
83 suggestions: {:list_behaviour_implementations, Pleroma.Uploaders.Uploader}
84 },
85 %{
86 key: :filters,
87 type: {:list, :module},
88 description:
89 "List of filter modules for uploads. Module names are shortened (removed leading `Pleroma.Upload.Filter.` part), but on adding custom module you need to use full name.",
90 suggestions: {:list_behaviour_implementations, Pleroma.Upload.Filter}
91 },
92 %{
93 key: :link_name,
94 type: :boolean,
95 description:
96 "If enabled, a name parameter will be added to the URL of the upload. For example `https://instance.tld/media/imagehash.png?name=realname.png`."
97 },
98 %{
99 key: :base_url,
100 label: "Base URL",
101 type: :string,
102 description:
103 "Base URL for the uploads. Required if you use a CDN or host attachments under a different domain.",
104 suggestions: [
105 "https://cdn-host.com"
106 ]
107 },
108 %{
109 key: :proxy_remote,
110 type: :boolean,
111 description: """
112 Proxy requests to the remote uploader.\n
113 Useful if media upload endpoint is not internet accessible.
114 """
115 },
116 %{
117 key: :filename_display_max_length,
118 type: :integer,
119 description: "Set max length of a filename to display. 0 = no limit. Default: 30"
120 }
121 ]
122 },
123 %{
124 group: :pleroma,
125 key: Pleroma.Uploaders.Local,
126 type: :group,
127 description: "Local uploader-related settings",
128 children: [
129 %{
130 key: :uploads,
131 type: :string,
132 description: "Path where user's uploads will be saved",
133 suggestions: [
134 "uploads"
135 ]
136 }
137 ]
138 },
139 %{
140 group: :pleroma,
141 key: Pleroma.Uploaders.S3,
142 type: :group,
143 description: "S3 uploader-related settings",
144 children: [
145 %{
146 key: :bucket,
147 type: :string,
148 description: "S3 bucket",
149 suggestions: [
150 "bucket"
151 ]
152 },
153 %{
154 key: :bucket_namespace,
155 type: :string,
156 description: "S3 bucket namespace",
157 suggestions: ["pleroma"]
158 },
159 %{
160 key: :truncated_namespace,
161 type: :string,
162 description:
163 "If you use S3 compatible service such as Digital Ocean Spaces or CDN, set folder name or \"\" etc." <>
164 " For example, when using CDN to S3 virtual host format, set \"\". At this time, write CNAME to CDN in Upload base_url."
165 },
166 %{
167 key: :streaming_enabled,
168 type: :boolean,
169 description:
170 "Enable streaming uploads, when enabled the file will be sent to the server in chunks as it's being read. This may be unsupported by some providers, try disabling this if you have upload problems."
171 }
172 ]
173 },
174 %{
175 group: :pleroma,
176 key: Pleroma.Upload.Filter.Mogrify,
177 type: :group,
178 description: "Uploads mogrify filter settings",
179 children: [
180 %{
181 key: :args,
182 type: [:string, {:list, :string}, {:list, :tuple}],
183 description:
184 "List of actions for the mogrify command. It's possible to add self-written settings as string. " <>
185 "For example `auto-orient, strip, {\"resize\", \"3840x1080>\"}` value will be parsed into valid list of the settings.",
186 suggestions: [
187 "strip",
188 "auto-orient",
189 {"implode", "1"}
190 ]
191 }
192 ]
193 },
194 %{
195 group: :pleroma,
196 key: Pleroma.Upload.Filter.AnonymizeFilename,
197 type: :group,
198 description: "Filter replaces the filename of the upload",
199 children: [
200 %{
201 key: :text,
202 type: :string,
203 description:
204 "Text to replace filenames in links. If no setting, {random}.extension will be used. You can get the original" <>
205 " filename extension by using {extension}, for example custom-file-name.{extension}.",
206 suggestions: [
207 "custom-file-name.{extension}"
208 ]
209 }
210 ]
211 },
212 %{
213 group: :pleroma,
214 key: Pleroma.Emails.Mailer,
215 type: :group,
216 description: "Mailer-related settings",
217 children: [
218 %{
219 key: :enabled,
220 label: "Mailer Enabled",
221 type: :boolean
222 },
223 %{
224 key: :adapter,
225 type: :module,
226 description:
227 "One of the mail adapters listed in [Swoosh documentation](https://hexdocs.pm/swoosh/Swoosh.html#module-adapters)",
228 suggestions: [
229 Swoosh.Adapters.AmazonSES,
230 Swoosh.Adapters.Dyn,
231 Swoosh.Adapters.Gmail,
232 Swoosh.Adapters.Mailgun,
233 Swoosh.Adapters.Mailjet,
234 Swoosh.Adapters.Mandrill,
235 Swoosh.Adapters.Postmark,
236 Swoosh.Adapters.SMTP,
237 Swoosh.Adapters.Sendgrid,
238 Swoosh.Adapters.Sendmail,
239 Swoosh.Adapters.SocketLabs,
240 Swoosh.Adapters.SparkPost
241 ]
242 },
243 %{
244 group: {:subgroup, Swoosh.Adapters.SMTP},
245 key: :relay,
246 type: :string,
247 description: "Hostname or IP address",
248 suggestions: ["smtp.example.com"]
249 },
250 %{
251 group: {:subgroup, Swoosh.Adapters.SMTP},
252 key: :port,
253 type: :integer,
254 description: "SMTP port",
255 suggestions: ["1025"]
256 },
257 %{
258 group: {:subgroup, Swoosh.Adapters.SMTP},
259 key: :username,
260 type: :string,
261 description: "SMTP AUTH username",
262 suggestions: ["user@example.com"]
263 },
264 %{
265 group: {:subgroup, Swoosh.Adapters.SMTP},
266 key: :password,
267 type: :string,
268 description: "SMTP AUTH password",
269 suggestions: ["password"]
270 },
271 %{
272 group: {:subgroup, Swoosh.Adapters.SMTP},
273 key: :ssl,
274 label: "Use SSL",
275 type: :boolean,
276 description: "Use Implicit SSL/TLS. e.g. port 465"
277 },
278 %{
279 group: {:subgroup, Swoosh.Adapters.SMTP},
280 key: :tls,
281 label: "STARTTLS Mode",
282 type: {:dropdown, :atom},
283 description: "Explicit TLS (STARTTLS) enforcement mode",
284 suggestions: [:if_available, :always, :never]
285 },
286 %{
287 group: {:subgroup, Swoosh.Adapters.SMTP},
288 key: :auth,
289 label: "AUTH Mode",
290 type: {:dropdown, :atom},
291 description: "SMTP AUTH enforcement mode",
292 suggestions: [:if_available, :always, :never]
293 },
294 %{
295 group: {:subgroup, Swoosh.Adapters.SMTP},
296 key: :retries,
297 type: :integer,
298 description: "SMTP temporary (4xx) error retries",
299 suggestions: [1]
300 },
301 %{
302 group: {:subgroup, Swoosh.Adapters.Sendgrid},
303 key: :api_key,
304 label: "SendGrid API Key",
305 type: :string,
306 suggestions: ["YOUR_API_KEY"]
307 },
308 %{
309 group: {:subgroup, Swoosh.Adapters.Sendmail},
310 key: :cmd_path,
311 type: :string,
312 suggestions: ["/usr/bin/sendmail"]
313 },
314 %{
315 group: {:subgroup, Swoosh.Adapters.Sendmail},
316 key: :cmd_args,
317 type: :string,
318 suggestions: ["-N delay,failure,success"]
319 },
320 %{
321 group: {:subgroup, Swoosh.Adapters.Sendmail},
322 key: :qmail,
323 label: "Qmail compat mode",
324 type: :boolean
325 },
326 %{
327 group: {:subgroup, Swoosh.Adapters.Mandrill},
328 key: :api_key,
329 label: "Mandrill API Key",
330 type: :string,
331 suggestions: ["YOUR_API_KEY"]
332 },
333 %{
334 group: {:subgroup, Swoosh.Adapters.Mailgun},
335 key: :api_key,
336 label: "Mailgun API Key",
337 type: :string,
338 suggestions: ["YOUR_API_KEY"]
339 },
340 %{
341 group: {:subgroup, Swoosh.Adapters.Mailgun},
342 key: :domain,
343 type: :string,
344 suggestions: ["YOUR_DOMAIN_NAME"]
345 },
346 %{
347 group: {:subgroup, Swoosh.Adapters.Mailjet},
348 key: :api_key,
349 label: "MailJet Public API Key",
350 type: :string,
351 suggestions: ["MJ_APIKEY_PUBLIC"]
352 },
353 %{
354 group: {:subgroup, Swoosh.Adapters.Mailjet},
355 key: :secret,
356 label: "MailJet Private API Key",
357 type: :string,
358 suggestions: ["MJ_APIKEY_PRIVATE"]
359 },
360 %{
361 group: {:subgroup, Swoosh.Adapters.Postmark},
362 key: :api_key,
363 label: "Postmark API Key",
364 type: :string,
365 suggestions: ["X-Postmark-Server-Token"]
366 },
367 %{
368 group: {:subgroup, Swoosh.Adapters.SparkPost},
369 key: :api_key,
370 label: "SparkPost API key",
371 type: :string,
372 suggestions: ["YOUR_API_KEY"]
373 },
374 %{
375 group: {:subgroup, Swoosh.Adapters.SparkPost},
376 key: :endpoint,
377 type: :string,
378 suggestions: ["https://api.sparkpost.com/api/v1"]
379 },
380 %{
381 group: {:subgroup, Swoosh.Adapters.AmazonSES},
382 key: :access_key,
383 label: "AWS Access Key",
384 type: :string,
385 suggestions: ["AWS_ACCESS_KEY"]
386 },
387 %{
388 group: {:subgroup, Swoosh.Adapters.AmazonSES},
389 key: :secret,
390 label: "AWS Secret Key",
391 type: :string,
392 suggestions: ["AWS_SECRET_KEY"]
393 },
394 %{
395 group: {:subgroup, Swoosh.Adapters.AmazonSES},
396 key: :region,
397 label: "AWS Region",
398 type: :string,
399 suggestions: ["us-east-1", "us-east-2"]
400 },
401 %{
402 group: {:subgroup, Swoosh.Adapters.Dyn},
403 key: :api_key,
404 label: "Dyn API Key",
405 type: :string,
406 suggestions: ["apikey"]
407 },
408 %{
409 group: {:subgroup, Swoosh.Adapters.SocketLabs},
410 key: :api_key,
411 label: "SocketLabs API Key",
412 type: :string,
413 suggestions: ["INJECTION_API_KEY"]
414 },
415 %{
416 group: {:subgroup, Swoosh.Adapters.SocketLabs},
417 key: :server_id,
418 label: "Server ID",
419 type: :string,
420 suggestions: ["SERVER_ID"]
421 },
422 %{
423 group: {:subgroup, Swoosh.Adapters.Gmail},
424 key: :access_token,
425 label: "GMail API Access Token",
426 type: :string,
427 suggestions: ["GMAIL_API_ACCESS_TOKEN"]
428 }
429 ]
430 },
431 %{
432 group: :pleroma,
433 key: :uri_schemes,
434 label: "URI Schemes",
435 type: :group,
436 description: "URI schemes related settings",
437 children: [
438 %{
439 key: :valid_schemes,
440 type: {:list, :string},
441 description: "List of the scheme part that is considered valid to be an URL",
442 suggestions: [
443 "https",
444 "http",
445 "dat",
446 "dweb",
447 "gopher",
448 "hyper",
449 "ipfs",
450 "ipns",
451 "irc",
452 "ircs",
453 "magnet",
454 "mailto",
455 "mumble",
456 "ssb",
457 "xmpp"
458 ]
459 }
460 ]
461 },
462 %{
463 group: :pleroma,
464 key: :database,
465 type: :group,
466 description: "Database-related settings",
467 children: [
468 %{
469 key: :improved_hashtag_timeline,
470 type: :keyword,
471 description:
472 "If `true`, hashtags will be fetched from `hashtags` table for hashtags timeline. When `false`, object-embedded hashtags will be used (slower). Is auto-set to `true` (unless overridden) when HashtagsTableMigrator completes."
473 }
474 ]
475 },
476 %{
477 group: :pleroma,
478 key: :instance,
479 type: :group,
480 description: "Instance-related settings",
481 children: [
482 %{
483 key: :name,
484 type: :string,
485 description: "Name of the instance",
486 suggestions: [
487 "Pleroma"
488 ]
489 },
490 %{
491 key: :email,
492 label: "Admin Email Address",
493 type: :string,
494 description: "Email used to reach an Administrator/Moderator of the instance",
495 suggestions: [
496 "email@example.com"
497 ]
498 },
499 %{
500 key: :notify_email,
501 label: "Sender Email Address",
502 type: :string,
503 description: "Envelope FROM address for mail sent via Pleroma",
504 suggestions: [
505 "notify@example.com"
506 ]
507 },
508 %{
509 key: :description,
510 type: :string,
511 description:
512 "The instance's description. It can be seen in nodeinfo and `/api/v1/instance`",
513 suggestions: [
514 "Very cool instance"
515 ]
516 },
517 %{
518 key: :limit,
519 type: :integer,
520 description: "Posts character limit (CW/Subject included in the counter)",
521 suggestions: [
522 5_000
523 ]
524 },
525 %{
526 key: :chat_limit,
527 type: :integer,
528 description: "Character limit of the instance chat messages",
529 suggestions: [
530 5_000
531 ]
532 },
533 %{
534 key: :remote_limit,
535 type: :integer,
536 description: "Hard character limit beyond which remote posts will be dropped",
537 suggestions: [
538 100_000
539 ]
540 },
541 %{
542 key: :upload_limit,
543 type: :integer,
544 description: "File size limit of uploads (except for avatar, background, banner)",
545 suggestions: [
546 16_000_000
547 ]
548 },
549 %{
550 key: :avatar_upload_limit,
551 type: :integer,
552 description: "File size limit of user's profile avatars",
553 suggestions: [
554 2_000_000
555 ]
556 },
557 %{
558 key: :background_upload_limit,
559 type: :integer,
560 description: "File size limit of user's profile backgrounds",
561 suggestions: [
562 4_000_000
563 ]
564 },
565 %{
566 key: :banner_upload_limit,
567 type: :integer,
568 description: "File size limit of user's profile banners",
569 suggestions: [
570 4_000_000
571 ]
572 },
573 %{
574 key: :poll_limits,
575 type: :map,
576 description: "A map with poll limits for local polls",
577 suggestions: [
578 %{
579 max_options: 20,
580 max_option_chars: 200,
581 min_expiration: 0,
582 max_expiration: 31_536_000
583 }
584 ],
585 children: [
586 %{
587 key: :max_options,
588 type: :integer,
589 description: "Maximum number of options",
590 suggestions: [20]
591 },
592 %{
593 key: :max_option_chars,
594 type: :integer,
595 description: "Maximum number of characters per option",
596 suggestions: [200]
597 },
598 %{
599 key: :min_expiration,
600 type: :integer,
601 description: "Minimum expiration time (in seconds)",
602 suggestions: [0]
603 },
604 %{
605 key: :max_expiration,
606 type: :integer,
607 description: "Maximum expiration time (in seconds)",
608 suggestions: [3600]
609 }
610 ]
611 },
612 %{
613 key: :registrations_open,
614 type: :boolean,
615 description:
616 "Enable registrations for anyone. Invitations require this setting to be disabled."
617 },
618 %{
619 key: :invites_enabled,
620 type: :boolean,
621 description:
622 "Enable user invitations for admins (depends on `registrations_open` being disabled)"
623 },
624 %{
625 key: :account_activation_required,
626 type: :boolean,
627 description: "Require users to confirm their emails before signing in"
628 },
629 %{
630 key: :account_approval_required,
631 type: :boolean,
632 description: "Require users to be manually approved by an admin before signing in"
633 },
634 %{
635 key: :federating,
636 type: :boolean,
637 description: "Enable federation with other instances"
638 },
639 %{
640 key: :federation_incoming_replies_max_depth,
641 label: "Fed. incoming replies max depth",
642 type: :integer,
643 description:
644 "Max. depth of reply-to and reply activities fetching on incoming federation, to prevent out-of-memory situations while" <>
645 " fetching very long threads. If set to `nil`, threads of any depth will be fetched. Lower this value if you experience out-of-memory crashes.",
646 suggestions: [
647 100
648 ]
649 },
650 %{
651 key: :federation_reachability_timeout_days,
652 label: "Fed. reachability timeout days",
653 type: :integer,
654 description:
655 "Timeout (in days) of each external federation target being unreachable prior to pausing federating to it",
656 suggestions: [
657 7
658 ]
659 },
660 %{
661 key: :allow_relay,
662 type: :boolean,
663 description: "Enable Pleroma's Relay, which makes it possible to follow a whole instance"
664 },
665 %{
666 key: :public,
667 type: :boolean,
668 description:
669 "Makes the client API in authenticated mode-only except for user-profiles." <>
670 " Useful for disabling the Local Timeline and The Whole Known Network. " <>
671 " Note: when setting to `false`, please also check `:restrict_unauthenticated` setting."
672 },
673 %{
674 key: :quarantined_instances,
675 type: {:list, :string},
676 description:
677 "List of ActivityPub instances where private (DMs, followers-only) activities will not be sent",
678 suggestions: [
679 "quarantined.com",
680 "*.quarantined.com"
681 ]
682 },
683 %{
684 key: :static_dir,
685 type: :string,
686 description: "Instance static directory",
687 suggestions: [
688 "instance/static/"
689 ]
690 },
691 %{
692 key: :allowed_post_formats,
693 type: {:list, :string},
694 description: "MIME-type list of formats allowed to be posted (transformed into HTML)",
695 suggestions: [
696 "text/plain",
697 "text/html",
698 "text/markdown",
699 "text/bbcode"
700 ]
701 },
702 %{
703 key: :extended_nickname_format,
704 type: :boolean,
705 description:
706 "Enable to use extended local nicknames format (allows underscores/dashes)." <>
707 " This will break federation with older software for theses nicknames."
708 },
709 %{
710 key: :cleanup_attachments,
711 type: :boolean,
712 description: """
713 Enable to remove associated attachments when status is removed.
714 This will not affect duplicates and attachments without status.
715 Enabling this will increase load to database when deleting statuses on larger instances.
716 """
717 },
718 %{
719 key: :max_pinned_statuses,
720 type: :integer,
721 description: "The maximum number of pinned statuses. 0 will disable the feature.",
722 suggestions: [
723 0,
724 1,
725 3
726 ]
727 },
728 %{
729 key: :autofollowed_nicknames,
730 type: {:list, :string},
731 description:
732 "Set to nicknames of (local) users that every new user should automatically follow"
733 },
734 %{
735 key: :autofollowing_nicknames,
736 type: {:list, :string},
737 description:
738 "Set to nicknames of (local) users that automatically follows every newly registered user"
739 },
740 %{
741 key: :attachment_links,
742 type: :boolean,
743 description: "Enable to automatically add attachment link text to statuses"
744 },
745 %{
746 key: :max_report_comment_size,
747 type: :integer,
748 description: "The maximum size of the report comment. Default: 1000.",
749 suggestions: [
750 1_000
751 ]
752 },
753 %{
754 key: :safe_dm_mentions,
755 label: "Safe DM mentions",
756 type: :boolean,
757 description:
758 "If enabled, only mentions at the beginning of a post will be used to address people in direct messages." <>
759 " This is to prevent accidental mentioning of people when talking about them (e.g. \"@admin please keep an eye on @bad_actor\")." <>
760 " Default: disabled"
761 },
762 %{
763 key: :healthcheck,
764 type: :boolean,
765 description: "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
766 },
767 %{
768 key: :remote_post_retention_days,
769 type: :integer,
770 description:
771 "The default amount of days to retain remote posts when pruning the database",
772 suggestions: [
773 90
774 ]
775 },
776 %{
777 key: :user_bio_length,
778 type: :integer,
779 description: "A user bio maximum length. Default: 5000.",
780 suggestions: [
781 5_000
782 ]
783 },
784 %{
785 key: :user_name_length,
786 type: :integer,
787 description: "A user name maximum length. Default: 100.",
788 suggestions: [
789 100
790 ]
791 },
792 %{
793 key: :skip_thread_containment,
794 type: :boolean,
795 description: "Skip filtering out broken threads. Default: enabled."
796 },
797 %{
798 key: :limit_to_local_content,
799 type: {:dropdown, :atom},
800 description:
801 "Limit unauthenticated users to search for local statutes and users only. Default: `:unauthenticated`.",
802 suggestions: [
803 :unauthenticated,
804 :all,
805 false
806 ]
807 },
808 %{
809 key: :max_account_fields,
810 type: :integer,
811 description: "The maximum number of custom fields in the user profile. Default: 10.",
812 suggestions: [
813 10
814 ]
815 },
816 %{
817 key: :max_remote_account_fields,
818 type: :integer,
819 description:
820 "The maximum number of custom fields in the remote user profile. Default: 20.",
821 suggestions: [
822 20
823 ]
824 },
825 %{
826 key: :account_field_name_length,
827 type: :integer,
828 description: "An account field name maximum length. Default: 512.",
829 suggestions: [
830 512
831 ]
832 },
833 %{
834 key: :account_field_value_length,
835 type: :integer,
836 description: "An account field value maximum length. Default: 2048.",
837 suggestions: [
838 2048
839 ]
840 },
841 %{
842 key: :registration_reason_length,
843 type: :integer,
844 description: "Maximum registration reason length. Default: 500.",
845 suggestions: [
846 500
847 ]
848 },
849 %{
850 key: :external_user_synchronization,
851 type: :boolean,
852 description: "Enabling following/followers counters synchronization for external users"
853 },
854 %{
855 key: :multi_factor_authentication,
856 type: :keyword,
857 description: "Multi-factor authentication settings",
858 suggestions: [
859 [
860 totp: [digits: 6, period: 30],
861 backup_codes: [number: 5, length: 16]
862 ]
863 ],
864 children: [
865 %{
866 key: :totp,
867 label: "TOTP settings",
868 type: :keyword,
869 description: "TOTP settings",
870 suggestions: [digits: 6, period: 30],
871 children: [
872 %{
873 key: :digits,
874 type: :integer,
875 suggestions: [6],
876 description:
877 "Determines the length of a one-time pass-code, in characters. Defaults to 6 characters."
878 },
879 %{
880 key: :period,
881 type: :integer,
882 suggestions: [30],
883 description:
884 "A period for which the TOTP code will be valid, in seconds. Defaults to 30 seconds."
885 }
886 ]
887 },
888 %{
889 key: :backup_codes,
890 type: :keyword,
891 description: "MFA backup codes settings",
892 suggestions: [number: 5, length: 16],
893 children: [
894 %{
895 key: :number,
896 type: :integer,
897 suggestions: [5],
898 description: "Number of backup codes to generate."
899 },
900 %{
901 key: :length,
902 type: :integer,
903 suggestions: [16],
904 description:
905 "Determines the length of backup one-time pass-codes, in characters. Defaults to 16 characters."
906 }
907 ]
908 }
909 ]
910 },
911 %{
912 key: :instance_thumbnail,
913 type: {:string, :image},
914 description:
915 "The instance thumbnail can be any image that represents your instance and is used by some apps or services when they display information about your instance.",
916 suggestions: ["/instance/thumbnail.jpeg"]
917 },
918 %{
919 key: :show_reactions,
920 type: :boolean,
921 description: "Let favourites and emoji reactions be viewed through the API."
922 }
923 ]
924 },
925 %{
926 group: :pleroma,
927 key: :welcome,
928 type: :group,
929 description: "Welcome messages settings",
930 children: [
931 %{
932 key: :direct_message,
933 type: :keyword,
934 descpiption: "Direct message settings",
935 children: [
936 %{
937 key: :enabled,
938 type: :boolean,
939 description: "Enables sending a direct message to newly registered users"
940 },
941 %{
942 key: :message,
943 type: :string,
944 description: "A message that will be sent to newly registered users",
945 suggestions: [
946 "Hi, @username! Welcome on board!"
947 ]
948 },
949 %{
950 key: :sender_nickname,
951 type: :string,
952 description: "The nickname of the local user that sends a welcome message",
953 suggestions: [
954 "lain"
955 ]
956 }
957 ]
958 },
959 %{
960 key: :chat_message,
961 type: :keyword,
962 descpiption: "Chat message settings",
963 children: [
964 %{
965 key: :enabled,
966 type: :boolean,
967 description: "Enables sending a chat message to newly registered users"
968 },
969 %{
970 key: :message,
971 type: :string,
972 description:
973 "A message that will be sent to newly registered users as a chat message",
974 suggestions: [
975 "Hello, welcome on board!"
976 ]
977 },
978 %{
979 key: :sender_nickname,
980 type: :string,
981 description: "The nickname of the local user that sends a welcome chat message",
982 suggestions: [
983 "lain"
984 ]
985 }
986 ]
987 },
988 %{
989 key: :email,
990 type: :keyword,
991 descpiption: "Email message settings",
992 children: [
993 %{
994 key: :enabled,
995 type: :boolean,
996 description: "Enables sending an email to newly registered users"
997 },
998 %{
999 key: :sender,
1000 type: [:string, :tuple],
1001 description:
1002 "Email address and/or nickname that will be used to send the welcome email.",
1003 suggestions: [
1004 {"Pleroma App", "welcome@pleroma.app"}
1005 ]
1006 },
1007 %{
1008 key: :subject,
1009 type: :string,
1010 description:
1011 "Subject of the welcome email. EEX template with user and instance_name variables can be used.",
1012 suggestions: ["Welcome to <%= instance_name%>"]
1013 },
1014 %{
1015 key: :html,
1016 type: :string,
1017 description:
1018 "HTML content of the welcome email. EEX template with user and instance_name variables can be used.",
1019 suggestions: ["<h1>Hello <%= user.name%>. Welcome to <%= instance_name%></h1>"]
1020 },
1021 %{
1022 key: :text,
1023 type: :string,
1024 description:
1025 "Text content of the welcome email. EEX template with user and instance_name variables can be used.",
1026 suggestions: ["Hello <%= user.name%>. \n Welcome to <%= instance_name%>\n"]
1027 }
1028 ]
1029 }
1030 ]
1031 },
1032 %{
1033 group: :logger,
1034 type: :group,
1035 description: "Logger-related settings",
1036 children: [
1037 %{
1038 key: :backends,
1039 type: [:atom, :tuple, :module],
1040 description:
1041 "Where logs will be sent, :console - send logs to stdout, { ExSyslogger, :ex_syslogger } - to syslog, Quack.Logger - to Slack.",
1042 suggestions: [:console, {ExSyslogger, :ex_syslogger}, Quack.Logger]
1043 }
1044 ]
1045 },
1046 %{
1047 group: :logger,
1048 type: :group,
1049 key: :ex_syslogger,
1050 label: "ExSyslogger",
1051 description: "ExSyslogger-related settings",
1052 children: [
1053 %{
1054 key: :level,
1055 type: {:dropdown, :atom},
1056 description: "Log level",
1057 suggestions: [:debug, :info, :warn, :error]
1058 },
1059 %{
1060 key: :ident,
1061 type: :string,
1062 description:
1063 "A string that's prepended to every message, and is typically set to the app name",
1064 suggestions: ["pleroma"]
1065 },
1066 %{
1067 key: :format,
1068 type: :string,
1069 description: "Default: \"$date $time [$level] $levelpad$node $metadata $message\"",
1070 suggestions: ["$metadata[$level] $message"]
1071 },
1072 %{
1073 key: :metadata,
1074 type: {:list, :atom},
1075 suggestions: [:request_id]
1076 }
1077 ]
1078 },
1079 %{
1080 group: :logger,
1081 type: :group,
1082 key: :console,
1083 label: "Console Logger",
1084 description: "Console logger settings",
1085 children: [
1086 %{
1087 key: :level,
1088 type: {:dropdown, :atom},
1089 description: "Log level",
1090 suggestions: [:debug, :info, :warn, :error]
1091 },
1092 %{
1093 key: :format,
1094 type: :string,
1095 description: "Default: \"$date $time [$level] $levelpad$node $metadata $message\"",
1096 suggestions: ["$metadata[$level] $message"]
1097 },
1098 %{
1099 key: :metadata,
1100 type: {:list, :atom},
1101 suggestions: [:request_id]
1102 }
1103 ]
1104 },
1105 %{
1106 group: :quack,
1107 type: :group,
1108 label: "Quack Logger",
1109 description: "Quack-related settings",
1110 children: [
1111 %{
1112 key: :level,
1113 type: {:dropdown, :atom},
1114 description: "Log level",
1115 suggestions: [:debug, :info, :warn, :error]
1116 },
1117 %{
1118 key: :meta,
1119 type: {:list, :atom},
1120 description: "Configure which metadata you want to report on",
1121 suggestions: [
1122 :application,
1123 :module,
1124 :file,
1125 :function,
1126 :line,
1127 :pid,
1128 :crash_reason,
1129 :initial_call,
1130 :registered_name,
1131 :all,
1132 :none
1133 ]
1134 },
1135 %{
1136 key: :webhook_url,
1137 label: "Webhook URL",
1138 type: :string,
1139 description: "Configure the Slack incoming webhook",
1140 suggestions: ["https://hooks.slack.com/services/YOUR-KEY-HERE"]
1141 }
1142 ]
1143 },
1144 %{
1145 group: :pleroma,
1146 key: :frontend_configurations,
1147 type: :group,
1148 description:
1149 "This form can be used to configure a keyword list that keeps the configuration data for any " <>
1150 "kind of frontend. By default, settings for pleroma_fe and masto_fe are configured. If you want to " <>
1151 "add your own configuration your settings all fields must be complete.",
1152 children: [
1153 %{
1154 key: :pleroma_fe,
1155 label: "Pleroma FE",
1156 type: :map,
1157 description: "Settings for Pleroma FE",
1158 suggestions: [
1159 %{
1160 alwaysShowSubjectInput: true,
1161 background: "/static/aurora_borealis.jpg",
1162 collapseMessageWithSubject: false,
1163 disableChat: false,
1164 greentext: false,
1165 hideFilteredStatuses: false,
1166 hideMutedPosts: false,
1167 hidePostStats: false,
1168 hideSitename: false,
1169 hideUserStats: false,
1170 loginMethod: "password",
1171 logo: "/static/logo.svg",
1172 logoMargin: ".1em",
1173 logoMask: true,
1174 minimalScopesMode: false,
1175 noAttachmentLinks: false,
1176 nsfwCensorImage: "/static/img/nsfw.74818f9.png",
1177 postContentType: "text/plain",
1178 redirectRootLogin: "/main/friends",
1179 redirectRootNoLogin: "/main/all",
1180 scopeCopy: true,
1181 sidebarRight: false,
1182 showFeaturesPanel: true,
1183 showInstanceSpecificPanel: false,
1184 subjectLineBehavior: "email",
1185 theme: "pleroma-dark",
1186 webPushNotifications: false
1187 }
1188 ],
1189 children: [
1190 %{
1191 key: :alwaysShowSubjectInput,
1192 label: "Always show subject input",
1193 type: :boolean,
1194 description: "When disabled, auto-hide the subject field if it's empty"
1195 },
1196 %{
1197 key: :background,
1198 type: {:string, :image},
1199 description:
1200 "URL of the background, unless viewing a user profile with a background that is set",
1201 suggestions: ["/images/city.jpg"]
1202 },
1203 %{
1204 key: :collapseMessageWithSubject,
1205 label: "Collapse message with subject",
1206 type: :boolean,
1207 description:
1208 "When a message has a subject (aka Content Warning), collapse it by default"
1209 },
1210 %{
1211 key: :disableChat,
1212 label: "PleromaFE Chat",
1213 type: :boolean,
1214 description: "Disables PleromaFE Chat component"
1215 },
1216 %{
1217 key: :greentext,
1218 label: "Greentext",
1219 type: :boolean,
1220 description: "Enables green text on lines prefixed with the > character"
1221 },
1222 %{
1223 key: :hideFilteredStatuses,
1224 label: "Hide Filtered Statuses",
1225 type: :boolean,
1226 description: "Hides filtered statuses from timelines"
1227 },
1228 %{
1229 key: :hideMutedPosts,
1230 label: "Hide Muted Posts",
1231 type: :boolean,
1232 description: "Hides muted statuses from timelines"
1233 },
1234 %{
1235 key: :hidePostStats,
1236 label: "Hide post stats",
1237 type: :boolean,
1238 description: "Hide notices statistics (repeats, favorites, ...)"
1239 },
1240 %{
1241 key: :hideSitename,
1242 label: "Hide Sitename",
1243 type: :boolean,
1244 description: "Hides instance name from PleromaFE banner"
1245 },
1246 %{
1247 key: :hideUserStats,
1248 label: "Hide user stats",
1249 type: :boolean,
1250 description:
1251 "Hide profile statistics (posts, posts per day, followers, followings, ...)"
1252 },
1253 %{
1254 key: :logo,
1255 type: {:string, :image},
1256 description: "URL of the logo, defaults to Pleroma's logo",
1257 suggestions: ["/static/logo.svg"]
1258 },
1259 %{
1260 key: :logoMargin,
1261 label: "Logo margin",
1262 type: :string,
1263 description:
1264 "Allows you to adjust vertical margins between logo boundary and navbar borders. " <>
1265 "The idea is that to have logo's image without any extra margins and instead adjust them to your need in layout.",
1266 suggestions: [".1em"]
1267 },
1268 %{
1269 key: :logoMask,
1270 label: "Logo mask",
1271 type: :boolean,
1272 description:
1273 "By default it assumes logo used will be monochrome with alpha channel to be compatible with both light and dark themes. " <>
1274 "If you want a colorful logo you must disable logoMask."
1275 },
1276 %{
1277 key: :minimalScopesMode,
1278 label: "Minimal scopes mode",
1279 type: :boolean,
1280 description:
1281 "Limit scope selection to Direct, User default, and Scope of post replying to. " <>
1282 "Also prevents replying to a DM with a public post from PleromaFE."
1283 },
1284 %{
1285 key: :nsfwCensorImage,
1286 label: "NSFW Censor Image",
1287 type: {:string, :image},
1288 description:
1289 "URL of the image to use for hiding NSFW media attachments in the timeline",
1290 suggestions: ["/static/img/nsfw.74818f9.png"]
1291 },
1292 %{
1293 key: :postContentType,
1294 label: "Post Content Type",
1295 type: {:dropdown, :atom},
1296 description: "Default post formatting option",
1297 suggestions: ["text/plain", "text/html", "text/markdown", "text/bbcode"]
1298 },
1299 %{
1300 key: :redirectRootNoLogin,
1301 label: "Redirect root no login",
1302 type: :string,
1303 description:
1304 "Relative URL which indicates where to redirect when a user isn't logged in",
1305 suggestions: ["/main/all"]
1306 },
1307 %{
1308 key: :redirectRootLogin,
1309 label: "Redirect root login",
1310 type: :string,
1311 description:
1312 "Relative URL which indicates where to redirect when a user is logged in",
1313 suggestions: ["/main/friends"]
1314 },
1315 %{
1316 key: :scopeCopy,
1317 label: "Scope copy",
1318 type: :boolean,
1319 description: "Copy the scope (private/unlisted/public) in replies to posts by default"
1320 },
1321 %{
1322 key: :sidebarRight,
1323 label: "Sidebar on Right",
1324 type: :boolean,
1325 description: "Change alignment of sidebar and panels to the right"
1326 },
1327 %{
1328 key: :showFeaturesPanel,
1329 label: "Show instance features panel",
1330 type: :boolean,
1331 description:
1332 "Enables panel displaying functionality of the instance on the About page"
1333 },
1334 %{
1335 key: :showInstanceSpecificPanel,
1336 label: "Show instance specific panel",
1337 type: :boolean,
1338 description: "Whether to show the instance's custom panel"
1339 },
1340 %{
1341 key: :subjectLineBehavior,
1342 label: "Subject line behavior",
1343 type: :string,
1344 description: "Allows changing the default behaviour of subject lines in replies.
1345 `email`: copy and preprend re:, as in email,
1346 `masto`: copy verbatim, as in Mastodon,
1347 `noop`: don't copy the subject.",
1348 suggestions: ["email", "masto", "noop"]
1349 },
1350 %{
1351 key: :theme,
1352 type: :string,
1353 description: "Which theme to use. Available themes are defined in styles.json",
1354 suggestions: ["pleroma-dark"]
1355 }
1356 ]
1357 },
1358 %{
1359 key: :masto_fe,
1360 label: "Masto FE",
1361 type: :map,
1362 description: "Settings for Masto FE",
1363 suggestions: [
1364 %{
1365 showInstanceSpecificPanel: true
1366 }
1367 ],
1368 children: [
1369 %{
1370 key: :showInstanceSpecificPanel,
1371 label: "Show instance specific panel",
1372 type: :boolean,
1373 description: "Whenether to show the instance's specific panel"
1374 }
1375 ]
1376 }
1377 ]
1378 },
1379 %{
1380 group: :pleroma,
1381 key: :assets,
1382 type: :group,
1383 description:
1384 "This section configures assets to be used with various frontends. Currently the only option relates to mascots on the mastodon frontend",
1385 children: [
1386 %{
1387 key: :mascots,
1388 type: {:keyword, :map},
1389 description:
1390 "Keyword of mascots, each element must contain both an URL and a mime_type key",
1391 suggestions: [
1392 pleroma_fox_tan: %{
1393 url: "/images/pleroma-fox-tan-smol.png",
1394 mime_type: "image/png"
1395 },
1396 pleroma_fox_tan_shy: %{
1397 url: "/images/pleroma-fox-tan-shy.png",
1398 mime_type: "image/png"
1399 }
1400 ]
1401 },
1402 %{
1403 key: :default_mascot,
1404 type: :atom,
1405 description:
1406 "This will be used as the default mascot on MastoFE. Default: `:pleroma_fox_tan`",
1407 suggestions: [
1408 :pleroma_fox_tan
1409 ]
1410 },
1411 %{
1412 key: :default_user_avatar,
1413 type: {:string, :image},
1414 description: "URL of the default user avatar",
1415 suggestions: ["/images/avi.png"]
1416 }
1417 ]
1418 },
1419 %{
1420 group: :pleroma,
1421 key: :manifest,
1422 type: :group,
1423 description:
1424 "This section describe PWA manifest instance-specific values. Currently this option relate only for MastoFE.",
1425 children: [
1426 %{
1427 key: :icons,
1428 type: {:list, :map},
1429 description: "Describe the icons of the app",
1430 suggestion: [
1431 %{
1432 src: "/static/logo.png"
1433 },
1434 %{
1435 src: "/static/icon.png",
1436 type: "image/png"
1437 },
1438 %{
1439 src: "/static/icon.ico",
1440 sizes: "72x72 96x96 128x128 256x256"
1441 }
1442 ]
1443 },
1444 %{
1445 key: :theme_color,
1446 type: :string,
1447 description: "Describe the theme color of the app",
1448 suggestions: ["#282c37", "mediumpurple"]
1449 },
1450 %{
1451 key: :background_color,
1452 type: :string,
1453 description: "Describe the background color of the app",
1454 suggestions: ["#191b22", "aliceblue"]
1455 }
1456 ]
1457 },
1458 %{
1459 group: :pleroma,
1460 key: :media_proxy,
1461 type: :group,
1462 description: "Media proxy",
1463 children: [
1464 %{
1465 key: :enabled,
1466 type: :boolean,
1467 description: "Enables proxying of remote media via the instance's proxy"
1468 },
1469 %{
1470 key: :base_url,
1471 label: "Base URL",
1472 type: :string,
1473 description:
1474 "The base URL to access a user-uploaded file. Useful when you want to proxy the media files via another host/CDN fronts.",
1475 suggestions: ["https://example.com"]
1476 },
1477 %{
1478 key: :invalidation,
1479 type: :keyword,
1480 descpiption: "",
1481 suggestions: [
1482 enabled: true,
1483 provider: Pleroma.Web.MediaProxy.Invalidation.Script
1484 ],
1485 children: [
1486 %{
1487 key: :enabled,
1488 type: :boolean,
1489 description: "Enables media cache object invalidation."
1490 },
1491 %{
1492 key: :provider,
1493 type: :module,
1494 description: "Module which will be used to purge objects from the cache.",
1495 suggestions: [
1496 Pleroma.Web.MediaProxy.Invalidation.Script,
1497 Pleroma.Web.MediaProxy.Invalidation.Http
1498 ]
1499 }
1500 ]
1501 },
1502 %{
1503 key: :proxy_opts,
1504 label: "Advanced MediaProxy Options",
1505 type: :keyword,
1506 description: "Internal Pleroma.ReverseProxy settings",
1507 suggestions: [
1508 redirect_on_failure: false,
1509 max_body_length: 25 * 1_048_576,
1510 max_read_duration: 30_000
1511 ],
1512 children: [
1513 %{
1514 key: :redirect_on_failure,
1515 type: :boolean,
1516 description: """
1517 Redirects the client to the origin server upon encountering HTTP errors.\n
1518 Note that files larger than Max Body Length will trigger an error. (e.g., Peertube videos)\n\n
1519 **WARNING:** This setting will allow larger files to be accessed, but exposes the\n
1520 IP addresses of your users to the other servers, bypassing the MediaProxy.
1521 """
1522 },
1523 %{
1524 key: :max_body_length,
1525 type: :integer,
1526 description:
1527 "Maximum file size (in bytes) allowed through the Pleroma MediaProxy cache."
1528 },
1529 %{
1530 key: :max_read_duration,
1531 type: :integer,
1532 description: "Timeout (in milliseconds) of GET request to the remote URI."
1533 }
1534 ]
1535 },
1536 %{
1537 key: :whitelist,
1538 type: {:list, :string},
1539 description: "List of hosts with scheme to bypass the MediaProxy",
1540 suggestions: ["http://example.com"]
1541 }
1542 ]
1543 },
1544 %{
1545 group: :pleroma,
1546 key: :media_preview_proxy,
1547 type: :group,
1548 description: "Media preview proxy",
1549 children: [
1550 %{
1551 key: :enabled,
1552 type: :boolean,
1553 description:
1554 "Enables proxying of remote media preview to the instance's proxy. Requires enabled media proxy."
1555 },
1556 %{
1557 key: :thumbnail_max_width,
1558 type: :integer,
1559 description:
1560 "Max width of preview thumbnail for images (video preview always has original dimensions)."
1561 },
1562 %{
1563 key: :thumbnail_max_height,
1564 type: :integer,
1565 description:
1566 "Max height of preview thumbnail for images (video preview always has original dimensions)."
1567 },
1568 %{
1569 key: :image_quality,
1570 type: :integer,
1571 description: "Quality of the output. Ranges from 0 (min quality) to 100 (max quality)."
1572 },
1573 %{
1574 key: :min_content_length,
1575 type: :integer,
1576 description:
1577 "Min content length (in bytes) to perform preview. Media smaller in size will be served without thumbnailing."
1578 }
1579 ]
1580 },
1581 %{
1582 group: :pleroma,
1583 key: Pleroma.Web.MediaProxy.Invalidation.Http,
1584 type: :group,
1585 description: "HTTP invalidate settings",
1586 children: [
1587 %{
1588 key: :method,
1589 type: :atom,
1590 description: "HTTP method of request. Default: :purge"
1591 },
1592 %{
1593 key: :headers,
1594 type: {:keyword, :string},
1595 description: "HTTP headers of request",
1596 suggestions: [{"x-refresh", 1}]
1597 },
1598 %{
1599 key: :options,
1600 type: :keyword,
1601 description: "Request options",
1602 children: [
1603 %{
1604 key: :params,
1605 type: {:map, :string}
1606 }
1607 ]
1608 }
1609 ]
1610 },
1611 %{
1612 group: :pleroma,
1613 key: Pleroma.Web.MediaProxy.Invalidation.Script,
1614 type: :group,
1615 description: "Invalidation script settings",
1616 children: [
1617 %{
1618 key: :script_path,
1619 type: :string,
1620 description: "Path to executable script which will purge cached items.",
1621 suggestions: ["./installation/nginx-cache-purge.sh.example"]
1622 },
1623 %{
1624 key: :url_format,
1625 label: "URL Format",
1626 type: :string,
1627 description:
1628 "Optional URL format preprocessing. Only required for Apache's htcacheclean.",
1629 suggestions: [":htcacheclean"]
1630 }
1631 ]
1632 },
1633 %{
1634 group: :pleroma,
1635 key: :gopher,
1636 type: :group,
1637 description: "Gopher settings",
1638 children: [
1639 %{
1640 key: :enabled,
1641 type: :boolean,
1642 description: "Enables the gopher interface"
1643 },
1644 %{
1645 key: :ip,
1646 label: "IP",
1647 type: :tuple,
1648 description: "IP address to bind to",
1649 suggestions: [{0, 0, 0, 0}]
1650 },
1651 %{
1652 key: :port,
1653 type: :integer,
1654 description: "Port to bind to",
1655 suggestions: [9999]
1656 },
1657 %{
1658 key: :dstport,
1659 type: :integer,
1660 description: "Port advertised in URLs (optional, defaults to port)",
1661 suggestions: [9999]
1662 }
1663 ]
1664 },
1665 %{
1666 group: :pleroma,
1667 key: :activitypub,
1668 label: "ActivityPub",
1669 type: :group,
1670 description: "ActivityPub-related settings",
1671 children: [
1672 %{
1673 key: :unfollow_blocked,
1674 type: :boolean,
1675 description: "Whether blocks result in people getting unfollowed"
1676 },
1677 %{
1678 key: :outgoing_blocks,
1679 type: :boolean,
1680 description: "Whether to federate blocks to other instances"
1681 },
1682 %{
1683 key: :sign_object_fetches,
1684 type: :boolean,
1685 description: "Sign object fetches with HTTP signatures"
1686 },
1687 %{
1688 key: :note_replies_output_limit,
1689 type: :integer,
1690 description:
1691 "The number of Note replies' URIs to be included with outgoing federation (`5` to match Mastodon hardcoded value, `0` to disable the output)"
1692 },
1693 %{
1694 key: :follow_handshake_timeout,
1695 type: :integer,
1696 description: "Following handshake timeout",
1697 suggestions: [500]
1698 }
1699 ]
1700 },
1701 %{
1702 group: :pleroma,
1703 key: :http_security,
1704 label: "HTTP security",
1705 type: :group,
1706 description: "HTTP security settings",
1707 children: [
1708 %{
1709 key: :enabled,
1710 type: :boolean,
1711 description: "Whether the managed content security policy is enabled"
1712 },
1713 %{
1714 key: :sts,
1715 label: "STS",
1716 type: :boolean,
1717 description: "Whether to additionally send a Strict-Transport-Security header"
1718 },
1719 %{
1720 key: :sts_max_age,
1721 label: "STS max age",
1722 type: :integer,
1723 description: "The maximum age for the Strict-Transport-Security header if sent",
1724 suggestions: [31_536_000]
1725 },
1726 %{
1727 key: :ct_max_age,
1728 label: "CT max age",
1729 type: :integer,
1730 description: "The maximum age for the Expect-CT header if sent",
1731 suggestions: [2_592_000]
1732 },
1733 %{
1734 key: :referrer_policy,
1735 type: :string,
1736 description: "The referrer policy to use, either \"same-origin\" or \"no-referrer\"",
1737 suggestions: ["same-origin", "no-referrer"]
1738 },
1739 %{
1740 key: :report_uri,
1741 label: "Report URI",
1742 type: :string,
1743 description: "Adds the specified URL to report-uri and report-to group in CSP header",
1744 suggestions: ["https://example.com/report-uri"]
1745 }
1746 ]
1747 },
1748 %{
1749 group: :web_push_encryption,
1750 key: :vapid_details,
1751 label: "Vapid Details",
1752 type: :group,
1753 description:
1754 "Web Push Notifications configuration. You can use the mix task mix web_push.gen.keypair to generate it.",
1755 children: [
1756 %{
1757 key: :subject,
1758 type: :string,
1759 description:
1760 "A mailto link for the administrative contact." <>
1761 " It's best if this email is not a personal email address, but rather a group email to the instance moderation team.",
1762 suggestions: ["mailto:moderators@pleroma.com"]
1763 },
1764 %{
1765 key: :public_key,
1766 type: :string,
1767 description: "VAPID public key",
1768 suggestions: ["Public key"]
1769 },
1770 %{
1771 key: :private_key,
1772 type: :string,
1773 description: "VAPID private key",
1774 suggestions: ["Private key"]
1775 }
1776 ]
1777 },
1778 %{
1779 group: :pleroma,
1780 key: Pleroma.Captcha,
1781 type: :group,
1782 description: "Captcha-related settings",
1783 children: [
1784 %{
1785 key: :enabled,
1786 type: :boolean,
1787 description: "Whether the captcha should be shown on registration"
1788 },
1789 %{
1790 key: :method,
1791 type: :module,
1792 description: "The method/service to use for captcha",
1793 suggestions: [Pleroma.Captcha.Kocaptcha, Pleroma.Captcha.Native]
1794 },
1795 %{
1796 key: :seconds_valid,
1797 type: :integer,
1798 description: "The time in seconds for which the captcha is valid",
1799 suggestions: [60]
1800 }
1801 ]
1802 },
1803 %{
1804 group: :pleroma,
1805 key: Pleroma.Captcha.Kocaptcha,
1806 type: :group,
1807 description:
1808 "Kocaptcha is a very simple captcha service with a single API endpoint, the source code is" <>
1809 " here: https://github.com/koto-bank/kocaptcha. The default endpoint (https://captcha.kotobank.ch) is hosted by the developer.",
1810 children: [
1811 %{
1812 key: :endpoint,
1813 type: :string,
1814 description: "The kocaptcha endpoint to use",
1815 suggestions: ["https://captcha.kotobank.ch"]
1816 }
1817 ]
1818 },
1819 %{
1820 group: :pleroma,
1821 label: "Pleroma Admin Token",
1822 type: :group,
1823 description:
1824 "Allows setting a token that can be used to authenticate requests with admin privileges without a normal user account token. Append the `admin_token` parameter to requests to utilize it. (Please reconsider using HTTP Basic Auth or OAuth-based authentication if possible)",
1825 children: [
1826 %{
1827 key: :admin_token,
1828 type: :string,
1829 description: "Admin token",
1830 suggestions: [
1831 "Please use a high entropy string or UUID"
1832 ]
1833 }
1834 ]
1835 },
1836 %{
1837 group: :pleroma,
1838 key: Oban,
1839 type: :group,
1840 description:
1841 "[Oban](https://github.com/sorentwo/oban) asynchronous job processor configuration.",
1842 children: [
1843 %{
1844 key: :log,
1845 type: {:dropdown, :atom},
1846 description: "Logs verbose mode",
1847 suggestions: [false, :error, :warn, :info, :debug]
1848 },
1849 %{
1850 key: :queues,
1851 type: {:keyword, :integer},
1852 description:
1853 "Background jobs queues (keys: queues, values: max numbers of concurrent jobs)",
1854 suggestions: [
1855 activity_expiration: 10,
1856 attachments_cleanup: 5,
1857 background: 5,
1858 federator_incoming: 50,
1859 federator_outgoing: 50,
1860 mailer: 10,
1861 scheduled_activities: 10,
1862 transmogrifier: 20,
1863 web_push: 50
1864 ],
1865 children: [
1866 %{
1867 key: :activity_expiration,
1868 type: :integer,
1869 description: "Activity expiration queue",
1870 suggestions: [10]
1871 },
1872 %{
1873 key: :backup,
1874 type: :integer,
1875 description: "Backup queue",
1876 suggestions: [1]
1877 },
1878 %{
1879 key: :attachments_cleanup,
1880 type: :integer,
1881 description: "Attachment deletion queue",
1882 suggestions: [5]
1883 },
1884 %{
1885 key: :background,
1886 type: :integer,
1887 description: "Background queue",
1888 suggestions: [5]
1889 },
1890 %{
1891 key: :federator_incoming,
1892 type: :integer,
1893 description: "Incoming federation queue",
1894 suggestions: [50]
1895 },
1896 %{
1897 key: :federator_outgoing,
1898 type: :integer,
1899 description: "Outgoing federation queue",
1900 suggestions: [50]
1901 },
1902 %{
1903 key: :mailer,
1904 type: :integer,
1905 description: "Email sender queue, see Pleroma.Emails.Mailer",
1906 suggestions: [10]
1907 },
1908 %{
1909 key: :scheduled_activities,
1910 type: :integer,
1911 description: "Scheduled activities queue, see Pleroma.ScheduledActivities",
1912 suggestions: [10]
1913 },
1914 %{
1915 key: :transmogrifier,
1916 type: :integer,
1917 description: "Transmogrifier queue",
1918 suggestions: [20]
1919 },
1920 %{
1921 key: :web_push,
1922 type: :integer,
1923 description: "Web push notifications queue",
1924 suggestions: [50]
1925 }
1926 ]
1927 },
1928 %{
1929 key: :crontab,
1930 type: {:list, :tuple},
1931 description: "Settings for cron background jobs",
1932 suggestions: [
1933 {"0 0 * * 0", Pleroma.Workers.Cron.DigestEmailsWorker},
1934 {"0 0 * * *", Pleroma.Workers.Cron.NewUsersDigestWorker}
1935 ]
1936 }
1937 ]
1938 },
1939 %{
1940 group: :pleroma,
1941 key: :workers,
1942 type: :group,
1943 description: "Includes custom worker options not interpretable directly by `Oban`",
1944 children: [
1945 %{
1946 key: :retries,
1947 type: {:keyword, :integer},
1948 description: "Max retry attempts for failed jobs, per `Oban` queue",
1949 suggestions: [
1950 federator_incoming: 5,
1951 federator_outgoing: 5
1952 ]
1953 }
1954 ]
1955 },
1956 %{
1957 group: :pleroma,
1958 key: Pleroma.Web.Metadata,
1959 type: :group,
1960 description: "Metadata-related settings",
1961 children: [
1962 %{
1963 key: :providers,
1964 type: {:list, :module},
1965 description: "List of metadata providers to enable",
1966 suggestions: [
1967 Pleroma.Web.Metadata.Providers.OpenGraph,
1968 Pleroma.Web.Metadata.Providers.TwitterCard,
1969 Pleroma.Web.Metadata.Providers.RelMe,
1970 Pleroma.Web.Metadata.Providers.Feed
1971 ]
1972 },
1973 %{
1974 key: :unfurl_nsfw,
1975 label: "Unfurl NSFW",
1976 type: :boolean,
1977 description: "When enabled NSFW attachments will be shown in previews"
1978 }
1979 ]
1980 },
1981 %{
1982 group: :pleroma,
1983 key: :rich_media,
1984 type: :group,
1985 description:
1986 "If enabled the instance will parse metadata from attached links to generate link previews",
1987 children: [
1988 %{
1989 key: :enabled,
1990 type: :boolean,
1991 description: "Enables RichMedia parsing of URLs"
1992 },
1993 %{
1994 key: :ignore_hosts,
1995 type: {:list, :string},
1996 description: "List of hosts which will be ignored by the metadata parser",
1997 suggestions: ["accounts.google.com", "xss.website"]
1998 },
1999 %{
2000 key: :ignore_tld,
2001 label: "Ignore TLD",
2002 type: {:list, :string},
2003 description: "List TLDs (top-level domains) which will ignore for parse metadata",
2004 suggestions: ["local", "localdomain", "lan"]
2005 },
2006 %{
2007 key: :parsers,
2008 type: {:list, :module},
2009 description:
2010 "List of Rich Media parsers. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parsers.` part), but on adding custom module you need to use full name.",
2011 suggestions: [
2012 Pleroma.Web.RichMedia.Parsers.OEmbed,
2013 Pleroma.Web.RichMedia.Parsers.TwitterCard
2014 ]
2015 },
2016 %{
2017 key: :ttl_setters,
2018 label: "TTL setters",
2019 type: {:list, :module},
2020 description:
2021 "List of rich media TTL setters. Module names are shortened (removed leading `Pleroma.Web.RichMedia.Parser.` part), but on adding custom module you need to use full name.",
2022 suggestions: [
2023 Pleroma.Web.RichMedia.Parser.TTL.AwsSignedUrl
2024 ]
2025 },
2026 %{
2027 key: :failure_backoff,
2028 type: :integer,
2029 description:
2030 "Amount of milliseconds after request failure, during which the request will not be retried.",
2031 suggestions: [60_000]
2032 }
2033 ]
2034 },
2035 %{
2036 group: :pleroma,
2037 key: Pleroma.Formatter,
2038 label: "Linkify",
2039 type: :group,
2040 description:
2041 "Configuration for Pleroma's link formatter which parses mentions, hashtags, and URLs.",
2042 children: [
2043 %{
2044 key: :class,
2045 type: [:string, :boolean],
2046 description: "Specify the class to be added to the generated link. Disable to clear.",
2047 suggestions: ["auto-linker", false]
2048 },
2049 %{
2050 key: :rel,
2051 type: [:string, :boolean],
2052 description: "Override the rel attribute. Disable to clear.",
2053 suggestions: ["ugc", "noopener noreferrer", false]
2054 },
2055 %{
2056 key: :new_window,
2057 type: :boolean,
2058 description: "Link URLs will open in a new window/tab."
2059 },
2060 %{
2061 key: :truncate,
2062 type: [:integer, :boolean],
2063 description:
2064 "Set to a number to truncate URLs longer than the number. Truncated URLs will end in `...`",
2065 suggestions: [15, false]
2066 },
2067 %{
2068 key: :strip_prefix,
2069 type: :boolean,
2070 description: "Strip the scheme prefix."
2071 },
2072 %{
2073 key: :extra,
2074 type: :boolean,
2075 description: "Link URLs with rarely used schemes (magnet, ipfs, irc, etc.)"
2076 },
2077 %{
2078 key: :validate_tld,
2079 type: [:atom, :boolean],
2080 description:
2081 "Set to false to disable TLD validation for URLs/emails. Can be set to :no_scheme to validate TLDs only for URLs without a scheme (e.g `example.com` will be validated, but `http://example.loki` won't)",
2082 suggestions: [:no_scheme, true]
2083 }
2084 ]
2085 },
2086 %{
2087 group: :pleroma,
2088 key: Pleroma.ScheduledActivity,
2089 type: :group,
2090 description: "Scheduled activities settings",
2091 children: [
2092 %{
2093 key: :daily_user_limit,
2094 type: :integer,
2095 description:
2096 "The number of scheduled activities a user is allowed to create in a single day. Default: 25.",
2097 suggestions: [25]
2098 },
2099 %{
2100 key: :total_user_limit,
2101 type: :integer,
2102 description:
2103 "The number of scheduled activities a user is allowed to create in total. Default: 300.",
2104 suggestions: [300]
2105 },
2106 %{
2107 key: :enabled,
2108 type: :boolean,
2109 description: "Whether scheduled activities are sent to the job queue to be executed"
2110 }
2111 ]
2112 },
2113 %{
2114 group: :pleroma,
2115 key: Pleroma.Workers.PurgeExpiredActivity,
2116 type: :group,
2117 description: "Expired activities settings",
2118 children: [
2119 %{
2120 key: :enabled,
2121 type: :boolean,
2122 description: "Enables expired activities addition & deletion"
2123 },
2124 %{
2125 key: :min_lifetime,
2126 type: :integer,
2127 description: "Minimum lifetime for ephemeral activity (in seconds)",
2128 suggestions: [600]
2129 }
2130 ]
2131 },
2132 %{
2133 group: :pleroma,
2134 label: "Pleroma Authenticator",
2135 type: :group,
2136 description: "Authenticator",
2137 children: [
2138 %{
2139 key: Pleroma.Web.Auth.Authenticator,
2140 type: :module,
2141 suggestions: [Pleroma.Web.Auth.PleromaAuthenticator, Pleroma.Web.Auth.LDAPAuthenticator]
2142 }
2143 ]
2144 },
2145 %{
2146 group: :pleroma,
2147 key: :ldap,
2148 label: "LDAP",
2149 type: :group,
2150 description:
2151 "Use LDAP for user authentication. When a user logs in to the Pleroma instance, the name and password" <>
2152 " will be verified by trying to authenticate (bind) to a LDAP server." <>
2153 " If a user exists in the LDAP directory but there is no account with the same name yet on the" <>
2154 " Pleroma instance then a new Pleroma account will be created with the same name as the LDAP user name.",
2155 children: [
2156 %{
2157 key: :enabled,
2158 type: :boolean,
2159 description: "Enables LDAP authentication"
2160 },
2161 %{
2162 key: :host,
2163 type: :string,
2164 description: "LDAP server hostname",
2165 suggestions: ["localhosts"]
2166 },
2167 %{
2168 key: :port,
2169 type: :integer,
2170 description: "LDAP port, e.g. 389 or 636",
2171 suggestions: [389, 636]
2172 },
2173 %{
2174 key: :ssl,
2175 label: "SSL",
2176 type: :boolean,
2177 description: "Enable to use SSL, usually implies the port 636"
2178 },
2179 %{
2180 key: :sslopts,
2181 label: "SSL options",
2182 type: :keyword,
2183 description: "Additional SSL options",
2184 suggestions: [cacertfile: "path/to/file/with/PEM/cacerts", verify: :verify_peer],
2185 children: [
2186 %{
2187 key: :cacertfile,
2188 type: :string,
2189 description: "Path to file with PEM encoded cacerts",
2190 suggestions: ["path/to/file/with/PEM/cacerts"]
2191 },
2192 %{
2193 key: :verify,
2194 type: :atom,
2195 description: "Type of cert verification",
2196 suggestions: [:verify_peer]
2197 }
2198 ]
2199 },
2200 %{
2201 key: :tls,
2202 label: "TLS",
2203 type: :boolean,
2204 description: "Enable to use STARTTLS, usually implies the port 389"
2205 },
2206 %{
2207 key: :tlsopts,
2208 label: "TLS options",
2209 type: :keyword,
2210 description: "Additional TLS options",
2211 suggestions: [cacertfile: "path/to/file/with/PEM/cacerts", verify: :verify_peer],
2212 children: [
2213 %{
2214 key: :cacertfile,
2215 type: :string,
2216 description: "Path to file with PEM encoded cacerts",
2217 suggestions: ["path/to/file/with/PEM/cacerts"]
2218 },
2219 %{
2220 key: :verify,
2221 type: :atom,
2222 description: "Type of cert verification",
2223 suggestions: [:verify_peer]
2224 }
2225 ]
2226 },
2227 %{
2228 key: :base,
2229 type: :string,
2230 description: "LDAP base, e.g. \"dc=example,dc=com\"",
2231 suggestions: ["dc=example,dc=com"]
2232 },
2233 %{
2234 key: :uid,
2235 label: "UID",
2236 type: :string,
2237 description:
2238 "LDAP attribute name to authenticate the user, e.g. when \"cn\", the filter will be \"cn=username,base\"",
2239 suggestions: ["cn"]
2240 }
2241 ]
2242 },
2243 %{
2244 group: :pleroma,
2245 key: :auth,
2246 type: :group,
2247 description: "Authentication / authorization settings",
2248 children: [
2249 %{
2250 key: :enforce_oauth_admin_scope_usage,
2251 label: "Enforce OAuth admin scope usage",
2252 type: :boolean,
2253 description:
2254 "OAuth admin scope requirement toggle. " <>
2255 "If enabled, admin actions explicitly demand admin OAuth scope(s) presence in OAuth token " <>
2256 "(client app must support admin scopes). If disabled and token doesn't have admin scope(s), " <>
2257 "`is_admin` user flag grants access to admin-specific actions."
2258 },
2259 %{
2260 key: :auth_template,
2261 type: :string,
2262 description:
2263 "Authentication form template. By default it's `show.html` which corresponds to `lib/pleroma/web/templates/o_auth/o_auth/show.html.ee`.",
2264 suggestions: ["show.html"]
2265 },
2266 %{
2267 key: :oauth_consumer_template,
2268 label: "OAuth consumer template",
2269 type: :string,
2270 description:
2271 "OAuth consumer mode authentication form template. By default it's `consumer.html` which corresponds to" <>
2272 " `lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex`.",
2273 suggestions: ["consumer.html"]
2274 },
2275 %{
2276 key: :oauth_consumer_strategies,
2277 label: "OAuth consumer strategies",
2278 type: {:list, :string},
2279 description:
2280 "The list of enabled OAuth consumer strategies. By default it's set by OAUTH_CONSUMER_STRATEGIES environment variable." <>
2281 " Each entry in this space-delimited string should be of format \"strategy\" or \"strategy:dependency\"" <>
2282 " (e.g. twitter or keycloak:ueberauth_keycloak_strategy in case dependency is named differently than ueberauth_<strategy>).",
2283 suggestions: ["twitter", "keycloak:ueberauth_keycloak_strategy"]
2284 }
2285 ]
2286 },
2287 %{
2288 group: :pleroma,
2289 key: :email_notifications,
2290 type: :group,
2291 description: "Email notifications settings",
2292 children: [
2293 %{
2294 key: :digest,
2295 type: :map,
2296 description:
2297 "emails of \"what you've missed\" for users who have been inactive for a while",
2298 suggestions: [
2299 %{
2300 active: false,
2301 schedule: "0 0 * * 0",
2302 interval: 7,
2303 inactivity_threshold: 7
2304 }
2305 ],
2306 children: [
2307 %{
2308 key: :active,
2309 label: "Enabled",
2310 type: :boolean,
2311 description: "Globally enable or disable digest emails"
2312 },
2313 %{
2314 key: :schedule,
2315 type: :string,
2316 description:
2317 "When to send digest email, in crontab format. \"0 0 0\" is the default, meaning \"once a week at midnight on Sunday morning\".",
2318 suggestions: ["0 0 * * 0"]
2319 },
2320 %{
2321 key: :interval,
2322 type: :integer,
2323 description: "Minimum interval between digest emails to one user",
2324 suggestions: [7]
2325 },
2326 %{
2327 key: :inactivity_threshold,
2328 type: :integer,
2329 description: "Minimum user inactivity threshold",
2330 suggestions: [7]
2331 }
2332 ]
2333 }
2334 ]
2335 },
2336 %{
2337 group: :pleroma,
2338 key: Pleroma.Emails.UserEmail,
2339 type: :group,
2340 description: "Email template settings",
2341 children: [
2342 %{
2343 key: :logo,
2344 type: {:string, :image},
2345 description: "A path to a custom logo. Set it to `nil` to use the default Pleroma logo.",
2346 suggestions: ["some/path/logo.png"]
2347 },
2348 %{
2349 key: :styling,
2350 type: :map,
2351 description: "A map with color settings for email templates.",
2352 suggestions: [
2353 %{
2354 link_color: "#d8a070",
2355 background_color: "#2C3645",
2356 content_background_color: "#1B2635",
2357 header_color: "#d8a070",
2358 text_color: "#b9b9ba",
2359 text_muted_color: "#b9b9ba"
2360 }
2361 ],
2362 children: [
2363 %{
2364 key: :link_color,
2365 type: :string,
2366 suggestions: ["#d8a070"]
2367 },
2368 %{
2369 key: :background_color,
2370 type: :string,
2371 suggestions: ["#2C3645"]
2372 },
2373 %{
2374 key: :content_background_color,
2375 type: :string,
2376 suggestions: ["#1B2635"]
2377 },
2378 %{
2379 key: :header_color,
2380 type: :string,
2381 suggestions: ["#d8a070"]
2382 },
2383 %{
2384 key: :text_color,
2385 type: :string,
2386 suggestions: ["#b9b9ba"]
2387 },
2388 %{
2389 key: :text_muted_color,
2390 type: :string,
2391 suggestions: ["#b9b9ba"]
2392 }
2393 ]
2394 }
2395 ]
2396 },
2397 %{
2398 group: :pleroma,
2399 key: Pleroma.Emails.NewUsersDigestEmail,
2400 type: :group,
2401 description: "New users admin email digest",
2402 children: [
2403 %{
2404 key: :enabled,
2405 type: :boolean,
2406 description: "Enables new users admin digest email when `true`"
2407 }
2408 ]
2409 },
2410 %{
2411 group: :pleroma,
2412 key: :oauth2,
2413 label: "OAuth2",
2414 type: :group,
2415 description: "Configure OAuth 2 provider capabilities",
2416 children: [
2417 %{
2418 key: :token_expires_in,
2419 type: :integer,
2420 description: "The lifetime in seconds of the access token",
2421 suggestions: [2_592_000]
2422 },
2423 %{
2424 key: :issue_new_refresh_token,
2425 type: :boolean,
2426 description:
2427 "Keeps old refresh token or generate new refresh token when to obtain an access token"
2428 },
2429 %{
2430 key: :clean_expired_tokens,
2431 type: :boolean,
2432 description: "Enable a background job to clean expired OAuth tokens. Default: disabled."
2433 }
2434 ]
2435 },
2436 %{
2437 group: :pleroma,
2438 key: :emoji,
2439 type: :group,
2440 children: [
2441 %{
2442 key: :shortcode_globs,
2443 type: {:list, :string},
2444 description: "Location of custom emoji files. * can be used as a wildcard.",
2445 suggestions: ["/emoji/custom/**/*.png"]
2446 },
2447 %{
2448 key: :pack_extensions,
2449 type: {:list, :string},
2450 description:
2451 "A list of file extensions for emojis, when no emoji.txt for a pack is present",
2452 suggestions: [".png", ".gif"]
2453 },
2454 %{
2455 key: :groups,
2456 type: {:keyword, {:list, :string}},
2457 description:
2458 "Emojis are ordered in groups (tags). This is an array of key-value pairs where the key is the group name" <>
2459 " and the value is the location or array of locations. * can be used as a wildcard.",
2460 suggestions: [
2461 Custom: ["/emoji/*.png", "/emoji/**/*.png"]
2462 ]
2463 },
2464 %{
2465 key: :default_manifest,
2466 type: :string,
2467 description:
2468 "Location of the JSON-manifest. This manifest contains information about the emoji-packs you can download." <>
2469 " Currently only one manifest can be added (no arrays).",
2470 suggestions: ["https://git.pleroma.social/pleroma/emoji-index/raw/master/index.json"]
2471 },
2472 %{
2473 key: :shared_pack_cache_seconds_per_file,
2474 label: "Shared pack cache s/file",
2475 type: :integer,
2476 descpiption:
2477 "When an emoji pack is shared, the archive is created and cached in memory" <>
2478 " for this amount of seconds multiplied by the number of files.",
2479 suggestions: [60]
2480 }
2481 ]
2482 },
2483 %{
2484 group: :pleroma,
2485 key: :rate_limit,
2486 type: :group,
2487 description:
2488 "Rate limit settings. This is an advanced feature enabled only for :authentication by default.",
2489 children: [
2490 %{
2491 key: :search,
2492 type: [:tuple, {:list, :tuple}],
2493 description: "For the search requests (account & status search etc.)",
2494 suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2495 },
2496 %{
2497 key: :timeline,
2498 type: [:tuple, {:list, :tuple}],
2499 description: "For requests to timelines (each timeline has it's own limiter)",
2500 suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2501 },
2502 %{
2503 key: :app_account_creation,
2504 type: [:tuple, {:list, :tuple}],
2505 description: "For registering user accounts from the same IP address",
2506 suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2507 },
2508 %{
2509 key: :relations_actions,
2510 type: [:tuple, {:list, :tuple}],
2511 description: "For actions on relationships with all users (follow, unfollow)",
2512 suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2513 },
2514 %{
2515 key: :relation_id_action,
2516 label: "Relation ID action",
2517 type: [:tuple, {:list, :tuple}],
2518 description: "For actions on relation with a specific user (follow, unfollow)",
2519 suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2520 },
2521 %{
2522 key: :statuses_actions,
2523 type: [:tuple, {:list, :tuple}],
2524 description:
2525 "For create / delete / fav / unfav / reblog / unreblog actions on any statuses",
2526 suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2527 },
2528 %{
2529 key: :status_id_action,
2530 label: "Status ID action",
2531 type: [:tuple, {:list, :tuple}],
2532 description:
2533 "For fav / unfav or reblog / unreblog actions on the same status by the same user",
2534 suggestions: [{1000, 10}, [{10_000, 10}, {10_000, 50}]]
2535 },
2536 %{
2537 key: :authentication,
2538 type: [:tuple, {:list, :tuple}],
2539 description: "For authentication create / password check / user existence check requests",
2540 suggestions: [{60_000, 15}]
2541 }
2542 ]
2543 },
2544 %{
2545 group: :esshd,
2546 label: "ESSHD",
2547 type: :group,
2548 description:
2549 "Before enabling this you must add :esshd to mix.exs as one of the extra_applications " <>
2550 "and generate host keys in your priv dir with ssh-keygen -m PEM -N \"\" -b 2048 -t rsa -f ssh_host_rsa_key",
2551 children: [
2552 %{
2553 key: :enabled,
2554 type: :boolean,
2555 description: "Enables SSH"
2556 },
2557 %{
2558 key: :priv_dir,
2559 type: :string,
2560 description: "Dir with SSH keys",
2561 suggestions: ["/some/path/ssh_keys"]
2562 },
2563 %{
2564 key: :handler,
2565 type: :string,
2566 description: "Handler module",
2567 suggestions: ["Pleroma.BBS.Handler"]
2568 },
2569 %{
2570 key: :port,
2571 type: :integer,
2572 description: "Port to connect",
2573 suggestions: [10_022]
2574 },
2575 %{
2576 key: :password_authenticator,
2577 type: :string,
2578 description: "Authenticator module",
2579 suggestions: ["Pleroma.BBS.Authenticator"]
2580 }
2581 ]
2582 },
2583 %{
2584 group: :mime,
2585 label: "Mime Types",
2586 type: :group,
2587 description: "Mime Types settings",
2588 children: [
2589 %{
2590 key: :types,
2591 type: :map,
2592 suggestions: [
2593 %{
2594 "application/xml" => ["xml"],
2595 "application/xrd+xml" => ["xrd+xml"],
2596 "application/jrd+json" => ["jrd+json"],
2597 "application/activity+json" => ["activity+json"],
2598 "application/ld+json" => ["activity+json"]
2599 }
2600 ],
2601 children: [
2602 %{
2603 key: "application/xml",
2604 type: {:list, :string},
2605 suggestions: ["xml"]
2606 },
2607 %{
2608 key: "application/xrd+xml",
2609 type: {:list, :string},
2610 suggestions: ["xrd+xml"]
2611 },
2612 %{
2613 key: "application/jrd+json",
2614 type: {:list, :string},
2615 suggestions: ["jrd+json"]
2616 },
2617 %{
2618 key: "application/activity+json",
2619 type: {:list, :string},
2620 suggestions: ["activity+json"]
2621 },
2622 %{
2623 key: "application/ld+json",
2624 type: {:list, :string},
2625 suggestions: ["activity+json"]
2626 }
2627 ]
2628 }
2629 ]
2630 },
2631 %{
2632 group: :pleroma,
2633 key: :chat,
2634 type: :group,
2635 description: "Pleroma chat settings",
2636 children: [
2637 %{
2638 key: :enabled,
2639 type: :boolean
2640 }
2641 ]
2642 },
2643 %{
2644 group: :pleroma,
2645 key: :http,
2646 label: "HTTP",
2647 type: :group,
2648 description: "HTTP settings",
2649 children: [
2650 %{
2651 key: :proxy_url,
2652 label: "Proxy URL",
2653 type: [:string, :tuple],
2654 description: "Proxy URL",
2655 suggestions: ["localhost:9020", {:socks5, :localhost, 3090}]
2656 },
2657 %{
2658 key: :send_user_agent,
2659 type: :boolean
2660 },
2661 %{
2662 key: :user_agent,
2663 type: [:string, :atom],
2664 description:
2665 "What user agent to use. Must be a string or an atom `:default`. Default value is `:default`.",
2666 suggestions: ["Pleroma", :default]
2667 },
2668 %{
2669 key: :adapter,
2670 type: :keyword,
2671 description: "Adapter specific options",
2672 suggestions: [],
2673 children: [
2674 %{
2675 key: :ssl_options,
2676 type: :keyword,
2677 label: "SSL Options",
2678 description: "SSL options for HTTP adapter",
2679 children: [
2680 %{
2681 key: :versions,
2682 type: {:list, :atom},
2683 description: "List of TLS version to use",
2684 suggestions: [:tlsv1, ":tlsv1.1", ":tlsv1.2"]
2685 }
2686 ]
2687 }
2688 ]
2689 }
2690 ]
2691 },
2692 %{
2693 group: :pleroma,
2694 key: :markup,
2695 label: "Markup Settings",
2696 type: :group,
2697 children: [
2698 %{
2699 key: :allow_inline_images,
2700 type: :boolean
2701 },
2702 %{
2703 key: :allow_headings,
2704 type: :boolean
2705 },
2706 %{
2707 key: :allow_tables,
2708 type: :boolean
2709 },
2710 %{
2711 key: :allow_fonts,
2712 type: :boolean
2713 },
2714 %{
2715 key: :scrub_policy,
2716 type: {:list, :module},
2717 description:
2718 "Module names are shortened (removed leading `Pleroma.HTML.` part), but on adding custom module you need to use full name.",
2719 suggestions: [Pleroma.HTML.Transform.MediaProxy, Pleroma.HTML.Scrubber.Default]
2720 }
2721 ]
2722 },
2723 %{
2724 group: :pleroma,
2725 key: :user,
2726 type: :group,
2727 children: [
2728 %{
2729 key: :deny_follow_blocked,
2730 type: :boolean
2731 }
2732 ]
2733 },
2734 %{
2735 group: :pleroma,
2736 key: Pleroma.User,
2737 type: :group,
2738 children: [
2739 %{
2740 key: :restricted_nicknames,
2741 type: {:list, :string},
2742 description: "List of nicknames users may not register with.",
2743 suggestions: [
2744 ".well-known",
2745 "~",
2746 "about",
2747 "activities",
2748 "api",
2749 "auth",
2750 "check_password",
2751 "dev",
2752 "friend-requests",
2753 "inbox",
2754 "internal",
2755 "main",
2756 "media",
2757 "nodeinfo",
2758 "notice",
2759 "oauth",
2760 "objects",
2761 "ostatus_subscribe",
2762 "pleroma",
2763 "proxy",
2764 "push",
2765 "registration",
2766 "relay",
2767 "settings",
2768 "status",
2769 "tag",
2770 "user-search",
2771 "user_exists",
2772 "users",
2773 "web"
2774 ]
2775 },
2776 %{
2777 key: :email_blacklist,
2778 type: {:list, :string},
2779 description: "List of email domains users may not register with.",
2780 suggestions: ["mailinator.com", "maildrop.cc"]
2781 }
2782 ]
2783 },
2784 %{
2785 group: :cors_plug,
2786 label: "CORS plug config",
2787 type: :group,
2788 children: [
2789 %{
2790 key: :max_age,
2791 type: :integer,
2792 suggestions: [86_400]
2793 },
2794 %{
2795 key: :methods,
2796 type: {:list, :string},
2797 suggestions: ["POST", "PUT", "DELETE", "GET", "PATCH", "OPTIONS"]
2798 },
2799 %{
2800 key: :expose,
2801 type: {:list, :string},
2802 suggestions: [
2803 "Link",
2804 "X-RateLimit-Reset",
2805 "X-RateLimit-Limit",
2806 "X-RateLimit-Remaining",
2807 "X-Request-Id",
2808 "Idempotency-Key"
2809 ]
2810 },
2811 %{
2812 key: :credentials,
2813 type: :boolean
2814 },
2815 %{
2816 key: :headers,
2817 type: {:list, :string},
2818 suggestions: ["Authorization", "Content-Type", "Idempotency-Key"]
2819 }
2820 ]
2821 },
2822 %{
2823 group: :pleroma,
2824 key: Pleroma.Web.Plugs.RemoteIp,
2825 type: :group,
2826 description: """
2827 `Pleroma.Web.Plugs.RemoteIp` is a shim to call [`RemoteIp`](https://git.pleroma.social/pleroma/remote_ip) but with runtime configuration.
2828 **If your instance is not behind at least one reverse proxy, you should not enable this plug.**
2829 """,
2830 children: [
2831 %{
2832 key: :enabled,
2833 type: :boolean,
2834 description: "Enable/disable the plug. Default: disabled."
2835 },
2836 %{
2837 key: :headers,
2838 type: {:list, :string},
2839 description: """
2840 A list of strings naming the HTTP headers to use when deriving the true client IP. Default: `["x-forwarded-for"]`.
2841 """
2842 },
2843 %{
2844 key: :proxies,
2845 type: {:list, :string},
2846 description:
2847 "A list of upstream proxy IP subnets in CIDR notation from which we will parse the content of `headers`. Defaults to `[]`. IPv4 entries without a bitmask will be assumed to be /32 and IPv6 /128."
2848 },
2849 %{
2850 key: :reserved,
2851 type: {:list, :string},
2852 description: """
2853 A list of reserved IP subnets in CIDR notation which should be ignored if found in `headers`. Defaults to `["127.0.0.0/8", "::1/128", "fc00::/7", "10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]`
2854 """
2855 }
2856 ]
2857 },
2858 %{
2859 group: :pleroma,
2860 key: :web_cache_ttl,
2861 label: "Web cache TTL",
2862 type: :group,
2863 description:
2864 "The expiration time for the web responses cache. Values should be in milliseconds or `nil` to disable expiration.",
2865 children: [
2866 %{
2867 key: :activity_pub,
2868 type: :integer,
2869 description:
2870 "Activity pub routes (except question activities). Default: `nil` (no expiration).",
2871 suggestions: [nil]
2872 },
2873 %{
2874 key: :activity_pub_question,
2875 type: :integer,
2876 description: "Activity pub routes (question activities). Default: `30_000` (30 seconds).",
2877 suggestions: [30_000]
2878 }
2879 ]
2880 },
2881 %{
2882 group: :pleroma,
2883 key: :static_fe,
2884 label: "Static FE",
2885 type: :group,
2886 description:
2887 "Render profiles and posts using server-generated HTML that is viewable without using JavaScript",
2888 children: [
2889 %{
2890 key: :enabled,
2891 type: :boolean,
2892 description: "Enables the rendering of static HTML. Default: disabled."
2893 }
2894 ]
2895 },
2896 %{
2897 group: :pleroma,
2898 key: :feed,
2899 type: :group,
2900 description: "Configure feed rendering",
2901 children: [
2902 %{
2903 key: :post_title,
2904 type: :map,
2905 description: "Configure title rendering",
2906 children: [
2907 %{
2908 key: :max_length,
2909 type: :integer,
2910 description: "Maximum number of characters before truncating title",
2911 suggestions: [100]
2912 },
2913 %{
2914 key: :omission,
2915 type: :string,
2916 description: "Replacement which will be used after truncating string",
2917 suggestions: ["..."]
2918 }
2919 ]
2920 }
2921 ]
2922 },
2923 %{
2924 group: :pleroma,
2925 key: :modules,
2926 type: :group,
2927 description: "Custom Runtime Modules",
2928 children: [
2929 %{
2930 key: :runtime_dir,
2931 type: :string,
2932 description: "A path to custom Elixir modules (such as MRF policies)."
2933 }
2934 ]
2935 },
2936 %{
2937 group: :pleroma,
2938 key: :streamer,
2939 type: :group,
2940 description: "Settings for notifications streamer",
2941 children: [
2942 %{
2943 key: :workers,
2944 type: :integer,
2945 description: "Number of workers to send notifications",
2946 suggestions: [3]
2947 },
2948 %{
2949 key: :overflow_workers,
2950 type: :integer,
2951 description: "Maximum number of workers created if pool is empty",
2952 suggestions: [2]
2953 }
2954 ]
2955 },
2956 %{
2957 group: :pleroma,
2958 key: :connections_pool,
2959 type: :group,
2960 description: "Advanced settings for `Gun` connections pool",
2961 children: [
2962 %{
2963 key: :connection_acquisition_wait,
2964 type: :integer,
2965 description:
2966 "Timeout to acquire a connection from pool. The total max time is this value multiplied by the number of retries. Default: 250ms.",
2967 suggestions: [250]
2968 },
2969 %{
2970 key: :connection_acquisition_retries,
2971 type: :integer,
2972 description:
2973 "Number of attempts to acquire the connection from the pool if it is overloaded. Default: 5",
2974 suggestions: [5]
2975 },
2976 %{
2977 key: :max_connections,
2978 type: :integer,
2979 description: "Maximum number of connections in the pool. Default: 250 connections.",
2980 suggestions: [250]
2981 },
2982 %{
2983 key: :connect_timeout,
2984 type: :integer,
2985 description: "Timeout while `gun` will wait until connection is up. Default: 5000ms.",
2986 suggestions: [5000]
2987 },
2988 %{
2989 key: :reclaim_multiplier,
2990 type: :integer,
2991 description:
2992 "Multiplier for the number of idle connection to be reclaimed if the pool is full. For example if the pool maxes out at 250 connections and this setting is set to 0.3, the pool will reclaim at most 75 idle connections if it's overloaded. Default: 0.1",
2993 suggestions: [0.1]
2994 }
2995 ]
2996 },
2997 %{
2998 group: :pleroma,
2999 key: :pools,
3000 type: :group,
3001 description: "Advanced settings for `Gun` workers pools",
3002 children:
3003 Enum.map([:federation, :media, :upload, :default], fn pool_name ->
3004 %{
3005 key: pool_name,
3006 type: :keyword,
3007 description: "Settings for #{pool_name} pool.",
3008 children: [
3009 %{
3010 key: :size,
3011 type: :integer,
3012 description: "Maximum number of concurrent requests in the pool.",
3013 suggestions: [50]
3014 },
3015 %{
3016 key: :max_waiting,
3017 type: :integer,
3018 description:
3019 "Maximum number of requests waiting for other requests to finish. After this number is reached, the pool will start returning errrors when a new request is made",
3020 suggestions: [10]
3021 },
3022 %{
3023 key: :recv_timeout,
3024 type: :integer,
3025 description: "Timeout for the pool while gun will wait for response",
3026 suggestions: [10_000]
3027 }
3028 ]
3029 }
3030 end)
3031 },
3032 %{
3033 group: :pleroma,
3034 key: :hackney_pools,
3035 type: :group,
3036 description: "Advanced settings for `Hackney` connections pools",
3037 children: [
3038 %{
3039 key: :federation,
3040 type: :keyword,
3041 description: "Settings for federation pool.",
3042 children: [
3043 %{
3044 key: :max_connections,
3045 type: :integer,
3046 description: "Number workers in the pool.",
3047 suggestions: [50]
3048 },
3049 %{
3050 key: :timeout,
3051 type: :integer,
3052 description: "Timeout while `hackney` will wait for response.",
3053 suggestions: [150_000]
3054 }
3055 ]
3056 },
3057 %{
3058 key: :media,
3059 type: :keyword,
3060 description: "Settings for media pool.",
3061 children: [
3062 %{
3063 key: :max_connections,
3064 type: :integer,
3065 description: "Number workers in the pool.",
3066 suggestions: [50]
3067 },
3068 %{
3069 key: :timeout,
3070 type: :integer,
3071 description: "Timeout while `hackney` will wait for response.",
3072 suggestions: [150_000]
3073 }
3074 ]
3075 },
3076 %{
3077 key: :upload,
3078 type: :keyword,
3079 description: "Settings for upload pool.",
3080 children: [
3081 %{
3082 key: :max_connections,
3083 type: :integer,
3084 description: "Number workers in the pool.",
3085 suggestions: [25]
3086 },
3087 %{
3088 key: :timeout,
3089 type: :integer,
3090 description: "Timeout while `hackney` will wait for response.",
3091 suggestions: [300_000]
3092 }
3093 ]
3094 }
3095 ]
3096 },
3097 %{
3098 group: :pleroma,
3099 key: :restrict_unauthenticated,
3100 label: "Restrict Unauthenticated",
3101 type: :group,
3102 description:
3103 "Disallow viewing timelines, user profiles and statuses for unauthenticated users.",
3104 children: [
3105 %{
3106 key: :timelines,
3107 type: :map,
3108 description: "Settings for public and federated timelines.",
3109 children: [
3110 %{
3111 key: :local,
3112 type: :boolean,
3113 description: "Disallow view public timeline."
3114 },
3115 %{
3116 key: :federated,
3117 type: :boolean,
3118 description: "Disallow view federated timeline."
3119 }
3120 ]
3121 },
3122 %{
3123 key: :profiles,
3124 type: :map,
3125 description: "Settings for user profiles.",
3126 children: [
3127 %{
3128 key: :local,
3129 type: :boolean,
3130 description: "Disallow view local user profiles."
3131 },
3132 %{
3133 key: :remote,
3134 type: :boolean,
3135 description: "Disallow view remote user profiles."
3136 }
3137 ]
3138 },
3139 %{
3140 key: :activities,
3141 type: :map,
3142 description: "Settings for statuses.",
3143 children: [
3144 %{
3145 key: :local,
3146 type: :boolean,
3147 description: "Disallow view local statuses."
3148 },
3149 %{
3150 key: :remote,
3151 type: :boolean,
3152 description: "Disallow view remote statuses."
3153 }
3154 ]
3155 }
3156 ]
3157 },
3158 %{
3159 group: :pleroma,
3160 key: Pleroma.Web.ApiSpec.CastAndValidate,
3161 type: :group,
3162 children: [
3163 %{
3164 key: :strict,
3165 type: :boolean,
3166 description:
3167 "Enables strict input validation (useful in development, not recommended in production)"
3168 }
3169 ]
3170 },
3171 %{
3172 group: :pleroma,
3173 key: :instances_favicons,
3174 type: :group,
3175 description: "Control favicons for instances",
3176 children: [
3177 %{
3178 key: :enabled,
3179 type: :boolean,
3180 description: "Allow/disallow displaying and getting instances favicons"
3181 }
3182 ]
3183 },
3184 %{
3185 group: :ex_aws,
3186 key: :s3,
3187 type: :group,
3188 descriptions: "S3 service related settings",
3189 children: [
3190 %{
3191 key: :access_key_id,
3192 type: :string,
3193 description: "S3 access key ID",
3194 suggestions: ["AKIAQ8UKHTGIYN7DMWWJ"]
3195 },
3196 %{
3197 key: :secret_access_key,
3198 type: :string,
3199 description: "Secret access key",
3200 suggestions: ["JFGt+fgH1UQ7vLUQjpW+WvjTdV/UNzVxcwn7DkaeFKtBS5LvoXvIiME4NQBsT6ZZ"]
3201 },
3202 %{
3203 key: :host,
3204 type: :string,
3205 description: "S3 host",
3206 suggestions: ["s3.eu-central-1.amazonaws.com"]
3207 },
3208 %{
3209 key: :region,
3210 type: :string,
3211 description: "S3 region (for AWS)",
3212 suggestions: ["us-east-1"]
3213 }
3214 ]
3215 },
3216 %{
3217 group: :pleroma,
3218 key: :frontends,
3219 type: :group,
3220 description: "Installed frontends management",
3221 children: [
3222 %{
3223 key: :primary,
3224 type: :map,
3225 description: "Primary frontend, the one that is served for all pages by default",
3226 children: installed_frontend_options
3227 },
3228 %{
3229 key: :admin,
3230 type: :map,
3231 description: "Admin frontend",
3232 children: installed_frontend_options
3233 },
3234 %{
3235 key: :available,
3236 type: :map,
3237 description:
3238 "A map containing available frontends and parameters for their installation.",
3239 children: frontend_options
3240 }
3241 ]
3242 },
3243 %{
3244 group: :pleroma,
3245 key: Pleroma.Web.Preload,
3246 type: :group,
3247 description: "Preload-related settings",
3248 children: [
3249 %{
3250 key: :providers,
3251 type: {:list, :module},
3252 description: "List of preload providers to enable",
3253 suggestions: [
3254 Pleroma.Web.Preload.Providers.Instance,
3255 Pleroma.Web.Preload.Providers.User,
3256 Pleroma.Web.Preload.Providers.Timelines,
3257 Pleroma.Web.Preload.Providers.StatusNet
3258 ]
3259 }
3260 ]
3261 },
3262 %{
3263 group: :pleroma,
3264 key: :majic_pool,
3265 type: :group,
3266 description: "Majic/libmagic configuration",
3267 children: [
3268 %{
3269 key: :size,
3270 type: :integer,
3271 description: "Number of majic workers to start.",
3272 suggestions: [2]
3273 }
3274 ]
3275 },
3276 %{
3277 group: :pleroma,
3278 key: Pleroma.User.Backup,
3279 type: :group,
3280 description: "Account Backup",
3281 children: [
3282 %{
3283 key: :purge_after_days,
3284 type: :integer,
3285 description: "Remove backup achives after N days",
3286 suggestions: [30]
3287 },
3288 %{
3289 key: :limit_days,
3290 type: :integer,
3291 description: "Limit user to export not more often than once per N days",
3292 suggestions: [7]
3293 }
3294 ]
3295 },
3296 %{
3297 group: :prometheus,
3298 key: Pleroma.Web.Endpoint.MetricsExporter,
3299 type: :group,
3300 description: "Prometheus app metrics endpoint configuration",
3301 children: [
3302 %{
3303 key: :enabled,
3304 type: :boolean,
3305 description: "[Pleroma extension] Enables app metrics endpoint."
3306 },
3307 %{
3308 key: :ip_whitelist,
3309 label: "IP Whitelist",
3310 type: [{:list, :string}, {:list, :charlist}, {:list, :tuple}],
3311 description: "Restrict access of app metrics endpoint to the specified IP addresses."
3312 },
3313 %{
3314 key: :auth,
3315 type: [:boolean, :tuple],
3316 description: "Enables HTTP Basic Auth for app metrics endpoint.",
3317 suggestion: [false, {:basic, "myusername", "mypassword"}]
3318 },
3319 %{
3320 key: :path,
3321 type: :string,
3322 description: "App metrics endpoint URI path.",
3323 suggestions: ["/api/pleroma/app_metrics"]
3324 },
3325 %{
3326 key: :format,
3327 type: :atom,
3328 description: "App metrics endpoint output format.",
3329 suggestions: [:text, :protobuf]
3330 }
3331 ]
3332 },
3333 %{
3334 group: :pleroma,
3335 key: ConcurrentLimiter,
3336 type: :group,
3337 description: "Limits configuration for background tasks.",
3338 children: [
3339 %{
3340 key: Pleroma.Web.RichMedia.Helpers,
3341 type: :keyword,
3342 description: "Concurrent limits configuration for getting RichMedia for activities.",
3343 suggestions: [max_running: 5, max_waiting: 5],
3344 children: [
3345 %{
3346 key: :max_running,
3347 type: :integer,
3348 description: "Max running concurrently jobs.",
3349 suggestion: [5]
3350 },
3351 %{
3352 key: :max_waiting,
3353 type: :integer,
3354 description: "Max waiting jobs.",
3355 suggestion: [5]
3356 }
3357 ]
3358 },
3359 %{
3360 key: Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy,
3361 type: :keyword,
3362 description: "Concurrent limits configuration for MediaProxyWarmingPolicy.",
3363 suggestions: [max_running: 5, max_waiting: 5],
3364 children: [
3365 %{
3366 key: :max_running,
3367 type: :integer,
3368 description: "Max running concurrently jobs.",
3369 suggestion: [5]
3370 },
3371 %{
3372 key: :max_waiting,
3373 type: :integer,
3374 description: "Max waiting jobs.",
3375 suggestion: [5]
3376 }
3377 ]
3378 }
3379 ]
3380 }
3381 ]