Sync iRedMail upgrade tutorial.

Sync iRedAdmin-Pro RESTful API doc.
This commit is contained in:
Zhang Huangbin 2019-07-09 16:24:42 +08:00
parent 8db79c0e97
commit 325992eaa2
6 changed files with 211 additions and 25 deletions

View File

@ -24,7 +24,7 @@ sql> INSERT INTO domain_admins (username, domain) VALUES ('john@example.com', 'A
That's it, you can now login to iRedAdmin as `john@example.com` (with `john@example.com`'s password).
To promote user `smith@test.com` to be admin of domain `test.com`:
To promote user `smith@test.com` to be admin of domain `test.com` (Note: normal domain admin is only available in iRedAdmin-Pro):
```
sql> USE vmail;

View File

@ -721,9 +721,9 @@ Notes:
### Whitelisting and Blacklisting {: .toggle }
Valid whitelisting and blacklisting addresses:
Valid whitelisting and blacklisting addresses. __Invalid addresses will be discarded silently.__
Address | Samples
Address | Examples
--- |---
Single IP Address | `192.168.2.10`
IP CIDR Network | `192.168.2.0/24`, `2620:0:2d0:200::7/128`
@ -732,29 +732,61 @@ Entire email domain | `@domain.ltd`
Entire email domain and all its sub-domains | `@.domain.ltd`
Catch-all address | `@.`
Invalid addresses will be discarded silently.
<br/>
!!! api "`GET`{: .get } `/api/wblist/inbound/whitelist/global`{: .url } `Get global whitelists for inbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/inbound/blacklist/global`{: .url } `Get global blacklists for inbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/outbound/whitelist/global`{: .url } `Get global whitelists for outbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/outbound/blacklist/global`{: .url } `Get global whitelists for outbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/inbound/whitelist/<domain>`{: .url } `Get per-domain whitelists for inbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/inbound/blacklist/<domain>`{: .url } `Get per-domain blacklists for inbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/outbound/whitelist/<domain>`{: .url } `Get per-domain whitelists for outbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/outbound/blacklist/<domain>`{: .url } `Get per-domain whitelists for outbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/inbound/whitelist/<mail>`{: .url } `Get per-user whitelists for inbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/inbound/blacklist/<mail>`{: .url } `Get per-user blacklists for inbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/outbound/whitelist/<mail>`{: .url } `Get per-user whitelists for outbound.`{: .comment }"
!!! api "`GET`{: .get } `/api/wblist/outbound/blacklist/<mail>`{: .url } `Get per-user whitelists for outbound.`{: .comment }"
!!! api "`POST`{: .post } `/api/wblist/inbound/whitelist/global`{: .url } `Add new global whitelists for inbound.`{: .comment }"
!!! api "`POST`{: .post } `/api/wblist/inbound/blacklist/global`{: .url } `Add new global blacklists for inbound.`{: .comment }"
!!! api "`POST`{: .post } `/api/wblist/outbound/whitelist/global`{: .url } `Add new global whitelists for outbound.`{: .comment }"
!!! api "`POST`{: .post } `/api/wblist/outbound/blacklist/global`{: .url } `Add new global whitelists for outbound.`{: .comment }"
!!! api "`POST`{: .post } `/api/wblist/inbound/whitelist/global`{: .url } `Add new global whitelists for inbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/inbound/blacklist/global`{: .url } `Add new global blacklists for inbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/outbound/whitelist/global`{: .url } `Add new global whitelists for outbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/outbound/blacklist/global`{: .url } `Add new global whitelists for outbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/inbound/whitelist/<domain>`{: .url } `Add new per-domain whitelists for inbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/inbound/blacklist/<domain>`{: .url } `Add new per-domain blacklists for inbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/outbound/whitelist/<domain>`{: .url } `Add new per-domain whitelists for outbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/outbound/blacklist/<domain>`{: .url } `Add new per-domain whitelists for outbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/inbound/whitelist/<mail>`{: .url } `Add new per-user whitelists for inbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/inbound/blacklist/<mail>`{: .url } `Add new per-user blacklists for inbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/outbound/whitelist/<mail>`{: .url } `Add new per-user whitelists for outbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`POST`{: .post } `/api/wblist/outbound/blacklist/<mail>`{: .url } `Add new per-user whitelists for outbound.`{: .comment } `Parameters`{: .has_params_wblist }"
!!! api "`PUT`{: .put } `/api/wblist/inbound/whitelist/global`{: .url } `Delete given global whitelists for inbound.`{: .comment }"
!!! api "`PUT`{: .put } `/api/wblist/inbound/blacklist/global`{: .url } `Delete given global blacklists for inbound.`{: .comment }"
!!! api "`PUT`{: .put } `/api/wblist/outbound/whitelist/global`{: .url } `Delete given global whitelists for outbound.`{: .comment }"
!!! api "`PUT`{: .put } `/api/wblist/outbound/blacklist/global`{: .url } `Delete given global whitelists for outbound.`{: .comment }"
<div class="params params_wblist">
Parameters available for global, per-domain and per-user whitelist/blacklist settings.
Parameter | Summary | Sample Usage
--- |--- |---
`addresses` | The addresses you want to whitelist or blacklist.<br/>Multiple addresses must be separated by comma. | `addresses=user1@domain.com,192.168.1.10`
</div>
!!! api "`PUT`{: .put } `/api/wblist/inbound/whitelist/global`{: .url } `Delete existing global whitelists for inbound.`{: .comment }"
!!! api "`PUT`{: .put } `/api/wblist/inbound/blacklist/global`{: .url } `Delete existing global blacklists for inbound.`{: .comment }"
!!! api "`PUT`{: .put } `/api/wblist/outbound/whitelist/global`{: .url } `Delete existing global whitelists for outbound.`{: .comment }"
!!! api "`PUT`{: .put } `/api/wblist/outbound/blacklist/global`{: .url } `Delete existing global whitelists for outbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/inbound/whitelist/global`{: .url } `Delete all existing global whitelists for inbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/inbound/blacklist/global`{: .url } `Delete all existing global blacklists for inbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/outbound/whitelist/global`{: .url } `Delete all existing global whitelists for outbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/outbound/blacklist/global`{: .url } `Delete all existing global whitelists for outbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/inbound/whitelist/<domain>`{: .url } `Delete all per-domain global whitelists for inbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/inbound/blacklist/<domain>`{: .url } `Delete all per-domain global blacklists for inbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/outbound/whitelist/<domain>`{: .url } `Delete all per-domain existing global whitelists for outbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/outbound/blacklist/<domain>`{: .url } `Delete all per-domain existing global whitelists for outbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/inbound/whitelist/<mail>`{: .url } `Delete all per-user existing global whitelists for inbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/inbound/blacklist/<mail>`{: .url } `Delete all per-user existing global blacklists for inbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/outbound/whitelist/<mail>`{: .url } `Delete all per-user existing global whitelists for outbound.`{: .comment }"
!!! api "`DELETE`{: .delete } `/api/wblist/outbound/blacklist/<mail>`{: .url } `Delete all per-user existing global whitelists for outbound.`{: .comment }"
### Greylisting {: .toggle }

