This is an automated email from the ASF dual-hosted git repository.

btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit 172bf5b4609520bf43ad21d5d69a522200899f6b
Author: Benoit Tellier <[email protected]>
AuthorDate: Fri Jan 28 11:50:02 2022 +0700

    JAMES-3683 Document the use of the Redis rate limiter
---
 server/mailet/rate-limiter-redis/README.adoc       |  43 ++++++
 .../mailet/rate-limiter-redis/docker-compose.yml   |  17 ++
 .../rate-limiter-redis/extensions.properties       |   1 +
 .../mailet/rate-limiter-redis/mailetcontainer.xml  | 171 +++++++++++++++++++++
 4 files changed, 232 insertions(+)

diff --git a/server/mailet/rate-limiter-redis/README.adoc 
b/server/mailet/rate-limiter-redis/README.adoc
new file mode 100644
index 0000000..404c455
--- /dev/null
+++ b/server/mailet/rate-limiter-redis/README.adoc
@@ -0,0 +1,43 @@
+= Distributed Rate limiting for Apache James on top of Redis
+
+This package provides distributed rate limiting using Redis as a shared data 
store.
+
+It reuses work of xref:../rate-limiter/README.adoc[the Rate Limiter 
extensions] but substitute a Redis implementation
+for the underlying rate limiting.
+
+== Running rate limiting with the memory implementation
+
+- 1. Compile this project.
+- 2. Place the generated "jar with dependencies" in James `extensions-jars` 
folder.
+- 3. Configure James to use the redis implementation for Rate Limiting by 
putting the following content within
+`extension.properties`:
+
+----
+guice.extension.module=org.apache.james.rate.limiter.redis.R
+----
+
+- 4. Use the rate limiting mailets within `mailetcontainer.xml`
+
+We provide a sample `docker-compose` demonstrating this setup.
+
+== Additionnal mailet parameters
+
+Mailets need to specify the `redisURL` tag.
+
+This consists in a list of urls to contact the Redis servers.
+
+Specifying a single URL will connect to a single Redis instance.
+
+Specifying a coma delimited list of URLs will connect to Redis as a cluster.
+
+Eg:
+
+```
+<mailet matcher="All" class="PerSenderRateLimit">
+    <redisURL>redis://localhost:6379</redisURL>
+    <keyPrefix>myPrefix</keyPrefix>
+    <duration>1h</duration>
+    <count>10</count>
+</mailet>
+``
+
diff --git a/server/mailet/rate-limiter-redis/docker-compose.yml 
b/server/mailet/rate-limiter-redis/docker-compose.yml
new file mode 100644
index 0000000..d21bf4c
--- /dev/null
+++ b/server/mailet/rate-limiter-redis/docker-compose.yml
@@ -0,0 +1,17 @@
+version: '3'
+
+services:
+
+  redis:
+    image: redis:6.2.6
+
+  james:
+    image: apache/james:memory-latest
+    depends_on:
+      - redis
+    container_name: james
+    hostname: james.local
+    volumes:
+      - 
$PWD/target/james-server-rate-limiter-redis-3.7.0-SNAPSHOT-jar-with-dependencies.jar:/root/extensions-jars/james-server-rate-limiter-redis.jar
+      - $PWD/extensions.properties:/root/conf/extensions.properties
+      - $PWD/mailetcontainer.xml:/root/conf/mailetcontainer.xml
diff --git a/server/mailet/rate-limiter-redis/extensions.properties 
b/server/mailet/rate-limiter-redis/extensions.properties
new file mode 100644
index 0000000..bf6f821
--- /dev/null
+++ b/server/mailet/rate-limiter-redis/extensions.properties
@@ -0,0 +1 @@
+guice.extension.module=org.apache.james.rate.limiter.redis.RedisRateLimiterModule
\ No newline at end of file
diff --git a/server/mailet/rate-limiter-redis/mailetcontainer.xml 
b/server/mailet/rate-limiter-redis/mailetcontainer.xml
new file mode 100644
index 0000000..1dd804c
--- /dev/null
+++ b/server/mailet/rate-limiter-redis/mailetcontainer.xml
@@ -0,0 +1,171 @@
+<?xml version="1.0"?>
+
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+ -->
+
+<!-- Read https://james.apache.org/server/config-mailetcontainer.html for 
further details -->
+
+<mailetcontainer enableJmx="true">
+
+    <context>
+        <!-- When the domain part of the postmaster mailAddress is missing, 
the default domain is appended.
+        You can configure it to (for example) 
<postmaster>[email protected]</postmaster> -->
+        <postmaster>postmaster</postmaster>
+    </context>
+
+    <spooler>
+        <threads>20</threads>
+        <errorRepository>memory://var/mail/error/</errorRepository>
+    </spooler>
+
+    <processors>
+        <processor state="root" enableJmx="true">
+            <mailet match="All" class="PostmasterAlias"/>
+            <mailet match="RelayLimit=30" class="Null"/>
+            <mailet match="All" class="ToProcessor">
+                <processor>transport</processor>
+            </mailet>
+        </processor>
+
+        <processor state="error" enableJmx="true">
+            <mailet match="All" class="MetricsMailet">
+                <metricName>mailetContainerErrors</metricName>
+            </mailet>
+            <mailet match="All" class="Bounce">
+                <onMailetException>ignore</onMailetException>
+            </mailet>
+            <mailet match="All" class="ToRepository">
+                <repositoryPath>memory://var/mail/error/</repositoryPath>
+                <onMailetException>propagate</onMailetException>
+            </mailet>
+        </processor>
+
+        <processor state="transport" enableJmx="true">
+            <matcher name="relay-allowed" 
match="org.apache.james.mailetcontainer.impl.matchers.Or">
+                <matcher match="SMTPAuthSuccessful"/>
+                <matcher match="SMTPIsAuthNetwork"/>
+                <matcher match="SentByMailet"/>
+                <matcher match="org.apache.james.jmap.mailet.SentByJmap"/>
+            </matcher>
+
+            <mailet match="All" class="RemoveMimeHeader">
+                <name>bcc</name>
+                <onMailetException>ignore</onMailetException>
+            </mailet>
+            <mailet match="All" class="RecipientRewriteTable">
+                <errorProcessor>rrt-error</errorProcessor>
+            </mailet>
+            <mailet match="RecipientIsLocal" class="ToProcessor">
+                <processor>local-delivery</processor>
+            </mailet>
+            <mailet match="HostIsLocal" class="ToProcessor">
+                <processor>local-address-error</processor>
+                <notice>550 - Requested action not taken: no such user 
here</notice>
+            </mailet>
+            <mailet match="relay-allowed" class="ToProcessor">
+                <processor>relay</processor>
+            </mailet>
+            <mailet match="All" class="ToProcessor">
+                <processor>relay-denied</processor>
+            </mailet>
+        </processor>
+
+        <processor state="local-delivery" enableJmx="true">
+            <mailet match="All" class="VacationMailet">
+                <onMailetException>ignore</onMailetException>
+            </mailet>
+            <mailet match="All" class="Sieve">
+                <onMailetException>ignore</onMailetException>
+            </mailet>
+            <mailet match="All" class="AddDeliveredToHeader"/>
+            <mailet match="All" 
class="org.apache.james.jmap.mailet.filter.JMAPFiltering">
+                <onMailetException>ignore</onMailetException>
+            </mailet>
+            <mailet match="All" class="LocalDelivery"/>
+        </processor>
+
+        <processor state="relay" enableJmx="true">
+            <mailet matcher="All" class="PerSenderRateLimit">
+                <redisURL>redis://redis:6379</redisURL>
+                <keyPrefix>myPrefix</keyPrefix>
+                <duration>1h</duration>
+                <count>10</count>
+                <recipients>20</recipients>
+                <size>100M</size>
+                <totalSize>200M</totalSize>
+            </mailet>
+            <mailet match="All" class="RemoteDelivery">
+                <outgoingQueue>outgoing</outgoingQueue>
+                <delayTime>5000, 100000, 500000</delayTime>
+                <maxRetries>3</maxRetries>
+                <maxDnsProblemRetries>0</maxDnsProblemRetries>
+                <deliveryThreads>10</deliveryThreads>
+                <sendpartial>true</sendpartial>
+                <bounceProcessor>bounces</bounceProcessor>
+            </mailet>
+        </processor>
+
+        <processor state="local-address-error" enableJmx="true">
+            <mailet match="All" class="MetricsMailet">
+                <metricName>mailetContainerLocalAddressError</metricName>
+            </mailet>
+            <mailet match="All" class="Bounce">
+                <attachment>none</attachment>
+            </mailet>
+            <mailet match="All" class="ToRepository">
+                
<repositoryPath>memory://var/mail/address-error/</repositoryPath>
+            </mailet>
+        </processor>
+
+        <processor state="relay-denied" enableJmx="true">
+            <mailet match="All" class="MetricsMailet">
+                <metricName>mailetContainerRelayDenied</metricName>
+            </mailet>
+            <mailet match="All" class="Bounce">
+                <attachment>none</attachment>
+            </mailet>
+            <mailet match="All" class="ToRepository">
+                
<repositoryPath>memory://var/mail/relay-denied/</repositoryPath>
+                <notice>Warning: You are sending an e-mail to a remote server. 
You must be authenticated to perform such an operation</notice>
+            </mailet>
+        </processor>
+
+        <processor state="bounces" enableJmx="true">
+            <mailet match="All" class="MetricsMailet">
+                <metricName>bounces</metricName>
+            </mailet>
+            <mailet match="All" class="DSNBounce">
+                <passThrough>false</passThrough>
+            </mailet>
+        </processor>
+
+        <processor state="rrt-error" enableJmx="false">
+            <mailet match="All" class="ToRepository">
+                <repositoryPath>memory://var/mail/rrt-error/</repositoryPath>
+                <passThrough>true</passThrough>
+            </mailet>
+            <mailet match="IsSenderInRRTLoop" class="Null"/>
+            <mailet match="All" class="Bounce"/>
+        </processor>
+
+    </processors>
+
+</mailetcontainer>
+
+

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to