diff options
Diffstat (limited to 'installation')
| -rw-r--r-- | installation/caddyfile-pleroma.example | 4 | ||||
| -rwxr-xr-x | installation/download-mastofe-build.sh | 45 | ||||
| -rw-r--r-- | installation/pleroma-apache.conf | 6 | ||||
| -rwxr-xr-x | installation/pleroma-mongooseim.cfg | 932 | ||||
| -rw-r--r-- | installation/pleroma.nginx | 4 | ||||
| -rw-r--r-- | installation/pleroma.vcl | 70 | 
6 files changed, 1022 insertions, 39 deletions
| diff --git a/installation/caddyfile-pleroma.example b/installation/caddyfile-pleroma.example index fcf76718e..7985d9c67 100644 --- a/installation/caddyfile-pleroma.example +++ b/installation/caddyfile-pleroma.example @@ -10,7 +10,9 @@ example.tld  {    gzip -  proxy / localhost:4000 { +  # this is explicitly IPv4 since Pleroma.Web.Endpoint binds on IPv4 only +  # and `localhost.` resolves to [::0] on some systems: see issue #930 +  proxy / 127.0.0.1:4000 {      websocket      transparent    } diff --git a/installation/download-mastofe-build.sh b/installation/download-mastofe-build.sh new file mode 100755 index 000000000..7e293867d --- /dev/null +++ b/installation/download-mastofe-build.sh @@ -0,0 +1,45 @@ +#!/bin/sh +# Pleroma: A lightweight social networking server +# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> +# SPDX-License-Identifier: AGPL-3.0-only +project_id="74" +project_branch="rebase/glitch-soc" +static_dir="instance/static" +# For bundling: +# project_branch="pleroma" +# static_dir="priv/static" + +if [[ ! -d "${static_dir}" ]] +then +	echo "Error: ${static_dir} directory is missing, are you sure you are running this script at the root of pleroma’s repository?" +	exit 1 +fi + +last_modified="$(curl -s -I 'https://git.pleroma.social/api/v4/projects/'${project_id}'/jobs/artifacts/'${project_branch}'/download?job=build' | grep '^Last-Modified:' | cut -d: -f2-)" + +echo "branch:${project_branch}" +echo "Last-Modified:${last_modified}" + +artifact="mastofe.zip" + +if [[ -e mastofe.timestamp ]] && [[ "${last_modified}" != "" ]] +then +	if [[ "$(cat mastofe.timestamp)" == "${last_modified}" ]] +	then +		echo "MastoFE is up-to-date, exiting…" +		exit 0 +	fi +fi + +curl -c - "https://git.pleroma.social/api/v4/projects/${project_id}/jobs/artifacts/${project_branch}/download?job=build" -o "${artifact}" || exit + +# TODO: Update the emoji as well +rm -fr "${static_dir}/sw.js" "${static_dir}/packs" || exit +unzip -q "${artifact}" || exit + +cp public/assets/sw.js "${static_dir}/sw.js" || exit +cp -r public/packs "${static_dir}/packs" || exit + +echo "${last_modified}" > mastofe.timestamp +rm -fr public +rm -i "${artifact}" diff --git a/installation/pleroma-apache.conf b/installation/pleroma-apache.conf index 2beb7c4cc..b5640ac3d 100644 --- a/installation/pleroma-apache.conf +++ b/installation/pleroma-apache.conf @@ -58,8 +58,10 @@ CustomLog ${APACHE_LOG_DIR}/access.log combined      RewriteRule /(.*) ws://localhost:4000/$1 [P,L]      ProxyRequests off -    ProxyPass / http://localhost:4000/ -    ProxyPassReverse / http://localhost:4000/ +    # this is explicitly IPv4 since Pleroma.Web.Endpoint binds on IPv4 only +    # and `localhost.` resolves to [::0] on some systems: see issue #930 +    ProxyPass / http://127.0.0.1:4000/ +    ProxyPassReverse / http://127.0.0.1:4000/      RequestHeader set Host ${servername}      ProxyPreserveHost On diff --git a/installation/pleroma-mongooseim.cfg b/installation/pleroma-mongooseim.cfg new file mode 100755 index 000000000..d7567321f --- /dev/null +++ b/installation/pleroma-mongooseim.cfg @@ -0,0 +1,932 @@ +%%% +%%%               ejabberd configuration file +%%% +%%%' + +%%% The parameters used in this configuration file are explained in more detail +%%% in the ejabberd Installation and Operation Guide. +%%% Please consult the Guide in case of doubts, it is included with +%%% your copy of ejabberd, and is also available online at +%%% http://www.process-one.net/en/ejabberd/docs/ + +%%% This configuration file contains Erlang terms. +%%% In case you want to understand the syntax, here are the concepts: +%%% +%%%  - The character to comment a line is % +%%% +%%%  - Each term ends in a dot, for example: +%%%      override_global. +%%% +%%%  - A tuple has a fixed definition, its elements are +%%%    enclosed in {}, and separated with commas: +%%%      {loglevel, 4}. +%%% +%%%  - A list can have as many elements as you want, +%%%    and is enclosed in [], for example: +%%%      [http_poll, web_admin, tls] +%%% +%%%    Pay attention that list elements are delimited with commas, +%%%    but no comma is allowed after the last list element. This will +%%%    give a syntax error unlike in more lenient languages (e.g. Python). +%%% +%%%  - A keyword of ejabberd is a word in lowercase. +%%%    Strings are enclosed in "" and can contain spaces, dots, ... +%%%      {language, "en"}. +%%%      {ldap_rootdn, "dc=example,dc=com"}. +%%% +%%%  - This term includes a tuple, a keyword, a list, and two strings: +%%%      {hosts, ["jabber.example.net", "im.example.com"]}. +%%% +%%%  - This config is preprocessed during release generation by a tool which +%%%    interprets double curly braces as substitution markers, so avoid this +%%%    syntax in this file (though it's valid Erlang). +%%% +%%%    So this is OK (though arguably looks quite ugly): +%%%      { {s2s_addr, "example-host.net"}, {127,0,0,1} }. +%%% +%%%    And I can't give an example of what's not OK exactly because +%%%    of this rule. +%%% + + +%%%.   ======================= +%%%'   OVERRIDE STORED OPTIONS + +%% +%% Override the old values stored in the database. +%% + +%% +%% Override global options (shared by all ejabberd nodes in a cluster). +%% +%%override_global. + +%% +%% Override local options (specific for this particular ejabberd node). +%% +%%override_local. + +%% +%% Remove the Access Control Lists before new ones are added. +%% +%%override_acls. + + +%%%.   ========= +%%%'   DEBUGGING + +%% +%% loglevel: Verbosity of log files generated by ejabberd. +%% 0: No ejabberd log at all (not recommended) +%% 1: Critical +%% 2: Error +%% 3: Warning +%% 4: Info +%% 5: Debug +%% +{loglevel, 3}. + +%%%.   ================ +%%%'   SERVED HOSTNAMES + +%% +%% hosts: Domains served by ejabberd. +%% You can define one or several, for example: +%% {hosts, ["example.net", "example.com", "example.org"]}. +%% +{hosts, ["pleroma.soykaf.com"] }. + +%% +%% route_subdomains: Delegate subdomains to other XMPP servers. +%% For example, if this ejabberd serves example.org and you want +%% to allow communication with an XMPP server called im.example.org. +%% +%%{route_subdomains, s2s}. + + +%%%.   =============== +%%%'   LISTENING PORTS + +%% +%% listen: The ports ejabberd will listen on, which service each is handled +%% by and what options to start it with. +%% +{listen, + [ +  %% BOSH and WS endpoints over HTTP +  { 5280, ejabberd_cowboy, [ +      {num_acceptors, 10}, +      {transport_options, [{max_connections, 1024}]}, +      {modules, [ + +          {"_", "/http-bind", mod_bosh}, +          {"_", "/ws-xmpp", mod_websockets, [{ejabberd_service, [ +                                        {access, all}, +                                        {shaper_rule, fast}, +                                        {ip, {127, 0, 0, 1}}, +                                        {password, "secret"}]} +          %% Uncomment to enable connection dropping or/and server-side pings +          %{timeout, 600000}, {ping_rate, 2000} +          ]} +          %% Uncomment to serve static files +          %{"_", "/static/[...]", cowboy_static, +          %  {dir, "/var/www", [{mimetypes, cow_mimetypes, all}]} +          %}, + +          %% Example usage of mod_revproxy + +          %% {"_", "/[...]", mod_revproxy, [{timeout, 5000}, +          %%                                % time limit for upstream to respond +          %%                                {body_length, 8000000}, +          %%                                % maximum body size (may be infinity) +          %%                                {custom_headers, [{<<"header">>,<<"value">>}]} +          %%                                % list of extra headers that are send to upstream +          %%                               ]} + +          %% Example usage of mod_cowboy + +          %% {"_", "/[...]", mod_cowboy, [{http, mod_revproxy, +          %%                                [{timeout, 5000}, +          %%                                 % time limit for upstream to respond +          %%                                 {body_length, 8000000}, +          %%                                 % maximum body size (may be infinity) +          %%                                 {custom_headers, [{<<"header">>,<<"value">>}]} +          %%                                 % list of extra headers that are send to upstream +          %%                                ]}, +          %%                               {ws, xmpp, mod_websockets} +          %%                             ]} +      ]} +  ]}, + +  %% BOSH and WS endpoints over HTTPS +  { 5285, ejabberd_cowboy, [ +        {num_acceptors, 10}, +        {transport_options, [{max_connections, 1024}]}, +        {ssl, [{certfile, "priv/ssl/fullchain.pem"}, {keyfile, "priv/ssl/privkey.pem"}, {password, ""}]}, +        {modules, [ +            {"_", "/http-bind", mod_bosh}, +            {"_", "/ws-xmpp", mod_websockets, [ +            %% Uncomment to enable connection dropping or/and server-side pings +            %{timeout, 600000}, {ping_rate, 60000} +            ]} +            %% Uncomment to serve static files +            %{"_", "/static/[...]", cowboy_static, +            %  {dir, "/var/www", [{mimetypes, cow_mimetypes, all}]} +            %}, +        ]} +    ]}, + +  %% MongooseIM HTTP API it's important to start it on localhost +  %% or some private interface only (not accessible from the outside) +  %% At least start it on different port which will be hidden behind firewall + +  { {8088, "127.0.0.1"} , ejabberd_cowboy, [ +      {num_acceptors, 10}, +      {transport_options, [{max_connections, 1024}]}, +      {modules, [ +          {"localhost", "/api", mongoose_api_admin, []} +      ]} +  ]}, + +  { 8089 , ejabberd_cowboy, [ +      {num_acceptors, 10}, +      {transport_options, [{max_connections, 1024}]}, +      {protocol_options, [{compress, true}]}, +      {ssl, [{certfile, "priv/ssl/fullchain.pem"}, {keyfile, "priv/ssl/privkey.pem"}, {password, ""}]}, +      {modules, [ +          {"_", "/api/sse", lasse_handler, [mongoose_client_api_sse]}, +          {"_", "/api/messages/[:with]", mongoose_client_api_messages, []}, +          {"_", "/api/contacts/[:jid]", mongoose_client_api_contacts, []}, +          {"_", "/api/rooms/[:id]",    mongoose_client_api_rooms, []}, +          {"_", "/api/rooms/[:id]/config",    mongoose_client_api_rooms_config, []}, +          {"_", "/api/rooms/:id/users/[:user]",    mongoose_client_api_rooms_users, []}, +          {"_", "/api/rooms/[:id]/messages",    mongoose_client_api_rooms_messages, []} +      ]} +  ]}, + +  %% Following HTTP API is deprected, the new one abouve should be used instead + +  { {5288, "127.0.0.1"} , ejabberd_cowboy, [ +      {num_acceptors, 10}, +      {transport_options, [{max_connections, 1024}]}, +      {modules, [ +          {"localhost", "/api", mongoose_api, [{handlers, [mongoose_api_metrics, +                                                           mongoose_api_users]}]} +      ]} +  ]}, + +  { 5222, ejabberd_c2s, [ + +			%% +			%% If TLS is compiled in and you installed a SSL +			%% certificate, specify the full path to the +			%% file and uncomment this line: +			%% +                        {certfile, "priv/ssl/both.pem"}, starttls, +                         +                        %%{zlib, 10000}, +			%% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS +			%% {ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"}, +			{access, c2s}, +			{shaper, c2s_shaper}, +			{max_stanza_size, 65536}, +			{protocol_options, ["no_sslv3"]} +                         +		       ]}, + +   + +  %% +  %% To enable the old SSL connection method on port 5223: +  %% +  %%{5223, ejabberd_c2s, [ +  %%			{access, c2s}, +  %%			{shaper, c2s_shaper}, +  %%			{certfile, "/path/to/ssl.pem"}, tls, +  %%			{max_stanza_size, 65536} +  %%		       ]}, + +  { 5269, ejabberd_s2s_in, [ +			   {shaper, s2s_shaper}, +			   {max_stanza_size, 131072}, +			   {protocol_options, ["no_sslv3"]} +			    +			  ]} + +  %% +  %% ejabberd_service: Interact with external components (transports, ...) +  %% +  ,{8888, ejabberd_service, [ +                {access, all}, +                {shaper_rule, fast}, +                {ip, {127, 0, 0, 1}}, +                {password, "secret"} +           ]} + +  %% +  %% ejabberd_stun: Handles STUN Binding requests +  %% +  %%{ {3478, udp}, ejabberd_stun, []} + + ]}. + +%% +%% s2s_use_starttls: Enable STARTTLS + Dialback for S2S connections. +%% Allowed values are: false optional required required_trusted +%% You must specify a certificate file. +%% +{s2s_use_starttls, optional}. +%% +%% s2s_certfile: Specify a certificate file. +%% +{s2s_certfile, "priv/ssl/both.pem"}. + +%% https://www.openssl.org/docs/apps/ciphers.html#CIPHER_STRINGS +%% {s2s_ciphers, "DEFAULT:!EXPORT:!LOW:!SSLv2"}. + +%% +%% domain_certfile: Specify a different certificate for each served hostname. +%% +%%{domain_certfile, "example.org", "/path/to/example_org.pem"}. +%%{domain_certfile, "example.com", "/path/to/example_com.pem"}. + +%% +%% S2S whitelist or blacklist +%% +%% Default s2s policy for undefined hosts. +%% +{s2s_default_policy, deny }. + +%% +%% Allow or deny communication with specific servers. +%% +%%{ {s2s_host, "goodhost.org"}, allow}. +%%{ {s2s_host, "badhost.org"}, deny}. + +{outgoing_s2s_port, 5269 }. + +%% +%% IP addresses predefined for specific hosts to skip DNS lookups. +%% Ports defined here take precedence over outgoing_s2s_port. +%% Examples: +%% +%% { {s2s_addr, "example-host.net"}, {127,0,0,1} }. +%% { {s2s_addr, "example-host.net"}, { {127,0,0,1}, 5269 } }. +%% { {s2s_addr, "example-host.net"}, { {127,0,0,1}, 5269 } }. + +%% +%% Outgoing S2S options +%% +%% Preferred address families (which to try first) and connect timeout +%% in milliseconds. +%% +%%{outgoing_s2s_options, [ipv4, ipv6], 10000}. +%% +%%%.   ============== +%%%'   SESSION BACKEND + +%%{sm_backend, {mnesia, []}}. + +%% Requires {redis, global, default, ..., ...} outgoing pool +%%{sm_backend, {redis, []}}. + +{sm_backend, {mnesia, []} }. + + +%%%.   ============== +%%%'   AUTHENTICATION + +%% Advertised SASL mechanisms +{sasl_mechanisms, [cyrsasl_plain]}. + +%% +%% auth_method: Method used to authenticate the users. +%% The default method is the internal. +%% If you want to use a different method, +%% comment this line and enable the correct ones. +%% +%% {auth_method, internal }. +{auth_method, http }. +{auth_opts, [ +             {http, global, auth, [{workers, 50}], [{server, "https://pleroma.soykaf.com"}]}, +             {password_format, plain} % default +             %% {password_format, scram} +              +             %% {scram_iterations, 4096} % default +              +             %% +             %% For auth_http: +             %% {basic_auth, "user:password"} +             %% {path_prefix, "/"} % default +             %% auth_http requires {http, Host | global, auth, ..., ...} outgoing pool. +             %% +             %% For auth_external +             %%{extauth_program, "/path/to/authentication/script"}. +             %% +             %% For auth_jwt +             %% {jwt_secret_source, "/path/to/file"}, +             %% {jwt_algorithm, "RS256"}, +             %% {jwt_username_key, user} +             %% For cyrsasl_external +             %% {authenticate_with_cn, false} +             {cyrsasl_external, standard} +            ]}. + +%% +%% Authentication using external script +%% Make sure the script is executable by ejabberd. +%% +%%{auth_method, external}. + +%% +%% Authentication using RDBMS +%% Remember to setup a database in the next section. +%% +%%{auth_method, rdbms}. + +%% +%% Authentication using LDAP +%% +%%{auth_method, ldap}. +%% + +%% List of LDAP servers: +%%{ldap_servers, ["localhost"]}. +%% +%% Encryption of connection to LDAP servers: +%%{ldap_encrypt, none}. +%%{ldap_encrypt, tls}. +%% +%% Port to connect to on LDAP servers: +%%{ldap_port, 389}. +%%{ldap_port, 636}. +%% +%% LDAP manager: +%%{ldap_rootdn, "dc=example,dc=com"}. +%% +%% Password of LDAP manager: +%%{ldap_password, "******"}. +%% +%% Search base of LDAP directory: +%%{ldap_base, "dc=example,dc=com"}. +%% +%% LDAP attribute that holds user ID: +%%{ldap_uids, [{"mail", "%u@mail.example.org"}]}. +%% +%% LDAP filter: +%%{ldap_filter, "(objectClass=shadowAccount)"}. + +%% +%% Anonymous login support: +%%   auth_method: anonymous +%%   anonymous_protocol: sasl_anon | login_anon | both +%%   allow_multiple_connections: true | false +%% +%%{host_config, "public.example.org", [{auth_method, anonymous}, +%%                                     {allow_multiple_connections, false}, +%%                                     {anonymous_protocol, sasl_anon}]}. +%% +%% To use both anonymous and internal authentication: +%% +%%{host_config, "public.example.org", [{auth_method, [internal, anonymous]}]}. + + +%%%.   ============== +%%%'   OUTGOING CONNECTIONS (e.g. DB) + +%% Here you may configure all outgoing connections used by MongooseIM, +%% e.g. to RDBMS (such as MySQL), Riak or external HTTP components. +%% Default MongooseIM configuration uses only Mnesia (non-Mnesia extensions are disabled), +%% so no options here are uncommented out of the box. +%% This section includes configuration examples; for comprehensive guide +%% please consult MongooseIM documentation, page "Outgoing connections": +%% - doc/advanced-configuration/outgoing-connections.md +%% - https://mongooseim.readthedocs.io/en/latest/advanced-configuration/outgoing-connections/ + + +{outgoing_pools, [ +%  {riak, global, default, [{workers, 5}], [{address, "127.0.0.1"}, {port, 8087}]}, +%  {elastic, global, default, [], [{host, "elastic.host.com"}, {port, 9042}]}, +  {http, global, auth, [{workers, 50}], [{server, "https://pleroma.soykaf.com"}]} +%  {cassandra, global, default, [{workers, 100}], [{servers, [{"server1", 9042}]}, {keyspace, "big_mongooseim"}]}, +%  {rdbms, global, default, [{workers, 10}], [{server, {mysql, "server", 3306, "database", "username", "password"}}]} +]}. + +%% More examples that may be added to outgoing_pools list: +%% +%% == MySQL == +%%  {rdbms, global, default, [{workers, 10}], +%%   [{server, {mysql, "server", 3306, "database", "username", "password"}}, +%%    {keepalive_interval, 10}]}, +%% keepalive_interval is optional + +%% == PostgreSQL == +%%  {rdbms, global, default, [{workers, 10}], +%%   [{server, {pgsql, "server", 5432, "database", "username", "password"}}]}, + +%% == ODBC (MSSQL) == +%%  {rdbms, global, default, [{workers, 10}], +%%   [{server, "DSN=mongooseim;UID=mongooseim;PWD=mongooseim"}]}, + +%% == Elastic Search == +%%  {elastic, global, default, [], [{host, "elastic.host.com"}, {port, 9042}]}, + +%% == Riak == +%%  {riak, global, default, [{workers, 20}], [{address, "127.0.0.1"}, {port, 8087}]}, + +%% == HTTP == +%%  {http, global, conn1, [{workers, 50}], [{server, "http://server:8080"}]}, + +%% == Cassandra == +%%  {cassandra, global, default, [{workers, 100}], +%%    [ +%%      {servers, [ +%%                 {"cassandra_server1.example.com", 9042}, +%%                 {"cassandra_server2.example.com", 9042}, +%%                 {"cassandra_server3.example.com", 9042}, +%%                 {"cassandra_server4.example.com", 9042} +%%                ]}, +%%      {keyspace, "big_mongooseim"} +%%    ]} + +%% == Extra options == +%% +%% If you use PostgreSQL, have a large database, and need a +%% faster but inexact replacement for "select count(*) from users" +%% +%%{pgsql_users_number_estimate, true}. +%% +%% rdbms_server_type specifies what database is used over the RDBMS layer +%% Can take values mssql, pgsql, mysql +%% In some cases (for example for MAM with pgsql) it is required to set proper value. +%% +%% {rdbms_server_type, pgsql}. + +%%%.   =============== +%%%'   TRAFFIC SHAPERS + +%% +%% The "normal" shaper limits traffic speed to 1000 B/s +%% +{shaper, normal, {maxrate, 1000}}. + +%% +%% The "fast" shaper limits traffic speed to 50000 B/s +%% +{shaper, fast, {maxrate, 50000}}. + +%% +%% This option specifies the maximum number of elements in the queue +%% of the FSM. Refer to the documentation for details. +%% +{max_fsm_queue, 1000}. + +%%%.   ==================== +%%%'   ACCESS CONTROL LISTS + +%% +%% The 'admin' ACL grants administrative privileges to XMPP accounts. +%% You can put here as many accounts as you want. +%% +%{acl, admin, {user, "alice", "localhost"}}. +%{acl, admin, {user, "a", "localhost"}}. + +%% +%% Blocked users +%% +%%{acl, blocked, {user, "baduser", "example.org"}}. +%%{acl, blocked, {user, "test"}}. + +%% +%% Local users: don't modify this line. +%% +{acl, local, {user_regexp, ""}}. + +%% +%% More examples of ACLs +%% +%%{acl, jabberorg, {server, "jabber.org"}}. +%%{acl, aleksey, {user, "aleksey", "jabber.ru"}}. +%%{acl, test, {user_regexp, "^test"}}. +%%{acl, test, {user_glob, "test*"}}. + +%% +%% Define specific ACLs in a virtual host. +%% +%%{host_config, "localhost", +%% [ +%%  {acl, admin, {user, "bob-local", "localhost"}} +%% ] +%%}. + +%%%.   ============ +%%%'   ACCESS RULES + +%% Maximum number of simultaneous sessions allowed for a single user: +{access, max_user_sessions, [{10, all}]}. + +%% Maximum number of offline messages that users can have: +{access, max_user_offline_messages, [{5000, admin}, {100, all}]}. + +%% This rule allows access only for local users: +{access, local, [{allow, local}]}. + +%% Only non-blocked users can use c2s connections: +{access, c2s, [{deny, blocked}, +	       {allow, all}]}. + +%% For C2S connections, all users except admins use the "normal" shaper +{access, c2s_shaper, [{none, admin}, +		      {normal, all}]}. + +%% All S2S connections use the "fast" shaper +{access, s2s_shaper, [{fast, all}]}. + +%% Admins of this server are also admins of the MUC service: +{access, muc_admin, [{allow, admin}]}. + +%% Only accounts of the local ejabberd server can create rooms: +{access, muc_create, [{allow, local}]}. + +%% All users are allowed to use the MUC service: +{access, muc, [{allow, all}]}. + +%% In-band registration allows registration of any possible username. +%% To disable in-band registration, replace 'allow' with 'deny'. +{access, register, [{allow, all}]}. + +%% By default the frequency of account registrations from the same IP +%% is limited to 1 account every 10 minutes. To disable, specify: infinity +{registration_timeout, infinity}. + +%% Default settings for MAM. +%% To set non-standard value, replace 'default' with 'allow' or 'deny'. +%% Only user can access his/her archive by default. +%% An online user can read room's archive by default. +%% Only an owner can change settings and purge messages by default. +%% Empty list (i.e. `[]`) means `[{deny, all}]`. +{access, mam_set_prefs, [{default, all}]}. +{access, mam_get_prefs, [{default, all}]}. +{access, mam_lookup_messages, [{default, all}]}. +{access, mam_purge_single_message, [{default, all}]}. +{access, mam_purge_multiple_messages, [{default, all}]}. + +%% 1 command of the specified type per second. +{shaper, mam_shaper, {maxrate, 1}}. +%% This shaper is primeraly for Mnesia overload protection during stress testing. +%% The limit is 1000 operations of each type per second. +{shaper, mam_global_shaper, {maxrate, 1000}}. + +{access, mam_set_prefs_shaper, [{mam_shaper, all}]}. +{access, mam_get_prefs_shaper, [{mam_shaper, all}]}. +{access, mam_lookup_messages_shaper, [{mam_shaper, all}]}. +{access, mam_purge_single_message_shaper, [{mam_shaper, all}]}. +{access, mam_purge_multiple_messages_shaper, [{mam_shaper, all}]}. + +{access, mam_set_prefs_global_shaper, [{mam_global_shaper, all}]}. +{access, mam_get_prefs_global_shaper, [{mam_global_shaper, all}]}. +{access, mam_lookup_messages_global_shaper, [{mam_global_shaper, all}]}. +{access, mam_purge_single_message_global_shaper, [{mam_global_shaper, all}]}. +{access, mam_purge_multiple_messages_global_shaper, [{mam_global_shaper, all}]}. + +%% +%% Define specific Access Rules in a virtual host. +%% +%%{host_config, "localhost", +%% [ +%%  {access, c2s, [{allow, admin}, {deny, all}]}, +%%  {access, register, [{deny, all}]} +%% ] +%%}. + +%%%.   ================ +%%%'   DEFAULT LANGUAGE + +%% +%% language: Default language used for server messages. +%% +{language, "en"}. + +%% +%% Set a different default language in a virtual host. +%% +%%{host_config, "localhost", +%% [{language, "ru"}] +%%}. + +%%%.   ================ +%%%'   MISCELLANEOUS + +{all_metrics_are_global, false }. + +%%%.   ======== +%%%'   SERVICES + +%% Unlike modules, services are started per node and provide either features which are not +%% related to any particular host, or backend stuff which is used by modules. +%% This is handled by `mongoose_service` module. + +{services, +    [ +        {service_admin_extra, [{submods, [node, accounts, sessions, vcard, +                                          roster, last, private, stanza, stats]}]} +    ] +}. + +%%%.   ======= +%%%'   MODULES + +%% +%% Modules enabled in all mongooseim virtual hosts. +%% For list of possible modules options, check documentation. +%% +{modules, + [ + +  %% The format for a single route is as follows: +  %% {Host, Path, Method, Upstream} +  %% +  %% "_" can be used as wildcard for Host, Path and Method +  %% Upstream can be either host (just http(s)://host:port) or uri +  %% The difference is that host upstreams append whole path while +  %% uri upstreams append only remainder that follows the matched Path +  %% (this behaviour is similar to nginx's proxy_pass rules) +  %% +  %% Bindings can be used to match certain parts of host or path. +  %% They will be later overlaid with parts of the upstream uri. +  %% +  %% {mod_revproxy, +  %%    [{routes, [{"www.erlang-solutions.com", "/admin", "_", +  %%                "https://www.erlang-solutions.com/"}, +  %%               {":var.com", "/:var", "_", "http://localhost:8080/"}, +  %%               {":domain.com", "/", "_", "http://localhost:8080/:domain"}] +  %%     }]}, + +% {mod_http_upload, [ +    %% Set max file size in bytes. Defaults to 10 MB. +    %% Disabled if value is `undefined`. +%   {max_file_size, 1024}, +    %% Use S3 storage backend +%   {backend, s3}, +    %% Set options for S3 backend +%   {s3, [ +%     {bucket_url, "http://s3-eu-west-1.amazonaws.com/konbucket2"}, +%     {region, "eu-west-1"}, +%     {access_key_id, "AKIAIAOAONIULXQGMOUA"}, +%     {secret_access_key, "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"} +%   ]} +% ]}, + +  {mod_adhoc, []}, +   +  {mod_disco, [{users_can_see_hidden_services, false}]}, +  {mod_commands, []}, +  {mod_muc_commands, []}, +  {mod_muc_light_commands, []}, +  {mod_last, []}, +  {mod_stream_management, [ +                           % default 100 +                           % size of a buffer of unacked messages +                           % {buffer_max, 100} + +                           % default 1 - server sends the ack request after each stanza +                           % {ack_freq, 1} + +                           % default: 600 seconds +                           % {resume_timeout, 600} +                          ]}, +  %% {mod_muc_light, [{host, "muclight.@HOST@"}]}, +  %% {mod_muc, [{host, "muc.@HOST@"}, +  %%            {access, muc}, +  %%            {access_create, muc_create} +  %%           ]}, +  %% {mod_muc_log, [ +  %%                {outdir, "/tmp/muclogs"}, +  %%                {access_log, muc} +  %%               ]}, +  {mod_offline, [{access_max_user_messages, max_user_offline_messages}]}, +  {mod_privacy, []}, +  {mod_blocking, []}, +  {mod_private, []}, +% {mod_private, [{backend, mnesia}]}, +% {mod_private, [{backend, rdbms}]}, +% {mod_register, [ +%		  %% +%		  %% Set the minimum informational entropy for passwords. +%		  %% +%		  %%{password_strength, 32}, +% +%		  %% +%		  %% After successful registration, the user receives +%		  %% a message with this subject and body. +%		  %% +%		  {welcome_message, {""}}, +% +%		  %% +%		  %% When a user registers, send a notification to +%		  %% these XMPP accounts. +%		  %% +% +% +%		  %% +%		  %% Only clients in the server machine can register accounts +%		  %% +%		  {ip_access, [{allow, "127.0.0.0/8"}, +%			       {deny, "0.0.0.0/0"}]}, +% +%		  %% +%		  %% Local c2s or remote s2s users cannot register accounts +%		  %% +%		  %%{access_from, deny}, +% +%		  {access, register} +%		 ]}, +  {mod_roster, []}, +  {mod_sic, []}, +  {mod_vcard, [%{matches, 1}, +%{search, true}, +%{ldap_search_operator, 'or'}, %% either 'or' or 'and' +%{ldap_binary_search_fields, [<<"PHOTO">>]}, +%% list of binary search fields (as in vcard after mapping) +{host, "vjud.@HOST@"} +]}, +  {mod_bosh, []}, +  {mod_carboncopy, []} + +  %% +  %% Message Archive Management (MAM, XEP-0313) for registered users and +  %% Multi-User chats (MUCs). +  %% + +% {mod_mam_meta, [ +    %% Use RDBMS backend (default) +%   {backend, rdbms}, + +    %% Do not store user preferences (default) +%   {user_prefs_store, false}, +    %% Store user preferences in RDBMS +%   {user_prefs_store, rdbms}, +    %% Store user preferences in Mnesia (recommended). +    %% The preferences store will be called each time, as a message is routed. +    %% That is why Mnesia is better suited for this job. +%   {user_prefs_store, mnesia}, + +    %% Enables a pool of asynchronous writers. (default) +    %% Messages will be grouped together based on archive id. +%   {async_writer, true}, + +    %% Cache information about users (default) +%   {cache_users, true}, + +    %% Enable archivization for private messages (default) +%   {pm, [ +      %% Top-level options can be overriden here if needed, for example: +%     {async_writer, false} +%   ]}, + +    %% +    %% Message Archive Management (MAM) for multi-user chats (MUC). +    %% Enable XEP-0313 for "muc.@HOST@". +    %% +%   {muc, [ +%     {host, "muc.@HOST@"} +      %% As with pm, top-level options can be overriden for MUC archive +%   ]}, +% +    %% Do not use a <stanza-id/> element (by default stanzaid is used) +%   no_stanzaid_element, +% ]}, + + +  %% +  %% MAM configuration examples +  %% + +  %% Only MUC, no user-defined preferences, good performance. +% {mod_mam_meta, [ +%   {backend, rdbms}, +%   {pm, false}, +%   {muc, [ +%     {host, "muc.@HOST@"} +%   ]} +% ]}, + +  %% Only archives for c2c messages, good performance. +% {mod_mam_meta, [ +%   {backend, rdbms}, +%   {pm, [ +%     {user_prefs_store, mnesia} +%   ]} +% ]}, + +  %% Basic configuration for c2c messages, bad performance, easy to debug. +% {mod_mam_meta, [ +%   {backend, rdbms}, +%   {async_writer, false}, +%   {cache_users, false} +% ]}, + +  %% Cassandra archive for c2c and MUC conversations. +  %% No custom settings supported (always archive). +% {mod_mam_meta, [ +%   {backend, cassandra}, +%   {user_prefs_store, cassandra}, +%   {muc, [{host, "muc.@HOST@"}]} +% ]} + +% {mod_event_pusher, [ +%   {backends, [ +%     %% +%     %% Configuration for Amazon SNS notifications. +%     %% +%     {sns, [ +%       %% AWS credentials, region and host configuration +%       {access_key_id, "AKIAJAZYHOIPY6A2PESA"}, +%       {secret_access_key, "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"}, +%       {region, "eu-west-1"}, +%       {account_id, "251423380551"}, +%       {region, "eu-west-1"}, +%       {sns_host, "sns.eu-west-1.amazonaws.com"}, +% +%       %% Messages from this MUC host will be sent to the SNS topic +%       {muc_host, "muc.@HOST@"}, +% +%       %% Plugin module for defining custom message attributes and user identification +%       {plugin_module, mod_event_pusher_sns_defaults}, +% +%       %% Topic name configurations. Removing a topic will disable this specific SNS notification +%       {presence_updates_topic, "user_presence_updated-dev-1"},  %% For presence updates +%       {pm_messages_topic, "user_message_sent-dev-1"},           %% For private chat messages +%       {muc_messages_topic, "user_messagegroup_sent-dev-1"}      %% For group chat messages +% +%       %% Pool options +%       {pool_size, 100}, %% Worker pool size for publishing notifications +%       {publish_retry_count, 2}, %% Retry count in case of publish error +%       {publish_retry_time_ms, 50} %% Base exponential backoff time (in ms) for publish errors +%      ]} +%   ]} + +]}. + + +%% +%% Enable modules with custom options in a specific virtual host +%% +%%{host_config, "localhost", +%% [{ {add, modules}, +%%   [ +%%    {mod_some_module, []} +%%   ] +%%  } +%% ]}. + +%%%. +%%%' + +%%% $Id$ + +%%% Local Variables: +%%% mode: erlang +%%% End: +%%% vim: set filetype=erlang tabstop=8 foldmarker=%%%',%%%. foldmethod=marker: +%%%. diff --git a/installation/pleroma.nginx b/installation/pleroma.nginx index cc75d78b2..7425da33f 100644 --- a/installation/pleroma.nginx +++ b/installation/pleroma.nginx @@ -69,7 +69,9 @@ server {          proxy_set_header Connection "upgrade";          proxy_set_header Host $http_host; -        proxy_pass http://localhost:4000; +	# this is explicitly IPv4 since Pleroma.Web.Endpoint binds on IPv4 only +	# and `localhost.` resolves to [::0] on some systems: see issue #930 +        proxy_pass http://127.0.0.1:4000;          client_max_body_size 16m;      } diff --git a/installation/pleroma.vcl b/installation/pleroma.vcl index 92153d8ef..154747aa6 100644 --- a/installation/pleroma.vcl +++ b/installation/pleroma.vcl @@ -1,4 +1,4 @@ -vcl 4.0; +vcl 4.1;  import std;  backend default { @@ -35,24 +35,6 @@ sub vcl_recv {        }        return(purge);      } - -    # Pleroma MediaProxy - strip headers that will affect caching -    if (req.url ~ "^/proxy/") { -      unset req.http.Cookie; -      unset req.http.Authorization; -      unset req.http.Accept; -      return (hash); -    } - -    # Strip headers that will affect caching from all other static content -    # This also permits caching of individual toots and AP Activities -    if ((req.url ~ "^/(media|static)/") || -    (req.url ~ "(?i)\.(html|js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|mp4|ogg|webm|svg|swf|ttf|pdf|woff|woff2)$")) -    { -      unset req.http.Cookie; -      unset req.http.Authorization; -      return (hash); -    }  }  sub vcl_backend_response { @@ -61,6 +43,12 @@ sub vcl_backend_response {        set beresp.do_gzip = true;      } +    # Retry broken backend responses. +    if (beresp.status == 503) { +      set bereq.http.X-Varnish-Backend-503 = "1"; +      return (retry); +    } +      # CHUNKED SUPPORT      if (bereq.http.x-range ~ "bytes=" && beresp.status == 206) {        set beresp.ttl = 10m; @@ -73,8 +61,6 @@ sub vcl_backend_response {        return (deliver);      } -    # Default object caching of 86400s; -    set beresp.ttl = 86400s;      # Allow serving cached content for 6h in case backend goes down      set beresp.grace = 6h; @@ -90,20 +76,6 @@ sub vcl_backend_response {        set beresp.ttl = 30s;        return (deliver);      } - -    # Pleroma MediaProxy internally sets headers properly -    if (bereq.url ~ "^/proxy/") { -      return (deliver); -    } - -    # Strip cache-restricting headers from Pleroma on static content that we want to cache -    if (bereq.url ~ "(?i)\.(js|css|jpg|jpeg|png|gif|gz|tgz|bz2|tbz|mp3|mp4|ogg|webm|svg|swf|ttf|pdf|woff|woff2)$") -    { -      unset beresp.http.set-cookie; -      unset beresp.http.Cache-Control; -      unset beresp.http.x-request-id; -      set beresp.http.Cache-Control = "public, max-age=86400"; -    }  }  # The synthetic response for 301 redirects @@ -132,10 +104,32 @@ sub vcl_hash {  }  sub vcl_backend_fetch { +    # Be more lenient for slow servers on the fediverse +    if bereq.url ~ "^/proxy/" { +      set bereq.first_byte_timeout = 300s; +    } +      # CHUNKED SUPPORT      if (bereq.http.x-range) {        set bereq.http.Range = bereq.http.x-range;      } + +    if (bereq.retries == 0) { +        # Clean up the X-Varnish-Backend-503 flag that is used internally +        # to mark broken backend responses that should be retried. +        unset bereq.http.X-Varnish-Backend-503; +    } else { +        if (bereq.http.X-Varnish-Backend-503) { +            if (bereq.method != "POST" && +              std.healthy(bereq.backend) && +              bereq.retries <= 4) { +              # Flush broken backend response flag & try again. +              unset bereq.http.X-Varnish-Backend-503; +            } else { +              return (abandon); +            } +        } +    }  }  sub vcl_deliver { @@ -145,3 +139,9 @@ sub vcl_deliver {        unset resp.http.CR;      }  } + +sub vcl_backend_error { +    # Retry broken backend responses. +    set bereq.http.X-Varnish-Backend-503 = "1"; +    return (retry); +} | 