View File

@ -77,6 +77,37 @@ latest stable release immediately:
If you have netdata installed, you can upgrade it by following this tutorial: [Upgrade netdata](./upgrade.netdata.html).
### Fixed: improper order of Postfix smtpd_sender_restriction rules
iRedMail-0.9.9 and earlier releases didn't configure Postfix to apply custom
restriction rule before querying DNS records of sender domain,
this way you cannot whitelist some sender mail domains which don't have
DNS records (especially your internal mail domains used in LAN). Please follow
steps below to fix it.
* Open file `/etc/postfix/main.cf` (Linux/OpenBSD) or
`/usr/local/etc/postfix/main.cf` (FreeBSD), find parameter
`smtpd_sender_restrictions` like below:
```
smtpd_sender_restrictions =
reject_unknown_sender_domain
...
check_sender_access pcre:...
```
* Move the `reject_unknown_sender_domain` line after `check_sender_access` line
like below:
```
smtpd_sender_restrictions =
...
check_sender_access pcre:...
reject_unknown_sender_domain
```
* Reloading or restarting Postfix service is required.
### Fail2ban: slightly loose filter rule for postfix
We received few reports from clients that Outlook for macOS may trigger some

View File

@ -2192,12 +2192,12 @@ to be a domain admin.</p>
</div>
<h3 class="toggle" id="whitelisting-and-blacklisting">Whitelisting and Blacklisting</h3>
<p>Valid whitelisting and blacklisting addresses:</p>
<p>Valid whitelisting and blacklisting addresses. <strong>Invalid addresses will be discarded silently.</strong></p>
<table>
<thead>
<tr>
<th>Address</th>
<th>Samples</th>
<th>Examples</th>
</tr>
</thead>
<tbody>
@ -2227,7 +2227,6 @@ to be a domain admin.</p>
</tr>
</tbody>
</table>
<p>Invalid addresses will be discarded silently.</p>
<p><br/></p>
<div class="admonition api">
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/inbound/whitelist/global</code> <code class="comment">Get global whitelists for inbound.</code></p>
@ -2242,28 +2241,97 @@ to be a domain admin.</p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/outbound/blacklist/global</code> <code class="comment">Get global whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/inbound/whitelist/global</code> <code class="comment">Add new global whitelists for inbound.</code></p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/inbound/whitelist/&lt;domain&gt;</code> <code class="comment">Get per-domain whitelists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/inbound/blacklist/global</code> <code class="comment">Add new global blacklists for inbound.</code></p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/inbound/blacklist/&lt;domain&gt;</code> <code class="comment">Get per-domain blacklists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/outbound/whitelist/global</code> <code class="comment">Add new global whitelists for outbound.</code></p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/outbound/whitelist/&lt;domain&gt;</code> <code class="comment">Get per-domain whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/outbound/blacklist/global</code> <code class="comment">Add new global whitelists for outbound.</code></p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/outbound/blacklist/&lt;domain&gt;</code> <code class="comment">Get per-domain whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="put">PUT</code> <code class="url">/api/wblist/inbound/whitelist/global</code> <code class="comment">Delete given global whitelists for inbound.</code></p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/inbound/whitelist/&lt;mail&gt;</code> <code class="comment">Get per-user whitelists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="put">PUT</code> <code class="url">/api/wblist/inbound/blacklist/global</code> <code class="comment">Delete given global blacklists for inbound.</code></p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/inbound/blacklist/&lt;mail&gt;</code> <code class="comment">Get per-user blacklists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="put">PUT</code> <code class="url">/api/wblist/outbound/whitelist/global</code> <code class="comment">Delete given global whitelists for outbound.</code></p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/outbound/whitelist/&lt;mail&gt;</code> <code class="comment">Get per-user whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="put">PUT</code> <code class="url">/api/wblist/outbound/blacklist/global</code> <code class="comment">Delete given global whitelists for outbound.</code></p>
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/wblist/outbound/blacklist/&lt;mail&gt;</code> <code class="comment">Get per-user whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/inbound/whitelist/global</code> <code class="comment">Add new global whitelists for inbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/inbound/blacklist/global</code> <code class="comment">Add new global blacklists for inbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/outbound/whitelist/global</code> <code class="comment">Add new global whitelists for outbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/outbound/blacklist/global</code> <code class="comment">Add new global whitelists for outbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/inbound/whitelist/&lt;domain&gt;</code> <code class="comment">Add new per-domain whitelists for inbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/inbound/blacklist/&lt;domain&gt;</code> <code class="comment">Add new per-domain blacklists for inbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/outbound/whitelist/&lt;domain&gt;</code> <code class="comment">Add new per-domain whitelists for outbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/outbound/blacklist/&lt;domain&gt;</code> <code class="comment">Add new per-domain whitelists for outbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/inbound/whitelist/&lt;mail&gt;</code> <code class="comment">Add new per-user whitelists for inbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/inbound/blacklist/&lt;mail&gt;</code> <code class="comment">Add new per-user blacklists for inbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/outbound/whitelist/&lt;mail&gt;</code> <code class="comment">Add new per-user whitelists for outbound.</code> <code class="has_params_wblist">Parameters</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="post">POST</code> <code class="url">/api/wblist/outbound/blacklist/&lt;mail&gt;</code> <code class="comment">Add new per-user whitelists for outbound.</code> <code class="has_params_wblist">Parameters</code></p>
<div class="params params_wblist">
<p>Parameters available for global, per-domain and per-user whitelist/blacklist settings.</p>
<table>
<thead>
<tr>
<th>Parameter</th>
<th>Summary</th>
<th>Sample Usage</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>addresses</code></td>
<td>The addresses you want to whitelist or blacklist.<br/>Multiple addresses must be separated by comma.</td>
<td><code>addresses=user1@domain.com,192.168.1.10</code></td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="put">PUT</code> <code class="url">/api/wblist/inbound/whitelist/global</code> <code class="comment">Delete existing global whitelists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="put">PUT</code> <code class="url">/api/wblist/inbound/blacklist/global</code> <code class="comment">Delete existing global blacklists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="put">PUT</code> <code class="url">/api/wblist/outbound/whitelist/global</code> <code class="comment">Delete existing global whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="put">PUT</code> <code class="url">/api/wblist/outbound/blacklist/global</code> <code class="comment">Delete existing global whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/inbound/whitelist/global</code> <code class="comment">Delete all existing global whitelists for inbound.</code></p>
@ -2277,6 +2345,30 @@ to be a domain admin.</p>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/outbound/blacklist/global</code> <code class="comment">Delete all existing global whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/inbound/whitelist/&lt;domain&gt;</code> <code class="comment">Delete all per-domain global whitelists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/inbound/blacklist/&lt;domain&gt;</code> <code class="comment">Delete all per-domain global blacklists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/outbound/whitelist/&lt;domain&gt;</code> <code class="comment">Delete all per-domain existing global whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/outbound/blacklist/&lt;domain&gt;</code> <code class="comment">Delete all per-domain existing global whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/inbound/whitelist/&lt;mail&gt;</code> <code class="comment">Delete all per-user existing global whitelists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/inbound/blacklist/&lt;mail&gt;</code> <code class="comment">Delete all per-user existing global blacklists for inbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/outbound/whitelist/&lt;mail&gt;</code> <code class="comment">Delete all per-user existing global whitelists for outbound.</code></p>
</div>
<div class="admonition api">
<p class="admonition-title"><code class="delete">DELETE</code> <code class="url">/api/wblist/outbound/blacklist/&lt;mail&gt;</code> <code class="comment">Delete all per-user existing global whitelists for outbound.</code></p>
</div>
<h3 class="toggle" id="greylisting">Greylisting</h3>
<div class="admonition api">
<p class="admonition-title"><code class="get">GET</code> <code class="url">/api/greylisting/all</code> <code class="comment">Get all existing greylisting settings</code></p>

View File

@ -46,7 +46,7 @@ sql&gt; INSERT INTO domain_admins (username, domain) VALUES ('john@example.com',
</code></pre>
<p>That's it, you can now login to iRedAdmin as <code>john@example.com</code> (with <code>john@example.com</code>'s password).</p>
<p>To promote user <code>smith@test.com</code> to be admin of domain <code>test.com</code>:</p>
<p>To promote user <code>smith@test.com</code> to be admin of domain <code>test.com</code> (Note: normal domain admin is only available in iRedAdmin-Pro):</p>
<pre><code>sql&gt; USE vmail;
sql&gt; UPDATE mailbox SET isadmin=1, isglobaladmin=0 WHERE username='smith@test.com';
sql&gt; INSERT INTO domain_admins (username, domain) VALUES ('smith@test.com', 'test.com');

View File

@ -27,6 +27,7 @@
<li><a href="#upgrade-mlmmjadmin-to-the-latest-stable-release-21">Upgrade mlmmjadmin to the latest stable release (2.1)</a></li>
<li><a href="#upgrade-roundcube-webmail-to-the-latest-stable-release">Upgrade Roundcube webmail to the latest stable release</a></li>
<li><a href="#upgrade-netdata-to-the-latest-stable-release-1150">Upgrade netdata to the latest stable release (1.15.0)</a></li>
<li><a href="#fixed-improper-order-of-postfix-smtpd_sender_restriction-rules">Fixed: improper order of Postfix smtpd_sender_restriction rules</a></li>
<li><a href="#fail2ban-slightly-loose-filter-rule-for-postfix">Fail2ban: slightly loose filter rule for postfix</a></li>
<li><a href="#optional-enable-srs-sender-rewriting-scheme-support-in-postfix">[OPTIONAL] Enable SRS (Sender Rewriting Scheme) support in Postfix</a></li>
</ul>
@ -96,6 +97,36 @@ latest stable release immediately:</p>
</ul>
<h3 id="upgrade-netdata-to-the-latest-stable-release-1150">Upgrade netdata to the latest stable release (1.15.0)</h3>
<p>If you have netdata installed, you can upgrade it by following this tutorial: <a href="./upgrade.netdata.html">Upgrade netdata</a>.</p>
<h3 id="fixed-improper-order-of-postfix-smtpd_sender_restriction-rules">Fixed: improper order of Postfix smtpd_sender_restriction rules</h3>
<p>iRedMail-0.9.9 and earlier releases didn't configure Postfix to apply custom
restriction rule before querying DNS records of sender domain,
this way you cannot whitelist some sender mail domains which don't have
DNS records (especially your internal mail domains used in LAN). Please follow
steps below to fix it.</p>
<ul>
<li>Open file <code>/etc/postfix/main.cf</code> (Linux/OpenBSD) or
<code>/usr/local/etc/postfix/main.cf</code> (FreeBSD), find parameter
<code>smtpd_sender_restrictions</code> like below:</li>
</ul>
<pre><code>smtpd_sender_restrictions =
reject_unknown_sender_domain
...
check_sender_access pcre:...
</code></pre>
<ul>
<li>Move the <code>reject_unknown_sender_domain</code> line after <code>check_sender_access</code> line
like below:</li>
</ul>
<pre><code>smtpd_sender_restrictions =
...
check_sender_access pcre:...
reject_unknown_sender_domain
</code></pre>
<ul>
<li>Reloading or restarting Postfix service is required.</li>
</ul>
<h3 id="fail2ban-slightly-loose-filter-rule-for-postfix">Fail2ban: slightly loose filter rule for postfix</h3>
<p>We received few reports from clients that Outlook for macOS may trigger some
unexpected smtp errors, and caught by the Fail2ban filter rules shipped by