Dieser Commit ist enthalten in:
milkmaker 2022-04-24 17:19:35 +00:00
Ursprung 9e13fa5c3b
Commit 64d42d3266
206 geänderte Dateien mit 8735 neuen und 5652 gelöschten Zeilen

Datei anzeigen

@ -2428,9 +2428,8 @@
<p>To restore make sure you are actually restoring to the same mailcow it was deleted from or you use the same encryption keys in <code>crypt-vol-1</code>.</p>
<p><strong>Make sure the user you want to restore exists in your mailcow</strong>. Re-create them if they are missing.</p>
<p>Copy the folders from <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/_garbage/[timestamp]_[domain_sanitized][user_sanitized]</code> back to <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/[domain]/[user]</code> and resync the folder and recalc the quota:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm force-resync -u restoreme@example.net &#39;*&#39;
docker-compose exec dovecot-mailcow doveadm quota recalc -u restoreme@example.net
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm force-resync -u restoreme@example.net '*'
docker-compose exec dovecot-mailcow doveadm quota recalc -u restoreme@example.net</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -961,6 +961,47 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" class="md-nav__link">
./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
</a>
</li>
<li class="md-nav__item">
<a href="#backup-all-delete-backups-older-than-3-days" class="md-nav__link">
Backup all, delete backups older than 3 days
</a>
</li>
<li class="md-nav__item">
<a href="#backup-vmail-crypt-and-mysql-data-delete-backups-older-than-30-days" class="md-nav__link">
Backup vmail, crypt and mysql data, delete backups older than 30 days
</a>
</li>
<li class="md-nav__item">
<a href="#backup-vmail" class="md-nav__link">
Backup vmail
</a>
<nav class="md-nav" aria-label="Backup vmail">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cronjob" class="md-nav__link">
Cronjob
@ -971,6 +1012,34 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binsh" class="md-nav__link">
!/bin/sh
</a>
</li>
<li class="md-nav__item">
<a href="#backup-mailcow-data" class="md-nav__link">
Backup mailcow data
</a>
</li>
<li class="md-nav__item">
<a href="#httpsmailcowgithubiomailcow-dockerized-docsbackup_restoreb_n_r-backup" class="md-nav__link">
https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/
</a>
</li>
<li class="md-nav__item">
<a href="#run-command" class="md-nav__link">
run command
</a>
</li>
<li class="md-nav__item">
@ -978,6 +1047,13 @@
Backup strategy with rsync and mailcow backup script
</a>
</li>
<li class="md-nav__item">
<a href="#if-you-want-to-use-the-acl-util-to-backup-permissions-of-someall-foldersfiles-getfacl-rn-path" class="md-nav__link">
If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path
</a>
</li>
</ul>
@ -2411,6 +2487,47 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" class="md-nav__link">
./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
</a>
</li>
<li class="md-nav__item">
<a href="#backup-all-delete-backups-older-than-3-days" class="md-nav__link">
Backup all, delete backups older than 3 days
</a>
</li>
<li class="md-nav__item">
<a href="#backup-vmail-crypt-and-mysql-data-delete-backups-older-than-30-days" class="md-nav__link">
Backup vmail, crypt and mysql data, delete backups older than 30 days
</a>
</li>
<li class="md-nav__item">
<a href="#backup-vmail" class="md-nav__link">
Backup vmail
</a>
<nav class="md-nav" aria-label="Backup vmail">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cronjob" class="md-nav__link">
Cronjob
@ -2421,6 +2538,34 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binsh" class="md-nav__link">
!/bin/sh
</a>
</li>
<li class="md-nav__item">
<a href="#backup-mailcow-data" class="md-nav__link">
Backup mailcow data
</a>
</li>
<li class="md-nav__item">
<a href="#httpsmailcowgithubiomailcow-dockerized-docsbackup_restoreb_n_r-backup" class="md-nav__link">
https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/
</a>
</li>
<li class="md-nav__item">
<a href="#run-command" class="md-nav__link">
run command
</a>
</li>
<li class="md-nav__item">
@ -2428,6 +2573,13 @@
Backup strategy with rsync and mailcow backup script
</a>
</li>
<li class="md-nav__item">
<a href="#if-you-want-to-use-the-acl-util-to-backup-permissions-of-someall-foldersfiles-getfacl-rn-path" class="md-nav__link">
If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path
</a>
</li>
</ul>
@ -2454,65 +2606,57 @@
<p>Please do not copy this script to another location.</p>
<p>To run a backup, write "backup" as first parameter and either one or more components to backup as following parameters.
You can also use "all" as second parameter to backup all components. Append <code>--delete-days n</code> to delete backups older than n days.</p>
<div class="highlight"><pre><span></span><code># Syntax:
# ./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
# Backup all, delete backups older than 3 days
./helper-scripts/backup_and_restore.sh backup all --delete-days 3
# Backup vmail, crypt and mysql data, delete backups older than 30 days
./helper-scripts/backup_and_restore.sh backup vmail crypt mysql --delete-days 30
# Backup vmail
./helper-scripts/backup_and_restore.sh backup vmail
</code></pre></div>
<p>```</p>
<h1 id="syntax">Syntax:<a class="headerlink" href="#syntax" title="Permanent link">&para;</a></h1>
<h1 id="helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days">./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)<a class="headerlink" href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" title="Permanent link">&para;</a></h1>
<h1 id="backup-all-delete-backups-older-than-3-days">Backup all, delete backups older than 3 days<a class="headerlink" href="#backup-all-delete-backups-older-than-3-days" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup all --delete-days 3</p>
<h1 id="backup-vmail-crypt-and-mysql-data-delete-backups-older-than-30-days">Backup vmail, crypt and mysql data, delete backups older than 30 days<a class="headerlink" href="#backup-vmail-crypt-and-mysql-data-delete-backups-older-than-30-days" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup vmail crypt mysql --delete-days 30</p>
<h1 id="backup-vmail">Backup vmail<a class="headerlink" href="#backup-vmail" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup vmail</p>
<p>```</p>
<p>The script will ask you for a backup location. Inside of this location it will create folders in the format "mailcow_DATE".
You should not rename those folders to not break the restore process.</p>
<p>To run a backup unattended, define MAILCOW_BACKUP_LOCATION as environment variable before starting the script:</p>
<div class="highlight"><pre><span></span><code>MAILCOW_BACKUP_LOCATION=/opt/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all
</code></pre></div>
<p><code>MAILCOW_BACKUP_LOCATION=/opt/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all</code></p>
<h4 id="cronjob">Cronjob<a class="headerlink" href="#cronjob" title="Permanent link">&para;</a></h4>
<p>You can run the backup script regularly via cronjob. Make sure <code>BACKUP_LOCATION</code> exists:</p>
<div class="highlight"><pre><span></span><code>5 4 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/mnt/mailcow_backups /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3
</code></pre></div>
<p><code>5 4 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/mnt/mailcow_backups /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3</code></p>
<p>Per default cron sends the full result of each backup operation by email. If you want cron to only mail on error (non-zero exit code) you may want to use the following snippet. Pathes need to be modified according to your setup (this script is a user contribution).</p>
<p>This following script may be placed in <code>/etc/cron.daily/mailcow-backup</code> - do not forget to mark it as executable via <code>chmod +x</code>:</p>
<div class="highlight"><pre><span></span><code>#!/bin/sh
# Backup mailcow data
# https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/
set -e
OUT=&quot;$(mktemp)&quot;
export MAILCOW_BACKUP_LOCATION=&quot;/opt/backup&quot;
SCRIPT=&quot;/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh&quot;
PARAMETERS=&quot;backup all&quot;
OPTIONS=&quot;--delete-days 30&quot;
# run command
set +e
&quot;${SCRIPT}&quot; ${PARAMETERS} ${OPTIONS} 2&gt;&amp;1 &gt; &quot;$OUT&quot;
RESULT=$?
if [ $RESULT -ne 0 ]
<p>```</p>
<h1 id="binsh">!/bin/sh<a class="headerlink" href="#binsh" title="Permanent link">&para;</a></h1>
<h1 id="backup-mailcow-data">Backup mailcow data<a class="headerlink" href="#backup-mailcow-data" title="Permanent link">&para;</a></h1>
<h1 id="httpsmailcowgithubiomailcow-dockerized-docsbackup_restoreb_n_r-backup"><a href="https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/">https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/</a><a class="headerlink" href="#httpsmailcowgithubiomailcow-dockerized-docsbackup_restoreb_n_r-backup" title="Permanent link">&para;</a></h1>
<p>set -e</p>
<p>OUT="$(mktemp)"
export MAILCOW_BACKUP_LOCATION="/opt/backup"
SCRIPT="/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh"
PARAMETERS="backup all"
OPTIONS="--delete-days 30"</p>
<h1 id="run-command">run command<a class="headerlink" href="#run-command" title="Permanent link">&para;</a></h1>
<p>set +e
"${SCRIPT}" ${PARAMETERS} ${OPTIONS} 2&gt;&amp;1 &gt; "$OUT"
RESULT=$?</p>
<p>if [ $RESULT -ne 0 ]
then
echo &quot;${SCRIPT} ${PARAMETERS} ${OPTIONS} encounters an error:&quot;
echo &quot;RESULT=$RESULT&quot;
echo &quot;STDOUT / STDERR:&quot;
cat &quot;$OUT&quot;
echo "${SCRIPT} ${PARAMETERS} ${OPTIONS} encounters an error:"
echo "RESULT=$RESULT"
echo "STDOUT / STDERR:"
cat "$OUT"
fi
</code></pre></div>
```</p>
<h1 id="backup-strategy-with-rsync-and-mailcow-backup-script">Backup strategy with rsync and mailcow backup script<a class="headerlink" href="#backup-strategy-with-rsync-and-mailcow-backup-script" title="Permanent link">&para;</a></h1>
<p>Create the destination directory for mailcows helper script:
<div class="highlight"><pre><span></span><code>mkdir -p /external_share/backups/backup_script
</code></pre></div></p>
<code>mkdir -p /external_share/backups/backup_script</code></p>
<p>Create cronjobs:
<div class="highlight"><pre><span></span><code>25 1 * * * rsync -aH --delete /opt/mailcow-dockerized /external_share/backups/mailcow-dockerized
```
25 1 * * * rsync -aH --delete /opt/mailcow-dockerized /external_share/backups/mailcow-dockerized
40 2 * * * rsync -aH --delete /var/lib/docker/volumes /external_share/backups/var_lib_docker_volumes
5 4 * * * cd /opt/mailcow-dockerized/; BACKUP_LOCATION=/external_share/backups/backup_script /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3
# If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path
</code></pre></div></p>
5 4 * * * cd /opt/mailcow-dockerized/; BACKUP_LOCATION=/external_share/backups/backup_script /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3</p>
<h1 id="if-you-want-to-use-the-acl-util-to-backup-permissions-of-someall-foldersfiles-getfacl-rn-path">If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path<a class="headerlink" href="#if-you-want-to-use-the-acl-util-to-backup-permissions-of-someall-foldersfiles-getfacl-rn-path" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>On the destination (in this case <code>/external_share/backups</code>) you may want to have snapshot capabilities (ZFS, Btrfs etc.). Snapshot daily and keep for n days for a consistent backup.
Do <strong>not</strong> rsync to a Samba share, you need to keep the correct permissions!</p>
<p>To restore you'd simply need to run rsync the other way round and restart Docker to re-read the volumes. Run <code>docker-compose pull</code> and <code>docker-compose up -d</code>.</p>

Datei anzeigen

@ -2412,15 +2412,13 @@
<h3 id="backup">Backup<a class="headerlink" href="#backup" title="Permanent link">&para;</a></h3>
<p>This line backups the vmail directory to a file backup_vmail.tar.gz in the mailcow root directory:
<div class="highlight"><pre><span></span><code>cd /path/to/mailcow-dockerized
docker run --rm -i -v $(docker inspect --format &#39;{{ range .Mounts }}{{ if eq .Destination &quot;/var/vmail&quot; }}{{ .Name }}{{ end }}{{ end }}&#39; $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar cvfz /backup/backup_vmail.tar.gz /vmail
</code></pre></div></p>
<code>cd /path/to/mailcow-dockerized
docker run --rm -i -v $(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/var/vmail" }}{{ .Name }}{{ end }}{{ end }}' $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar cvfz /backup/backup_vmail.tar.gz /vmail</code></p>
<p>You can change the path by adjusting ${PWD} (which equals to the current directory) to any path you have write-access to.
Set the filename <code>backup_vmail.tar.gz</code> to any custom name, but leave the path as it is. Example: <code>[...] tar cvfz /backup/my_own_filename_.tar.gz</code></p>
<h3 id="restore">Restore<a class="headerlink" href="#restore" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>cd /path/to/mailcow-dockerized
docker run --rm -it -v $(docker inspect --format &#39;{{ range .Mounts }}{{ if eq .Destination &quot;/var/vmail&quot; }}{{ .Name }}{{ end }}{{ end }}&#39; $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar xvfz /backup/backup_vmail.tar.gz
</code></pre></div>
<p><code>cd /path/to/mailcow-dockerized
docker run --rm -it -v $(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/var/vmail" }}{{ .Name }}{{ end }}{{ end }}' $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar xvfz /backup/backup_vmail.tar.gz</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2411,20 +2411,18 @@
<h1>MySQL (mysqldump)</h1>
<h2 id="backup">Backup<a class="headerlink" href="#backup" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code>cd /path/to/mailcow-dockerized
<p><code>cd /path/to/mailcow-dockerized
source mailcow.conf
DATE=$(date +&quot;%Y%m%d_%H%M%S&quot;)
docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 -u${DBUSER} -p${DBPASS} ${DBNAME} &gt; backup_${DBNAME}_${DATE}.sql
</code></pre></div>
DATE=$(date +"%Y%m%d_%H%M%S")
docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 -u${DBUSER} -p${DBPASS} ${DBNAME} &gt; backup_${DBNAME}_${DATE}.sql</code></p>
<h2 id="restore">Restore<a class="headerlink" href="#restore" title="Permanent link">&para;</a></h2>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>You should redirect the SQL dump without <code>docker-compose</code> to prevent parsing errors.</p>
</div>
<div class="highlight"><pre><span></span><code>cd /path/to/mailcow-dockerized
<p><code>cd /path/to/mailcow-dockerized
source mailcow.conf
docker exec -i $(docker-compose ps -q mysql-mailcow) mysql -u${DBUSER} -p${DBPASS} ${DBNAME} &lt; backup_file.sql
</code></pre></div>
docker exec -i $(docker-compose ps -q mysql-mailcow) mysql -u${DBUSER} -p${DBPASS} ${DBNAME} &lt; backup_file.sql</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2459,10 +2459,9 @@
<p>You will need a SSH-enabled destination and a keyfile to connect to said destination. The key should not be protected by a password for the script to work unattended.</p>
<p>In your mailcow base directory, e.g. <code>/opt/mailcow-dockerized</code> you will find a file <code>create_cold_standby.sh</code>.</p>
<p>Edit this file and change the exported variables:</p>
<div class="highlight"><pre><span></span><code>export REMOTE_SSH_KEY=/path/to/keyfile
<p><code>export REMOTE_SSH_KEY=/path/to/keyfile
export REMOTE_SSH_PORT=22
export REMOTE_SSH_HOST=mailcow-backup.host.name
</code></pre></div>
export REMOTE_SSH_HOST=mailcow-backup.host.name</code></p>
<p>The key must be owned and readable by root only.</p>
<p>Both the source and destination require <code>rsync</code> &gt;= v3.1.0.
The destination must have Docker and docker-compose <strong>v1</strong> available.</p>
@ -2470,28 +2469,23 @@ The destination must have Docker and docker-compose <strong>v1</strong> availabl
<p>You may want to test the connection by running <code>ssh mailcow-backup.host.name -p22 -i /path/to/keyfile</code>.</p>
<h2 id="backup-and-refresh-the-cold-standby">Backup and refresh the cold-standby<a class="headerlink" href="#backup-and-refresh-the-cold-standby" title="Permanent link">&para;</a></h2>
<p>Run the first backup, this may take a while depending on the connection:</p>
<div class="highlight"><pre><span></span><code>bash /opt/mailcow-dockerized/create_cold_standby.sh
</code></pre></div>
<p><code>bash /opt/mailcow-dockerized/create_cold_standby.sh</code></p>
<p>That was easy, wasn't it?</p>
<p>Updating your cold-standby is just as easy:</p>
<div class="highlight"><pre><span></span><code>bash /opt/mailcow-dockerized/create_cold_standby.sh
</code></pre></div>
<p><code>bash /opt/mailcow-dockerized/create_cold_standby.sh</code></p>
<p>It's the same command.</p>
<h2 id="automated-backups-with-cron">Automated backups with cron<a class="headerlink" href="#automated-backups-with-cron" title="Permanent link">&para;</a></h2>
<p>First make sure that the <code>cron</code> service is enabled and running:</p>
<div class="highlight"><pre><span></span><code>systemctl enable cron.service &amp;&amp; systemctl start cron.service
</code></pre></div>
<p><code>systemctl enable cron.service &amp;&amp; systemctl start cron.service</code></p>
<p>To automate the backups to the cold-standby server you can use a cron job. To edit the cron jobs for the root user run:</p>
<div class="highlight"><pre><span></span><code>crontab -e
</code></pre></div>
<p><code>crontab -e</code></p>
<p>Add the following lines to synchronize the cold standby server daily at 03:00. In this example errors of the last execution are logged into a file.</p>
<div class="highlight"><pre><span></span><code>PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 3 * * * bash /opt/mailcow-dockerized/create_cold_standby.sh 2&gt; /var/log/mailcow-coldstandby-sync.log
</code></pre></div>
<p>```
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</p>
<p>0 3 * * * bash /opt/mailcow-dockerized/create_cold_standby.sh 2&gt; /var/log/mailcow-coldstandby-sync.log
```</p>
<p>If saved correctly, the cron job should be shown by typing:</p>
<div class="highlight"><pre><span></span><code>crontab -l
</code></pre></div>
<p><code>crontab -l</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -965,6 +965,20 @@
Restore
</a>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-restore" class="md-nav__link">
./helper-scripts/backup_and_restore.sh restore
</a>
</li>
</ul>
@ -2374,6 +2388,20 @@
Restore
</a>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-restore" class="md-nav__link">
./helper-scripts/backup_and_restore.sh restore
</a>
</li>
</ul>
@ -2394,14 +2422,13 @@
<h1>Restore</h1>
<h3 id="restore">Restore<a class="headerlink" href="#restore" title="Permanent link">&para;</a></h3>
<p>Please do not copy this script to another location.</p>
<p>To run a restore, <strong>start mailcow</strong>, use the script with "restore" as first parameter.</p>
<div class="highlight"><pre><span></span><code># Syntax:
# ./helper-scripts/backup_and_restore.sh restore
</code></pre></div>
<p>```</p>
<h1 id="syntax">Syntax:<a class="headerlink" href="#syntax" title="Permanent link">&para;</a></h1>
<h1 id="helper-scriptsbackup_and_restoresh-restore">./helper-scripts/backup_and_restore.sh restore<a class="headerlink" href="#helper-scriptsbackup_and_restoresh-restore" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>The script will ask you for a backup location containing the mailcow_DATE folders.</p>
<hr>

Datei anzeigen

@ -2428,9 +2428,8 @@
<p>Um die Mailbox wiederherzustellen, stellen Sie sicher, dass Sie tatsächlich auf die gleiche Mailcow wiederherstellen, von der sie gelöscht wurde, oder Sie verwenden die gleichen Verschlüsselungsschlüssel in <code>crypt-vol-1</code>.</p>
<p><strong>Stellen Sie sicher, dass der Benutzer, den Sie wiederherstellen wollen, in Ihrer Mailcow existiert</strong>. Legen Sie diesen neu an, wenn der Benutzer fehlt.</p>
<p>Kopieren Sie die Ordner von <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/_garbage/[timestamp]_[domain_sanitized][user_sanitized]</code> zurück nach <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/[domain]/[user]</code> und synchronisieren Sie die Ordner neu und berechnen Sie die Quota (Speicherplatz) neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm force-resync -u restoreme@example.net &#39;*&#39;
docker-compose exec dovecot-mailcow doveadm quota recalc -u restoreme@example.net
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm force-resync -u restoreme@example.net '*'
docker-compose exec dovecot-mailcow doveadm quota recalc -u restoreme@example.net</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -961,6 +961,47 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" class="md-nav__link">
./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
</a>
</li>
<li class="md-nav__item">
<a href="#alles-sichern-sicherungen-alter-als-3-tage-loschen" class="md-nav__link">
Alles sichern, Sicherungen älter als 3 Tage löschen
</a>
</li>
<li class="md-nav__item">
<a href="#vmail-crypt-und-mysql-daten-sichern-sicherungen-loschen-die-alter-als-30-tage-sind" class="md-nav__link">
vmail-, crypt- und mysql-Daten sichern, Sicherungen löschen, die älter als 30 Tage sind
</a>
</li>
<li class="md-nav__item">
<a href="#vmail-sichern" class="md-nav__link">
vmail sichern
</a>
<nav class="md-nav" aria-label="vmail sichern">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cronjob" class="md-nav__link">
Cronjob
@ -971,6 +1012,48 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binsh" class="md-nav__link">
!/bin/sh
</a>
</li>
<li class="md-nav__item">
<a href="#backup-mailcow-data" class="md-nav__link">
Backup mailcow data
</a>
</li>
<li class="md-nav__item">
<a href="#httpsmailcowgithubiomailcow-dockerized-docsb_n_r_backup" class="md-nav__link">
https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/
</a>
</li>
<li class="md-nav__item">
<a href="#run-command" class="md-nav__link">
run command
</a>
</li>
<li class="md-nav__item">
<a href="#httpsmailcowgithubiomailcow-dockerized-docsb_n_r_backup_1" class="md-nav__link">
https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/
</a>
</li>
<li class="md-nav__item">
<a href="#befehl-ausfuhren" class="md-nav__link">
Befehl ausführen
</a>
</li>
<li class="md-nav__item">
@ -978,6 +1061,13 @@
Backup-Strategie mit rsync und mailcow Backup-Skript
</a>
</li>
<li class="md-nav__item">
<a href="#wenn-sie-wollen-benutzen-sie-acl-util-um-die-berechtigungen-einigeraller-ordnerdateien-zu-sichern-getfacl-rn-path" class="md-nav__link">
Wenn Sie wollen, benutzen Sie acl util, um die Berechtigungen einiger/aller Ordner/Dateien zu sichern: getfacl -Rn /path
</a>
</li>
</ul>
@ -2411,6 +2501,47 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" class="md-nav__link">
./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
</a>
</li>
<li class="md-nav__item">
<a href="#alles-sichern-sicherungen-alter-als-3-tage-loschen" class="md-nav__link">
Alles sichern, Sicherungen älter als 3 Tage löschen
</a>
</li>
<li class="md-nav__item">
<a href="#vmail-crypt-und-mysql-daten-sichern-sicherungen-loschen-die-alter-als-30-tage-sind" class="md-nav__link">
vmail-, crypt- und mysql-Daten sichern, Sicherungen löschen, die älter als 30 Tage sind
</a>
</li>
<li class="md-nav__item">
<a href="#vmail-sichern" class="md-nav__link">
vmail sichern
</a>
<nav class="md-nav" aria-label="vmail sichern">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cronjob" class="md-nav__link">
Cronjob
@ -2421,6 +2552,48 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binsh" class="md-nav__link">
!/bin/sh
</a>
</li>
<li class="md-nav__item">
<a href="#backup-mailcow-data" class="md-nav__link">
Backup mailcow data
</a>
</li>
<li class="md-nav__item">
<a href="#httpsmailcowgithubiomailcow-dockerized-docsb_n_r_backup" class="md-nav__link">
https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/
</a>
</li>
<li class="md-nav__item">
<a href="#run-command" class="md-nav__link">
run command
</a>
</li>
<li class="md-nav__item">
<a href="#httpsmailcowgithubiomailcow-dockerized-docsb_n_r_backup_1" class="md-nav__link">
https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/
</a>
</li>
<li class="md-nav__item">
<a href="#befehl-ausfuhren" class="md-nav__link">
Befehl ausführen
</a>
</li>
<li class="md-nav__item">
@ -2428,6 +2601,13 @@
Backup-Strategie mit rsync und mailcow Backup-Skript
</a>
</li>
<li class="md-nav__item">
<a href="#wenn-sie-wollen-benutzen-sie-acl-util-um-die-berechtigungen-einigeraller-ordnerdateien-zu-sichern-getfacl-rn-path" class="md-nav__link">
Wenn Sie wollen, benutzen Sie acl util, um die Berechtigungen einiger/aller Ordner/Dateien zu sichern: getfacl -Rn /path
</a>
</li>
</ul>
@ -2454,84 +2634,72 @@
<p>Bitte kopieren Sie dieses Skript nicht an einen anderen Ort.</p>
<p>Um ein Backup zu starten, geben Sie "backup" als ersten Parameter an und entweder eine oder mehrere zu sichernde Komponenten als folgende Parameter.
Sie können auch "all" als zweiten Parameter verwenden, um alle Komponenten zu sichern. Fügen Sie <code>--delete-days n</code> an, um Sicherungen zu löschen, die älter als n Tage sind.</p>
<div class="highlight"><pre><span></span><code># Syntax:
# ./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
# Alles sichern, Sicherungen älter als 3 Tage löschen
./helper-scripts/backup_and_restore.sh backup all --delete-days 3
# vmail-, crypt- und mysql-Daten sichern, Sicherungen löschen, die älter als 30 Tage sind
./helper-scripts/backup_and_restore.sh backup vmail crypt mysql --delete-days 30
# vmail sichern
./helper-scripts/backup_and_restore.sh backup vmail
</code></pre></div>
<p>```</p>
<h1 id="syntax">Syntax:<a class="headerlink" href="#syntax" title="Permanent link">&para;</a></h1>
<h1 id="helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days">./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)<a class="headerlink" href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" title="Permanent link">&para;</a></h1>
<h1 id="alles-sichern-sicherungen-alter-als-3-tage-loschen">Alles sichern, Sicherungen älter als 3 Tage löschen<a class="headerlink" href="#alles-sichern-sicherungen-alter-als-3-tage-loschen" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup all --delete-days 3</p>
<h1 id="vmail-crypt-und-mysql-daten-sichern-sicherungen-loschen-die-alter-als-30-tage-sind">vmail-, crypt- und mysql-Daten sichern, Sicherungen löschen, die älter als 30 Tage sind<a class="headerlink" href="#vmail-crypt-und-mysql-daten-sichern-sicherungen-loschen-die-alter-als-30-tage-sind" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup vmail crypt mysql --delete-days 30</p>
<h1 id="vmail-sichern">vmail sichern<a class="headerlink" href="#vmail-sichern" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup vmail</p>
<p>```</p>
<p>Das Skript wird Sie nach einem Speicherort für die Sicherung fragen. Innerhalb dieses Speicherortes wird es Ordner im Format "mailcow_DATE" erstellen.
Sie sollten diese Ordner nicht umbenennen, um den Wiederherstellungsprozess nicht zu unterbrechen.</p>
<p>Um ein Backup unbeaufsichtigt durchzuführen, definieren Sie MAILCOW_BACKUP_LOCATION als Umgebungsvariable bevor Sie das Skript starten:</p>
<div class="highlight"><pre><span></span><code>MAILCOW_BACKUP_LOCATION=/opt/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all
</code></pre></div>
<p><code>MAILCOW_BACKUP_LOCATION=/opt/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all</code></p>
<h4 id="cronjob">Cronjob<a class="headerlink" href="#cronjob" title="Permanent link">&para;</a></h4>
<p>Sie können das Backup-Skript regelmäßig über einen Cronjob laufen lassen. Stellen Sie sicher, dass <code>BACKUP_LOCATION</code> existiert:</p>
<div class="highlight"><pre><span></span><code>5 4 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/mnt/mailcow_backups /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3
</code></pre></div>
<p><code>5 4 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/mnt/mailcow_backups /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3</code></p>
<p>Standardmäßig sendet Cron das komplette Ergebnis jeder Backup-Operation per E-Mail. Wenn Sie möchten, dass cron nur im Fehlerfall (Exit-Code ungleich Null) eine E-Mail sendet, können Sie den folgenden Ausschnitt verwenden. Die Pfade müssen entsprechend Ihrer Einrichtung angepasst werden (dieses Skript ist ein Beitrag des Benutzers).</p>
<p>Das folgende Skript kann in <code>/etc/cron.daily/mailcow-backup</code> platziert werden - vergessen Sie nicht, es mit <code>chmod +x</code> als ausführbar zu markieren:</p>
<div class="highlight"><pre><span></span><code>#!/bin/sh
# Backup mailcow data
# https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/
set -e
OUT=&quot;$(mktemp)&quot;
export MAILCOW_BACKUP_LOCATION=&quot;/opt/backup&quot;
SCRIPT=&quot;/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh&quot;
PARAMETERS=&quot;backup all&quot;
OPTIONS=&quot;--delete-days 30&quot;
# run command
set +e
&quot;${SCRIPT}&quot; ${PARAMETERS} ${OPTIONS} 2&gt;&amp;1 &gt; &quot;$OUT&quot;
RESULT=$?
if [ $RESULT -ne 0 ]
<p>```</p>
<h1 id="binsh">!/bin/sh<a class="headerlink" href="#binsh" title="Permanent link">&para;</a></h1>
<h1 id="backup-mailcow-data">Backup mailcow data<a class="headerlink" href="#backup-mailcow-data" title="Permanent link">&para;</a></h1>
<h1 id="httpsmailcowgithubiomailcow-dockerized-docsb_n_r_backup"><a href="https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/">https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/</a><a class="headerlink" href="#httpsmailcowgithubiomailcow-dockerized-docsb_n_r_backup" title="Permanent link">&para;</a></h1>
<p>set -e</p>
<p>OUT="$(mktemp)"
export MAILCOW_BACKUP_LOCATION="/opt/backup"
SCRIPT="/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh"
PARAMETERS="backup all"
OPTIONS="--delete-days 30"</p>
<h1 id="run-command">run command<a class="headerlink" href="#run-command" title="Permanent link">&para;</a></h1>
<p>set +e
"${SCRIPT}" ${PARAMETERS} ${OPTIONS} 2&gt;&amp;1 &gt; "$OUT"
RESULT=$?</p>
<p>if [ $RESULT -ne 0 ]
then
echo &quot;${SCRIPT} ${PARAMETERS} ${OPTIONS} encounters an error:&quot;
echo &quot;RESULT=$RESULT&quot;
# https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/
set -e
OUT=&quot;$(mktemp)&quot;
export MAILCOW_BACKUP_LOCATION=&quot;/opt/backup&quot;
SCRIPT=&quot;/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh&quot;
PARAMETERS=&quot;alle sichern&quot;
OPTIONS=&quot;--delete-days 30&quot;
# Befehl ausführen
setzen +e
&quot;${SCRIPT}&quot; ${PARAMETERS} ${OPTIONS} 2&gt;&amp;1 &gt; &quot;$OUT&quot;
ERGEBNIS=$?
if [ $RESULT -ne 0 ]
echo "${SCRIPT} ${PARAMETERS} ${OPTIONS} encounters an error:"
echo "RESULT=$RESULT"</p>
<h1 id="httpsmailcowgithubiomailcow-dockerized-docsb_n_r_backup_1"><a href="https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/">https://mailcow.github.io/mailcow-dockerized-docs/b_n_r_backup/</a><a class="headerlink" href="#httpsmailcowgithubiomailcow-dockerized-docsb_n_r_backup_1" title="Permanent link">&para;</a></h1>
<p>set -e</p>
<p>OUT="$(mktemp)"
export MAILCOW_BACKUP_LOCATION="/opt/backup"
SCRIPT="/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh"
PARAMETERS="alle sichern"
OPTIONS="--delete-days 30"</p>
<h1 id="befehl-ausfuhren">Befehl ausführen<a class="headerlink" href="#befehl-ausfuhren" title="Permanent link">&para;</a></h1>
<p>setzen +e
"${SCRIPT}" ${PARAMETERS} ${OPTIONS} 2&gt;&amp;1 &gt; "$OUT"
ERGEBNIS=$?</p>
<p>if [ $RESULT -ne 0 ]
dann
echo &quot;${SCRIPT} ${PARAMETER} ${OPTIONS} ist auf einen Fehler gestoßen:&quot;
echo &quot;ERGEBNIS=$ERGEBNIS&quot;
echo &quot;STDOUT / STDERR:&quot;
cat &quot;$OUT&quot;
echo "${SCRIPT} ${PARAMETER} ${OPTIONS} ist auf einen Fehler gestoßen:"
echo "ERGEBNIS=$ERGEBNIS"
echo "STDOUT / STDERR:"
cat "$OUT"
fi
</code></pre></div>
```</p>
<h1 id="backup-strategie-mit-rsync-und-mailcow-backup-skript">Backup-Strategie mit rsync und mailcow Backup-Skript<a class="headerlink" href="#backup-strategie-mit-rsync-und-mailcow-backup-skript" title="Permanent link">&para;</a></h1>
<p>Erstellen Sie das Zielverzeichnis für mailcows Hilfsskript:
<div class="highlight"><pre><span></span><code>mkdir -p /external_share/backups/backup_script
</code></pre></div></p>
<code>mkdir -p /external_share/backups/backup_script</code></p>
<p>Cronjobs erstellen:
<div class="highlight"><pre><span></span><code>25 1 * * * rsync -aH --delete /opt/mailcow-dockerized /external_share/backups/mailcow-dockerized
```
25 1 * * * rsync -aH --delete /opt/mailcow-dockerized /external_share/backups/mailcow-dockerized
40 2 * * * rsync -aH --delete /var/lib/docker/volumes /external_share/backups/var_lib_docker_volumes
5 4 * * * cd /opt/mailcow-dockerized/; BACKUP_LOCATION=/external_share/backups/backup_script /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3
# Wenn Sie wollen, benutzen Sie acl util, um die Berechtigungen einiger/aller Ordner/Dateien zu sichern: getfacl -Rn /path
</code></pre></div></p>
5 4 * * * cd /opt/mailcow-dockerized/; BACKUP_LOCATION=/external_share/backups/backup_script /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3</p>
<h1 id="wenn-sie-wollen-benutzen-sie-acl-util-um-die-berechtigungen-einigeraller-ordnerdateien-zu-sichern-getfacl-rn-path">Wenn Sie wollen, benutzen Sie acl util, um die Berechtigungen einiger/aller Ordner/Dateien zu sichern: getfacl -Rn /path<a class="headerlink" href="#wenn-sie-wollen-benutzen-sie-acl-util-um-die-berechtigungen-einigeraller-ordnerdateien-zu-sichern-getfacl-rn-path" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>Am Zielort (in diesem Fall <code>/external_share/backups</code>) möchten Sie vielleicht Snapshot-Fähigkeiten haben (ZFS, Btrfs usw.). Machen Sie täglich einen Snapshot und bewahren Sie ihn für n Tage auf, um ein konsistentes Backup zu erhalten.
Führen Sie <strong>kein</strong> rsync auf eine Samba-Freigabe durch, Sie müssen die richtigen Berechtigungen einhalten!</p>
<p>Zum Wiederherstellen müssen Sie rsync einfach in umgekehrter Richtung ausführen und Docker neu starten, um die Volumes erneut zu lesen. Führen Sie <code>docker-compose pull</code> und <code>docker-compose up -d</code> aus.</p>

Datei anzeigen

@ -2412,15 +2412,13 @@
<h3 id="sicherung">Sicherung<a class="headerlink" href="#sicherung" title="Permanent link">&para;</a></h3>
<p>Diese Zeile sichert das vmail-Verzeichnis in eine Datei backup_vmail.tar.gz im mailcow-Root-Verzeichnis:
<div class="highlight"><pre><span></span><code>cd /pfad/zu/mailcow-dockerized
docker run --rm -i -v $(docker inspect --format &#39;{{ range .Mounts }}{{ if eq .Destination &quot;/var/vmail&quot; }}{{ .Name }}{{ end }}{{{ end }}&#39; $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar cvfz /backup/backup_vmail.tar.gz /vmail
</code></pre></div></p>
<code>cd /pfad/zu/mailcow-dockerized
docker run --rm -i -v $(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/var/vmail" }}{{ .Name }}{{ end }}{{{ end }}' $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar cvfz /backup/backup_vmail.tar.gz /vmail</code></p>
<p>Sie können den Pfad ändern, indem Sie ${PWD} (das dem aktuellen Verzeichnis entspricht) an einen beliebigen Pfad anpassen, auf den Sie Schreibzugriff haben.
Setzen Sie den Dateinamen <code>backup_vmail.tar.gz</code> auf einen beliebigen Namen, aber lassen Sie den Pfad so wie er ist. Beispiel: <code>[...] tar cvfz /backup/mein_eigener_filename_.tar.gz</code></p>
<h3 id="wiederherstellen">Wiederherstellen<a class="headerlink" href="#wiederherstellen" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>cd /pfad/zu/mailcow-dockerized
docker run --rm -it -v $(docker inspect --format &#39;{{ range .Mounts }}{{ if eq .Destination &quot;/var/vmail&quot; }}{{ .Name }}{{ end }}{{ end }}&#39; $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar xvfz /backup/backup_vmail.tar.gz
</code></pre></div>
<p><code>cd /pfad/zu/mailcow-dockerized
docker run --rm -it -v $(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/var/vmail" }}{{ .Name }}{{ end }}{{ end }}' $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar xvfz /backup/backup_vmail.tar.gz</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2411,20 +2411,18 @@
<h1>MySQL (mysqldump)</h1>
<h2 id="sicherung">Sicherung<a class="headerlink" href="#sicherung" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code>cd /pfad/zu/mailcow-dockerized
<p><code>cd /pfad/zu/mailcow-dockerized
source mailcow.conf
DATE=$(Datum +&quot;%Y%m%d_%H%M%S&quot;)
docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 -u${DBUSER} -p${DBPASS} ${DBNAME} &gt; backup_${DBNAME}_${DATE}.sql
</code></pre></div>
DATE=$(Datum +"%Y%m%d_%H%M%S")
docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 -u${DBUSER} -p${DBPASS} ${DBNAME} &gt; backup_${DBNAME}_${DATE}.sql</code></p>
<h2 id="wiederherstellen">Wiederherstellen<a class="headerlink" href="#wiederherstellen" title="Permanent link">&para;</a></h2>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Sie sollten den SQL-Dump ohne <code>docker-compose</code> umleiten, um Parsing-Fehler zu vermeiden.</p>
</div>
<div class="highlight"><pre><span></span><code>cd /pfad/zu/mailcow-dockerized
<p><code>cd /pfad/zu/mailcow-dockerized
source mailcow.conf
docker exec -i $(docker-compose ps -q mysql-mailcow) mysql -u${DBUSER} -p${DBPASS} ${DBNAME} &lt; backup_file.sql
</code></pre></div>
docker exec -i $(docker-compose ps -q mysql-mailcow) mysql -u${DBUSER} -p${DBPASS} ${DBNAME} &lt; backup_file.sql</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2459,10 +2459,9 @@
<p>Sie benötigen ein SSH-fähiges Ziel und eine Schlüsseldatei, um sich mit diesem Ziel zu verbinden. Der Schlüssel sollte nicht durch ein Passwort geschützt sein, damit das Skript unbeaufsichtigt arbeiten kann.</p>
<p>In Ihrem mailcow-Basisverzeichnis, z.B. <code>/opt/mailcow-dockerized</code>, finden Sie eine Datei <code>create_cold_standby.sh</code>.</p>
<p>Bearbeiten Sie diese Datei und ändern Sie die exportierten Variablen:</p>
<div class="highlight"><pre><span></span><code>export REMOTE_SSH_KEY=/pfad/zur/keyfile
<p><code>export REMOTE_SSH_KEY=/pfad/zur/keyfile
export REMOTE_SSH_PORT=22
export REMOTE_SSH_HOST=mailcow-backup.host.name
</code></pre></div>
export REMOTE_SSH_HOST=mailcow-backup.host.name</code></p>
<p>Der Schlüssel muss im Besitz von root sein und darf nur von diesem gelesen werden können.</p>
<p>Sowohl die Quelle als auch das Ziel benötigen <code>rsync</code> &gt;= v3.1.0.
Das Ziel muss über Docker und docker-compose <strong>v1</strong> verfügen.</p>
@ -2470,28 +2469,23 @@ Das Ziel muss über Docker und docker-compose <strong>v1</strong> verfügen.</p>
<p>Sie können die Verbindung testen, indem Sie <code>ssh mailcow-backup.host.name -p22 -i /path/to/keyfile</code> ausführen.</p>
<h2 id="backup-und-aktualisierung-des-cold-standby">Backup und Aktualisierung des Cold-Standby<a class="headerlink" href="#backup-und-aktualisierung-des-cold-standby" title="Permanent link">&para;</a></h2>
<p>Starten Sie das erste Backup, dies kann je nach Verbindung eine Weile dauern:</p>
<div class="highlight"><pre><span></span><code>bash /opt/mailcow-dockerized/create_cold_standby.sh
</code></pre></div>
<p><code>bash /opt/mailcow-dockerized/create_cold_standby.sh</code></p>
<p>Das war einfach, nicht wahr?</p>
<p>Das Aktualisieren des Cold-Standby ist genauso einfach:</p>
<div class="highlight"><pre><span></span><code>bash /opt/mailcow-dockerized/create_cold_standby.sh
</code></pre></div>
<p><code>bash /opt/mailcow-dockerized/create_cold_standby.sh</code></p>
<p>Es ist derselbe Befehl.</p>
<h2 id="automatisierte-backups-mit-cron">Automatisierte Backups mit cron<a class="headerlink" href="#automatisierte-backups-mit-cron" title="Permanent link">&para;</a></h2>
<p>Stellen Sie zunächst sicher, dass der <code>cron</code> Dienst aktiviert ist und läuft:</p>
<div class="highlight"><pre><span></span><code>systemctl enable cron.service &amp;&amp; systemctl start cron.service
</code></pre></div>
<p><code>systemctl enable cron.service &amp;&amp; systemctl start cron.service</code></p>
<p>Um die Backups auf dem Cold-Standby-Server zu automatisieren, können Sie einen Cron-Job verwenden. Um die Cron-Jobs für den Root-Benutzer zu bearbeiten, führen Sie aus:</p>
<div class="highlight"><pre><span></span><code>crontab -e
</code></pre></div>
<p><code>crontab -e</code></p>
<p>Fügen Sie die folgenden Zeilen hinzu, um den Cold-Standby-Server täglich um 03:00 Uhr zu synchronisieren. In diesem Beispiel werden Fehler der letzten Ausführung in einer Datei protokolliert.</p>
<div class="highlight"><pre><span></span><code>PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 3 * * * bash /opt/mailcow-dockerized/create_cold_standby.sh 2&gt; /var/log/mailcow-coldstandby-sync.log
</code></pre></div>
<p>```
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</p>
<p>0 3 * * * bash /opt/mailcow-dockerized/create_cold_standby.sh 2&gt; /var/log/mailcow-coldstandby-sync.log
```</p>
<p>Wenn korrekt gespeichert, sollte der Cron-Job durch Eingabe angezeigt werden:</p>
<div class="highlight"><pre><span></span><code>crontab -l
</code></pre></div>
<p><code>crontab -l</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -965,6 +965,20 @@
Wiederherstellung
</a>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-restore" class="md-nav__link">
./helper-scripts/backup_and_restore.sh restore
</a>
</li>
</ul>
@ -2374,6 +2388,20 @@
Wiederherstellung
</a>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-restore" class="md-nav__link">
./helper-scripts/backup_and_restore.sh restore
</a>
</li>
</ul>
@ -2394,14 +2422,13 @@
<h1>Wiederherstellung</h1>
<h3 id="wiederherstellung">Wiederherstellung<a class="headerlink" href="#wiederherstellung" title="Permanent link">&para;</a></h3>
<p>Bitte kopieren Sie dieses Skript nicht an einen anderen Ort.</p>
<p>Um eine Wiederherstellung durchzuführen, <strong>starten Sie mailcow</strong>, verwenden Sie das Skript mit "restore" als ersten Parameter.</p>
<div class="highlight"><pre><span></span><code># Syntax:
# ./helper-scripts/backup_and_restore.sh restore
</code></pre></div>
<p>```</p>
<h1 id="syntax">Syntax:<a class="headerlink" href="#syntax" title="Permanent link">&para;</a></h1>
<h1 id="helper-scriptsbackup_and_restoresh-restore">./helper-scripts/backup_and_restore.sh restore<a class="headerlink" href="#helper-scriptsbackup_and_restoresh-restore" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>Das Skript wird Sie nach einem Speicherort für die Sicherung der mailcow_DATE-Ordner fragen.</p>
<hr>

Datei anzeigen

@ -2346,8 +2346,7 @@
<h1>Deinstallation</h1>
<p>Um mailcow: dockerized mit all seinen Volumes, Images und Containern zu entfernen, tun Sie dies:</p>
<div class="highlight"><pre><span></span><code>docker-compose down -v --rmi all --remove-orphans
</code></pre></div>
<p><code>docker-compose down -v --rmi all --remove-orphans</code></p>
<div class="admonition info">
<p class="admonition-title">Info</p>
<ul>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#nachdem-der-installationsprozess-abgeschlossen-ist-mussen-sie-eventuell-den-dienst-aktivieren-und-sicherstellen-dass-er-gestartet-ist-z-b-centos-7" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -362,6 +367,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Installation
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,66 +2352,58 @@
<h1>Installation</h1>
<p>Sie benötigen Docker (eine Version &gt;= <code>20.10.2</code> ist erforderlich) und Docker Compose (eine Version <code>&lt;= 2.0</code> ist erforderlich).</p>
<p><strong>1.</strong> Erfahren Sie, wie Sie <a href="https://docs.docker.com/install/">Docker</a> und <a href="https://docs.docker.com/compose/install/">Docker Compose</a> installieren.</p>
<p>Schnelle Installation für die meisten Betriebssysteme:</p>
<ul>
<li>
<p>Docker
<div class="highlight"><pre><span></span><code>curl -sSL https://get.docker.com/ | CHANNEL=stable sh
# Nachdem der Installationsprozess abgeschlossen ist, müssen Sie eventuell den Dienst aktivieren und sicherstellen, dass er gestartet ist (z. B. CentOS 7)
systemctl enable --now docker
</code></pre></div></p>
</li>
<li>
<p>Docker-Compose</p>
</li>
<li>Docker
```
curl -sSL <a href="https://get.docker.com/">https://get.docker.com/</a> | CHANNEL=stable sh</li>
</ul>
<h1 id="nachdem-der-installationsprozess-abgeschlossen-ist-mussen-sie-eventuell-den-dienst-aktivieren-und-sicherstellen-dass-er-gestartet-ist-z-b-centos-7">Nachdem der Installationsprozess abgeschlossen ist, müssen Sie eventuell den Dienst aktivieren und sicherstellen, dass er gestartet ist (z. B. CentOS 7)<a class="headerlink" href="#nachdem-der-installationsprozess-abgeschlossen-ist-mussen-sie-eventuell-den-dienst-aktivieren-und-sicherstellen-dass-er-gestartet-ist-z-b-centos-7" title="Permanent link">&para;</a></h1>
<p>systemctl enable --now docker
```</p>
<ul>
<li>Docker-Compose</li>
</ul>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p><strong>mailcow benötigt die neueste Version von docker-compose v1.</strong> Es wird dringend empfohlen, die untenstehenden Befehle zu verwenden, um <code>docker-compose</code> zu installieren. Paket-Manager (z.B. <code>apt</code>, <code>yum</code>) werden <strong>wahrscheinlich</strong> nicht die richtige Version liefern.
Hinweis: Dieser Befehl lädt docker-compose aus dem offiziellen Docker-Github-Repository herunter und ist eine sichere Methode. Das Snippet ermittelt die neueste unterstützte Version von mailcow. In fast allen Fällen ist dies die letzte verfügbare Version (Ausnahmen sind kaputte Versionen oder größere Änderungen, die noch nicht von mailcow unterstützt werden).</p>
</div>
<div class="highlight"><pre><span></span><code>curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
</code></pre></div>
<p><code>curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose</code></p>
<p>Bitte verwenden Sie die neueste verfügbare Docker-Engine und nicht die Engine, die mit Ihrem Distros-Repository ausgeliefert wird.</p>
<p><strong>1.1.1.</strong> Auf SELinux-aktivierten Systemen, z.B. CentOS 7:</p>
<ul>
<li>Prüfen Sie, ob das Paket "container-selinux" auf Ihrem System vorhanden ist:</li>
</ul>
<div class="highlight"><pre><span></span><code>rpm -qa | grep container-selinux
</code></pre></div>
<p><code>rpm -qa | grep container-selinux</code></p>
<p>Wenn der obige Befehl eine leere oder keine Ausgabe liefert, sollten Sie es über Ihren Paketmanager installieren.</p>
<ul>
<li>Prüfen Sie, ob Docker SELinux-Unterstützung aktiviert hat:</li>
</ul>
<div class="highlight"><pre><span></span><code>docker info | grep selinux
</code></pre></div>
<p><code>docker info | grep selinux</code></p>
<p>Wenn der obige Befehl eine leere oder keine Ausgabe liefert, erstellen oder bearbeiten Sie <code>/etc/docker/daemon.json</code> und fügen Sie <code>"selinux-enabled": true</code> hinzu. Beispielhafter Inhalt der Datei:</p>
<div class="highlight"><pre><span></span><code>{
&quot;selinux-enabled&quot;: true
}
</code></pre></div>
<p><code>{
"selinux-enabled": true
}</code></p>
<p>Starten Sie den Docker-Daemon neu und überprüfen Sie, ob SELinux nun aktiviert ist.</p>
<p>Dieser Schritt ist erforderlich, um sicherzustellen, dass die mailcows-Volumes richtig gekennzeichnet sind, wie in der Compose-Datei angegeben.
Wenn Sie daran interessiert sind, wie das funktioniert, können Sie sich die Readme-Datei von <a href="https://github.com/containers/container-selinux">https://github.com/containers/container-selinux</a> ansehen, die auf viele nützliche Informationen zu diesem Thema verweist.</p>
<p><strong>2.</strong> Klonen Sie den Master-Zweig des Repositorys und stellen Sie sicher, dass Ihre umask gleich 0022 ist. Bitte klonen Sie das Repository als root-Benutzer und kontrollieren Sie auch den Stack als root. Wir werden die Attribute - wenn nötig - ändern, während wir die Container automatisch bereitstellen und sicherstellen, dass alles gesichert ist. Das update.sh-Skript muss daher ebenfalls als root ausgeführt werden. Es kann notwendig sein, den Besitzer und andere Attribute von Dateien zu ändern, auf die Sie sonst keinen Zugriff haben. <strong>Wir geben die Berechtigungen für jede exponierte Anwendung</strong> auf und führen einen exponierten Dienst nicht als root aus! Wenn Sie den Docker-Daemon als Nicht-Root-Benutzer steuern, erhalten Sie keine zusätzliche Sicherheit. Der unprivilegierte Benutzer wird die Container ebenfalls als root spawnen. Das Verhalten des Stacks ist identisch.</p>
<div class="highlight"><pre><span></span><code>$ su
# umask
0022 # &lt;- Überprüfen, dass es 0022 ist
# cd /opt
# git clone https://github.com/mailcow/mailcow-dockerized
# cd mailcow-dockerized
</code></pre></div>
<p>```
$ su</p>
<h1 id="umask">umask<a class="headerlink" href="#umask" title="Permanent link">&para;</a></h1>
<p>0022 # &lt;- Überprüfen, dass es 0022 ist</p>
<h1 id="cd-opt">cd /opt<a class="headerlink" href="#cd-opt" title="Permanent link">&para;</a></h1>
<h1 id="git-clone-httpsgithubcommailcowmailcow-dockerized">git clone <a href="https://github.com/mailcow/mailcow-dockerized">https://github.com/mailcow/mailcow-dockerized</a><a class="headerlink" href="#git-clone-httpsgithubcommailcowmailcow-dockerized" title="Permanent link">&para;</a></h1>
<h1 id="cd-mailcow-dockerized">cd mailcow-dockerized<a class="headerlink" href="#cd-mailcow-dockerized" title="Permanent link">&para;</a></h1>
<p>```</p>
<p><strong>3.</strong> Erzeugen Sie eine Konfigurationsdatei. Verwenden Sie einen FQDN (<code>host.domain.tld</code>) als Hostname, wenn Sie gefragt werden.
<div class="highlight"><pre><span></span><code>./generate_config.sh
</code></pre></div></p>
<code>./generate_config.sh</code></p>
<p><strong>4.</strong> Ändern Sie die Konfiguration, wenn Sie das wollen oder müssen.
<div class="highlight"><pre><span></span><code>nano mailcow.conf
</code></pre></div>
<code>nano mailcow.conf</code>
Wenn Sie planen, einen Reverse Proxy zu verwenden, können Sie zum Beispiel HTTPS an 127.0.0.1 auf Port 8443 und HTTP an 127.0.0.1 auf Port 8080 binden.</p>
<p>Möglicherweise müssen Sie einen vorinstallierten MTA stoppen, der Port 25/tcp blockiert. Siehe <a href="../../post_installation/firststeps-local_mta/">dieses Kapitel</a>, um zu erfahren, wie man Postfix rekonfiguriert, um nach einer erfolgreichen Installation neben mailcow laufen zu lassen.</p>
<p>Einige Updates modifizieren mailcow.conf und fügen neue Parameter hinzu. Es ist schwer, in der Dokumentation den Überblick zu behalten. Bitte überprüfen Sie deren Beschreibung und fragen Sie, wenn Sie unsicher sind, in den bekannten Kanälen nach Rat.</p>
@ -2410,20 +2411,18 @@ Wenn Sie planen, einen Reverse Proxy zu verwenden, können Sie zum Beispiel HTTP
<p><strong>Wenn Sie auf Probleme und seltsame Phänomene stoßen, überprüfen Sie bitte Ihre MTU.</strong></p>
<p>Bearbeiten Sie <code>docker-compose.yml</code> und ändern Sie die Netzwerkeinstellungen entsprechend Ihrer MTU.
Fügen Sie den neuen Parameter driver_opts wie folgt hinzu:
<div class="highlight"><pre><span></span><code>networks:
<code>networks:
mailcow-network:
...
driver_opts:
com.docker.network.driver.mtu: 1450
...
</code></pre></div></p>
...</code></p>
<p><strong>4.2.</strong> Benutzer ohne ein IPv6-aktiviertes Netzwerk auf ihrem Hostsystem:</p>
<p><strong>Einschalten von IPv6. Endlich.</strong></p>
<p>Wenn Sie kein IPv6-fähiges Netzwerk auf Ihrem Host haben und Sie sich nicht um ein besseres Internet kümmern (hehe), ist es empfehlenswert, IPv6 für das mailcow-Netzwerk zu <a href="../../post_installation/firststeps-disable_ipv6/">deaktivieren</a>, um unvorhergesehene Probleme zu vermeiden.</p>
<p><strong>5.</strong> LAden Sie die Images herunter und führen Sie die Compose-Datei aus. Der Parameter <code>-d</code> wird mailcow: dockerized starten:
<div class="highlight"><pre><span></span><code>docker-compose pull
docker-compose up -d
</code></pre></div></p>
<code>docker-compose pull
docker-compose up -d</code></p>
<p>Geschafft!</p>
<p>Sie können nun auf <strong>https://${MAILCOW_HOSTNAME}</strong> mit den Standard-Zugangsdaten <code>admin</code> + Passwort <code>moohoo</code> zugreifen.</p>
<div class="admonition info">

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#nachdem-der-installationsprozess-abgeschlossen-ist-mussen-sie-den-dienst-aktivieren-und-sicherstellen-dass-er-gestartet-ist-z-b-centos-7" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -390,6 +395,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Migration
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,8 +2352,6 @@
<h1>Migration</h1>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Diese Anleitung geht davon aus, dass Sie beabsichtigen, einen bestehenden Mailcow-Server (Quelle) auf einen brandneuen, leeren Server (Ziel) zu migrieren. Sie kümmert sich nicht um die Erhaltung bestehender Daten auf dem Zielserver und löscht alles innerhalb von <code>/var/lib/docker/volumes</code> und somit alle Docker-Volumes, die Sie bereits eingerichtet haben.</p>
@ -2357,45 +2364,37 @@
Installieren Sie <a href="https://docs.docker.com/engine/installation/linux/">Docker</a> und <a href="https://docs.docker.com/compose/install/">Docker Compose</a> auf Ihrem neuen Server.</p>
<p>Schnelle Installation für die meisten Betriebssysteme:</p>
<ul>
<li>
<p>Docker
<div class="highlight"><pre><span></span><code>curl -sSL https://get.docker.com/ | CHANNEL=stable sh
# Nachdem der Installationsprozess abgeschlossen ist, müssen Sie den Dienst aktivieren und sicherstellen, dass er gestartet ist (z. B. CentOS 7)
systemctl enable docker.service
</code></pre></div></p>
</li>
<li>
<p>docker-compose
<div class="highlight"><pre><span></span><code>curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
</code></pre></div></p>
</li>
<li>Docker
```
curl -sSL <a href="https://get.docker.com/">https://get.docker.com/</a> | CHANNEL=stable sh</li>
</ul>
<h1 id="nachdem-der-installationsprozess-abgeschlossen-ist-mussen-sie-den-dienst-aktivieren-und-sicherstellen-dass-er-gestartet-ist-z-b-centos-7">Nachdem der Installationsprozess abgeschlossen ist, müssen Sie den Dienst aktivieren und sicherstellen, dass er gestartet ist (z. B. CentOS 7)<a class="headerlink" href="#nachdem-der-installationsprozess-abgeschlossen-ist-mussen-sie-den-dienst-aktivieren-und-sicherstellen-dass-er-gestartet-ist-z-b-centos-7" title="Permanent link">&para;</a></h1>
<p>systemctl enable docker.service
```</p>
<ul>
<li>docker-compose
<code>curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose</code></li>
</ul>
<p>Bitte verwenden Sie die neueste verfügbare Docker-Engine und nicht die Engine, die mit Ihrem Distros-Repository ausgeliefert wird.</p>
<p><strong>2.</strong> Stoppen Sie Docker und stellen Sie sicher, dass Docker gestoppt wurde:
<div class="highlight"><pre><span></span><code>systemctl stop docker.service
systemctl status docker.service
</code></pre></div></p>
<code>systemctl stop docker.service
systemctl status docker.service</code></p>
<p><strong>3.</strong> Führen Sie die folgenden Befehle auf dem Quellcomputer aus (achten Sie darauf, die abschließenden Schrägstriche im ersten Pfadparameter wie unten gezeigt hinzuzufügen!) - <strong>WARNUNG: Dieser Befehl löscht alles, was bereits unter <code>/var/lib/docker/volumes</code> auf dem Zielrechner existiert</strong>:
<div class="highlight"><pre><span></span><code>rsync -aHhP --numeric-ids --delete /opt/mailcow-dockerized/ root@target-machine.example.com:/opt/mailcow-dockerized
rsync -aHhP --numeric-ids --delete /var/lib/docker/volumes/ root@target-machine.example.com:/var/lib/docker/volumes
</code></pre></div></p>
<code>rsync -aHhP --numeric-ids --delete /opt/mailcow-dockerized/ root@target-machine.example.com:/opt/mailcow-dockerized
rsync -aHhP --numeric-ids --delete /var/lib/docker/volumes/ root@target-machine.example.com:/var/lib/docker/volumes</code></p>
<p><strong>4.</strong> Schalten Sie mailcow ab und stoppen Sie Docker auf dem Quellrechner.
<div class="highlight"><pre><span></span><code>cd /opt/mailcow-dockerized
<code>cd /opt/mailcow-dockerized
docker-compose herunterfahren
systemctl stop docker.service
</code></pre></div></p>
systemctl stop docker.service</code></p>
<p>**Wiederholen Sie Schritt 3 mit denselben Befehlen. Dies wird viel schneller gehen als beim ersten Mal.</p>
<p><strong>6.</strong> Wechseln Sie auf den Zielrechner und starten Sie Docker.
<div class="highlight"><pre><span></span><code>systemctl start docker.service
</code></pre></div></p>
<code>systemctl start docker.service</code></p>
<p><strong>7.</strong> Ziehen Sie nun die mailcow Docker-Images auf den Zielrechner.
<div class="highlight"><pre><span></span><code>cd /opt/mailcow-dockerized
docker-compose pull
</code></pre></div></p>
<code>cd /opt/mailcow-dockerized
docker-compose pull</code></p>
<p><strong>8.</strong> Starten Sie den gesamten mailcow-Stack und alles sollte fertig sein!
<div class="highlight"><pre><span></span><code>docker-compose up -d
</code></pre></div></p>
<code>docker-compose up -d</code></p>
<p><strong>9.</strong> Zum Schluss ändern Sie Ihre DNS-Einstellungen so, dass sie auf den Zielserver zeigen.</p>
<hr>

Datei anzeigen

@ -419,6 +419,75 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#optionen-konnen-kombiniert-werden" class="md-nav__link">
Optionen können kombiniert werden
</a>
</li>
<li class="md-nav__item">
<a href="#-pruft-auf-updates-und-zeigt-anderungen-an" class="md-nav__link">
- Prüft auf Updates und zeigt Änderungen an
</a>
</li>
<li class="md-nav__item">
<a href="#versuchen-sie-nicht-docker-compose-zu-aktualisieren-stellen-sie-sicher-dass-sie-die-neueste-verfugbare-version-von-docker-compose-verwenden" class="md-nav__link">
Versuchen Sie nicht, docker-compose zu aktualisieren, stellen Sie sicher, dass Sie die neueste verfügbare Version von docker-compose verwenden
</a>
</li>
<li class="md-nav__item">
<a href="#-starten-sie-mailcow-nicht-nachdem-sie-ein-update-durchgefuhrt-haben" class="md-nav__link">
- Starten Sie mailcow nicht, nachdem Sie ein Update durchgeführt haben
</a>
</li>
<li class="md-nav__item">
<a href="#-erzwinge-update-unbeaufsichtigt-aber-nicht-unterstutzt-benutzung-auf-eigenes-risiko" class="md-nav__link">
- Erzwinge Update (unbeaufsichtigt, aber nicht unterstützt, Benutzung auf eigenes Risiko)
</a>
</li>
<li class="md-nav__item">
<a href="#-garbage-collector-ausfuhren-um-alte-image-tags-zu-bereinigen-und-beenden" class="md-nav__link">
- Garbage Collector ausführen, um alte Image-Tags zu bereinigen und beenden
</a>
</li>
<li class="md-nav__item">
<a href="#-update-mit-der-merge-strategie-option-ours-statt-theirs" class="md-nav__link">
- Update mit der Merge-Strategie-Option "ours" statt "theirs"
</a>
</li>
<li class="md-nav__item">
<a href="#dies-wird-konflikte-beim-zusammenfuhren-zugunsten-ihrer-lokalen-anderungen-losen-und-sollte-vermieden-werden-lokale-anderungen-werden-immer-beibehalten-es-sei-denn-wir-haben-auch-die-datei-xy-geandert" class="md-nav__link">
Dies wird Konflikte beim Zusammenführen zugunsten Ihrer lokalen Änderungen lösen und sollte vermieden werden. Lokale Änderungen werden immer beibehalten, es sei denn, wir haben auch die Datei XY geändert.
</a>
</li>
<li class="md-nav__item">
<a href="#-nicht-aktualisieren-nur-holen-von-docker-images" class="md-nav__link">
- Nicht aktualisieren, nur holen von Docker Images
</a>
<nav class="md-nav" aria-label="- Nicht aktualisieren, nur holen von Docker Images">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ich-habe-vergessen-was-ich-vor-dem-ausfuhren-von-updatesh-geandert-habe" class="md-nav__link">
Ich habe vergessen, was ich vor dem Ausführen von update.sh geändert habe.
@ -433,6 +502,19 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#ersetzen-sie-die-commit-id-22cd00b5e28893ef9ddef3c2b5436453cc5223ab-durch-ihre-id" class="md-nav__link">
Ersetzen Sie die Commit-ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab durch Ihre ID
</a>
<nav class="md-nav" aria-label="Ersetzen Sie die Commit-ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab durch Ihre ID">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#hooks" class="md-nav__link">
Hooks
@ -440,16 +522,16 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#funoten" class="md-nav__link">
Fußnoten
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2423,6 +2505,75 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#optionen-konnen-kombiniert-werden" class="md-nav__link">
Optionen können kombiniert werden
</a>
</li>
<li class="md-nav__item">
<a href="#-pruft-auf-updates-und-zeigt-anderungen-an" class="md-nav__link">
- Prüft auf Updates und zeigt Änderungen an
</a>
</li>
<li class="md-nav__item">
<a href="#versuchen-sie-nicht-docker-compose-zu-aktualisieren-stellen-sie-sicher-dass-sie-die-neueste-verfugbare-version-von-docker-compose-verwenden" class="md-nav__link">
Versuchen Sie nicht, docker-compose zu aktualisieren, stellen Sie sicher, dass Sie die neueste verfügbare Version von docker-compose verwenden
</a>
</li>
<li class="md-nav__item">
<a href="#-starten-sie-mailcow-nicht-nachdem-sie-ein-update-durchgefuhrt-haben" class="md-nav__link">
- Starten Sie mailcow nicht, nachdem Sie ein Update durchgeführt haben
</a>
</li>
<li class="md-nav__item">
<a href="#-erzwinge-update-unbeaufsichtigt-aber-nicht-unterstutzt-benutzung-auf-eigenes-risiko" class="md-nav__link">
- Erzwinge Update (unbeaufsichtigt, aber nicht unterstützt, Benutzung auf eigenes Risiko)
</a>
</li>
<li class="md-nav__item">
<a href="#-garbage-collector-ausfuhren-um-alte-image-tags-zu-bereinigen-und-beenden" class="md-nav__link">
- Garbage Collector ausführen, um alte Image-Tags zu bereinigen und beenden
</a>
</li>
<li class="md-nav__item">
<a href="#-update-mit-der-merge-strategie-option-ours-statt-theirs" class="md-nav__link">
- Update mit der Merge-Strategie-Option "ours" statt "theirs"
</a>
</li>
<li class="md-nav__item">
<a href="#dies-wird-konflikte-beim-zusammenfuhren-zugunsten-ihrer-lokalen-anderungen-losen-und-sollte-vermieden-werden-lokale-anderungen-werden-immer-beibehalten-es-sei-denn-wir-haben-auch-die-datei-xy-geandert" class="md-nav__link">
Dies wird Konflikte beim Zusammenführen zugunsten Ihrer lokalen Änderungen lösen und sollte vermieden werden. Lokale Änderungen werden immer beibehalten, es sei denn, wir haben auch die Datei XY geändert.
</a>
</li>
<li class="md-nav__item">
<a href="#-nicht-aktualisieren-nur-holen-von-docker-images" class="md-nav__link">
- Nicht aktualisieren, nur holen von Docker Images
</a>
<nav class="md-nav" aria-label="- Nicht aktualisieren, nur holen von Docker Images">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ich-habe-vergessen-was-ich-vor-dem-ausfuhren-von-updatesh-geandert-habe" class="md-nav__link">
Ich habe vergessen, was ich vor dem Ausführen von update.sh geändert habe.
@ -2437,6 +2588,19 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#ersetzen-sie-die-commit-id-22cd00b5e28893ef9ddef3c2b5436453cc5223ab-durch-ihre-id" class="md-nav__link">
Ersetzen Sie die Commit-ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab durch Ihre ID
</a>
<nav class="md-nav" aria-label="Ersetzen Sie die Commit-ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab durch Ihre ID">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#hooks" class="md-nav__link">
Hooks
@ -2444,16 +2608,16 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#funoten" class="md-nav__link">
Fußnoten
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2474,57 +2638,48 @@
<h1>Update</h1>
<h2 id="automatische-aktualisierung">Automatische Aktualisierung<a class="headerlink" href="#automatische-aktualisierung" title="Permanent link">&para;</a></h2>
<p>Ein Update-Skript in Ihrem mailcow-dockerized Verzeichnis kümmert sich um Updates.</p>
<p>Aber benutzen Sie es mit Bedacht! Wenn Sie denken, dass Sie viele Änderungen am mailcow-Code vorgenommen haben, sollten Sie die manuelle Update-Anleitung unten verwenden.</p>
<p>Führen sie das Update-Skript aus:
<div class="highlight"><pre><span></span><code>./update.sh
</code></pre></div></p>
<code>./update.sh</code></p>
<p>Wenn es nötig ist, wird es Sie fragen, wie Sie fortfahren möchten.
Merge-Fehler werden gemeldet.
Einige kleinere Konflikte werden automatisch korrigiert (zugunsten des mailcow: dockerized repository code).</p>
<h3 id="optionen">Optionen<a class="headerlink" href="#optionen" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code># Optionen können kombiniert werden
# - Prüft auf Updates und zeigt Änderungen an
./update.sh --check
# Versuchen Sie nicht, docker-compose zu aktualisieren, **stellen Sie sicher, dass Sie die neueste verfügbare Version von docker-compose verwenden**
./update.sh --no-update-compose
# - Starten Sie mailcow nicht, nachdem Sie ein Update durchgeführt haben
./update.sh --skip-start
# - Erzwinge Update (unbeaufsichtigt, aber nicht unterstützt, Benutzung auf eigenes Risiko)
./update.sh --force
# - Garbage Collector ausführen, um alte Image-Tags zu bereinigen und beenden
./update.sh --gc
# - Update mit der Merge-Strategie-Option &quot;ours&quot; statt &quot;theirs&quot;
# Dies wird **Konflikte** beim Zusammenführen zugunsten Ihrer lokalen Änderungen lösen und sollte vermieden werden. Lokale Änderungen werden immer beibehalten, es sei denn, wir haben auch die Datei XY geändert.
./update.sh --ours
# - Nicht aktualisieren, nur holen von Docker Images
./update.sh --prefetch
</code></pre></div>
<p>```</p>
<h1 id="optionen-konnen-kombiniert-werden">Optionen können kombiniert werden<a class="headerlink" href="#optionen-konnen-kombiniert-werden" title="Permanent link">&para;</a></h1>
<h1 id="-pruft-auf-updates-und-zeigt-anderungen-an">- Prüft auf Updates und zeigt Änderungen an<a class="headerlink" href="#-pruft-auf-updates-und-zeigt-anderungen-an" title="Permanent link">&para;</a></h1>
<p>./update.sh --check</p>
<h1 id="versuchen-sie-nicht-docker-compose-zu-aktualisieren-stellen-sie-sicher-dass-sie-die-neueste-verfugbare-version-von-docker-compose-verwenden">Versuchen Sie nicht, docker-compose zu aktualisieren, <strong>stellen Sie sicher, dass Sie die neueste verfügbare Version von docker-compose verwenden</strong><a class="headerlink" href="#versuchen-sie-nicht-docker-compose-zu-aktualisieren-stellen-sie-sicher-dass-sie-die-neueste-verfugbare-version-von-docker-compose-verwenden" title="Permanent link">&para;</a></h1>
<p>./update.sh --no-update-compose</p>
<h1 id="-starten-sie-mailcow-nicht-nachdem-sie-ein-update-durchgefuhrt-haben">- Starten Sie mailcow nicht, nachdem Sie ein Update durchgeführt haben<a class="headerlink" href="#-starten-sie-mailcow-nicht-nachdem-sie-ein-update-durchgefuhrt-haben" title="Permanent link">&para;</a></h1>
<p>./update.sh --skip-start</p>
<h1 id="-erzwinge-update-unbeaufsichtigt-aber-nicht-unterstutzt-benutzung-auf-eigenes-risiko">- Erzwinge Update (unbeaufsichtigt, aber nicht unterstützt, Benutzung auf eigenes Risiko)<a class="headerlink" href="#-erzwinge-update-unbeaufsichtigt-aber-nicht-unterstutzt-benutzung-auf-eigenes-risiko" title="Permanent link">&para;</a></h1>
<p>./update.sh --force</p>
<h1 id="-garbage-collector-ausfuhren-um-alte-image-tags-zu-bereinigen-und-beenden">- Garbage Collector ausführen, um alte Image-Tags zu bereinigen und beenden<a class="headerlink" href="#-garbage-collector-ausfuhren-um-alte-image-tags-zu-bereinigen-und-beenden" title="Permanent link">&para;</a></h1>
<p>./update.sh --gc</p>
<h1 id="-update-mit-der-merge-strategie-option-ours-statt-theirs">- Update mit der Merge-Strategie-Option "ours" statt "theirs"<a class="headerlink" href="#-update-mit-der-merge-strategie-option-ours-statt-theirs" title="Permanent link">&para;</a></h1>
<h1 id="dies-wird-konflikte-beim-zusammenfuhren-zugunsten-ihrer-lokalen-anderungen-losen-und-sollte-vermieden-werden-lokale-anderungen-werden-immer-beibehalten-es-sei-denn-wir-haben-auch-die-datei-xy-geandert">Dies wird <strong>Konflikte</strong> beim Zusammenführen zugunsten Ihrer lokalen Änderungen lösen und sollte vermieden werden. Lokale Änderungen werden immer beibehalten, es sei denn, wir haben auch die Datei XY geändert.<a class="headerlink" href="#dies-wird-konflikte-beim-zusammenfuhren-zugunsten-ihrer-lokalen-anderungen-losen-und-sollte-vermieden-werden-lokale-anderungen-werden-immer-beibehalten-es-sei-denn-wir-haben-auch-die-datei-xy-geandert" title="Permanent link">&para;</a></h1>
<p>./update.sh --ours</p>
<h1 id="-nicht-aktualisieren-nur-holen-von-docker-images">- Nicht aktualisieren, nur holen von Docker Images<a class="headerlink" href="#-nicht-aktualisieren-nur-holen-von-docker-images" title="Permanent link">&para;</a></h1>
<p>./update.sh --prefetch
```</p>
<h3 id="ich-habe-vergessen-was-ich-vor-dem-ausfuhren-von-updatesh-geandert-habe">Ich habe vergessen, was ich vor dem Ausführen von update.sh geändert habe.<a class="headerlink" href="#ich-habe-vergessen-was-ich-vor-dem-ausfuhren-von-updatesh-geandert-habe" title="Permanent link">&para;</a></h3>
<p>Siehe <code>git log --pretty=oneline | grep -i "before update"</code>, Sie werden eine Ausgabe ähnlich dieser haben:</p>
<div class="highlight"><pre><span></span><code>22cd00b5e28893ef9ddef3c2b5436453cc5223ab Before update on 2020-09-28_19_25_45
dacd4fb9b51e9e1c8a37d84485b92ffaf6c59353 Before update on 2020-08-07_13_31_31
</code></pre></div>
<p><code>22cd00b5e28893ef9ddef3c2b5436453cc5223ab Before update on 2020-09-28_19_25_45
dacd4fb9b51e9e1c8a37d84485b92ffaf6c59353 Before update on 2020-08-07_13_31_31</code></p>
<p>Führen Sie <code>git diff 22cd00b5e28893ef9ddef3c2b5436453cc5223ab</code> aus, um zu sehen, was sich geändert hat.</p>
<h3 id="kann-ich-ein-rollback-durchfuhren">Kann ich ein Rollback durchführen?<a class="headerlink" href="#kann-ich-ein-rollback-durchfuhren" title="Permanent link">&para;</a></h3>
<p>Ja.</p>
<p>Siehe das obige Thema, anstelle eines Diffs führen Sie checkout aus:</p>
<div class="highlight"><pre><span></span><code>docker-compose down
# Ersetzen Sie die Commit-ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab durch Ihre ID
git checkout 22cd00b5e28893ef9ddef3c2b5436453cc5223ab
<p>```
docker-compose down</p>
<h1 id="ersetzen-sie-die-commit-id-22cd00b5e28893ef9ddef3c2b5436453cc5223ab-durch-ihre-id">Ersetzen Sie die Commit-ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab durch Ihre ID<a class="headerlink" href="#ersetzen-sie-die-commit-id-22cd00b5e28893ef9ddef3c2b5436453cc5223ab-durch-ihre-id" title="Permanent link">&para;</a></h1>
<p>git checkout 22cd00b5e28893ef9ddef3c2b5436453cc5223ab
docker-compose pull
docker-compose up -d
</code></pre></div>
```</p>
<h3 id="hooks">Hooks<a class="headerlink" href="#hooks" title="Permanent link">&para;</a></h3>
<p>Sie können sich in den Update-Mechanismus einklinken, indem Sie Skripte namens <code>pre_commit_hook.sh</code> und <code>post_commit_hook.sh</code> zu Ihrem mailcows-Root-Verzeichnis hinzufügen. Siehe <a href="../../manual-guides/u_e-update-hooks/">hier</a> für weitere Details.</p>
<h2 id="funoten">Fußnoten<a class="headerlink" href="#funoten" title="Permanent link">&para;</a></h2>

Datei anzeigen

@ -2466,21 +2466,20 @@
<li>Sie brauchen <code>your_id</code> von den Downloadlinks. <strong>Diese sind pro User individuell</strong>.</li>
<li>
<p>Fügen Sie diese wie folgt in die <code>data/conf/clamav/freshclam.conf</code> ein und ersetzen Sie den <code>your_id</code> Teil mit Ihrer ID:
<div class="highlight"><pre><span></span><code>DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfo.hdb
<code>DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfo.hdb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfo.ign2
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/javascript.ndb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/spam_marketing.ndb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfohtml.hdb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfoascii.hdb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfopdf.hdb
</code></pre></div></p>
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfopdf.hdb</code></p>
</li>
<li>
<p>Bei den kostenlosen SecuriteInfo Datenbanken ist die Download-Geschwindigkeit auf 300 kB/s begrenzt. Ändern Sie in <code>data/conf/clamav/freshclam.conf</code> den Standardwert <code>ReceiveTimeout 20</code> auf <code>ReceiveTimeout 90</code> (Zeitangabe in Sekunden), da ansonsten einige der Datenbank-Downloads aufgrund ihrer Größe abbrechen können.</p>
</li>
<li>
<p>Passen Sie <code>data/conf/clamav/clamd.conf</code> mit den folgenden Einstellungen an:
<div class="highlight"><pre><span></span><code>DetectPUA yes
<code>DetectPUA yes
ExcludePUA PUA.Win.Packer
ExcludePUA PUA.Win.Trojan.Packed
ExcludePUA PUA.Win.Trojan.Molebox
@ -2492,12 +2491,11 @@ MaxRecursion 40
MaxEmbeddedPE 100M
MaxHTMLNormalize 50M
MaxScriptNormalize 50M
MaxZipTypeRcg 50M
</code></pre></div></p>
MaxZipTypeRcg 50M</code></p>
</li>
<li>Starten Sie den ClamAV Container neu:
<div class="highlight"><pre><span></span><code>docker-compose restart clamd-mailcow
</code></pre></div></li>
<code>bash
docker-compose restart clamd-mailcow</code></li>
</ol>
<p><strong>Bitte beachten Sie</strong>:</p>
<ul>
@ -2509,14 +2507,13 @@ MaxZipTypeRcg 50M
<h3 id="interserver-datenbanken-aktivieren">InterServer Datenbanken aktivieren<a class="headerlink" href="#interserver-datenbanken-aktivieren" title="Permanent link">&para;</a></h3>
<ol>
<li>Fügen Sie folgendes in <code>data/conf/clamav/freshclam.conf</code> ein:
<div class="highlight"><pre><span></span><code>DatabaseCustomURL http://sigs.interserver.net/interserver256.hdb
<code>DatabaseCustomURL http://sigs.interserver.net/interserver256.hdb
DatabaseCustomURL http://sigs.interserver.net/interservertopline.db
DatabaseCustomURL http://sigs.interserver.net/shell.ldb
DatabaseCustomURL http://sigs.interserver.net/whitelist.fp
</code></pre></div></li>
DatabaseCustomURL http://sigs.interserver.net/whitelist.fp</code></li>
<li>Starten Sie den ClamAV Container neu:
<div class="highlight"><pre><span></span><code>docker-compose restart clamd-mailcow
</code></pre></div></li>
<code>bash
docker-compose restart clamd-mailcow</code></li>
</ol>
<hr>

Datei anzeigen

@ -1842,6 +1842,13 @@
Whitelist für bestimmte ClamAV-Signaturen
</a>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-redis-mailcow-binsh" class="md-nav__link">
docker-compose exec redis-mailcow /bin/sh
</a>
</li>
</ul>
@ -2374,6 +2381,13 @@
Whitelist für bestimmte ClamAV-Signaturen
</a>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-redis-mailcow-binsh" class="md-nav__link">
docker-compose exec redis-mailcow /bin/sh
</a>
</li>
</ul>
@ -2394,26 +2408,25 @@
<h1>Whitelist</h1>
<h2 id="whitelist-fur-bestimmte-clamav-signaturen">Whitelist für bestimmte ClamAV-Signaturen<a class="headerlink" href="#whitelist-fur-bestimmte-clamav-signaturen" title="Permanent link">&para;</a></h2>
<p>Es kann vorkommen, dass legitime (saubere) Mails von ClamAV blockiert werden (Rspamd markiert die Mail mit <code>VIRUS_FOUND</code>). So werden beispielsweise interaktive PDF-Formularanhänge standardmäßig blockiert, da der eingebettete Javascript-Code für schädliche Zwecke verwendet werden könnte. Überprüfen Sie dies anhand der clamd-Protokolle, z.B.:</p>
<div class="highlight"><pre><span></span><code>docker-compose logs clamd-mailcow <span class="p">|</span> grep <span class="s2">&quot;FOUND&quot;</span>
</code></pre></div>
<p><code>bash
docker-compose logs clamd-mailcow | grep "FOUND"</code></p>
<p>Diese Zeile bestätigt, dass ein solcher identifiziert wurde:</p>
<div class="highlight"><pre><span></span><code>clamd-mailcow_1 | Sat Sep 28 07:43:24 2019 -&gt; instream(local): PUA.Pdf.Trojan.EmbeddedJavaScript-1(e887d2ac324ce90750768b86b63d0749:363325) FOUND
</code></pre></div>
<p><code>text
clamd-mailcow_1 | Sat Sep 28 07:43:24 2019 -&gt; instream(local): PUA.Pdf.Trojan.EmbeddedJavaScript-1(e887d2ac324ce90750768b86b63d0749:363325) FOUND</code></p>
<p>Um diese spezielle Signatur auf die Whitelist zu setzen (und den Versand dieses Dateityps im Anhang zu ermöglichen), fügen Sie sie der ClamAV-Signatur-Whitelist-Datei hinzu:</p>
<div class="highlight"><pre><span></span><code><span class="nb">echo</span> <span class="s1">&#39;PUA.Pdf.Trojan.EmbeddedJavaScript-1&#39;</span> &gt;&gt; data/conf/clamav/whitelist.ign2
</code></pre></div>
<p><code>bash
echo 'PUA.Pdf.Trojan.EmbeddedJavaScript-1' &gt;&gt; data/conf/clamav/whitelist.ign2</code></p>
<p>Dann starten Sie den clamd-mailcow Service Container in der mailcow UI oder mit docker-compose neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart clamd-mailcow
</code></pre></div>
<p><code>bash
docker-compose restart clamd-mailcow</code></p>
<p>Bereinigen Sie zwischengespeicherte ClamAV-Ergebnisse in Redis:</p>
<div class="highlight"><pre><span></span><code># docker-compose exec redis-mailcow /bin/sh
/data # redis-cli KEYS rs_cl* | xargs redis-cli DEL
<p>```</p>
<h1 id="docker-compose-exec-redis-mailcow-binsh">docker-compose exec redis-mailcow /bin/sh<a class="headerlink" href="#docker-compose-exec-redis-mailcow-binsh" title="Permanent link">&para;</a></h1>
<p>/data # redis-cli KEYS rs_cl* | xargs redis-cli DEL
/data # exit
</code></pre></div>
```</p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2348,14 +2348,11 @@
<h1>Dockerfiles anpassen</h1>
<p>Sie müssen die Override-Datei mit den entsprechenden Build-Tags in den mailcow: dockerized Root-Ordner (d.h. <code>/opt/mailcow-dockerized</code>) kopieren:</p>
<div class="highlight"><pre><span></span><code>cp helper-scripts/docker-compose.override.yml.d/BUILD_FLAGS/docker-compose.override.yml docker-compose.override.yml
</code></pre></div>
<p><code>cp helper-scripts/docker-compose.override.yml.d/BUILD_FLAGS/docker-compose.override.yml docker-compose.override.yml</code></p>
<p>Nehmen Sie Ihre Änderungen in <code>data/Dockerfiles/$service</code> vor und erstellen Sie das Image lokal:</p>
<div class="highlight"><pre><span></span><code>docker build data/Dockerfiles/service -t mailcow/$service
</code></pre></div>
<p><code>docker build data/Dockerfiles/service -t mailcow/$service</code></p>
<p>Nun werden die geänderten Container automatisch neu erstellt:</p>
<div class="highlight"><pre><span></span><code>docker-compose up -d
</code></pre></div>
<p><code>docker-compose up -d</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2348,8 +2348,7 @@
<h1>Docker Compose Bash Completion</h1>
<p>Um eine schöne Bash-Vervollständigung in Ihren Containern zu erhalten, führen Sie einfach das Folgende aus:</p>
<div class="highlight"><pre><span></span><code>curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
</code></pre></div>
<p><code>curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2349,8 +2349,7 @@
<p>Am 17. August haben wir die Möglichkeit, mit "jedem" oder "allen authentifizierten Benutzern" zu teilen, standardmäßig deaktiviert.</p>
<p>Diese Funktion kann wieder aktiviert werden, indem <code>ACL_ANYONE</code> auf <code>allow</code> in mailcow.conf gesetzt wird:</p>
<div class="highlight"><pre><span></span><code>ACL_ANYONE=allow
</code></pre></div>
<p><code>ACL_ANYONE=allow</code></p>
<p>Wenden Sie die Änderungen an, indem Sie <code>docker-compose up -d</code> ausführen.</p>
<hr>

Datei anzeigen

@ -1564,6 +1564,33 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binbash" class="md-nav__link">
!/bin/bash
</a>
</li>
<li class="md-nav__item">
<a href="#pfad-zu-mailcow-dockerized-zb-optmailcow-dockerized" class="md-nav__link">
Pfad zu mailcow-dockerized, z.B. /opt/mailcow-dockerized
</a>
</li>
<li class="md-nav__item">
<a href="#jeden-tag-um-0400-uhr-morgens-ausfuhren" class="md-nav__link">
Jeden Tag um 04:00 Uhr morgens ausführen.
</a>
<nav class="md-nav" aria-label="Jeden Tag um 04:00 Uhr morgens ausführen.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#uber-docker-job-scheduler" class="md-nav__link">
über Docker Job Scheduler
@ -2418,6 +2445,33 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binbash" class="md-nav__link">
!/bin/bash
</a>
</li>
<li class="md-nav__item">
<a href="#pfad-zu-mailcow-dockerized-zb-optmailcow-dockerized" class="md-nav__link">
Pfad zu mailcow-dockerized, z.B. /opt/mailcow-dockerized
</a>
</li>
<li class="md-nav__item">
<a href="#jeden-tag-um-0400-uhr-morgens-ausfuhren" class="md-nav__link">
Jeden Tag um 04:00 Uhr morgens ausführen.
</a>
<nav class="md-nav" aria-label="Jeden Tag um 04:00 Uhr morgens ausführen.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#uber-docker-job-scheduler" class="md-nav__link">
über Docker Job Scheduler
@ -2448,23 +2502,17 @@
<h1>Löschen der Mails eines Benutzers</h1>
<p>Wenn Sie alte Mails aus den Ordnern <code>.Junk</code> oder <code>.Trash</code> löschen wollen oder vielleicht alle gelesenen Mails, die älter als eine bestimmte Zeitspanne sind, können Sie das dovecot-Tool doveadm <a href="https://wiki.dovecot.org/Tools/Doveadm/Expunge">man doveadm-expunge</a> verwenden.</p>
<h2 id="der-manuelle-weg">Der manuelle Weg<a class="headerlink" href="#der-manuelle-weg" title="Permanent link">&para;</a></h2>
<p>Dann wollen wir mal loslegen:</p>
<p>Löschen Sie die Mails eines Benutzers im Junk-Ordner, die <strong>gelesen</strong> und <strong>älter</strong> als 4 Stunden sind</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm expunge -u &#39;mailbox@example.com&#39; mailbox &#39;Junk&#39; SEEN not SINCE 4h
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm expunge -u 'mailbox@example.com' mailbox 'Junk' SEEN not SINCE 4h</code></p>
<p>Lösche <strong>alle</strong> Mails des Benutzers im Junk-Ordner, die <strong>älter</strong> als 7 Tage sind</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm expunge -A mailbox &#39;Junk&#39; savedbefore 7d
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm expunge -A mailbox 'Junk' savedbefore 7d</code></p>
<p>Löscht <strong>alle</strong> Mails (aller Benutzer) in <strong>allen</strong> Ordnern, die <strong>älter</strong> als 52 Wochen sind (internes Datum der Mail, nicht das Datum, an dem sie auf dem System gespeichert wurde =&gt; <code>before</code> statt <code>savedbefore</code>). Nützlich zum Löschen sehr alter Mails in allen Benutzern und Ordnern (daher besonders nützlich für GDPR-Compliance).</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm expunge -A mailbox % before 52w
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm expunge -A mailbox % before 52w</code></p>
<p>Löschen von Mails in einem benutzerdefinierten Ordner <strong>innerhalb</strong> des Posteingangs eines Benutzers, die <strong>nicht</strong> gekennzeichnet und <strong>älter</strong> als 2 Wochen sind</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm expunge -u &#39;mailbox@example.com&#39; mailbox &#39;INBOX/custom-folder&#39; not FLAGGED not SINCE 2w
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm expunge -u 'mailbox@example.com' mailbox 'INBOX/custom-folder' not FLAGGED not SINCE 2w</code></p>
<div class="admonition info">
<p class="admonition-title">Info</p>
<p>Für mögliche <a href="https://wiki.dovecot.org/Tools/Doveadm/SearchQuery#section_date_specification">Zeitspannen</a> oder <a href="https://wiki.dovecot.org/Tools/Doveadm/SearchQuery#section_search_keys">SearchQuery</a> schauen Sie bitte in <a href="https://wiki.dovecot.org/Tools/Doveadm/SearchQuery">man doveadm-search-query</a></p>
@ -2472,44 +2520,42 @@
<h2 id="job-scheduler">Job-Scheduler<a class="headerlink" href="#job-scheduler" title="Permanent link">&para;</a></h2>
<h3 id="uber-das-host-system-cron">über das Host-System cron<a class="headerlink" href="#uber-das-host-system-cron" title="Permanent link">&para;</a></h3>
<p>Wenn Sie eine solche Aufgabe automatisieren wollen, können Sie einen Cron-Job auf Ihrem Rechner erstellen, der ein Skript wie das folgende aufruft:</p>
<div class="highlight"><pre><span></span><code>#!/bin/bash
# Pfad zu mailcow-dockerized, z.B. /opt/mailcow-dockerized
cd /pfad/zu/ihrem/mailcow-dockerized
/usr/local/bin/docker-compose exec -T dovecot-mailcow doveadm expunge -A mailbox &#39;Junk&#39; savedbefore 2w
/usr/local/bin/docker-compose exec -T dovecot-mailcow doveadm expunge -A mailbox &#39;Junk&#39; SEEN not SINCE 12h
<p>```</p>
<h1 id="binbash">!/bin/bash<a class="headerlink" href="#binbash" title="Permanent link">&para;</a></h1>
<h1 id="pfad-zu-mailcow-dockerized-zb-optmailcow-dockerized">Pfad zu mailcow-dockerized, z.B. /opt/mailcow-dockerized<a class="headerlink" href="#pfad-zu-mailcow-dockerized-zb-optmailcow-dockerized" title="Permanent link">&para;</a></h1>
<p>cd /pfad/zu/ihrem/mailcow-dockerized</p>
<p>/usr/local/bin/docker-compose exec -T dovecot-mailcow doveadm expunge -A mailbox 'Junk' savedbefore 2w
/usr/local/bin/docker-compose exec -T dovecot-mailcow doveadm expunge -A mailbox 'Junk' SEEN not SINCE 12h
[...]
</code></pre></div>
```</p>
<p>Um einen Cronjob zu erstellen, können Sie <code>crontab -e</code> ausführen und etwas wie das Folgende einfügen, um ein Skript auszuführen:</p>
<div class="highlight"><pre><span></span><code># Jeden Tag um 04:00 Uhr morgens ausführen.
0 4 * * * /pfad/zu/ihr/expunge_mailboxes.sh
</code></pre></div>
<p>```</p>
<h1 id="jeden-tag-um-0400-uhr-morgens-ausfuhren">Jeden Tag um 04:00 Uhr morgens ausführen.<a class="headerlink" href="#jeden-tag-um-0400-uhr-morgens-ausfuhren" title="Permanent link">&para;</a></h1>
<p>0 4 * * * /pfad/zu/ihr/expunge_mailboxes.sh
```</p>
<h3 id="uber-docker-job-scheduler">über Docker Job Scheduler<a class="headerlink" href="#uber-docker-job-scheduler" title="Permanent link">&para;</a></h3>
<p>Um dies mit einem Docker-Job-Scheduler zu archivieren, verwenden Sie diese docker-compose.override.yml mit Ihrer Mailcow: </p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
ofelia:
<p>```
version: '2.1'</p>
<p>services:</p>
<p>ofelia:
image: mcuadros/ofelia:latest
restart: always
command: daemon --docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
network_mode: none
dovecot-mailcow:
- /var/run/docker.sock:/var/run/docker.sock:ro <br />
network_mode: none</p>
<p>dovecot-mailcow:
labels:
- &quot;ofelia.enabled=true&quot;
- &quot;ofelia.job-exec.dovecot-expunge-trash.schedule=0 4 * * *&quot;
- &quot;ofelia.job-exec.dovecot-expunge-trash.command=doveadm expunge -A mailbox &#39;Junk&#39; savedbefore 2w&quot;
- &quot;ofelia.job-exec.dovecot-expunge-trash.tty=false&quot;
</code></pre></div>
- "ofelia.enabled=true"
- "ofelia.job-exec.dovecot-expunge-trash.schedule=0 4 * * *"
- "ofelia.job-exec.dovecot-expunge-trash.command=doveadm expunge -A mailbox 'Junk' savedbefore 2w"
- "ofelia.job-exec.dovecot-expunge-trash.tty=false"</p>
<p>```</p>
<p>Der Job-Controller braucht nur Zugriff auf den Docker Control Socket, um das Verhalten von "exec" zu emulieren. Dann fügen wir unserem Dovecot-Container ein paar Labels hinzu, um den Job-Scheduler zu aktivieren und ihm in einem Cron-kompatiblen Scheduling-Format mitzuteilen, wann er laufen soll. Wenn Sie Probleme mit dem Scheduling-String haben, können Sie <a href="https://crontab.guru/">crontab guru</a> verwenden.
Diese docker-compose.override.yml löscht jeden Tag um 4 Uhr morgens alle Mails, die älter als 2 Wochen sind, aus dem Ordner "Junk". Um zu sehen, ob alles richtig gelaufen ist, können Sie nicht nur in Ihrer Mailbox nachsehen, sondern auch im Docker-Log von Ofelia, ob es etwa so aussieht:</p>
<div class="highlight"><pre><span></span><code>common.go:124 ▶ NOTICE [Job &quot;dovecot-expunge-trash&quot; (8759567efa66)] Started - doveadm expunge -A mailbox &#39;Junk&#39; savedbefore 2w,
common.go:124 ▶ NOTICE [Job &quot;dovecot-expunge-trash&quot; (8759567efa66)] Finished in &quot;285.032291ms&quot;, failed: false, skipped: false, error: none,
</code></pre></div>
<p><code>common.go:124 ▶ NOTICE [Job "dovecot-expunge-trash" (8759567efa66)] Started - doveadm expunge -A mailbox 'Junk' savedbefore 2w,
common.go:124 ▶ NOTICE [Job "dovecot-expunge-trash" (8759567efa66)] Finished in "285.032291ms", failed: false, skipped: false, error: none,</code></p>
<p>Wenn der Vorgang fehlgeschlagen ist, wird dies angegeben und die Ausgabe von doveadm im Protokoll aufgeführt, um Ihnen die Fehlersuche zu erleichtern.</p>
<p>Falls Sie weitere Jobs hinzufügen wollen, stellen Sie sicher, dass Sie den "dovecot-expunge-trash"-Teil nach "ofelia.job-exec." in etwas anderes ändern, er definiert den Namen des Jobs. Die Syntax der Labels finden Sie unter <a href="https://github.com/mcuadros/ofelia">mcuadros/ofelia</a>.</p>

Datei anzeigen

@ -2349,8 +2349,7 @@
<p>Erstellen Sie eine Datei <code>data/conf/dovecot/extra.conf</code> - falls nicht vorhanden - und fügen Sie Ihren zusätzlichen Inhalt hier ein.</p>
<p>Starten Sie <code>dovecot-mailcow</code> neu, um Ihre Änderungen zu übernehmen:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart dovecot-mailcow
</code></pre></div>
<p><code>docker-compose restart dovecot-mailcow</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -1571,6 +1571,40 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#einzelbenutzer" class="md-nav__link">
Einzelbenutzer
</a>
</li>
<li class="md-nav__item">
<a href="#alle-benutzer" class="md-nav__link">
alle Benutzer
</a>
</li>
<li class="md-nav__item">
<a href="#einzelner-benutzer" class="md-nav__link">
einzelner Benutzer
</a>
</li>
<li class="md-nav__item">
<a href="#alle-benutzer-aber-offensichtlich-langsamer-und-gefahrlicher" class="md-nav__link">
alle Benutzer, aber offensichtlich langsamer und gefährlicher
</a>
<nav class="md-nav" aria-label="alle Benutzer, aber offensichtlich langsamer und gefährlicher">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#loschen-der-mailbox-daten" class="md-nav__link">
Löschen der Mailbox-Daten
@ -2404,6 +2438,40 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#einzelbenutzer" class="md-nav__link">
Einzelbenutzer
</a>
</li>
<li class="md-nav__item">
<a href="#alle-benutzer" class="md-nav__link">
alle Benutzer
</a>
</li>
<li class="md-nav__item">
<a href="#einzelner-benutzer" class="md-nav__link">
einzelner Benutzer
</a>
</li>
<li class="md-nav__item">
<a href="#alle-benutzer-aber-offensichtlich-langsamer-und-gefahrlicher" class="md-nav__link">
alle Benutzer, aber offensichtlich langsamer und gefährlicher
</a>
<nav class="md-nav" aria-label="alle Benutzer, aber offensichtlich langsamer und gefährlicher">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#loschen-der-mailbox-daten" class="md-nav__link">
Löschen der Mailbox-Daten
@ -2434,8 +2502,6 @@
<h1>FTS (Solr)</h1>
<h2 id="fts-solr">FTS Solr<a class="headerlink" href="#fts-solr" title="Permanent link">&para;</a></h2>
<p>Solr wird für Setups mit Speicher &gt;= 3,5 GiB verwendet, um eine Volltextsuche in Dovecot zu ermöglichen.</p>
<p>Bitte beachten Sie, dass Anwendungen wie Solr <em>vielleicht</em> von Zeit zu Zeit gewartet werden müssen.</p>
@ -2443,19 +2509,21 @@
<p>Die Standard-Heap-Größe (1024 M) ist in mailcow.conf definiert.</p>
<p>Da wir in Docker laufen und unsere Container mit dem "restart: always" Flag erstellen, wird eine oom Situation zumindest nur einen Neustart des Containers auslösen.</p>
<h3 id="fts-bezogene-dovecot-befehle">FTS-bezogene Dovecot-Befehle<a class="headerlink" href="#fts-bezogene-dovecot-befehle" title="Permanent link">&para;</a></h3>
<p><div class="highlight"><pre><span></span><code># Einzelbenutzer
docker-compose exec dovecot-mailcow doveadm fts rescan -u user@domain
# alle Benutzer
docker-compose exec dovecot-mailcow doveadm fts rescan -A
</code></pre></div>
<p>```</p>
<h1 id="einzelbenutzer">Einzelbenutzer<a class="headerlink" href="#einzelbenutzer" title="Permanent link">&para;</a></h1>
<p>docker-compose exec dovecot-mailcow doveadm fts rescan -u user@domain</p>
<h1 id="alle-benutzer">alle Benutzer<a class="headerlink" href="#alle-benutzer" title="Permanent link">&para;</a></h1>
<p>docker-compose exec dovecot-mailcow doveadm fts rescan -A</p>
<p>```
Dovecot Wiki: "Scannt, welche Mails im Volltextsuchindex vorhanden sind und vergleicht diese mit den tatsächlich in den Postfächern vorhandenen Mails. Dies entfernt Mails aus dem Index, die bereits gelöscht wurden und stellt sicher, dass der nächste doveadm-Index alle fehlenden Mails (falls vorhanden) indiziert."</p>
<p>Dies indiziert <strong>nicht</strong> eine Mailbox neu. Es repariert im Grunde einen gegebenen Index.</p>
<p>Wenn Sie die Daten sofort neu indizieren wollen, können Sie den folgenden Befehl ausführen, wobei '*' auch eine Postfachmaske wie 'Sent' sein kann. Sie müssen diese Befehle nicht ausführen, aber es wird die Dinge ein wenig beschleunigen:</p>
<div class="highlight"><pre><span></span><code># einzelner Benutzer
docker-compose exec dovecot-mailcow doveadm index -u user@domain &#39;*&#39;
# alle Benutzer, aber offensichtlich langsamer und gefährlicher
docker-compose exec dovecot-mailcow doveadm index -A &#39;*&#39;
</code></pre></div>
<p>```</p>
<h1 id="einzelner-benutzer">einzelner Benutzer<a class="headerlink" href="#einzelner-benutzer" title="Permanent link">&para;</a></h1>
<p>docker-compose exec dovecot-mailcow doveadm index -u user@domain '*'</p>
<h1 id="alle-benutzer-aber-offensichtlich-langsamer-und-gefahrlicher">alle Benutzer, aber offensichtlich langsamer und gefährlicher<a class="headerlink" href="#alle-benutzer-aber-offensichtlich-langsamer-und-gefahrlicher" title="Permanent link">&para;</a></h1>
<p>docker-compose exec dovecot-mailcow doveadm index -A '*'
```</p>
<p>Dies <strong>wird</strong> einige Zeit in Anspruch nehmen, abhängig von Ihrer Maschine und Solr kann oom ausführen, überwachen Sie es!</p>
<p>Da die Neuindizierung sehr sinnvoll ist, haben wir sie nicht in die mailcow UI integriert. Sie müssen sich um eventuelle Fehler beim Re-Indizieren einer Mailbox kümmern.</p>
<h3 id="loschen-der-mailbox-daten">Löschen der Mailbox-Daten<a class="headerlink" href="#loschen-der-mailbox-daten" title="Permanent link">&para;</a></h3>

Datei anzeigen

@ -2462,8 +2462,7 @@
<h3 id="konfiguration-andern">Konfiguration ändern<a class="headerlink" href="#konfiguration-andern" title="Permanent link">&para;</a></h3>
<p>Erstellen Sie eine neue Datei <code>data/conf/dovecot/extra.conf</code> (oder bearbeiten Sie sie, falls sie bereits existiert).
Fügen Sie die Einstellung ein, gefolgt von dem neuen Wert. Um zum Beispiel das Intervall auf 5 Minuten zu setzen, können Sie Folgendes eingeben:</p>
<div class="highlight"><pre><span></span><code>imap_idle_notify_interval = 5 mins
</code></pre></div>
<p><code>imap_idle_notify_interval = 5 mins</code></p>
<p>29 Minuten ist der maximale Wert, den der <a href="https://tools.ietf.org/html/rfc2177">entsprechende RFC</a> erlaubt.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
@ -2471,13 +2470,11 @@ Fügen Sie die Einstellung ein, gefolgt von dem neuen Wert. Um zum Beispiel das
</div>
<h3 id="dovecot-neu-laden">Dovecot neu laden<a class="headerlink" href="#dovecot-neu-laden" title="Permanent link">&para;</a></h3>
<p>Nun laden Sie Dovecot neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow dovecot reload
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow dovecot reload</code></p>
<div class="admonition info">
<p class="admonition-title">Info</p>
<p>Sie können den Wert dieser Einstellung überprüfen mit
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow dovecot -a | grep &quot;imap_idle_notify_interval&quot;
</code></pre></div>
<code>docker-compose exec dovecot-mailcow dovecot -a | grep "imap_idle_notify_interval"</code>
Wenn Sie den Wert nicht geändert haben, sollte er auf 2m stehen. Wenn Sie ihn geändert haben, sollten Sie den neuen Wert sehen.</p>
</div>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#entschlusseln-sie-varvmail" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -1556,6 +1561,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Mail crypt
@ -2328,6 +2335,8 @@
</nav>
</div>
@ -2345,37 +2354,34 @@
<h1>Mail crypt</h1>
<p>Die Mails werden komprimiert (lz4) und verschlüsselt gespeichert. Das Schlüsselpaar ist in crypt-vol-1 zu finden.</p>
<p>Wenn Sie vorhandene maildir-Dateien entschlüsseln/verschlüsseln wollen, können Sie das folgende Skript auf eigene Gefahr verwenden:</p>
<p>Rufen Sie Dovecot auf, indem Sie <code>docker-compose exec dovecot-mailcow /bin/bash</code> im mailcow-dockerisierten Verzeichnis ausführen.</p>
<div class="highlight"><pre><span></span><code># Entschlüsseln Sie /var/vmail
find /var/vmail/ -type f -regextype egrep -regex &#39;.*S=.*W=.*&#39; | while read -r file; do
if [[ $(head -c7 &quot;$file&quot;) == &quot;CRYPTED&quot; ]]; then
<p>```</p>
<h1 id="entschlusseln-sie-varvmail">Entschlüsseln Sie /var/vmail<a class="headerlink" href="#entschlusseln-sie-varvmail" title="Permanent link">&para;</a></h1>
<p>find /var/vmail/ -type f -regextype egrep -regex '.<em>S=.</em>W=.*' | while read -r file; do
if [[ $(head -c7 "$file") == "CRYPTED" ]]; then
doveadm fs get compress lz4:0:crypt:private_key_path=/mail_crypt/ecprivkey.pem:public_key_path=/mail_crypt/ecpubkey.pem:posix:prefix=/ \
&quot;$file&quot; &gt; &quot;/tmp/$(basename &quot;$file&quot;)&quot;
if [[ -s &quot;/tmp/$(basename &quot;$file&quot;)&quot; ]]; then
chmod 600 &quot;/tmp/$(basename &quot;$file&quot;)&quot;
chown 5000:5000 &quot;/tmp/$(basename &quot;$file&quot;)&quot;
mv &quot;/tmp/$(basename &quot;$file&quot;)&quot; &quot;$file&quot;
"$file" &gt; "/tmp/$(basename "$file")"
if [[ -s "/tmp/$(basename "$file")" ]]; then
chmod 600 "/tmp/$(basename "$file")"
chown 5000:5000 "/tmp/$(basename "$file")"
mv "/tmp/$(basename "$file")" "$file"
else
rm &quot;/tmp/$(basename &quot;$file&quot;)&quot;
rm "/tmp/$(basename "$file")"
fi
fi
done
# Verschlüsseln von /var/vmail
find /var/vmail/ -type f -regextype egrep -regex &#39;.*S=.*W=.*&#39; | while read -r file; do
if [[ $(head -c7 &quot;$file&quot;) != &quot;CRYPTED&quot; ]]; then
done</p>
<h1 id="verschlusseln-von-varvmail">Verschlüsseln von /var/vmail<a class="headerlink" href="#verschlusseln-von-varvmail" title="Permanent link">&para;</a></h1>
<p>find /var/vmail/ -type f -regextype egrep -regex '.<em>S=.</em>W=.*' | while read -r file; do
if [[ $(head -c7 "$file") != "CRYPTED" ]]; then
doveadm fs put crypt private_key_path=/mail_crypt/ecprivkey.pem:public_key_path=/mail_crypt/ecpubkey.pem:posix:prefix=/ \
&quot;$file&quot; &quot;$file&quot;
chmod 600 &quot;$file&quot;
chown 5000:5000 &quot;$file&quot;
"$file" "$file"
chmod 600 "$file"
chown 5000:5000 "$file"
fi
done
</code></pre></div>
```</p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2414,25 +2414,19 @@
<h2 id="doveadm-quota">doveadm quota<a class="headerlink" href="#doveadm-quota" title="Permanent link">&para;</a></h2>
<p>Die Befehle <code>quota get</code> und <code>quota recalc</code><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup> werden verwendet, um die Quota-Nutzung des aktuellen Benutzers anzuzeigen oder neu zu berechnen. Die angezeigten Werte sind in <em>Kilobytes</em>.</p>
<p>Um den aktuellen Quota-Status für einen Benutzer / eine Mailbox aufzulisten, tun Sie folgendes:</p>
<div class="highlight"><pre><span></span><code>doveadm quota get -u &#39;mailbox@example.org&#39;
</code></pre></div>
<p><code>doveadm quota get -u 'mailbox@example.org'</code></p>
<p>Um den Quota-Speicherwert für <strong>alle</strong> Benutzer aufzulisten, tun Sie folgendes:</p>
<div class="highlight"><pre><span></span><code>doveadm quota get -A |grep &quot;STORAGE&quot;
</code></pre></div>
<p><code>doveadm quota get -A |grep "STORAGE"</code></p>
<p>Berechnen Sie die Quota-Nutzung eines einzelnen Benutzers neu:</p>
<div class="highlight"><pre><span></span><code>doveadm quota recalc -u &#39;mailbox@example.org&#39;
</code></pre></div>
<p><code>doveadm quota recalc -u 'mailbox@example.org'</code></p>
<h2 id="doveadm-search">doveadm search<a class="headerlink" href="#doveadm-search" title="Permanent link">&para;</a></h2>
<p>Der Befehl <code>doveadm search</code><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup> wird verwendet, um Nachrichten zu finden, die Ihrer Anfrage entsprechen. Er kann den Benutzernamen, die Mailbox-GUID / -UID und die Nachrichten-GUIDs / -UIDs zurückgeben.</p>
<p>Um die Anzahl der Nachrichten im <strong>.Trash</strong> Ordner eines Benutzers zu sehen:</p>
<div class="highlight"><pre><span></span><code>doveadm search -A mailbox &#39;Trash&#39; | awk &#39;{print $1}&#39; | sort | uniq -c
</code></pre></div>
<p><code>doveadm search -A mailbox 'Trash' | awk '{print $1}' | sort | uniq -c</code></p>
<p>Alle Nachrichten im <strong>Postfach</strong> eines Benutzers anzeigen, die älter als 90 Tage sind:</p>
<div class="highlight"><pre><span></span><code>doveadm search -u &#39;mailbox@example.org&#39; mailbox &#39;INBOX&#39; savedbefore 90d
</code></pre></div>
<p><code>doveadm search -u 'mailbox@example.org' mailbox 'INBOX' savedbefore 90d</code></p>
<p>Zeige <strong>alle Nachrichten</strong> in <strong>beliebigen Ordnern</strong>, die <strong>älter</strong> sind als 30 Tage für <code>mailbox@example.org</code>:</p>
<div class="highlight"><pre><span></span><code>doveadm search -u &#39;mailbox@example.org&#39; mailbox &quot;*&quot; savedbefore 30d
</code></pre></div>
<p><code>doveadm search -u 'mailbox@example.org' mailbox "*" savedbefore 30d</code></p>
<div class="footnote">
<hr />
<ol>

Datei anzeigen

@ -2398,28 +2398,25 @@
<p>Erstellen Sie einen neuen öffentlichen Namespace "Public" und eine Mailbox "Develcow" innerhalb dieses Namespaces:</p>
<p>Bearbeiten oder erstellen Sie <code>data/conf/dovecot/extra.conf</code>, fügen Sie hinzu:</p>
<div class="highlight"><pre><span></span><code>namespace {
<p><code>namespace {
type = public
separator = /
prefix = Public/
location = maildir:/var/vmail/public:INDEXPVT=~/public
subscriptions = yes
mailbox &quot;Develcow&quot; {
mailbox "Develcow" {
auto = subscribe
}
}
</code></pre></div>
}</code></p>
<p><code>:INDEXPVT=~/public</code> kann weggelassen werden, wenn die Flags, die pro Benutzer gesehen werden, nicht gewünscht sind.</p>
<p>Die neue Mailbox im öffentlichen Namensraum wird von den Benutzern automatisch abonniert.</p>
<p>Um allen authentifizierten Benutzern vollen Zugriff auf das neue Postfach (nicht auf den gesamten Namespace) zu gewähren, führen Sie aus:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm acl set -A &quot;Public/Develcow&quot; &quot;authenticated&quot; lookup read write write-seen write-deleted insert post delete expunge create
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm acl set -A "Public/Develcow" "authenticated" lookup read write write-seen write-deleted insert post delete expunge create</code></p>
<p>Passen Sie den Befehl an Ihre Bedürfnisse an, wenn Sie detailliertere Rechte pro Benutzer vergeben möchten (verwenden Sie z.B. <code>-u user@domain</code> anstelle von <code>-A</code>).</p>
<h2 id="erlaube-authentifizierten-benutzern-den-zugriff-auf-den-gesamten-offentlichen-namespace">Erlaube authentifizierten Benutzern den Zugriff auf den gesamten öffentlichen Namespace<a class="headerlink" href="#erlaube-authentifizierten-benutzern-den-zugriff-auf-den-gesamten-offentlichen-namespace" title="Permanent link">&para;</a></h2>
<p>Um allen authentifizierten Benutzern vollen Zugriff auf den gesamten öffentlichen Namespace und seine Unterordner zu gewähren, erstellen Sie eine neue Datei <code>dovecot-acl</code> im Namespace-Stammverzeichnis:</p>
<p>Öffnen/bearbeiten/erstellen Sie <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/public/dovecot-acl</code> (passen Sie den Pfad entsprechend an), um die globale ACL-Datei mit dem folgenden Inhalt zu erstellen:</p>
<div class="highlight"><pre><span></span><code>authenticated kxeilprwts
</code></pre></div>
<p><code>authenticated kxeilprwts</code></p>
<p>kxeilprwts" ist gleichbedeutend mit "lookup read write write-seen write-deleted insert post delete expunge create".</p>
<p>Sie können <code>doveadm acl set -u user@domain "Public/Develcow" user=user@domain lookup read</code> verwenden, um den Zugriff für einen einzelnen Benutzer zu beschränken. Sie können es auch umdrehen und den Zugriff für alle Benutzer auf "lr" beschränken und nur einigen Benutzern vollen Zugriff gewähren.</p>
<p>Siehe <a href="https://doc.dovecot.org/settings/plugin/acl/">Dovecot ACL</a> für weitere Informationen über ACL.</p>

Datei anzeigen

@ -2351,9 +2351,8 @@
<p><strong>Das wird empfohlen und sollte nicht geändert werden.</strong></p>
<p>Wenn der Benutzer trotzdem statisch sein soll, geben Sie bitte zwei Variablen in <code>mailcow.conf</code> an.</p>
<p><strong>Beide</strong> Parameter dürfen nicht leer sein!</p>
<div class="highlight"><pre><span></span><code>DOVECOT_MASTER_USER=mymasteruser
DOVECOT_MASTER_PASS=mysecretpass
</code></pre></div>
<p><code>DOVECOT_MASTER_USER=mymasteruser
DOVECOT_MASTER_PASS=mysecretpass</code></p>
<p>Führen Sie <code>docker-compose up -d</code> aus, um Ihre Änderungen zu übernehmen.</p>
<p>Der statische Master-Benutzername wird zu <code>DOVECOT_MASTER_USER@mailcow.local</code> erweitert.</p>
<p>Um sich als <code>test@example.org</code> anzumelden, würde dies <code>test@example.org*mymasteruser@mailcow.local</code> mit dem oben angegebenen Passwort entsprechen.</p>

Datei anzeigen

@ -2442,41 +2442,39 @@
<p>Neuere Docker-Versionen scheinen sich über bestehende Volumes zu beschweren. Man kann dies vorübergehend beheben, indem man das bestehende Volume entfernt und mailcow mit der Override-Datei startet. Aber es scheint nach einem Neustart problematisch zu sein (muss bestätigt werden).</p>
</div>
<p>Ein einfacher, schmutziger, aber stabiler Workaround ist es, mailcow zu stoppen (<code>docker-compose down</code>), <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data</code> zu entfernen und einen neuen Link zu Ihrem entfernten Dateisystem zu erstellen, zum Beispiel:</p>
<div class="highlight"><pre><span></span><code>mv /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data_backup
ln -s /mnt/volume-xy/vmail_data /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data
</code></pre></div>
<p><code>mv /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data_backup
ln -s /mnt/volume-xy/vmail_data /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data</code></p>
<p>Starten Sie anschließend mailcow.</p>
<hr />
<h2 id="der-alte-weg">Der "alte" Weg<a class="headerlink" href="#der-alte-weg" title="Permanent link">&para;</a></h2>
<p>Wenn man einen anderen Ordner für das vmail-Volume verwenden möchte, kann man eine <code>docker-compose.override.yml</code> Datei erstellen und den folgenden Inhalt hinzufügen:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
<p><code>version: '2.1'
volumes:
vmail-vol-1:
driver_opts:
type: none
device: /data/mailcow/vmail
o: bind
</code></pre></div>
o: bind</code></p>
<h3 id="verschieben-eines-bestehenden-vmail-ordners">Verschieben eines bestehenden vmail-Ordners:<a class="headerlink" href="#verschieben-eines-bestehenden-vmail-ordners" title="Permanent link">&para;</a></h3>
<ul>
<li>Finden Sie den aktuellen vmail-Ordner anhand seines "Mountpoint"-Attributs: <code>docker volume inspect mailcowdockerized_vmail-vol-1</code></li>
</ul>
<div class="highlight"><pre><span></span><code>[
<p><code>hl_lines="10"
[
{
&quot;CreatedAt&quot;: &quot;2019-06-16T22:08:34+02:00&quot;,
&quot;Driver&quot;: &quot;local&quot;,
&quot;Labels&quot;: {
&quot;com.docker.compose.project&quot;: &quot;mailcowdockerized&quot;,
&quot;com.docker.compose.version&quot;: &quot;1.23.2&quot;,
&quot;com.docker.compose.volume&quot;: &quot;vmail-vol-1&quot;
"CreatedAt": "2019-06-16T22:08:34+02:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "mailcowdockerized",
"com.docker.compose.version": "1.23.2",
"com.docker.compose.volume": "vmail-vol-1"
},
<span class="hll"> &quot;Mountpoint&quot;: &quot;/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data&quot;,
</span> &quot;Name&quot;: &quot;mailcowdockerized_vmail-vol-1&quot;,
&quot;Options&quot;: null,
&quot;Scope&quot;: &quot;local&quot;
"Mountpoint": "/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data",
"Name": "mailcowdockerized_vmail-vol-1",
"Options": null,
"Scope": "local"
}
]
</code></pre></div>
]</code></p>
<ul>
<li>Kopieren Sie den Inhalt des <code>Mountpoint</code>-Ordners an den neuen Speicherort (z.B. <code>/data/mailcow/vmail</code>) mit <code>cp -a</code>, <code>rsync -a</code> oder einem ähnlichen, nicht strikten Kopierbefehl</li>
<li>Stoppen Sie mailcow durch Ausführen von <code>docker-compose down</code> aus Ihrem mailcow-Stammverzeichnis (z.B. <code>/opt/mailcow-dockerized</code>)</li>

Datei anzeigen

@ -2444,9 +2444,9 @@
<h2 id="neue-website">Neue Website<a class="headerlink" href="#neue-website" title="Permanent link">&para;</a></h2>
<p>Um persistente (über Updates) Sites zu erstellen, die von mailcow: dockerized gehostet werden, muss eine neue Site-Konfiguration in <code>data/conf/nginx/</code> platziert werden:</p>
<p>Eine gute Vorlage, um damit zu beginnen:</p>
<div class="highlight"><pre><span></span><code>nano data/conf/nginx/my_custom_site.conf
</code></pre></div>
<div class="highlight"><pre><span></span><code>server {
<p><code>nano data/conf/nginx/my_custom_site.conf</code></p>
<p>``` hl_lines="16"
server {
ssl_certificate /etc/ssl/mail/cert.pem;
ssl_certificate_key /etc/ssl/mail/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
@ -2461,29 +2461,27 @@
# Location: data/web
root /web;
# Location: data/web/mysite.com
<span class="hll"> #root /web/mysite.com
</span> include /etc/nginx/conf.d/listen_plain.active;
#root /web/mysite.com
include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/conf.d/listen_ssl.active;
server_name mysite.example.org;
server_tokens off;
# This allows acme to be validated even with a different web root
server_tokens off;</p>
<p># This allows acme to be validated even with a different web root
location ^~ /.well-known/acme-challenge/ {
default_type &quot;text/plain&quot;;
default_type "text/plain";
rewrite /.well-known/acme-challenge/(.*) /$1 break;
root /web/.well-known/acme-challenge/;
}
if ($scheme = http) {
}</p>
<p>if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
}
</code></pre></div>
```</p>
<h2 id="neue-website-mit-proxy-zu-einem-entfernten-location">Neue Website mit Proxy zu einem entfernten Location<a class="headerlink" href="#neue-website-mit-proxy-zu-einem-entfernten-location" title="Permanent link">&para;</a></h2>
<p>Ein weiteres Beispiel mit einer Reverse-Proxy-Konfiguration:</p>
<div class="highlight"><pre><span></span><code>nano data/conf/nginx/my_custom_site.conf
</code></pre></div>
<div class="highlight"><pre><span></span><code>server {
<p><code>nano data/conf/nginx/my_custom_site.conf</code></p>
<p>``` hl_lines="16 28"
server {
ssl_certificate /etc/ssl/mail/cert.pem;
ssl_certificate_key /etc/ssl/mail/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
@ -2498,20 +2496,17 @@
root /web;
include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/conf.d/listen_ssl.active;
<span class="hll"> server_name example.domain.tld;
</span> server_tokens off;
location ^~ /.well-known/acme-challenge/ {
server_name example.domain.tld;
server_tokens off;</p>
<p>location ^~ /.well-known/acme-challenge/ {
allow all;
default_type &quot;text/plain&quot;;
}
if ($scheme = http) {
default_type "text/plain";
}</p>
<p>if ($scheme = http) {
return 301 https://$host$request_uri;
}
<span class="hll"> location / {
</span> proxy_pass http://service:3000/;
}</p>
<p>location / {
proxy_pass <a href="http://service:3000/">http://service:3000/</a>;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@ -2519,18 +2514,16 @@
client_max_body_size 0;
}
}
</code></pre></div>
```</p>
<h2 id="konfig-erweiterung-in-mailcows-nginx">Konfig-Erweiterung in mailcows Nginx<a class="headerlink" href="#konfig-erweiterung-in-mailcows-nginx" title="Permanent link">&para;</a></h2>
<p>Der Dateiname, der für eine neue Site verwendet wird, ist nicht wichtig, solange der Dateiname eine .conf-Erweiterung trägt.</p>
<p>Es ist auch möglich, die Konfiguration der Standarddatei <code>site.conf</code> Datei zu erweitern:</p>
<div class="highlight"><pre><span></span><code>nano data/conf/nginx/site.my_content.custom
</code></pre></div>
<p><code>nano data/conf/nginx/site.my_content.custom</code></p>
<p>Dieser Dateiname muss keine ".conf"-Erweiterung haben, sondern folgt dem Muster <code>site.*.custom</code>, wobei <code>*</code> ein eigener Name ist.</p>
<p>Wenn PHP in eine benutzerdefinierte Site eingebunden werden soll, verwenden Sie bitte den PHP-FPM-Listener auf phpfpm:9002 oder erstellen Sie einen neuen Listener in <code>data/conf/phpfpm/php-fpm.d/pools.conf</code>.</p>
<p>Starten Sie Nginx neu (und PHP-FPM, falls ein neuer Listener erstellt wurde):</p>
<div class="highlight"><pre><span></span><code>docker-compose restart nginx-mailcow
docker-compose restart php-fpm-mailcow
</code></pre></div>
<p><code>docker-compose restart nginx-mailcow
docker-compose restart php-fpm-mailcow</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2350,7 +2350,8 @@
<p><strong>WICHTIG</strong>: Diese Anleitung gilt nur für Konfigurationen, bei denen SNI nicht aktiviert ist. Wenn SNI aktiviert ist, muss der Zertifikatspfad angepasst werden. Etwas wie <code>ssl_certificate,key /etc/ssl/mail/webmail.example.org/cert.pem,key.pem;</code> wird genügen. <strong>Aber</strong>: Das Zertifikat sollte <strong>zuerst</strong> bezogen werden und erst wenn das Zertifikat existiert, sollte eine Site Config erstellt werden. Nginx wird nicht starten, wenn es das Zertifikat und den Schlüssel nicht finden kann.</p>
<p>Um eine Subdomain <code>webmail.example.org</code> zu erstellen und sie auf SOGo umzuleiten, müssen Sie eine <strong>neue</strong> Nginx-Site erstellen. Achten Sie dabei auf "CHANGE_TO_MAILCOW_HOSTNAME"!</p>
<p><strong>nano data/conf/nginx/webmail.conf</strong></p>
<div class="highlight"><pre><span></span><code>server {
<p>``` hl_lines="9 17"
server {
ssl_certificate /etc/ssl/mail/cert.pem;
ssl_certificate_key /etc/ssl/mail/key.pem;
index index.php index.html;
@ -2358,23 +2359,21 @@
root /web;
include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/conf.d/listen_ssl.active;
<span class="hll"> server_name webmail.example.org;
</span> server_tokens off;
server_name webmail.example.org;
server_tokens off;
location ^~ /.well-known/acme-challenge/ {
allow all;
default_type &quot;text/plain&quot;;
default_type "text/plain";
}</p>
<p>location / {
return 301 <a href="https://CHANGE_TO_MAILCOW_HOSTNAME/SOGo">https://CHANGE_TO_MAILCOW_HOSTNAME/SOGo</a>;
}
location / {
<span class="hll"> return 301 https://CHANGE_TO_MAILCOW_HOSTNAME/SOGo;
</span> }
}
</code></pre></div>
```</p>
<p>Speichern Sie und starten Sie Nginx neu: <code>docker-compose restart nginx-mailcow</code>.</p>
<p>Öffnen Sie nun <code>mailcow.conf</code> und suchen Sie <code>ADDITIONAL_SAN</code>.
Fügen Sie <code>webmail.example.org</code> zu diesem Array hinzu, verwenden Sie keine Anführungszeichen!</p>
<div class="highlight"><pre><span></span><code>ADDITIONAL_SAN=webmail.example.org
</code></pre></div>
<p><code>ADDITIONAL_SAN=webmail.example.org</code></p>
<p>Führen Sie <code>docker-compose up -d</code> aus. Siehe "acme-mailcow" und "nginx-mailcow" Logs, wenn etwas fehlschlägt.</p>
<hr>

Datei anzeigen

@ -2349,8 +2349,7 @@
<p>Öffnen Sie <code>data/conf/postfix/extra.cf</code> und setzen Sie das <code>message_size_limit</code> entsprechend in Bytes. Siehe <code>main.cf</code> für den Standardwert.</p>
<p>Starten Sie Postfix neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart postfix-mailcow
</code></pre></div>
<p><code>docker-compose restart postfix-mailcow</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2416,14 +2416,11 @@
<h2 id="veraltete-anleitung-nicht-fur-neuere-mailcows-verwenden">Veraltete Anleitung (NICHT FÜR NEUERE MAILCOWS VERWENDEN!)<a class="headerlink" href="#veraltete-anleitung-nicht-fur-neuere-mailcows-verwenden" title="Permanent link">&para;</a></h2>
<p>Diese Option ist keine Best-Practice und sollte nur verwendet werden, wenn es keine andere Möglichkeit gibt, das zu erreichen, was Sie erreichen wollen.</p>
<p>Erstellen Sie einfach eine Datei <code>data/conf/postfix/check_sasl_access</code> und tragen Sie den folgenden Inhalt ein. Dieser Benutzer muss in Ihrer Installation existieren und muss sich vor dem Versenden von Mails authentifizieren.
<div class="highlight"><pre><span></span><code>user-to-allow-everything@example.com OK
</code></pre></div></p>
<code>user-to-allow-everything@example.com OK</code></p>
<p>Öffnen Sie <code>data/conf/postfix/main.cf</code> und suchen Sie <code>smtpd_sender_restrictions</code>. Fügen Sie <code>check_sasl_access hash:/opt/postfix/conf/check_sasl_access</code> wie folgt ein:
<div class="highlight"><pre><span></span><code>smtpd_sender_restrictions = check_sasl_access hash:/opt/postfix/conf/check_sasl_access reject_authenticated_sender_login_mismatch [...]
</code></pre></div></p>
<code>smtpd_sender_restrictions = check_sasl_access hash:/opt/postfix/conf/check_sasl_access reject_authenticated_sender_login_mismatch [...]</code></p>
<p>Postmap auf check_sasl_access ausführen:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec postfix-mailcow postmap /opt/postfix/conf/check_sasl_access
</code></pre></div>
<p><code>docker-compose exec postfix-mailcow postmap /opt/postfix/conf/check_sasl_access</code></p>
<p>Starten Sie den Postfix-Container neu.</p>
<hr>

Datei anzeigen

@ -2351,8 +2351,7 @@
<p>Postfix wird sich einmal nach dem Start von postfix-mailcow über doppelte Werte beschweren, dies ist beabsichtigt.</p>
<p>Syslog-ng wurde so konfiguriert, dass es diese Warnungen ausblendet, während Postfix läuft, um die Log-Dateien nicht jedes Mal mit unnötigen Informationen zu spammen, wenn ein Dienst benutzt wird.</p>
<p>Starten Sie <code>postfix-mailcow</code> neu, um Ihre Änderungen zu übernehmen:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart postfix-mailcow
</code></pre></div>
<p><code>docker-compose restart postfix-mailcow</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2348,13 +2348,11 @@
<h1>Statistik mit pflogsumm</h1>
<p>Um pflogsumm mit dem Standard-Logging-Treiber zu verwenden, müssen wir postfix-mailcow über docker logs abfragen und die Ausgabe zu pflogsumm leiten:</p>
<div class="highlight"><pre><span></span><code>docker logs --since 24h $(docker ps -qf name=postfix-mailcow) | pflogsumm
</code></pre></div>
<p><code>docker logs --since 24h $(docker ps -qf name=postfix-mailcow) | pflogsumm</code></p>
<p>Die obige Log-Ausgabe ist auf die letzten 24 Stunden beschränkt.</p>
<p>Es ist auch möglich, einen täglichen pflogsumm-Bericht über cron zu erstellen. Erstellen Sie die Datei /etc/cron.d/pflogsumm mit dem folgenden Inhalt:</p>
<div class="highlight"><pre><span></span><code>SHELL=/bin/bash
59 23 * * * root docker logs --since 24h $(docker ps -qf name=postfix-mailcow) | /usr/sbin/pflogsumm -d today | mail -s &quot;Postfix Report of $(date)&quot; postmaster@example.net
</code></pre></div>
<p><code>SHELL=/bin/bash
59 23 * * * root docker logs --since 24h $(docker ps -qf name=postfix-mailcow) | /usr/sbin/pflogsumm -d today | mail -s "Postfix Report of $(date)" postmaster@example.net</code></p>
<p>Um zu funktionieren muss ein lokaler Postfix auf dem Server installiert werden, welcher an den Postfix der mailcow relayed.</p>
<p>Genauere Informationen lassen sich unter Sektion <a href="https://mailcow.github.io/mailcow-dockerized-docs/de/post_installation/firststeps-local_mta/">Post-Installationsaufgaben -&gt; Lokaler MTA auf Dockerhost</a> finden.</p>
<p>Basierend auf den Postfix-Logs der letzten 24 Stunden sendet dieses Beispiel dann jeden Tag um 23:59:00 Uhr einen pflogsumm-Bericht an <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#112;&#111;&#115;&#116;&#109;&#97;&#115;&#116;&#101;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#110;&#101;&#116;">&#112;&#111;&#115;&#116;&#109;&#97;&#115;&#116;&#101;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#110;&#101;&#116;</a>.</p>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#regeln-werden-in-der-angegebenen-reihenfolge-ausgewertet" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -1392,6 +1397,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
IP in Postscreen auf die Whitelist setzen
@ -2328,6 +2335,8 @@
</nav>
</div>
@ -2345,19 +2354,18 @@
<h1>IP in Postscreen auf die Whitelist setzen</h1>
<p>IPs können in der Datei <code>data/conf/postfix/custom_postscreen_whitelist.cidr</code> aus dem Postscreen und damit <em>auch</em> aus den RBL-Prüfungen entfernt werden.</p>
<p>Postscreen führt mehrere Prüfungen durch, um bösartige Absender zu identifizieren. In den meisten Fällen möchten Sie eine IP-Adresse auf die Whitelist setzen, um sie von der Suche nach einer schwarzen Liste auszuschließen.</p>
<p>Das Format der Datei ist wie folgt</p>
<p><code>CIDR ACTION</code></p>
<p>Dabei steht CIDR für eine einzelne IP-Adresse oder einen IP-Bereich in CIDR-Notation und action entweder für "permit" oder "reject".</p>
<p>Beispiel:</p>
<div class="highlight"><pre><span></span><code># Regeln werden in der angegebenen Reihenfolge ausgewertet.
# Schwarze Liste 192.168.* außer 192.168.0.1.
192.168.0.1 permit
<p>```</p>
<h1 id="regeln-werden-in-der-angegebenen-reihenfolge-ausgewertet">Regeln werden in der angegebenen Reihenfolge ausgewertet.<a class="headerlink" href="#regeln-werden-in-der-angegebenen-reihenfolge-ausgewertet" title="Permanent link">&para;</a></h1>
<h1 id="schwarze-liste-192168-auer-19216801">Schwarze Liste 192.168.* außer 192.168.0.1.<a class="headerlink" href="#schwarze-liste-192168-auer-19216801" title="Permanent link">&para;</a></h1>
<p>192.168.0.1 permit
192.168.0.0/16 reject
</code></pre></div>
```</p>
<p>Die Datei wird spontan neu geladen, ein Neustart von Postfix ist nicht erforderlich.</p>
<hr>

Datei anzeigen

@ -2447,15 +2447,13 @@
<h3 id="ipv4-hostssubnetze">IPv4-Hosts/Subnetze<a class="headerlink" href="#ipv4-hostssubnetze" title="Permanent link">&para;</a></h3>
<p>Um das Subnetz <code>192.168.2.0/24</code> zu den vertrauenswürdigen Netzwerken hinzuzufügen, können Sie die folgende Konfiguration verwenden, abhängig von Ihren IPV4_NETWORK und IPV6_NETWORK Bereichen:</p>
<p>Bearbeiten Sie <code>data/conf/postfix/extra.cf</code>:</p>
<div class="highlight"><pre><span></span><code>mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 [fe80::]/10 172.22.1.0/24 [fd4d:6169:6c63:6f77::]/64 192.168.2.0/24
</code></pre></div>
<p><code>mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 [fe80::]/10 172.22.1.0/24 [fd4d:6169:6c63:6f77::]/64 192.168.2.0/24</code></p>
<p>Führen Sie <code>docker-compose restart postfix-mailcow</code> aus, um Ihre neuen Einstellungen zu übernehmen.</p>
<h3 id="ipv6-hostssubnets">IPv6-Hosts/Subnets<a class="headerlink" href="#ipv6-hostssubnets" title="Permanent link">&para;</a></h3>
<p>Das Hinzufügen von IPv6-Hosts erfolgt auf die gleiche Weise wie bei IPv4, allerdings muss das Subnetz in eckige Klammern <code>[]</code> gesetzt und die Netzmaske angehängt werden.</p>
<p>Um das Subnetz 2001:db8::/32 zu den vertrauenswürdigen Netzwerken hinzuzufügen, können Sie die folgende Konfiguration verwenden, abhängig von Ihren IPV4_NETWORK- und IPV6_NETWORK-Bereichen:</p>
<p>Bearbeiten Sie <code>data/conf/postfix/extra.cf</code>:</p>
<div class="highlight"><pre><span></span><code>mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 [fe80::]/10 172.22.1.0/24 [fd4d:6169:6c63:6f77::]/64 [2001:db8::]/32
</code></pre></div>
<p><code>mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 [fe80::]/10 172.22.1.0/24 [fd4d:6169:6c63:6f77::]/64 [2001:db8::]/32</code></p>
<p>Führen Sie <code>docker-compose restart postfix-mailcow</code> aus, um Ihre neuen Einstellungen zu übernehmen.</p>
<div class="admonition info">
<p class="admonition-title">Info</p>

Datei anzeigen

@ -1804,6 +1804,24 @@
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-redis-mailcow-redis-cli" class="md-nav__link">
docker-compose exec redis-mailcow redis-cli
</a>
<nav class="md-nav" aria-label="docker-compose exec redis-mailcow redis-cli">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#schlussel-keys" class="md-nav__link">
SCHLÜSSEL (Keys)
@ -1821,11 +1839,6 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@ -2430,6 +2443,24 @@
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-redis-mailcow-redis-cli" class="md-nav__link">
docker-compose exec redis-mailcow redis-cli
</a>
<nav class="md-nav" aria-label="docker-compose exec redis-mailcow redis-cli">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#schlussel-keys" class="md-nav__link">
SCHLÜSSEL (Keys)
@ -2447,11 +2478,6 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@ -2472,33 +2498,29 @@
<h1>Redis</h1>
<p>Redis wird als Key-Value-Speicher für die Einstellungen und Daten von rspamd und (einige von) mailcow verwendet. Wenn Sie mit Redis nicht vertraut sind, lesen Sie bitte die <a href="https://redis.io/topics/introduction">Einführung in Redis</a> und besuchen Sie gegebenenfalls diese <a href="http://try.redis.io/">wunderbare Anleitung</a>, um zu erfahren, wie man Redis benutzt.</p>
<h2 id="client">Client<a class="headerlink" href="#client" title="Permanent link">&para;</a></h2>
<p>Um sich mit dem redis cli zu verbinden, führen Sie aus:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec redis-mailcow redis-cli
</code></pre></div>
<p><code>docker-compose exec redis-mailcow redis-cli</code></p>
<h3 id="fehlersuche">Fehlersuche<a class="headerlink" href="#fehlersuche" title="Permanent link">&para;</a></h3>
<p>Hier sind einige nützliche Befehle für den redis-cli zur Fehlersuche:</p>
<h5 id="monitor">MONITOR<a class="headerlink" href="#monitor" title="Permanent link">&para;</a></h5>
<p>Überwacht alle vom Server empfangenen Anfragen in Echtzeit:</p>
<div class="highlight"><pre><span></span><code># docker-compose exec redis-mailcow redis-cli
127.0.0.1:6379&gt; überwachen
<p>```</p>
<h1 id="docker-compose-exec-redis-mailcow-redis-cli">docker-compose exec redis-mailcow redis-cli<a class="headerlink" href="#docker-compose-exec-redis-mailcow-redis-cli" title="Permanent link">&para;</a></h1>
<p>127.0.0.1:6379&gt; überwachen
OK
1494077286.401963 [0 172.22.1.253:41228] &quot;SMEMBERS&quot; &quot;BAYES_SPAM_keys&quot;
1494077288.292970 [0 172.22.1.253:41229] &quot;SMEMBERS&quot; &quot;BAYES_SPAM_keys&quot;
1494077286.401963 [0 172.22.1.253:41228] "SMEMBERS" "BAYES_SPAM_keys"
1494077288.292970 [0 172.22.1.253:41229] "SMEMBERS" "BAYES_SPAM_keys"
[...]
</code></pre></div>
```</p>
<h5 id="schlussel-keys">SCHLÜSSEL (Keys)<a class="headerlink" href="#schlussel-keys" title="Permanent link">&para;</a></h5>
<p>Ermittelt alle Schlüssel, die dem Muster entsprechen:</p>
<div class="highlight"><pre><span></span><code>KEYS *
</code></pre></div>
<p><code>KEYS *</code></p>
<h5 id="ping">PING<a class="headerlink" href="#ping" title="Permanent link">&para;</a></h5>
<p>Testen Sie eine Verbindung:</p>
<div class="highlight"><pre><span></span><code>127.0.0.1:6379&gt; PING
PONG
</code></pre></div>
<p><code>127.0.0.1:6379&gt; PING
PONG</code></p>
<p>Wenn Sie mehr wissen wollen, hier ist ein <a href="https://www.cheatography.com/tasjaevan/cheat-sheets/redis/">Cheat-Sheet</a>.</p>
<hr>

Datei anzeigen

@ -1816,52 +1816,146 @@
</li>
<li class="md-nav__item">
<a href="#ham" class="md-nav__link">
Ham
</a>
</li>
<li class="md-nav__item">
<a href="#spam" class="md-nav__link">
Spam
</a>
<nav class="md-nav" aria-label="Spam">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#gelernte-daten-zurucksetzen-bayes-neural" class="md-nav__link">
Gelernte Daten zurücksetzen (Bayes, Neural)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#es-ist-besser-redis-zu-stoppen-bevor-sie-die-datei-kopieren" class="md-nav__link">
Es ist besser, Redis zu stoppen, bevor Sie die Datei kopieren.
</a>
</li>
<li class="md-nav__item">
<a href="#wir-mussen-zuerst-das-redis-cli-eingeben" class="md-nav__link">
Wir müssen zuerst das redis-cli eingeben:
</a>
</li>
<li class="md-nav__item">
<a href="#in-redis-cli" class="md-nav__link">
In redis-cli:
</a>
<nav class="md-nav" aria-label="In redis-cli:">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cli-werkzeuge" class="md-nav__link">
CLI-Werkzeuge
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#greylisting-deaktivieren" class="md-nav__link">
Greylisting deaktivieren
</a>
</li>
<li class="md-nav__item">
<a href="#spamfilter-schwellenwerte-global" class="md-nav__link">
Spamfilter-Schwellenwerte (global)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#oder" class="md-nav__link">
oder:
</a>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-mysql-mailcow-mysql-umailcow-pdbpass-mailcow-e-delete-from-filterconf-where-option-highspamlevel-or-option-lowspamlevel-and-object-amp111amp110amp108amp121amp45amp116amp104amp105amp115amp45amp109amp97amp105amp108amp98amp111amp120amp64amp101amp120amp97amp109amp112amp108amp101amp46amp111amp114amp103" class="md-nav__link">
docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e "delete from filterconf where option = 'highspamlevel' or option = 'lowspamlevel' and object = 'amp#111;amp#110;amp#108;amp#121;amp#45;amp#116;amp#104;amp#105;amp#115;amp#45;amp#109;amp#97;amp#105;amp#108;amp#98;amp#111;amp#120;amp#64;amp#101;amp#120;amp#97;amp#109;amp#112;amp#108;amp#101;amp#46;amp#111;amp#114;amp#103;';"
</a>
<nav class="md-nav" aria-label="docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e "delete from filterconf where option = 'highspamlevel' or option = 'lowspamlevel' and object = 'amp#111;amp#110;amp#108;amp#121;amp#45;amp#116;amp#104;amp#105;amp#115;amp#45;amp#109;amp#97;amp#105;amp#108;amp#98;amp#111;amp#120;amp#64;amp#101;amp#120;amp#97;amp#109;amp#112;amp#108;amp#101;amp#46;amp#111;amp#114;amp#103;';"">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#benutzerdefinierte-ablehnungsnachrichten" class="md-nav__link">
Benutzerdefinierte Ablehnungsnachrichten
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#verwerfen-statt-zuruckweisen" class="md-nav__link">
Verwerfen statt zurückweisen
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#losche-alle-ratelimit-schlussel" class="md-nav__link">
Lösche alle Ratelimit-Schlüssel
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unlink-verfugbar-in-redis-4-loscht-im-hintergrund" class="md-nav__link">
Unlink (verfügbar in Redis &gt;=4.) löscht im Hintergrund
</a>
<nav class="md-nav" aria-label="Unlink (verfügbar in Redis &gt;=4.) löscht im Hintergrund">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#erneutes-senden-von-quarantane-benachrichtigungen-auslosen" class="md-nav__link">
Erneutes Senden von Quarantäne-Benachrichtigungen auslösen
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#speicherung-der-historie-erhohen" class="md-nav__link">
Speicherung der Historie erhöhen
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2450,52 +2544,146 @@
</li>
<li class="md-nav__item">
<a href="#ham" class="md-nav__link">
Ham
</a>
</li>
<li class="md-nav__item">
<a href="#spam" class="md-nav__link">
Spam
</a>
<nav class="md-nav" aria-label="Spam">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#gelernte-daten-zurucksetzen-bayes-neural" class="md-nav__link">
Gelernte Daten zurücksetzen (Bayes, Neural)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#es-ist-besser-redis-zu-stoppen-bevor-sie-die-datei-kopieren" class="md-nav__link">
Es ist besser, Redis zu stoppen, bevor Sie die Datei kopieren.
</a>
</li>
<li class="md-nav__item">
<a href="#wir-mussen-zuerst-das-redis-cli-eingeben" class="md-nav__link">
Wir müssen zuerst das redis-cli eingeben:
</a>
</li>
<li class="md-nav__item">
<a href="#in-redis-cli" class="md-nav__link">
In redis-cli:
</a>
<nav class="md-nav" aria-label="In redis-cli:">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cli-werkzeuge" class="md-nav__link">
CLI-Werkzeuge
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#greylisting-deaktivieren" class="md-nav__link">
Greylisting deaktivieren
</a>
</li>
<li class="md-nav__item">
<a href="#spamfilter-schwellenwerte-global" class="md-nav__link">
Spamfilter-Schwellenwerte (global)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#oder" class="md-nav__link">
oder:
</a>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-mysql-mailcow-mysql-umailcow-pdbpass-mailcow-e-delete-from-filterconf-where-option-highspamlevel-or-option-lowspamlevel-and-object-amp111amp110amp108amp121amp45amp116amp104amp105amp115amp45amp109amp97amp105amp108amp98amp111amp120amp64amp101amp120amp97amp109amp112amp108amp101amp46amp111amp114amp103" class="md-nav__link">
docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e "delete from filterconf where option = 'highspamlevel' or option = 'lowspamlevel' and object = 'amp#111;amp#110;amp#108;amp#121;amp#45;amp#116;amp#104;amp#105;amp#115;amp#45;amp#109;amp#97;amp#105;amp#108;amp#98;amp#111;amp#120;amp#64;amp#101;amp#120;amp#97;amp#109;amp#112;amp#108;amp#101;amp#46;amp#111;amp#114;amp#103;';"
</a>
<nav class="md-nav" aria-label="docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e "delete from filterconf where option = 'highspamlevel' or option = 'lowspamlevel' and object = 'amp#111;amp#110;amp#108;amp#121;amp#45;amp#116;amp#104;amp#105;amp#115;amp#45;amp#109;amp#97;amp#105;amp#108;amp#98;amp#111;amp#120;amp#64;amp#101;amp#120;amp#97;amp#109;amp#112;amp#108;amp#101;amp#46;amp#111;amp#114;amp#103;';"">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#benutzerdefinierte-ablehnungsnachrichten" class="md-nav__link">
Benutzerdefinierte Ablehnungsnachrichten
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#verwerfen-statt-zuruckweisen" class="md-nav__link">
Verwerfen statt zurückweisen
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#losche-alle-ratelimit-schlussel" class="md-nav__link">
Lösche alle Ratelimit-Schlüssel
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unlink-verfugbar-in-redis-4-loscht-im-hintergrund" class="md-nav__link">
Unlink (verfügbar in Redis &gt;=4.) löscht im Hintergrund
</a>
<nav class="md-nav" aria-label="Unlink (verfügbar in Redis &gt;=4.) löscht im Hintergrund">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#erneutes-senden-von-quarantane-benachrichtigungen-auslosen" class="md-nav__link">
Erneutes Senden von Quarantäne-Benachrichtigungen auslösen
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#speicherung-der-historie-erhohen" class="md-nav__link">
Speicherung der Historie erhöhen
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2516,8 +2704,6 @@
<h1>Rspamd</h1>
<p>Rspamd wird für die AV-Verarbeitung, DKIM-Signierung und SPAM-Verarbeitung verwendet. Es ist ein leistungsfähiges und schnelles Filtersystem. Für eine ausführlichere Dokumentation über Rspamd besuchen Sie bitte die [Rspamd Dokumentation] (<a href="https://rspamd.com/doc/index.html">https://rspamd.com/doc/index.html</a>).</p>
<h2 id="spam-ham-lernen">Spam &amp; Ham lernen<a class="headerlink" href="#spam-ham-lernen" title="Permanent link">&para;</a></h2>
<p>Rspamd lernt, ob es sich um Spam oder Ham handelt, wenn Sie eine Nachricht in oder aus dem Junk-Ordner in ein anderes Postfach als den Papierkorb verschieben.
@ -2528,78 +2714,73 @@ Dies wird durch die Verwendung des Sieve-Plugins "sieve_imapsieve" und Parser-Sk
<p>Sie können auch die Web-UI von Rspamd verwenden, um Ham und/oder Spam zu lernen oder bestimmte Einstellungen von Rspamd anzupassen.</p>
<h3 id="spam-oder-ham-aus-bestehendem-verzeichnis-lernen">Spam oder Ham aus bestehendem Verzeichnis lernen<a class="headerlink" href="#spam-oder-ham-aus-bestehendem-verzeichnis-lernen" title="Permanent link">&para;</a></h3>
<p>Sie können einen Einzeiler verwenden, um Mails im Klartextformat (unkomprimiert) zu lernen:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Ham</span>
<span class="k">for</span> file <span class="k">in</span> /my/folder/cur/*<span class="p">;</span> <span class="k">do</span> docker <span class="nb">exec</span> -i <span class="k">$(</span>docker-compose ps -q rspamd-mailcow<span class="k">)</span> rspamc learn_ham &lt; <span class="nv">$file</span><span class="p">;</span> <span class="k">done</span>
<span class="c1"># Spam</span>
<span class="k">for</span> file <span class="k">in</span> /my/folder/.Junk/cur/*<span class="p">;</span> <span class="k">do</span> docker <span class="nb">exec</span> -i <span class="k">$(</span>docker-compose ps -q rspamd-mailcow<span class="k">)</span> rspamc learn_spam &lt; <span class="nv">$file</span><span class="p">;</span> <span class="k">done</span>
</code></pre></div>
<p>```bash</p>
<h1 id="ham">Ham<a class="headerlink" href="#ham" title="Permanent link">&para;</a></h1>
<p>for file in /my/folder/cur/*; do docker exec -i $(docker-compose ps -q rspamd-mailcow) rspamc learn_ham &lt; $file; done</p>
<h1 id="spam">Spam<a class="headerlink" href="#spam" title="Permanent link">&para;</a></h1>
<p>for file in /my/folder/.Junk/cur/*; do docker exec -i $(docker-compose ps -q rspamd-mailcow) rspamc learn_spam &lt; $file; done
```</p>
<p>Erwägen Sie, einen lokalen Ordner als neues Volume an <code>rspamd-mailcow</code> in <code>docker-compose.yml</code> anzuhängen und die gegebenen Dateien innerhalb des Containers zu lernen. Dies kann als Workaround verwendet werden, um komprimierte Daten mit zcat zu parsen. Beispiel:</p>
<p>``bash
for file in /data/old_mail/.Junk/cur/*; do rspamc learn_spam &lt; zcat $file; done
<div class="highlight"><pre><span></span><code>### Gelernte Daten zurücksetzen (Bayes, Neural)
Sie müssen die Schlüssel in Redis löschen, um die gelernten Daten zurückzusetzen, also erstellen Sie jetzt eine Kopie Ihrer Redis-Datenbank:
**Backup Datenbank**
```bash
# Es ist besser, Redis zu stoppen, bevor Sie die Datei kopieren.
cp /var/lib/docker/volumes/mailcowdockerized_redis-vol-1/_data/dump.rdb /root/
</code></pre></div></p>
```</p>
<h3 id="gelernte-daten-zurucksetzen-bayes-neural">Gelernte Daten zurücksetzen (Bayes, Neural)<a class="headerlink" href="#gelernte-daten-zurucksetzen-bayes-neural" title="Permanent link">&para;</a></h3>
<p>Sie müssen die Schlüssel in Redis löschen, um die gelernten Daten zurückzusetzen, also erstellen Sie jetzt eine Kopie Ihrer Redis-Datenbank:</p>
<p><strong>Backup Datenbank</strong></p>
<p>```bash</p>
<h1 id="es-ist-besser-redis-zu-stoppen-bevor-sie-die-datei-kopieren">Es ist besser, Redis zu stoppen, bevor Sie die Datei kopieren.<a class="headerlink" href="#es-ist-besser-redis-zu-stoppen-bevor-sie-die-datei-kopieren" title="Permanent link">&para;</a></h1>
<p>cp /var/lib/docker/volumes/mailcowdockerized_redis-vol-1/_data/dump.rdb /root/
```</p>
<p><strong>Bayes-Daten zurücksetzen</strong></p>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> redis-mailcow sh -c <span class="s1">&#39;redis-cli --scan --pattern BAYES_* | xargs redis-cli del&#39;</span>
docker-compose <span class="nb">exec</span> redis-mailcow sh -c <span class="s1">&#39;redis-cli --scan --pattern RS* | xargs redis-cli del&#39;</span>
</code></pre></div>
<p><code>bash
docker-compose exec redis-mailcow sh -c 'redis-cli --scan --pattern BAYES_* | xargs redis-cli del'
docker-compose exec redis-mailcow sh -c 'redis-cli --scan --pattern RS* | xargs redis-cli del'</code></p>
<p><strong>Neurale Daten zurücksetzen</strong></p>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> redis-mailcow sh -c <span class="s1">&#39;redis-cli --scan --pattern rn_* | xargs redis-cli del&#39;</span>
</code></pre></div>
<p><code>bash
docker-compose exec redis-mailcow sh -c 'redis-cli --scan --pattern rn_* | xargs redis-cli del'</code></p>
<p><strong>Fuzzy-Daten zurücksetzen</strong></p>
<div class="highlight"><pre><span></span><code><span class="c1"># Wir müssen zuerst das redis-cli eingeben:</span>
docker-compose <span class="nb">exec</span> redis-mailcow redis-cli
<span class="c1"># In redis-cli:</span>
<span class="m">127</span>.0.0.1:6379&gt; EVAL <span class="s2">&quot;for i, name in ipairs(redis.call(&#39;KEYS&#39;, ARGV[1])) do redis.call(&#39;DEL&#39;, name); end&quot;</span> <span class="m">0</span> fuzzy*
</code></pre></div>
<p>```bash</p>
<h1 id="wir-mussen-zuerst-das-redis-cli-eingeben">Wir müssen zuerst das redis-cli eingeben:<a class="headerlink" href="#wir-mussen-zuerst-das-redis-cli-eingeben" title="Permanent link">&para;</a></h1>
<p>docker-compose exec redis-mailcow redis-cli</p>
<h1 id="in-redis-cli">In redis-cli:<a class="headerlink" href="#in-redis-cli" title="Permanent link">&para;</a></h1>
<p>127.0.0.1:6379&gt; EVAL "for i, name in ipairs(redis.call('KEYS', ARGV[1])) do redis.call('DEL', name); end" 0 fuzzy*
```</p>
<p><strong>Info</strong></p>
<p>Wenn redis-cli sich beschwert über...</p>
<div class="highlight"><pre><span></span><code>(error) ERR wrong number of arguments for &#39;del&#39; command
</code></pre></div>
<p><code>Text
(error) ERR wrong number of arguments for 'del' command</code></p>
<p>...das Schlüsselmuster nicht gefunden wurde und somit keine Daten zum Löschen vorhanden sind - ist es in Ordnung.</p>
<h2 id="cli-werkzeuge">CLI-Werkzeuge<a class="headerlink" href="#cli-werkzeuge" title="Permanent link">&para;</a></h2>
<p>``bash
docker-compose exec rspamd-mailcow rspamc --help
docker-compose exec rspamd-mailcow rspamadm --help
<div class="highlight"><pre><span></span><code>## Greylisting deaktivieren
Nur Nachrichten mit einer höheren Punktzahl werden als Greylisting betrachtet (soft rejected). Es ist schlechte Praxis, Greylisting zu deaktivieren.
Sie können Greylisting serverweit durch Editieren deaktivieren:
`{mailcow-dir}/data/conf/rspamd/local.d/greylist.conf`
Fügen Sie die Zeile hinzu:
```cpp
enabled = false;
</code></pre></div></p>
```</p>
<h2 id="greylisting-deaktivieren">Greylisting deaktivieren<a class="headerlink" href="#greylisting-deaktivieren" title="Permanent link">&para;</a></h2>
<p>Nur Nachrichten mit einer höheren Punktzahl werden als Greylisting betrachtet (soft rejected). Es ist schlechte Praxis, Greylisting zu deaktivieren.</p>
<p>Sie können Greylisting serverweit durch Editieren deaktivieren:</p>
<p><code>{mailcow-dir}/data/conf/rspamd/local.d/greylist.conf</code></p>
<p>Fügen Sie die Zeile hinzu:</p>
<p><code>cpp
enabled = false;</code></p>
<p>Speichern Sie die Datei und starten Sie "rspamd-mailcow" neu: <code>docker-compose restart rspamd-mailcow</code></p>
<h2 id="spamfilter-schwellenwerte-global">Spamfilter-Schwellenwerte (global)<a class="headerlink" href="#spamfilter-schwellenwerte-global" title="Permanent link">&para;</a></h2>
<p>Jeder Benutzer kann <a href="../../mailcow-UI/u_e-mailcow_ui-spamfilter/">seine Spam-Bewertung</a> individuell ändern. Um eine neue <strong>serverweite</strong> Grenze zu definieren, editieren Sie <code>data/conf/rspamd/local.d/actions.conf</code>:</p>
<div class="highlight"><pre><span></span><code><span class="n">reject</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">15</span><span class="p">;</span><span class="w"></span>
<span class="n">add_header</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">8</span><span class="p">;</span><span class="w"></span>
<span class="n">greylist</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">7</span><span class="p">;</span><span class="w"></span>
</code></pre></div>
<p><code>cpp
reject = 15;
add_header = 8;
greylist = 7;</code></p>
<p>Speichern Sie die Datei und starten Sie "rspamd-mailcow" neu: <code>docker-compose restart rspamd-mailcow</code></p>
<p>Bestehende Einstellungen der Benutzer werden nicht überschrieben!</p>
<p>Um benutzerdefinierte Schwellenwerte zurückzusetzen, führen Sie aus:</p>
<div class="highlight"><pre><span></span><code>source mailcow.conf
docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e &quot;delete from filterconf where option = &#39;highspamlevel&#39; or option = &#39;lowspamlevel&#39;;&quot;
# oder:
# docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e &quot;delete from filterconf where option = &#39;highspamlevel&#39; or option = &#39;lowspamlevel&#39; and object = &#39;only-this-mailbox@example.org&#39;;&quot;
</code></pre></div>
<p>```
source mailcow.conf
docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e "delete from filterconf where option = 'highspamlevel' or option = 'lowspamlevel';"</p>
<h1 id="oder">oder:<a class="headerlink" href="#oder" title="Permanent link">&para;</a></h1>
<h1 id="docker-compose-exec-mysql-mailcow-mysql-umailcow-pdbpass-mailcow-e-delete-from-filterconf-where-option-highspamlevel-or-option-lowspamlevel-and-object-amp111amp110amp108amp121amp45amp116amp104amp105amp115amp45amp109amp97amp105amp108amp98amp111amp120amp64amp101amp120amp97amp109amp112amp108amp101amp46amp111amp114amp103">docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e "delete from filterconf where option = 'highspamlevel' or option = 'lowspamlevel' and object = '<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#111;&#110;&#108;&#121;&#45;&#116;&#104;&#105;&#115;&#45;&#109;&#97;&#105;&#108;&#98;&#111;&#120;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#111;&#114;&#103;">&#111;&#110;&#108;&#121;&#45;&#116;&#104;&#105;&#115;&#45;&#109;&#97;&#105;&#108;&#98;&#111;&#120;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#111;&#114;&#103;</a>';"<a class="headerlink" href="#docker-compose-exec-mysql-mailcow-mysql-umailcow-pdbpass-mailcow-e-delete-from-filterconf-where-option-highspamlevel-or-option-lowspamlevel-and-object-amp111amp110amp108amp121amp45amp116amp104amp105amp115amp45amp109amp97amp105amp108amp98amp111amp120amp64amp101amp120amp97amp109amp112amp108amp101amp46amp111amp114amp103" title="Permanent link">&para;</a></h1>
<p>```</p>
<h2 id="benutzerdefinierte-ablehnungsnachrichten">Benutzerdefinierte Ablehnungsnachrichten<a class="headerlink" href="#benutzerdefinierte-ablehnungsnachrichten" title="Permanent link">&para;</a></h2>
<p>Die Standard-Spam-Reject-Meldung kann durch Hinzufügen einer neuen Datei <code>data/conf/rspamd/override.d/worker-proxy.custom.inc</code> mit dem folgenden Inhalt geändert werden:</p>
<div class="highlight"><pre><span></span><code>reject_message = &quot;Meine eigene Ablehnungsnachricht&quot;;
</code></pre></div>
<p><code>reject_message = "Meine eigene Ablehnungsnachricht";</code></p>
<p>Speichern Sie die Datei und starten Sie Rspamd neu: <code>docker-compose restart rspamd-mailcow</code>.</p>
<p>Waehrend das oben genannte fuer abgelehnte Mails mit einem hohen Spam-Score funktioniert, ignorieren Prefilter-Aktionen diese Einstellung. Für diese Karten muss das Multimap-Modul in Rspamd angepasst werden:</p>
<ol>
@ -2610,48 +2791,45 @@ docker-compose exec mysql-mailcow mysql -umailcow -p$DBPASS mailcow -e &quot;del
<p>Fügen Sie Ihre eigene Nachricht als neue Zeile hinzu:</p>
</li>
</ol>
<div class="highlight"><pre><span></span><code>GLOBAL_RCPT_BL {
Typ = &quot;rcpt&quot;;
map = &quot;${LOCAL_CONFDIR}/custom/global_rcpt_blacklist.map&quot;;
<p><code>GLOBAL_RCPT_BL {
Typ = "rcpt";
map = "${LOCAL_CONFDIR}/custom/global_rcpt_blacklist.map";
regexp = true;
prefilter = true;
action = &quot;reject&quot;;
message = &quot;Der Versand von E-Mails an diesen Empfänger ist durch postmaster@your.domain verboten&quot;;
}
</code></pre></div>
action = "reject";
message = "Der Versand von E-Mails an diesen Empfänger ist durch postmaster@your.domain verboten";
}</code></p>
<ol>
<li>Speichern Sie die Datei und starten Sie Rspamd neu: <code>docker-compose restart rspamd-mailcow</code>.</li>
</ol>
<h2 id="verwerfen-statt-zuruckweisen">Verwerfen statt zurückweisen<a class="headerlink" href="#verwerfen-statt-zuruckweisen" title="Permanent link">&para;</a></h2>
<p>Wenn Sie eine Nachricht stillschweigend verwerfen wollen, erstellen oder bearbeiten Sie die Datei <code>data/conf/rspamd/override.d/worker-proxy.custom.inc</code> und fügen Sie den folgenden Inhalt hinzu:</p>
<div class="highlight"><pre><span></span><code>discard_on_reject = true;
</code></pre></div>
<p><code>discard_on_reject = true;</code></p>
<p>Starten Sie Rspamd neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart rspamd-mailcow
</code></pre></div>
<p><code>bash
docker-compose restart rspamd-mailcow</code></p>
<h2 id="losche-alle-ratelimit-schlussel">Lösche alle Ratelimit-Schlüssel<a class="headerlink" href="#losche-alle-ratelimit-schlussel" title="Permanent link">&para;</a></h2>
<p>Wenn Sie das UI nicht verwenden wollen und stattdessen alle Schlüssel in der Redis-Datenbank löschen wollen, können Sie redis-cli für diese Aufgabe verwenden:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec redis-mailcow sh
# Unlink (verfügbar in Redis &gt;=4.) löscht im Hintergrund
redis-cli --scan --pattern RL* | xargs redis-cli unlink
</code></pre></div>
<p>```
docker-compose exec redis-mailcow sh</p>
<h1 id="unlink-verfugbar-in-redis-4-loscht-im-hintergrund">Unlink (verfügbar in Redis &gt;=4.) löscht im Hintergrund<a class="headerlink" href="#unlink-verfugbar-in-redis-4-loscht-im-hintergrund" title="Permanent link">&para;</a></h1>
<p>redis-cli --scan --pattern RL* | xargs redis-cli unlink
```</p>
<p>Starten Sie Rspamd neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> redis-mailcow sh
</code></pre></div>
<p><code>bash
docker-compose exec redis-mailcow sh</code></p>
<h2 id="erneutes-senden-von-quarantane-benachrichtigungen-auslosen">Erneutes Senden von Quarantäne-Benachrichtigungen auslösen<a class="headerlink" href="#erneutes-senden-von-quarantane-benachrichtigungen-auslosen" title="Permanent link">&para;</a></h2>
<p>Sollte nur zur Fehlersuche verwendet werden!</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow bash
mysql -umailcow -p$DBPASS mailcow -e &quot;update quarantine set notified = 0;&quot;
<p><code>docker-compose exec dovecot-mailcow bash
mysql -umailcow -p$DBPASS mailcow -e "update quarantine set notified = 0;"
redis-cli -h redis DEL Q_LAST_NOTIFIED
quarantine_notify.py
</code></pre></div>
quarantine_notify.py</code></p>
<h2 id="speicherung-der-historie-erhohen">Speicherung der Historie erhöhen<a class="headerlink" href="#speicherung-der-historie-erhohen" title="Permanent link">&para;</a></h2>
<p>Standardmäßig speichert Rspamd 1000 Elemente in der Historie.</p>
<p>Die Historie wird komprimiert gespeichert.</p>
<p>Es wird empfohlen, hier keinen unverhältnismäßig hohen Wert zu verwenden, probieren Sie etwas in der Größenordnung von 5000 oder 10000 und sehen Sie, wie Ihr Server damit umgeht:</p>
<p>Bearbeiten Sie <code>data/conf/rspamd/local.d/history_redis.conf</code>:</p>
<div class="highlight"><pre><span></span><code>nrows = 1000; # Ändern Sie diesen Wert
</code></pre></div>
<p><code>nrows = 1000; # Ändern Sie diesen Wert</code></p>
<p>Starten Sie anschließend Rspamd neu: <code>docker-compose restart rspamd-mailcow</code></p>
<hr>

Datei anzeigen

@ -2491,53 +2491,51 @@ Nachdem Sie <code>data/conf/sogo/custom-theme.js</code> modifiziert und Änderun
<li>öffnen Sie die Entwicklerkonsole des Browsers, normalerweise ist die Tastenkombination F12</li>
<li>nur wenn Sie Firefox benutzen: schreiben Sie mit der Hand in die Entwicklerkonsole <code>allow pasting</code> und drücken Sie Enter</li>
<li>fügen Sie den Java-Script-Schnipsel in die Entwicklungskonsole ein:
<div class="highlight"><pre><span></span><code>copy([].slice.call(document.styleSheets)
<code>copy([].slice.call(document.styleSheets)
.map(e =&gt; e.ownerNode)
.filter(e =&gt; e.hasAttribute(&#39;md-theme-style&#39;))
.filter(e =&gt; e.hasAttribute('md-theme-style'))
.map(e =&gt; e.textInhalt)
.join(&#39;\n&#39;)
)
</code></pre></div></li>
.join('\n')
)</code></li>
<li>Öffnen Sie den Texteditor und fügen Sie die Daten aus der Zwischenablage ein (Strg+V), Sie sollten ein minimiertes CSS erhalten, speichern Sie es</li>
<li>kopieren Sie die CSS-Datei auf den Mailcow-Server <code>data/conf/sogo/custom-theme.css</code></li>
<li>editiere <code>data/conf/sogo/sogo.conf</code> und setze <code>SOGoUIxDebugEnabled = NO;</code></li>
<li>Anhängen/Erstellen von <code>docker-compose.override.yml</code> mit:
<div class="highlight"><pre><span></span><code>Version: &#39;2.1&#39;
Dienste:
```
Version: '2.1'</li>
</ol>
<p>Dienste:
sogo-mailcow:
volumes:
- ./data/conf/sogo/custom-theme.css:/usr/lib/GNUstep/SOGo/WebServerResources/css/theme-default.css:z
</code></pre></div></li>
<li>führen Sie <code>docker-compose up -d</code> aus</li>
<li>Ausführen von <code>docker-compose restart memcached-mailcow</code></li>
</ol>
<code>``
11. führen Sie</code>docker-compose up -d<code>aus
12. Ausführen von</code>docker-compose restart memcached-mailcow`</p>
<h2 id="zurucksetzen-auf-das-sogo-standardthema">Zurücksetzen auf das SOGo Standardthema<a class="headerlink" href="#zurucksetzen-auf-das-sogo-standardthema" title="Permanent link">&para;</a></h2>
<ol>
<li>checken Sie <code>data/conf/sogo/custom-theme.js</code> aus, indem Sie <code>git fetch ; git checkout origin/master data/conf/sogo/custom-theme.js data/conf/sogo/custom-theme.js</code> ausführen</li>
<li>Suchen Sie in <code>data/conf/sogo/custom-theme.js</code>:
<div class="highlight"><pre><span></span><code>// Neue Paletten auf das Standardthema anwenden, einige Farbtöne neu zuordnen
$mdThemingProvider.theme(&#39;default&#39;)
.primaryPalette(&#39;green-cow&#39;, {
&#39;default&#39;: &#39;400&#39;, // Hintergrundfarbe der oberen Symbolleisten
hue-1&#39;: &#39;400&#39;,
&#39;hue-2&#39;: &#39;600&#39;, // Hintergrundfarbe der Seitenleiste
&#39;hue-3&#39;: &#39;A700&#39;
<code>// Neue Paletten auf das Standardthema anwenden, einige Farbtöne neu zuordnen
$mdThemingProvider.theme('default')
.primaryPalette('green-cow', {
'default': '400', // Hintergrundfarbe der oberen Symbolleisten
hue-1': '400',
'hue-2': '600', // Hintergrundfarbe der Seitenleiste
'hue-3': 'A700'
})
.accentPalette(&#39;green&#39;, {
&#39;default&#39;: &#39;600&#39;, // Hintergrundfarbe der Fab-Schaltflächen und des Anmeldebildschirms
hue-1&#39;: &#39;300&#39;, // Hintergrundfarbe der Symbolleiste der mittleren Liste
hue-2&#39;: &#39;300&#39;, // Hervorhebungsfarbe für ausgewählte Nachrichten und den aktuellen Tageskalender
hue-3&#39;: &#39;A700&#39;
.accentPalette('green', {
'default': '600', // Hintergrundfarbe der Fab-Schaltflächen und des Anmeldebildschirms
hue-1': '300', // Hintergrundfarbe der Symbolleiste der mittleren Liste
hue-2': '300', // Hervorhebungsfarbe für ausgewählte Nachrichten und den aktuellen Tageskalender
hue-3': 'A700'
})
.backgroundPalette(&#39;frost-grey&#39;);
</code></pre></div>
.backgroundPalette('frost-grey');</code>
und ersetzen Sie es durch:
<div class="highlight"><pre><span></span><code> $mdThemingProvider.theme(&#39;default&#39;);
</code></pre></div></li>
<code>$mdThemingProvider.theme('default');</code></li>
<li>Entfernen Sie aus <code>docker-compose.override.yml</code> Volume Mount in <code>sogo-mailcow</code>:
<div class="highlight"><pre><span></span><code>- ./data/conf/sogo/custom-theme.css:/usr/lib/GNUstep/SOGo/WebServerResources/css/theme-default.css:z
</code></pre></div></li>
```</li>
<li>./data/conf/sogo/custom-theme.css:/usr/lib/GNUstep/SOGo/WebServerResources/css/theme-default.css:z
```</li>
<li>führen Sie <code>docker-compose up -d</code> aus</li>
<li>Starten Sie <code>docker-compose restart memcached-mailcow</code>.</li>
</ol>
@ -2553,16 +2551,14 @@ Nachdem Sie diese Datei ersetzt haben, müssen Sie SOGo und Memcached Container
<p>Domains sind normalerweise voneinander isoliert.</p>
<p>Sie können das ändern, indem Sie <code>data/conf/sogo/sogo.conf</code> modifizieren:</p>
<p>Suche...
<div class="highlight"><pre><span></span><code> // SOGoDomainsVisibility = (
<code>// SOGoDomainsVisibility = (
// (domain1.tld, domain5.tld),
// (domain3.tld, domain2.tld)
// );
</code></pre></div>
// );</code>
...und ersetzen Sie diese durch - zum Beispiel:</p>
<div class="highlight"><pre><span></span><code> SOGoDomainsVisibility = (
<p><code>SOGoDomainsVisibility = (
(beispiel.org, beispiel.com, beispiel.net)
);
</code></pre></div>
);</code></p>
<p>SOGo neu starten: <code>docker-compose restart sogo-mailcow</code></p>
<h2 id="deaktivieren-sie-die-passwortanderung">Deaktivieren Sie die Passwortänderung<a class="headerlink" href="#deaktivieren-sie-die-passwortanderung" title="Permanent link">&para;</a></h2>
<p>Bearbeiten Sie <code>data/conf/sogo/sogo.conf</code> und <strong>ändern</strong> Sie <code>SOGoPasswordChangeEnabled</code> auf <code>NO</code>. Bitte fügen Sie keinen neuen Parameter hinzu.</p>

Datei anzeigen

@ -2416,18 +2416,15 @@
<strong>Wichtig</strong>: Nur DNSSEC-validierende DNS-Dienste werden funktionieren.</p>
<h2 id="methode-a-unbound">Methode A, Unbound<a class="headerlink" href="#methode-a-unbound" title="Permanent link">&para;</a></h2>
<p>Bearbeiten Sie <code>data/conf/unbound/unbound.conf</code> und fügen Sie die folgenden Parameter hinzu:</p>
<div class="highlight"><pre><span></span><code>forward-zone:
name: &quot;.&quot;
<p><code>forward-zone:
name: "."
forward-addr: 8.8.8.8 # VERWENDEN SIE KEINE ÖFFENTLICHEN DNS-SERVER - NUR EIN BEISPIEL
forward-addr: 8.8.4.4 # VERWENDET KEINE ÖFFENTLICHEN DNS-SERVER - NUR EIN BEISPIEL
</code></pre></div>
forward-addr: 8.8.4.4 # VERWENDET KEINE ÖFFENTLICHEN DNS-SERVER - NUR EIN BEISPIEL</code></p>
<p>Unbound neu starten:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart unbound-mailcow
</code></pre></div>
<p><code>docker-compose restart unbound-mailcow</code></p>
<h2 id="methode-b-uberschreiben-der-datei">Methode B, Überschreiben der Datei<a class="headerlink" href="#methode-b-uberschreiben-der-datei" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code>cd /opt/mailcow-dockerized
cp helper-scripts/docker-compose.override.yml.d/EXTERNAL_DNS/docker-compose.override.yml .
</code></pre></div>
<p><code>cd /opt/mailcow-dockerized
cp helper-scripts/docker-compose.override.yml.d/EXTERNAL_DNS/docker-compose.override.yml .</code></p>
<p>Bearbeiten Sie <code>docker-compose.override.yml</code> und passen Sie die IP an.</p>
<p>Führen Sie <code>docker-compose down ; docker-compose up -d</code> aus.</p>

Datei anzeigen

@ -2649,7 +2649,7 @@
<p>Watchdog verwendet Standardwerte für alle in <code>docker-compose.yml</code> definierten Thresholde.</p>
<p>Die Standardwerte sind für die meisten Konfigurationen geeignet.
Beispiel:
<div class="highlight"><pre><span></span><code>- NGINX_THRESHOLD=${NGINX_THRESHOLD:-5}
<code>- NGINX_THRESHOLD=${NGINX_THRESHOLD:-5}
- UNBOUND_THRESHOLD=${UNBOUND_THRESHOLD:-5}
- REDIS_THRESHOLD=${REDIS_THRESHOLD:-5}
- MYSQL_THRESHOLD=${MYSQL_THRESHOLD:-5}
@ -2666,8 +2666,7 @@ Beispiel:
- RSPAMD_THRESHOLD=${RSPAMD_THRESHOLD:-5}
- OLEFY_THRESHOLD=${OLEFY_THRESHOLD:-5}
- MAILQ_THRESHOLD=${MAILQ_THRESHOLD:-20}
- MAILQ_CRIT=${MAILQ_CRIT:-30}
</code></pre></div></p>
- MAILQ_CRIT=${MAILQ_CRIT:-30}</code></p>
<p>Um sie anzupassen, fügen Sie einfach die notwendigen Threshold Variablen (z.B. <code>MAILQ_THRESHOLD=10</code>) zu <code>mailcow.conf</code> hinzu und führen <code>docker-compose up -d</code> aus.</p>
<h3 id="threshold-beschreibungen">Threshold Beschreibungen<a class="headerlink" href="#threshold-beschreibungen" title="Permanent link">&para;</a></h3>
<h4 id="nginx_threshold">NGINX_THRESHOLD<a class="headerlink" href="#nginx_threshold" title="Permanent link">&para;</a></h4>

Datei anzeigen

@ -2403,20 +2403,19 @@
<p>1. Diese Nachricht in einen Unterordner "facebook" verschieben (wird in Kleinbuchstaben erstellt, falls nicht vorhanden)</p>
<p>2. Den Tag dem Betreff voranstellen: "[facebook] Betreff"</p>
<p>Bitte beachten Sie: Großgeschriebene Tags werden in Kleinbuchstaben umgewandelt, mit Ausnahme des ersten Buchstabens. Wenn Sie den Tag so lassen wollen, wie er ist, wenden Sie bitte den folgenden Diff an und starten Sie mailcow neu:
<div class="highlight"><pre><span></span><code>diff --git a/data/conf/dovecot/global_sieve_after b/data/conf/dovecot/global_sieve_after
<code>diff --git a/data/conf/dovecot/global_sieve_after b/data/conf/dovecot/global_sieve_after
index e047136e..933c4137 100644
--- a/data/conf/dovecot/global_sieve_after
+++ b/data/conf/dovecot/global_sieve_after
@@ -15,7 +15,7 @@ if allof (
envelope :detail :matches &quot;to&quot; &quot;*&quot;,
header :contains &quot;X-Moo-Tag&quot; &quot;YES&quot;
envelope :detail :matches "to" "*",
header :contains "X-Moo-Tag" "YES"
) {
- set :lower :upperfirst &quot;tag&quot; &quot;${1}&quot;;
+ set &quot;tag&quot; &quot;${1}&quot;;
if mailboxexists &quot;INBOX/${1}&quot; {
fileinto &quot;INBOX/${1}&quot;;
} else {
</code></pre></div></p>
- set :lower :upperfirst "tag" "${1}";
+ set "tag" "${1}";
if mailboxexists "INBOX/${1}" {
fileinto "INBOX/${1}";
} else {</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2349,27 +2349,24 @@
<p><strong>Verwenden Sie die untenstehende Konfiguration nicht für Reverse-Proxy-Setups</strong>, bitte lesen Sie dazu unsere <a href="../../post_installation/firststeps-rp/">Reverse-Proxy-Anleitung</a>, die einen Redirect von HTTP zu HTTPS beinhaltet.</p>
<p>Öffne <code>mailcow.conf</code> und setze <code>HTTP_BIND=</code> - falls nicht bereits gesetzt.</p>
<p>Erstellen Sie eine neue Datei <code>data/conf/nginx/redirect.conf</code> und fügen Sie die folgende Serverkonfiguration in die Datei ein:</p>
<div class="highlight"><pre><span></span><code>server {
<p><code>server {
root /web;
listen 80 default_server;
listen [::]:80 default_server;
include /etc/nginx/conf.d/server_name.active;
if ( $request_uri ~* &quot;%0A|%0D&quot; ) { return 403; }
if ( $request_uri ~* "%0A|%0D" ) { return 403; }
location ^~ /.well-known/acme-challenge/ {
allow all;
default_type &quot;text/plain&quot;;
default_type "text/plain";
}
location / {
return 301 https://$host$uri$is_args$args;
}
}
</code></pre></div>
}</code></p>
<p>Falls Sie den Parameter HTTP_BIND geändert haben, erstellen Sie den Container neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose up -d
</code></pre></div>
<p><code>docker-compose up -d</code></p>
<p>Andernfalls starten Sie Nginx neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart nginx-mailcow
</code></pre></div>
<p><code>docker-compose restart nginx-mailcow</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2350,45 +2350,44 @@
Denken Sie daran, dass <strong>ActiveSync NICHT mit einem Desktop-Client</strong> verwendet werden sollte.</p>
<p>Öffnen/erstellen Sie <code>data/web/inc/vars.local.inc.php</code> und fügen Sie Ihre Änderungen in das Konfigurationsfeld ein.</p>
<p>Die Änderungen werden mit "$autodiscover_config" in <code>data/web/inc/vars.inc.php</code> zusammengeführt):</p>
<div class="highlight"><pre><span></span><code>&lt;?php
<p><code>&lt;?php
$autodiscover_config = array(
// General autodiscover service type: &quot;activesync&quot; or &quot;imap&quot;
// General autodiscover service type: "activesync" or "imap"
// emClient uses autodiscover, but does not support ActiveSync. mailcow excludes emClient from ActiveSync.
&#39;autodiscoverType&#39; =&gt; &#39;activesync&#39;,
'autodiscoverType' =&gt; 'activesync',
// If autodiscoverType =&gt; activesync, also use ActiveSync (EAS) for Outlook desktop clients (&gt;= Outlook 2013 on Windows)
// Outlook for Mac does not support ActiveSync
&#39;useEASforOutlook&#39; =&gt; &#39;yes&#39;,
// Please don&#39;t use STARTTLS-enabled service ports in the &quot;port&quot; variable.
'useEASforOutlook' =&gt; 'yes',
// Please don't use STARTTLS-enabled service ports in the "port" variable.
// The autodiscover service will always point to SMTPS and IMAPS (TLS-wrapped services).
// The autoconfig service will additionally announce the STARTTLS-enabled ports, specified in the &quot;tlsport&quot; variable.
&#39;imap&#39; =&gt; array(
&#39;server&#39; =&gt; $mailcow_hostname,
&#39;port&#39; =&gt; array_pop(explode(&#39;:&#39;, getenv(&#39;IMAPS_PORT&#39;))),
&#39;tlsport&#39; =&gt; array_pop(explode(&#39;:&#39;, getenv(&#39;IMAP_PORT&#39;))),
// The autoconfig service will additionally announce the STARTTLS-enabled ports, specified in the "tlsport" variable.
'imap' =&gt; array(
'server' =&gt; $mailcow_hostname,
'port' =&gt; array_pop(explode(':', getenv('IMAPS_PORT'))),
'tlsport' =&gt; array_pop(explode(':', getenv('IMAP_PORT'))),
),
&#39;pop3&#39; =&gt; array(
&#39;server&#39; =&gt; $mailcow_hostname,
&#39;port&#39; =&gt; array_pop(explode(&#39;:&#39;, getenv(&#39;POPS_PORT&#39;))),
&#39;tlsport&#39; =&gt; array_pop(explode(&#39;:&#39;, getenv(&#39;POP_PORT&#39;))),
'pop3' =&gt; array(
'server' =&gt; $mailcow_hostname,
'port' =&gt; array_pop(explode(':', getenv('POPS_PORT'))),
'tlsport' =&gt; array_pop(explode(':', getenv('POP_PORT'))),
),
&#39;smtp&#39; =&gt; array(
&#39;server&#39; =&gt; $mailcow_hostname,
&#39;port&#39; =&gt; array_pop(explode(&#39;:&#39;, getenv(&#39;SMTPS_PORT&#39;))),
&#39;tlsport&#39; =&gt; array_pop(explode(&#39;:&#39;, getenv(&#39;SUBMISSION_PORT&#39;))),
'smtp' =&gt; array(
'server' =&gt; $mailcow_hostname,
'port' =&gt; array_pop(explode(':', getenv('SMTPS_PORT'))),
'tlsport' =&gt; array_pop(explode(':', getenv('SUBMISSION_PORT'))),
),
&#39;activesync&#39; =&gt; array(
&#39;url&#39; =&gt; &#39;https://&#39;.$mailcow_hostname.($https_port == 443 ? &#39;&#39; : &#39;:&#39;.$https_port).&#39;/Microsoft-Server-ActiveSync&#39;,
'activesync' =&gt; array(
'url' =&gt; 'https://'.$mailcow_hostname.($https_port == 443 ? '' : ':'.$https_port).'/Microsoft-Server-ActiveSync',
),
&#39;caldav&#39; =&gt; array(
&#39;server&#39; =&gt; $mailcow_hostname,
&#39;port&#39; =&gt; $https_port,
'caldav' =&gt; array(
'server' =&gt; $mailcow_hostname,
'port' =&gt; $https_port,
),
&#39;carddav&#39; =&gt; array(
&#39;server&#39; =&gt; $mailcow_hostname,
&#39;port&#39; =&gt; $https_port,
'carddav' =&gt; array(
'server' =&gt; $mailcow_hostname,
'port' =&gt; $https_port,
),
);
</code></pre></div>
);</code></p>
<p>Um immer IMAP und SMTP anstelle von EAS zu verwenden, setzen Sie <code>'autodiscoverType' =&gt; 'imap'</code>.</p>
<p>Deaktivieren Sie ActiveSync für Outlook-Desktop-Clients, indem Sie "useEASforOutlook" auf "no" setzen.</p>

Datei anzeigen

@ -2349,15 +2349,12 @@
<p>Unauthentifizierte Mails über SMTP an Port 25/tcp akzeptieren weiterhin &gt;= TLS 1.0 . Es ist besser, eine schwache Verschlüsselung zu akzeptieren als gar keine.</p>
<p><strong>Wie kann man schwache Protokolle wieder aktivieren?</strong></p>
<p>Bearbeiten Sie <code>data/conf/postfix/extra.cf</code>:</p>
<div class="highlight"><pre><span></span><code>submission_smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtps_smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
</code></pre></div>
<p><code>submission_smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3
smtps_smtpd_tls_mandatory_protocols = !SSLv2, !SSLv3</code></p>
<p>Bearbeiten Sie <code>data/conf/dovecot/extra.conf</code>:</p>
<div class="highlight"><pre><span></span><code>ssl_min_protocol = TLSv1
</code></pre></div>
<p><code>ssl_min_protocol = TLSv1</code></p>
<p>Starten Sie die betroffenen Dienste neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart postfix-mailcow dovecot-mailcow
</code></pre></div>
<p><code>docker-compose restart postfix-mailcow dovecot-mailcow</code></p>
<p>Tipp: Sie können TLS 1.2 in Windows 7 aktivieren.</p>
<hr>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#cd-optmailcow-dockerized" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -466,6 +471,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
IPv6 deaktivieren
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,8 +2352,6 @@
<h1>IPv6 deaktivieren</h1>
<p>Dies wird <strong>NUR</strong> empfohlen, wenn Sie kein IPv6-fähiges Netzwerk auf Ihrem Host haben!</p>
<p>Wenn Sie es wirklich brauchen, können Sie die Verwendung von IPv6 in der Compose-Datei deaktivieren.
Zusätzlich können Sie auch den Start des Containers "ipv6nat-mailcow" deaktivieren, da er nicht benötigt wird, wenn Sie IPv6 nicht verwenden.</p>
@ -2353,49 +2360,45 @@ zu erstellen und Ihre Änderungen am Dienst dort zu implementieren. Leider schei
<p>Um IPv6 im mailcow-Netzwerk zu deaktivieren, öffnen Sie docker-compose.yml mit Ihrem bevorzugten Texteditor und suchen Sie nach dem Netzwerk-Abschnitt (er befindet sich am Ende der Datei). </p>
<p><strong>1.</strong> Ändern Sie docker-compose.yml</p>
<p>Ändern Sie <code>enable_ipv6: true</code> in <code>enable_ipv6: false</code>:</p>
<div class="highlight"><pre><span></span><code>networks:
<p><code>networks:
mailcow-network:
[...]
enable_ipv6: true # &lt;&lt;&lt; auf false setzen
[...]
</code></pre></div>
[...]</code></p>
<p><strong>2.</strong> ipv6nat-mailcow deaktivieren</p>
<p>Um den ipv6nat-mailcow Container ebenfalls zu deaktivieren, gehen Sie in Ihr mailcow Verzeichnis und erstellen Sie eine neue Datei namens "docker-compose.override.yml": </p>
<p><strong>HINWEIS:</strong> Wenn Sie bereits eine Override-Datei haben, erstellen Sie diese natürlich nicht neu, sondern fügen Sie die untenstehenden Zeilen entsprechend in Ihre bestehende Datei ein!</p>
<div class="highlight"><pre><span></span><code># cd /opt/mailcow-dockerized
# touch docker-compose.override.yml
</code></pre></div>
<p>```</p>
<h1 id="cd-optmailcow-dockerized">cd /opt/mailcow-dockerized<a class="headerlink" href="#cd-optmailcow-dockerized" title="Permanent link">&para;</a></h1>
<h1 id="touch-docker-composeoverrideyml">touch docker-compose.override.yml<a class="headerlink" href="#touch-docker-composeoverrideyml" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>Öffnen Sie die Datei in Ihrem bevorzugten Texteditor und tragen Sie folgendes ein:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
ipv6nat-mailcow:
image: bash:latest
restart: &quot;no&quot;
entrypoint: [&quot;echo&quot;, &quot;ipv6nat disabled in compose.override.yml&quot;]
</code></pre></div>
<p>```
version: '2.1'
services:</p>
<pre><code>ipv6nat-mailcow:
image: bash:latest
restart: "no"
entrypoint: ["echo", "ipv6nat disabled in compose.override.yml"]
</code></pre>
<p>```</p>
<p>Damit diese Änderungen wirksam werden, müssen Sie den Stack vollständig stoppen und dann neu starten, damit Container und Netzwerke neu erstellt werden:</p>
<div class="highlight"><pre><span></span><code>docker-compose down
docker-compose up -d
</code></pre></div>
<p><code>docker-compose down
docker-compose up -d</code></p>
<p><strong>3.</strong> Deaktivieren Sie IPv6 in unbound-mailcow</p>
<p>Bearbeiten Sie <code>data/conf/unbound/unbound.conf</code> und setzen Sie <code>do-ip6</code> auf "no":</p>
<div class="highlight"><pre><span></span><code>Server:
<p><code>Server:
[...]
do-ip6: no
[...]
</code></pre></div>
[...]</code></p>
<p>unbound neu starten:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart unbound-mailcow
</code></pre></div>
<p><code>docker-compose restart unbound-mailcow</code></p>
<p><strong>4.</strong> Deaktivieren Sie IPv6 in postfix-mailcow</p>
<p>Erstellen Sie <code>data/conf/postfix/extra.cf</code> und setzen Sie <code>smtp_address_preference</code> auf <code>ipv4</code>:</p>
<div class="highlight"><pre><span></span><code>smtp_address_preference = ipv4
inet_protocols = ipv4
</code></pre></div>
<p><code>smtp_address_preference = ipv4
inet_protocols = ipv4</code></p>
<p>Starten Sie Postfix neu:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart postfix-mailcow
</code></pre></div>
<p><code>docker-compose restart postfix-mailcow</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2473,44 +2473,42 @@
</ol>
<h2 id="aktivieren-sie-dmarc-berichterstattung">Aktivieren Sie DMARC-Berichterstattung<a class="headerlink" href="#aktivieren-sie-dmarc-berichterstattung" title="Permanent link">&para;</a></h2>
<p>Erstellen Sie die Datei <code>data/conf/rspamd/local.d/dmarc.conf</code> und setzen Sie den folgenden Inhalt:</p>
<div class="highlight"><pre><span></span><code>reporting {
<p><code>reporting {
enabled = true;
email = &#39;noreply-dmarc@example.com&#39;;
domain = &#39;example.com&#39;;
org_name = &#39;Example&#39;;
helo = &#39;rspamd&#39;;
smtp = &#39;postfix&#39;;
email = 'noreply-dmarc@example.com';
domain = 'example.com';
org_name = 'Example';
helo = 'rspamd';
smtp = 'postfix';
smtp_port = 25;
from_name = &#39;Example DMARC Report&#39;;
msgid_from = &#39;rspamd.mail.example.com&#39;;
from_name = 'Example DMARC Report';
msgid_from = 'rspamd.mail.example.com';
max_entries = 2k;
keys_expire = 2d;
}
</code></pre></div>
}</code></p>
<p>Erstellen oder ändern Sie <code>docker-compose.override.yml</code> im mailcow-dockerized Basisverzeichnis:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
<p>```
version: '2.1'</p>
<p>services:
rspamd-mailcow:
environment:
- MASTER=${MASTER:-y}
labels:
ofelia.enabled: &quot;true&quot;
ofelia.job-exec.rspamd_dmarc_reporting.schedule: &quot;@every 24h&quot;
ofelia.job-exec.rspamd_dmarc_reporting.command: &quot;/bin/bash -c \&quot;[[ $${MASTER} == y ]] &amp;&amp; /usr/bin/rspamadm dmarc_report &gt; /var/lib/rspamd/dmarc_reports_last_log 2&gt;&amp;1 || exit 0\&quot;&quot;
ofelia.enabled: "true"
ofelia.job-exec.rspamd_dmarc_reporting.schedule: "@every 24h"
ofelia.job-exec.rspamd_dmarc_reporting.command: "/bin/bash -c \"[[ $${MASTER} == y ]] &amp;&amp; /usr/bin/rspamadm dmarc_report &gt; /var/lib/rspamd/dmarc_reports_last_log 2&gt;&amp;1 || exit 0\""
ofelia-mailcow:
depends_on:
- rspamd-mailcow
</code></pre></div>
```</p>
<p>Starte <code>docker-compose up -d</code></p>
<h2 id="senden-sie-eine-kopie-der-berichte-an-sich-selbst">Senden Sie eine Kopie der Berichte an sich selbst<a class="headerlink" href="#senden-sie-eine-kopie-der-berichte-an-sich-selbst" title="Permanent link">&para;</a></h2>
<p>Um eine versteckte Kopie der von Rspamd erzeugten Berichte zu erhalten, können Sie eine <code>bcc_addrs</code> Liste im <code>reporting</code> Konfigurationsabschnitt von <code>data/conf/rspamd/local.d/dmarc.conf</code> setzen:</p>
<div class="highlight"><pre><span></span><code>reporting {
<p><code>reporting {
enabled = true;
email = &#39;noreply-dmarc@example.com&#39;;
bcc_addrs = [&quot;noreply-dmarc@example.com&quot;, &quot;parsedmarc@example.com&quot;];
[...]
</code></pre></div>
email = 'noreply-dmarc@example.com';
bcc_addrs = ["noreply-dmarc@example.com", "parsedmarc@example.com"];
[...]</code></p>
<p>Rspamd lädt Änderungen in Echtzeit, so dass Sie den Container zu diesem Zeitpunkt nicht neu starten müssen.</p>
<p>Dies kann nützlich sein, wenn Sie...</p>
<ul>
@ -2519,18 +2517,14 @@ services:
</ul>
<h2 id="fehlersuche">Fehlersuche<a class="headerlink" href="#fehlersuche" title="Permanent link">&para;</a></h2>
<p>Prüfen Sie, wann der Berichtsplan zuletzt ausgeführt wurde:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec rspamd-mailcow date -r /var/lib/rspamd/dmarc_reports_last_log
</code></pre></div>
<p><code>docker-compose exec rspamd-mailcow date -r /var/lib/rspamd/dmarc_reports_last_log</code></p>
<p>Sehen Sie sich die letzte Berichtsausgabe an:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec rspamd-mailcow cat /var/lib/rspamd/dmarc_reports_last_log
</code></pre></div>
<p><code>docker-compose exec rspamd-mailcow cat /var/lib/rspamd/dmarc_reports_last_log</code></p>
<p>Manuelles Auslösen eines DMARC-Berichts:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec rspamd-mailcow rspamadm dmarc_report
</code></pre></div>
<p><code>docker-compose exec rspamd-mailcow rspamadm dmarc_report</code></p>
<p>Bestätigen Sie, dass Rspamd Daten in Redis aufgezeichnet hat:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec redis-mailcow redis-cli KEYS &#39;dmarc;*&#39;
docker-compose exec redis-mailcow redis-cli HGETALL &quot;dmarc;example.com;20211231&quot;
</code></pre></div>
<p><code>docker-compose exec redis-mailcow redis-cli KEYS 'dmarc;*'
docker-compose exec redis-mailcow redis-cli HGETALL "dmarc;example.com;20211231"</code></p>
<h2 id="andern-sie-die-haufigkeit-der-dmarc-berichte">Ändern Sie die Häufigkeit der DMARC-Berichte<a class="headerlink" href="#andern-sie-die-haufigkeit-der-dmarc-berichte" title="Permanent link">&para;</a></h2>
<p>Im obigen Beispiel werden die Berichte einmal alle 24 Stunden gesendet.</p>
<p>Der Olefia-Zeitplan hat die gleiche Implementierung wie <code>cron</code> in Go, die unterstützte Syntax ist beschrieben in <a href="https://pkg.go.dev/github.com/robfig/cron">cron Documentation</a></p>

Datei anzeigen

@ -530,10 +530,65 @@
</li>
<li class="md-nav__item">
<a href="#aus-technischen-grunden-unterscheiden-sich-die-http-bindungen-ein-wenig-von-anderen-service-bindungen" class="md-nav__link">
Aus technischen Gründen unterscheiden sich die http-Bindungen ein wenig von anderen Service-Bindungen.
</a>
</li>
<li class="md-nav__item">
<a href="#sie-werden-die-folgenden-variablen-finden-getrennt-durch-eine-bindungsadresse-und-deren-port" class="md-nav__link">
Sie werden die folgenden Variablen finden, getrennt durch eine Bindungsadresse und deren Port:
</a>
</li>
<li class="md-nav__item">
<a href="#beispiel-http_bind1234" class="md-nav__link">
Beispiel: HTTP_BIND=1.2.3.4
</a>
</li>
<li class="md-nav__item">
<a href="#andere-dienste-werden-nach-folgendem-format-gebunden" class="md-nav__link">
Andere Dienste werden nach folgendem Format gebunden:
</a>
</li>
<li class="md-nav__item">
<a href="#smtp_port123425-bindet-smtp-an-die-ip-1234-auf-port-25" class="md-nav__link">
SMTP_PORT=1.2.3.4:25 bindet SMTP an die IP 1.2.3.4 auf Port 25
</a>
</li>
<li class="md-nav__item">
<a href="#wichtig-durch-die-angabe-einer-ipv4-adresse-werden-alle-ipv6-bindungen-seit-docker-20x-ubersprungen" class="md-nav__link">
Wichtig! Durch die Angabe einer IPv4-Adresse werden alle IPv6-Bindungen seit Docker 20.x übersprungen.
</a>
</li>
<li class="md-nav__item">
<a href="#doveadm-sql-sowie-solr-sind-nur-an-lokale-ports-gebunden-bitte-andern-sie-das-nicht-es-sei-denn-sie-wissen-was-sie-tun" class="md-nav__link">
doveadm, SQL sowie Solr sind nur an lokale Ports gebunden, bitte ändern Sie das nicht, es sei denn, Sie wissen, was Sie tun.
</a>
<nav class="md-nav" aria-label="doveadm, SQL sowie Solr sind nur an lokale Ports gebunden, bitte ändern Sie das nicht, es sei denn, Sie wissen, was Sie tun.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ipv6-binding" class="md-nav__link">
IPv6-Binding
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2382,10 +2437,65 @@
</li>
<li class="md-nav__item">
<a href="#aus-technischen-grunden-unterscheiden-sich-die-http-bindungen-ein-wenig-von-anderen-service-bindungen" class="md-nav__link">
Aus technischen Gründen unterscheiden sich die http-Bindungen ein wenig von anderen Service-Bindungen.
</a>
</li>
<li class="md-nav__item">
<a href="#sie-werden-die-folgenden-variablen-finden-getrennt-durch-eine-bindungsadresse-und-deren-port" class="md-nav__link">
Sie werden die folgenden Variablen finden, getrennt durch eine Bindungsadresse und deren Port:
</a>
</li>
<li class="md-nav__item">
<a href="#beispiel-http_bind1234" class="md-nav__link">
Beispiel: HTTP_BIND=1.2.3.4
</a>
</li>
<li class="md-nav__item">
<a href="#andere-dienste-werden-nach-folgendem-format-gebunden" class="md-nav__link">
Andere Dienste werden nach folgendem Format gebunden:
</a>
</li>
<li class="md-nav__item">
<a href="#smtp_port123425-bindet-smtp-an-die-ip-1234-auf-port-25" class="md-nav__link">
SMTP_PORT=1.2.3.4:25 bindet SMTP an die IP 1.2.3.4 auf Port 25
</a>
</li>
<li class="md-nav__item">
<a href="#wichtig-durch-die-angabe-einer-ipv4-adresse-werden-alle-ipv6-bindungen-seit-docker-20x-ubersprungen" class="md-nav__link">
Wichtig! Durch die Angabe einer IPv4-Adresse werden alle IPv6-Bindungen seit Docker 20.x übersprungen.
</a>
</li>
<li class="md-nav__item">
<a href="#doveadm-sql-sowie-solr-sind-nur-an-lokale-ports-gebunden-bitte-andern-sie-das-nicht-es-sei-denn-sie-wissen-was-sie-tun" class="md-nav__link">
doveadm, SQL sowie Solr sind nur an lokale Ports gebunden, bitte ändern Sie das nicht, es sei denn, Sie wissen, was Sie tun.
</a>
<nav class="md-nav" aria-label="doveadm, SQL sowie Solr sind nur an lokale Ports gebunden, bitte ändern Sie das nicht, es sei denn, Sie wissen, was Sie tun.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#ipv6-binding" class="md-nav__link">
IPv6-Binding
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2406,29 +2516,25 @@
<h1>IP-Verbindungen</h1>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Das Ändern der Bindung hat keinen Einfluss auf Source-NAT. Siehe <a href="../firststeps-snat/">SNAT</a> für die erforderlichen Schritte.</p>
</div>
<h2 id="ipv4-binding">IPv4-Binding<a class="headerlink" href="#ipv4-binding" title="Permanent link">&para;</a></h2>
<p>Um eine oder mehrere IPv4-Bind(ings) anzupassen, öffne <code>mailcow.conf</code> und editiere eine, mehrere oder alle Variablen nach deinen Bedürfnissen:</p>
<div class="highlight"><pre><span></span><code># Aus technischen Gründen unterscheiden sich die http-Bindungen ein wenig von anderen Service-Bindungen.
# Sie werden die folgenden Variablen finden, getrennt durch eine Bindungsadresse und deren Port:
# Beispiel: HTTP_BIND=1.2.3.4
HTTP_PORT=80
<p>```</p>
<h1 id="aus-technischen-grunden-unterscheiden-sich-die-http-bindungen-ein-wenig-von-anderen-service-bindungen">Aus technischen Gründen unterscheiden sich die http-Bindungen ein wenig von anderen Service-Bindungen.<a class="headerlink" href="#aus-technischen-grunden-unterscheiden-sich-die-http-bindungen-ein-wenig-von-anderen-service-bindungen" title="Permanent link">&para;</a></h1>
<h1 id="sie-werden-die-folgenden-variablen-finden-getrennt-durch-eine-bindungsadresse-und-deren-port">Sie werden die folgenden Variablen finden, getrennt durch eine Bindungsadresse und deren Port:<a class="headerlink" href="#sie-werden-die-folgenden-variablen-finden-getrennt-durch-eine-bindungsadresse-und-deren-port" title="Permanent link">&para;</a></h1>
<h1 id="beispiel-http_bind1234">Beispiel: HTTP_BIND=1.2.3.4<a class="headerlink" href="#beispiel-http_bind1234" title="Permanent link">&para;</a></h1>
<p>HTTP_PORT=80
HTTP_BIND=
HTTPS_PORT=443
HTTPS_BIND=
# Andere Dienste werden nach folgendem Format gebunden:
# SMTP_PORT=1.2.3.4:25 bindet SMTP an die IP 1.2.3.4 auf Port 25
# Wichtig! Durch die Angabe einer IPv4-Adresse werden alle IPv6-Bindungen seit Docker 20.x übersprungen.
# doveadm, SQL sowie Solr sind nur an lokale Ports gebunden, bitte ändern Sie das nicht, es sei denn, Sie wissen, was Sie tun.
SMTP_PORT=25
HTTPS_BIND=</p>
<h1 id="andere-dienste-werden-nach-folgendem-format-gebunden">Andere Dienste werden nach folgendem Format gebunden:<a class="headerlink" href="#andere-dienste-werden-nach-folgendem-format-gebunden" title="Permanent link">&para;</a></h1>
<h1 id="smtp_port123425-bindet-smtp-an-die-ip-1234-auf-port-25">SMTP_PORT=1.2.3.4:25 bindet SMTP an die IP 1.2.3.4 auf Port 25<a class="headerlink" href="#smtp_port123425-bindet-smtp-an-die-ip-1234-auf-port-25" title="Permanent link">&para;</a></h1>
<h1 id="wichtig-durch-die-angabe-einer-ipv4-adresse-werden-alle-ipv6-bindungen-seit-docker-20x-ubersprungen">Wichtig! Durch die Angabe einer IPv4-Adresse werden alle IPv6-Bindungen seit Docker 20.x übersprungen.<a class="headerlink" href="#wichtig-durch-die-angabe-einer-ipv4-adresse-werden-alle-ipv6-bindungen-seit-docker-20x-ubersprungen" title="Permanent link">&para;</a></h1>
<h1 id="doveadm-sql-sowie-solr-sind-nur-an-lokale-ports-gebunden-bitte-andern-sie-das-nicht-es-sei-denn-sie-wissen-was-sie-tun">doveadm, SQL sowie Solr sind nur an lokale Ports gebunden, bitte ändern Sie das nicht, es sei denn, Sie wissen, was Sie tun.<a class="headerlink" href="#doveadm-sql-sowie-solr-sind-nur-an-lokale-ports-gebunden-bitte-andern-sie-das-nicht-es-sei-denn-sie-wissen-was-sie-tun" title="Permanent link">&para;</a></h1>
<p>SMTP_PORT=25
SMTPS_PORT=465
SUBMISSION_PORT=587
IMAP_PORT=143
@ -2439,35 +2545,36 @@ SIEVE_PORT=4190
DOVEADM_PORT=127.0.0.1:19991
SQL_PORT=127.0.0.1:13306
SOLR_PORT=127.0.0.1:18983
</code></pre></div>
```</p>
<p>Um Ihre Änderungen zu übernehmen, führen Sie <code>docker-compose down</code> gefolgt von <code>docker-compose up -d</code> aus.</p>
<h2 id="ipv6-binding">IPv6-Binding<a class="headerlink" href="#ipv6-binding" title="Permanent link">&para;</a></h2>
<p>Das Ändern von IPv6-Bindings ist anders als bei IPv4. Auch dies hat einen technischen Hintergrund.</p>
<p>Eine <code>docker-compose.override.yml</code> Datei wird verwendet, anstatt die <code>docker-compose.yml</code> Datei direkt zu bearbeiten. Dies geschieht, um die Aktualisierbarkeit zu erhalten, da die Datei <code>docker-compose.yml</code> regelmäßig aktualisiert wird und Ihre Änderungen höchstwahrscheinlich überschrieben werden.</p>
<p>Bearbeiten Sie die Datei "docker-compose.override.yml" und erstellen Sie sie mit dem folgenden Inhalt. Ihr Inhalt wird mit der produktiven Datei "docker-compose.yml" zusammengeführt.</p>
<p>Es wird eine imaginäre IPv6 <strong>2a00:dead:beef::abc</strong> angegeben. Das erste Suffix <code>:PORT1</code> definiert den externen Port, während das zweite Suffix <code>:PORT2</code> zu dem entsprechenden Port innerhalb des Containers führt und nicht verändert werden darf.</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
<p>```
version: '2.1'
services:</p>
<pre><code>dovecot-mailcow:
ports:
- '2a00:dead:beef::abc:143:143'
- '2a00:dead:beef::abc:993:993'
- '2a00:dead:beef::abc:110:110'
- '2a00:dead:beef::abc:995:995'
- '2a00:dead:beef::abc:4190:4190'
dovecot-mailcow:
ports:
- &#39;2a00:dead:beef::abc:143:143&#39;
- &#39;2a00:dead:beef::abc:993:993&#39;
- &#39;2a00:dead:beef::abc:110:110&#39;
- &#39;2a00:dead:beef::abc:995:995&#39;
- &#39;2a00:dead:beef::abc:4190:4190&#39;
postfix-mailcow:
ports:
- '2a00:dead:beef::abc:25:25'
- '2a00:dead:beef::abc:465:465'
- '2a00:dead:beef::abc:587:587'
postfix-mailcow:
ports:
- &#39;2a00:dead:beef::abc:25:25&#39;
- &#39;2a00:dead:beef::abc:465:465&#39;
- &#39;2a00:dead:beef::abc:587:587&#39;
nginx-mailcow:
ports:
- &#39;2a00:dead:beef::abc:80:80&#39;
- &#39;2a00:dead:beef::abc:443:443&#39;
</code></pre></div>
nginx-mailcow:
ports:
- '2a00:dead:beef::abc:80:80'
- '2a00:dead:beef::abc:443:443'
</code></pre>
<p>```</p>
<p>Um Ihre Änderungen zu übernehmen, führen Sie <code>docker-compose down</code> gefolgt von <code>docker-compose up -d</code> aus.</p>
<hr>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#smtp-inet-n-smtpd" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -508,6 +513,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Lokaler MTA auf Docker-Host
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,19 +2352,17 @@
<h1>Lokaler MTA auf Docker-Host</h1>
<p>Die einfachste Möglichkeit wäre, den Listener an Port 25/tcp zu deaktivieren.</p>
<p><strong>Postfix</strong>-Benutzer deaktivieren den Listener, indem sie die folgende Zeile (beginnend mit <code>smtp</code> oder <code>25</code>) in <code>/etc/postfix/master.cf</code> auskommentieren:
<div class="highlight"><pre><span></span><code>#smtp inet n - - - - smtpd
</code></pre></div></p>
```</p>
<h1 id="smtp-inet-n-smtpd">smtp inet n - - - - smtpd<a class="headerlink" href="#smtp-inet-n-smtpd" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>Außerdem, um über eine Dockerized mailcow weiterzuleiten, sollten Sie <code>172.22.1.1</code> als Relayhost hinzufügen und das Docker-Interface aus "inet_interfaces" entfernen:</p>
<div class="highlight"><pre><span></span><code>postconf -e &#39;relayhost = 172.22.1.1&#39;
postconf -e &quot;mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128&quot;
postconf -e &quot;inet_interfaces = loopback-only&quot;
postconf -e &quot;relay_transport = relay&quot;
postconf -e &quot;default_transport = smtp&quot;
</code></pre></div>
<p><code>postconf -e 'relayhost = 172.22.1.1'
postconf -e "mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128"
postconf -e "inet_interfaces = loopback-only"
postconf -e "relay_transport = relay"
postconf -e "default_transport = smtp"</code></p>
<p><strong>Jetzt ist es wichtig</strong>, dass Sie nicht denselben FQDN in <code>myhostname</code> haben, den Sie für Ihre mailcow verwenden. Prüfen Sie Ihre lokale (nicht-Docker) Postfix' main.cf auf <code>myhostname</code> und setzen Sie ihn auf etwas anderes, zum Beispiel <code>local.my.fqdn.tld</code>.</p>
<p>"172.22.1.1" ist das von mailcow erstellte Netzwerk-Gateway in Docker.
Das Relaying über diese Schnittstelle ist notwendig (anstatt - zum Beispiel - direkt über ${MAILCOW_HOSTNAME}), um über ein bekanntes internes Netzwerk weiterzuleiten.</p>

Datei anzeigen

@ -572,6 +572,33 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#nur-fur-rsyslog" class="md-nav__link">
Nur für Rsyslog:
</a>
</li>
<li class="md-nav__item">
<a href="#um-die-local3-eingabe-nach-varlogmailcowlog-zu-verschieben-und-die-verarbeitung-zu-beenden-erstellen-sie-eine-datei-etcrsyslogddockerconf" class="md-nav__link">
Um die local3-Eingabe nach /var/log/mailcow.log zu verschieben und die Verarbeitung zu beenden, erstellen Sie eine Datei "/etc/rsyslog.d/docker.conf":
</a>
</li>
<li class="md-nav__item">
<a href="#danach-rsyslog-neu-starten" class="md-nav__link">
Danach rsyslog neu starten.
</a>
<nav class="md-nav" aria-label="Danach rsyslog neu starten.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#uber-daemonjson-global" class="md-nav__link">
Über daemon.json (global)
@ -2416,6 +2443,33 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#nur-fur-rsyslog" class="md-nav__link">
Nur für Rsyslog:
</a>
</li>
<li class="md-nav__item">
<a href="#um-die-local3-eingabe-nach-varlogmailcowlog-zu-verschieben-und-die-verarbeitung-zu-beenden-erstellen-sie-eine-datei-etcrsyslogddockerconf" class="md-nav__link">
Um die local3-Eingabe nach /var/log/mailcow.log zu verschieben und die Verarbeitung zu beenden, erstellen Sie eine Datei "/etc/rsyslog.d/docker.conf":
</a>
</li>
<li class="md-nav__item">
<a href="#danach-rsyslog-neu-starten" class="md-nav__link">
Danach rsyslog neu starten.
</a>
<nav class="md-nav" aria-label="Danach rsyslog neu starten.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#uber-daemonjson-global" class="md-nav__link">
Über daemon.json (global)
@ -2446,8 +2500,6 @@
<h1>Logging</h1>
<p>Das Logging in mailcow: dockerized besteht aus mehreren Stufen, ist aber immerhin wesentlich flexibler und einfacher in einen Logging-Daemon zu integrieren als bisher.</p>
<p>In Docker schreibt die containerisierte Anwendung (PID 1) ihre Ausgabe auf stdout. Für echte Ein-Anwendungs-Container funktioniert das sehr gut.
Führen Sie <code>docker-compose logs --help</code> aus, um mehr zu erfahren. </p>
@ -2466,68 +2518,60 @@ ohne die Fähigkeit zu verlieren, Logs von der UI zu lesen oder verdächtige Cli
<h4 id="uber-docker-composeoverrideyml">Über docker-compose.override.yml<a class="headerlink" href="#uber-docker-composeoverrideyml" title="Permanent link">&para;</a></h4>
<p>Hier ist die gute Nachricht: Da Docker einige großartige Logging-Treiber hat, können Sie mailcow: dockerized mit Leichtigkeit in Ihre bestehende Logging-Umgebung integrieren.</p>
<p>Erstellen Sie eine <code>docker-compose.override.yml</code> und fügen Sie zum Beispiel diesen Block hinzu, um das "gelf" Logging-Plugin für <code>postfix-mailcow</code> zu verwenden:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
<p><code>version: '2.1'
services:
postfix-mailcow: # oder ein anderer
logging:
driver: &quot;gelf&quot;
driver: "gelf"
options:
gelf-address: &quot;udp://graylog:12201&quot;
</code></pre></div>
gelf-address: "udp://graylog:12201"</code></p>
<p>Ein weiteres Beispiel für <strong>Syslog</strong>:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
postfix-mailcow: # oder ein anderer
<p>```
version: '2.1'
services:</p>
<p>postfix-mailcow: # oder ein anderer
logging:
driver: &quot;syslog&quot;
driver: "syslog"
options:
syslog-address: &quot;udp://127.0.0.1:514&quot;
syslog-facility: &quot;local3&quot;
dovecot-mailcow: # oder ein anderer
syslog-address: "udp://127.0.0.1:514"
syslog-facility: "local3"</p>
<p>dovecot-mailcow: # oder ein anderer
logging:
driver: &quot;syslog&quot;
driver: "syslog"
options:
syslog-address: &quot;udp://127.0.0.1:514&quot;
syslog-facility: &quot;local3&quot;
rspamd-mailcow: # oder ein anderer
syslog-address: "udp://127.0.0.1:514"
syslog-facility: "local3"</p>
<p>rspamd-mailcow: # oder ein anderer
logging:
driver: &quot;syslog&quot;
driver: "syslog"
options:
syslog-address: &quot;udp://127.0.0.1:514&quot;
syslog-facility: &quot;local3&quot;
# Nur für Rsyslog:
# Um die local3-Eingabe nach /var/log/mailcow.log zu verschieben und die Verarbeitung zu beenden, erstellen Sie eine Datei &quot;/etc/rsyslog.d/docker.conf&quot;:
local3.* /var/log/mailcow.logs
&amp; ~
# Danach rsyslog neu starten.
</code></pre></div>
syslog-address: "udp://127.0.0.1:514"
syslog-facility: "local3"</p>
<h1 id="nur-fur-rsyslog">Nur für Rsyslog:<a class="headerlink" href="#nur-fur-rsyslog" title="Permanent link">&para;</a></h1>
<h1 id="um-die-local3-eingabe-nach-varlogmailcowlog-zu-verschieben-und-die-verarbeitung-zu-beenden-erstellen-sie-eine-datei-etcrsyslogddockerconf">Um die local3-Eingabe nach /var/log/mailcow.log zu verschieben und die Verarbeitung zu beenden, erstellen Sie eine Datei "/etc/rsyslog.d/docker.conf":<a class="headerlink" href="#um-die-local3-eingabe-nach-varlogmailcowlog-zu-verschieben-und-die-verarbeitung-zu-beenden-erstellen-sie-eine-datei-etcrsyslogddockerconf" title="Permanent link">&para;</a></h1>
<p>local3.* /var/log/mailcow.logs
&amp; ~</p>
<h1 id="danach-rsyslog-neu-starten">Danach rsyslog neu starten.<a class="headerlink" href="#danach-rsyslog-neu-starten" title="Permanent link">&para;</a></h1>
<p>```</p>
<h4 id="uber-daemonjson-global">Über daemon.json (global)<a class="headerlink" href="#uber-daemonjson-global" title="Permanent link">&para;</a></h4>
<p>Wenn Sie den Logging-Treiber <strong>global</strong> ändern wollen, editieren Sie die Konfigurationsdatei des Docker-Daemons <code>/etc/docker/daemon.json</code> und starten Sie den Docker-Dienst neu:</p>
<div class="highlight"><pre><span></span><code>{
<p><code>{
...
&quot;log-driver&quot;: &quot;gelf&quot;,
&quot;log-opts&quot;: {
&quot;gelf-address&quot;: &quot;udp://graylog:12201&quot;
"log-driver": "gelf",
"log-opts": {
"gelf-address": "udp://graylog:12201"
}
...
}
</code></pre></div>
}</code></p>
<p>Für Syslog:</p>
<div class="highlight"><pre><span></span><code>{
<p><code>{
...
&quot;log-driver&quot;: &quot;syslog&quot;,
&quot;log-opts&quot;: {
&quot;syslog-address&quot;: &quot;udp://1.2.3.4:514&quot;
"log-driver": "syslog",
"log-opts": {
"syslog-address": "udp://1.2.3.4:514"
}
...
}
</code></pre></div>
}</code></p>
<p>Starten Sie den Docker-Daemon neu und führen Sie <code>docker-compose down &amp;&amp; docker-compose up -d</code> aus, um die Container mit dem neuen Protokollierungstreiber neu zu erstellen.</p>
<hr>

Datei anzeigen

@ -600,10 +600,23 @@
</li>
<li class="md-nav__item">
<a href="#binbash" class="md-nav__link">
!/bin/bash
</a>
<nav class="md-nav" aria-label="!/bin/bash">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#hinzufugen-weiterer-servernamen-fur-mailcow-ui" class="md-nav__link">
Hinzufügen weiterer Servernamen für mailcow UI
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2438,10 +2451,23 @@
</li>
<li class="md-nav__item">
<a href="#binbash" class="md-nav__link">
!/bin/bash
</a>
<nav class="md-nav" aria-label="!/bin/bash">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#hinzufugen-weiterer-servernamen-fur-mailcow-ui" class="md-nav__link">
Hinzufügen weiterer Servernamen für mailcow UI
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2462,16 +2488,14 @@
<h1>Reverse Proxy</h1>
<p>Sie müssen die Nginx-Seite, die mit mailcow: dockerized geliefert wird, nicht ändern.
mailcow: dockerized vertraut auf das Standard-Gateway IP 172.22.1.1 als Proxy.</p>
<p>1. Stellen Sie sicher, dass Sie HTTP_BIND und HTTPS_BIND in <code>mailcow.conf</code> auf eine lokale Adresse ändern und die Ports entsprechend einstellen, zum Beispiel:
<div class="highlight"><pre><span></span><code><span class="nv">HTTP_BIND</span><span class="o">=</span><span class="m">127</span>.0.0.1
<span class="nv">HTTP_PORT</span><span class="o">=</span><span class="m">8080</span>
<span class="nv">HTTPS_BIND</span><span class="o">=</span><span class="m">127</span>.0.0.1
<span class="nv">HTTPS_PORT</span><span class="o">=</span><span class="m">8443</span>
</code></pre></div></p>
<code>bash
HTTP_BIND=127.0.0.1
HTTP_PORT=8080
HTTPS_BIND=127.0.0.1
HTTPS_PORT=8443</code></p>
<p>Dadurch werden auch die Bindungen innerhalb des Nginx-Containers geändert! Dies ist wichtig, wenn Sie sich entscheiden, einen Proxy innerhalb von Docker zu verwenden.</p>
<p><strong>WICHTIG:</strong> Verwenden Sie nicht Port 8081, 9081 oder 65510!</p>
<p>Erzeugen Sie die betroffenen Container neu, indem Sie <code>docker-compose up -d</code> ausführen.</p>
@ -2500,81 +2524,73 @@ Auf vielen Servern wird logrotate den Webserver sowieso täglich neu laden.</p>
<p>2. Konfigurieren Sie Ihren lokalen Webserver als Reverse Proxy:</p>
<h3 id="apache-24">Apache 2.4<a class="headerlink" href="#apache-24" title="Permanent link">&para;</a></h3>
<p>Erforderliche Module:
<div class="highlight"><pre><span></span><code>a2enmod rewrite proxy proxy_http headers ssl
</code></pre></div></p>
<code>a2enmod rewrite proxy proxy_http headers ssl</code></p>
<p>Let's Encrypt wird unserem Rewrite folgen, Zertifikatsanfragen in mailcow werden problemlos funktionieren.</p>
<p><strong>Die hervorgehobenen Zeilen müssen beachtet werden</strong>.</p>
<div class="highlight"><pre><span></span><code><span class="nt">&lt;VirtualHost</span><span class="w"> </span><span class="s">*:80</span><span class="nt">&gt;</span><span class="w"></span>
<span class="hll"><span class="w"> </span><span class="nb">ServerName</span><span class="w"> </span>ZU<span class="w"> </span>MAILCOW<span class="w"> </span>HOSTNAMEN<span class="w"> </span>ÄNDERN<span class="w"></span>
</span><span class="w"> </span><span class="nb">ServerAlias</span><span class="w"> </span>autodiscover.*<span class="w"></span>
<span class="w"> </span><span class="nb">ServerAlias</span><span class="w"> </span>autoconfig.*<span class="w"></span>
<span class="w"> </span><span class="nb">RewriteEngine</span><span class="w"> </span><span class="k">on</span><span class="w"></span>
<span class="w"> </span><span class="nb">RewriteCond</span><span class="w"> </span>%{HTTPS}<span class="w"> </span><span class="k">off</span><span class="w"></span>
<span class="w"> </span><span class="nb">RewriteRule</span><span class="w"> </span>^/?(.*)<span class="w"> </span>https://%{HTTP_HOST}/$1<span class="w"> </span>[R=301,L]<span class="w"></span>
<span class="hll"><span class="w"> </span><span class="nb">ProxyPass</span><span class="w"> </span>/<span class="w"> </span>http://127.0.0.1:8080/<span class="w"></span>
</span><span class="hll"><span class="w"> </span><span class="nb">ProxyPassReverse</span><span class="w"> </span>/<span class="w"> </span>http://127.0.0.1:8080/<span class="w"></span>
</span><span class="w"> </span><span class="nb">ProxyPreserveHost</span><span class="w"> </span><span class="k">On</span><span class="w"></span>
<span class="w"> </span><span class="nb">ProxyAddHeaders</span><span class="w"> </span><span class="k">On</span><span class="w"></span>
<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>set<span class="w"> </span>X-Forwarded-Proto<span class="w"> </span><span class="s2">&quot;http&quot;</span><span class="w"></span>
<span class="nt">&lt;/VirtualHost&gt;</span><span class="w"></span>
<span class="nt">&lt;VirtualHost</span><span class="w"> </span><span class="s">*:443</span><span class="nt">&gt;</span><span class="w"></span>
<span class="hll"><span class="w"> </span><span class="nb">ServerName</span><span class="w"> </span>ZU<span class="w"> </span>MAILCOW<span class="w"> </span>HOSTNAMEN<span class="w"> </span>ÄNDERN<span class="w"></span>
</span><span class="w"> </span><span class="nb">ServerAlias</span><span class="w"> </span>autodiscover.*<span class="w"></span>
<span class="w"> </span><span class="nb">ServerAlias</span><span class="w"> </span>autoconfig.*<span class="w"></span>
<span class="w"> </span><span class="c"># You should proxy to a plain HTTP session to offload SSL processing</span><span class="w"></span>
<span class="hll"><span class="w"> </span><span class="nb">ProxyPass</span><span class="w"> </span><span class="sx">/Microsoft-Server-ActiveSync</span><span class="w"> </span>http://127.0.0.1:8080/Microsoft-Server-ActiveSync<span class="w"> </span>connectiontimeout=4000<span class="w"></span>
</span><span class="hll"><span class="w"> </span><span class="nb">ProxyPassReverse</span><span class="w"> </span><span class="sx">/Microsoft-Server-ActiveSync</span><span class="w"> </span>http://127.0.0.1:8080/Microsoft-Server-ActiveSync<span class="w"></span>
</span><span class="hll"><span class="w"> </span><span class="nb">ProxyPass</span><span class="w"> </span>/<span class="w"> </span>http://127.0.0.1:8080/<span class="w"></span>
</span><span class="hll"><span class="w"> </span><span class="nb">ProxyPassReverse</span><span class="w"> </span>/<span class="w"> </span>http://127.0.0.1:8080/<span class="w"></span>
</span><span class="w"> </span><span class="nb">ProxyPreserveHost</span><span class="w"> </span><span class="k">On</span><span class="w"></span>
<span class="w"> </span><span class="nb">ProxyAddHeaders</span><span class="w"> </span><span class="k">On</span><span class="w"></span>
<span class="w"> </span><span class="nb">RequestHeader</span><span class="w"> </span>set<span class="w"> </span>X-Forwarded-Proto<span class="w"> </span><span class="s2">&quot;https&quot;</span><span class="w"></span>
<span class="hll"><span class="w"> </span><span class="nb">SSLCertificateFile</span><span class="w"> </span>MAILCOW_ORDNER/data/assets/ssl/cert.pem<span class="w"></span>
</span><span class="hll"><span class="w"> </span><span class="nb">SSLCertificateKeyFile</span><span class="w"> </span>MAILCOW_ORDNER/data/assets/ssl/key.pem<span class="w"></span>
</span>
<span class="w"> </span><span class="c"># Wenn Sie einen HTTPS-Host als Proxy verwenden möchten:</span><span class="w"></span>
<span class="w"> </span><span class="c">#SSLProxyEngine On</span><span class="w"></span>
<span class="w"> </span><span class="c"># Wenn Sie einen Proxy für einen nicht vertrauenswürdigen HTTPS-Host einrichten wollen:</span><span class="w"></span>
<span class="w"> </span><span class="c">#SSLProxyVerify none</span><span class="w"></span>
<span class="w"> </span><span class="c">#SSLProxyCheckPeerCN off</span><span class="w"></span>
<span class="w"> </span><span class="c">#SSLProxyCheckPeerName off</span><span class="w"></span>
<span class="w"> </span><span class="c">#SSLProxyCheckPeerExpire off</span><span class="w"></span>
<span class="nt">&lt;/VirtualHost&gt;</span><span class="w"></span>
</code></pre></div>
<p>``` apache hl_lines="2 10 11 17 22 23 24 25 30 31"
<VirtualHost *:80>
ServerName ZU MAILCOW HOSTNAMEN ÄNDERN
ServerAlias autodiscover.*
ServerAlias autoconfig.*
RewriteEngine on</p>
<p>RewriteCond %{HTTPS} off
RewriteRule ^/?(.*) https://%{HTTP_HOST}/$1 [R=301,L]</p>
<p>ProxyPass / <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080/</a>
ProxyPassReverse / <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080/</a>
ProxyPreserveHost On
ProxyAddHeaders On
RequestHeader set X-Forwarded-Proto "http"
</VirtualHost>
<VirtualHost *:443>
ServerName ZU MAILCOW HOSTNAMEN ÄNDERN
ServerAlias autodiscover.*
ServerAlias autoconfig.*</p>
<p># You should proxy to a plain HTTP session to offload SSL processing
ProxyPass /Microsoft-Server-ActiveSync <a href="http://127.0.0.1:8080/Microsoft-Server-ActiveSync">http://127.0.0.1:8080/Microsoft-Server-ActiveSync</a> connectiontimeout=4000
ProxyPassReverse /Microsoft-Server-ActiveSync <a href="http://127.0.0.1:8080/Microsoft-Server-ActiveSync">http://127.0.0.1:8080/Microsoft-Server-ActiveSync</a>
ProxyPass / <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080/</a>
ProxyPassReverse / <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080/</a>
ProxyPreserveHost On
ProxyAddHeaders On
RequestHeader set X-Forwarded-Proto "https"</p>
<p>SSLCertificateFile MAILCOW_ORDNER/data/assets/ssl/cert.pem
SSLCertificateKeyFile MAILCOW_ORDNER/data/assets/ssl/key.pem</p>
<p># Wenn Sie einen HTTPS-Host als Proxy verwenden möchten:
#SSLProxyEngine On</p>
<p># Wenn Sie einen Proxy für einen nicht vertrauenswürdigen HTTPS-Host einrichten wollen:
#SSLProxyVerify none
#SSLProxyCheckPeerCN off
#SSLProxyCheckPeerName off
#SSLProxyCheckPeerExpire off
</VirtualHost>
```</p>
<h3 id="nginx">Nginx<a class="headerlink" href="#nginx" title="Permanent link">&para;</a></h3>
<p>Let's Encrypt folgt unserem Rewrite, Zertifikatsanfragen funktionieren problemlos.</p>
<p><strong>Achten Sie auf die hervorgehobenen Zeilen</strong>.</p>
<div class="highlight"><pre><span></span><code>server {
<p>``` hl_lines="4 10 12 13 25 39"
server {
listen 80 default_server;
listen [::]:80 default_server;
<span class="hll"> server_name ZU MAILCOW HOSTNAMEN ÄNDERN autodiscover.* autoconfig.*;
</span> return 301 https://$host$request_uri;
server_name ZU MAILCOW HOSTNAMEN ÄNDERN autodiscover.* autoconfig.<em>;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
<span class="hll"> server_name ZU MAILCOW HOSTNAMEN ÄNDERN autodiscover.* autoconfig.*;
</span>
<span class="hll"> ssl_certificate MAILCOW_PATH/data/assets/ssl/cert.pem;
</span><span class="hll"> ssl_certificate_key MAILCOW_PATH/data/assets/ssl/key.pem;
</span> ssl_session_timeout 1d;
server_name ZU MAILCOW HOSTNAMEN ÄNDERN autodiscover.</em> autoconfig.*;</p>
<p>ssl_certificate MAILCOW_PATH/data/assets/ssl/cert.pem;
ssl_certificate_key MAILCOW_PATH/data/assets/ssl/key.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# Siehe https://ssl-config.mozilla.org/#server=nginx für die neuesten Empfehlungen zu ssl-Einstellungen
ssl_session_tickets off;</p>
<p># Siehe <a href="https://ssl-config.mozilla.org/#server=nginx">https://ssl-config.mozilla.org/#server=nginx</a> für die neuesten Empfehlungen zu ssl-Einstellungen
# Ein Beispiel für eine Konfiguration ist unten angegeben
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5:!SHA1:!kRSA;
ssl_prefer_server_ciphers off;
location /Microsoft-Server-ActiveSync {
<span class="hll"> proxy_pass http://127.0.0.1:8080/Microsoft-Server-ActiveSync;
</span> proxy_set_header Host $http_host;
ssl_prefer_server_ciphers off;</p>
<p>location /Microsoft-Server-ActiveSync {
proxy_pass <a href="http://127.0.0.1:8080/Microsoft-Server-ActiveSync">http://127.0.0.1:8080/Microsoft-Server-ActiveSync</a>;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
@ -2584,39 +2600,38 @@ server {
proxy_buffers 64 512k; # Seit dem 2022-04 Update nötig für SOGo
client_body_buffer_size 512k;
client_max_body_size 0;
}
location / {
<span class="hll"> proxy_pass http://127.0.0.1:8080/;
</span> proxy_set_header Host $http_host;
}</p>
<p>location / {
proxy_pass <a href="http://127.0.0.1:8080/">http://127.0.0.1:8080/</a>;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 0;
# Die folgenden Proxy-Buffer müssen gesetzt werden, wenn Sie SOGo nach dem Update 2022-04 (April 2022) verwenden wollen
# Andernfalls wird ein Login wie folgt fehlschlagen: https://github.com/mailcow/mailcow-dockerized/issues/4537
# Andernfalls wird ein Login wie folgt fehlschlagen: <a href="https://github.com/mailcow/mailcow-dockerized/issues/4537">https://github.com/mailcow/mailcow-dockerized/issues/4537</a>
proxy_buffer_size 128k;
proxy_buffers 64 512k;
proxy_busy_buffers_size 512k;
}
}
</code></pre></div>
```</p>
<h3 id="haproxy-von-der-community-unterstutzt">HAProxy (von der Community unterstützt)<a class="headerlink" href="#haproxy-von-der-community-unterstutzt" title="Permanent link">&para;</a></h3>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Dies ist ein nicht unterstützter Community Beitrag. Sie können gerne Korrekturen bereitstellen.</p>
</div>
<p><strong>Wichtig/Fix erwünscht</strong>: Dieses Beispiel leitet nur HTTPS-Verkehr weiter und benutzt nicht den in mailcow eingebauten ACME-Client.</p>
<div class="highlight"><pre><span></span><code>frontend https-in
<p>```
frontend https-in
bind :::443 v4v6 ssl crt mailcow.pem
default_backend mailcow
backend mailcow
default_backend mailcow</p>
<p>backend mailcow
option forwardfor
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
server mailcow 127.0.0.1:8080 check
</code></pre></div>
```</p>
<h3 id="traefik-v2-von-der-community-unterstutzt">Traefik v2 (von der Community unterstützt)<a class="headerlink" href="#traefik-v2-von-der-community-unterstutzt" title="Permanent link">&para;</a></h3>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
@ -2627,50 +2642,49 @@ backend mailcow
<p>Zuallererst werden wir den acme-mailcow-Container deaktivieren, da wir die von traefik bereitgestellten Zertifikate verwenden werden.
Dazu müssen wir <code>SKIP_LETS_ENCRYPT=y</code> in unserer <code>mailcow.conf</code> setzen und <code>docker-compose up -d</code> ausführen, um die Änderungen zu übernehmen.</p>
<p>Dann erstellen wir eine <code>docker-compose.override.yml</code> Datei, um die Hauptdatei <code>docker-compose.yml</code> zu überschreiben, die sich im Mailcow-Stammverzeichnis befindet. </p>
<div class="highlight"><pre><span></span><code><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;2.1&#39;</span><span class="w"></span>
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">nginx-mailcow</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Traefiks Netzwerk hinzufügen</span><span class="w"></span>
<span class="w"> </span><span class="nt">web</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">labels</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traefik.enable=true</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Erstellt einen Router namens &quot;moo&quot; für den Container und richtet eine Regel ein, um den Container mit einer bestimmten Regel zu verknüpfen,</span><span class="w"></span>
<span class="w"> </span><span class="c1"># in diesem Fall eine Host-Regel mit unserer MAILCOW_HOSTNAME-Variable.</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traefik.http.routers.moo.rule=Host(`${MAILCOW_HOSTNAME}`)</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Aktiviert tls über den zuvor erstellten Router.</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traefik.http.routers.moo.tls=true</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Gibt an, welche Art von Cert-Resolver wir verwenden werden, in diesem Fall le (Lets Encrypt).</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traefik.http.routers.moo.tls.certresolver=le</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Erzeugt einen Dienst namens &quot;moo&quot; für den Container und gibt an, welchen internen Port des Containers</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Traefik die eingehenden Daten weiterleiten soll.</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traefik.http.services.moo.loadbalancer.server.port=${HTTP_PORT}</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Gibt an, welchen Eingangspunkt (externer Port) traefik für diesen Container abhören soll.</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Websecure ist Port 443, siehe die Datei traefik.toml wie oben.</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traefik.http.routers.moo.entrypoints=websecure</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Stellen Sie sicher, dass traefik das Web-Netzwerk verwendet, nicht das mailcowdockerized_mailcow-network</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traefik.docker.network=web</span><span class="w"></span>
<span class="w"> </span><span class="nt">certdumper</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">humenius/traefik-certs-dumper</span><span class="w"></span>
<span class="w"> </span><span class="nt">container_name</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">traefik_certdumper</span><span class="w"></span>
<span class="w"> </span><span class="nt">network_mode</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">none</span><span class="w"></span>
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="c1"># mounten Sie den Ordner, der Traefiks `acme.json&#39; Datei enthält</span><span class="w"></span>
<span class="w"> </span><span class="c1"># in diesem Fall wird Traefik von seinem eigenen docker-compose in ../traefik gestartet</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">../traefik/data:/traefik:ro</span><span class="w"></span>
<span class="w"> </span><span class="c1"># SSL-Ordner von mailcow einhängen</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./data/assets/ssl/:/output:rw</span><span class="w"></span>
<span class="w"> </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">always</span><span class="w"></span>
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="c1"># Ändern Sie dies nur, wenn Sie eine andere Domain für Mailcows Web-Frontend verwenden als in der Standard-Konfiguration</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">DOMAIN=${MAILCOW_HOSTNAME}</span><span class="w"></span>
<span class="nt">networks</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">web</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">external</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">true</span><span class="w"></span>
</code></pre></div>
<p>```yaml
version: '2.1'</p>
<p>services:
nginx-mailcow:
networks:
# Traefiks Netzwerk hinzufügen
web:
labels:
- traefik.enable=true
# Erstellt einen Router namens "moo" für den Container und richtet eine Regel ein, um den Container mit einer bestimmten Regel zu verknüpfen,
# in diesem Fall eine Host-Regel mit unserer MAILCOW_HOSTNAME-Variable.
- traefik.http.routers.moo.rule=Host(<code>${MAILCOW_HOSTNAME}</code>)
# Aktiviert tls über den zuvor erstellten Router.
- traefik.http.routers.moo.tls=true
# Gibt an, welche Art von Cert-Resolver wir verwenden werden, in diesem Fall le (Lets Encrypt).
- traefik.http.routers.moo.tls.certresolver=le
# Erzeugt einen Dienst namens "moo" für den Container und gibt an, welchen internen Port des Containers
# Traefik die eingehenden Daten weiterleiten soll.
- traefik.http.services.moo.loadbalancer.server.port=${HTTP_PORT}
# Gibt an, welchen Eingangspunkt (externer Port) traefik für diesen Container abhören soll.
# Websecure ist Port 443, siehe die Datei traefik.toml wie oben.
- traefik.http.routers.moo.entrypoints=websecure
# Stellen Sie sicher, dass traefik das Web-Netzwerk verwendet, nicht das mailcowdockerized_mailcow-network
- traefik.docker.network=web</p>
<pre><code>certdumper:
image: humenius/traefik-certs-dumper
container_name: traefik_certdumper
network_mode: none
volumes:
# mounten Sie den Ordner, der Traefiks `acme.json' Datei enthält
# in diesem Fall wird Traefik von seinem eigenen docker-compose in ../traefik gestartet
- ../traefik/data:/traefik:ro
# SSL-Ordner von mailcow einhängen
- ./data/assets/ssl/:/output:rw
restart: always
environment:
# Ändern Sie dies nur, wenn Sie eine andere Domain für Mailcows Web-Frontend verwenden als in der Standard-Konfiguration
- DOMAIN=${MAILCOW_HOSTNAME}
</code></pre>
<p>networks:
web:
external: true
```</p>
<p>Starten Sie die neuen Container mit <code>docker-compose up -d</code>.</p>
<p>Da Traefik 2 ein acme v2 Format verwendet, um ALLE Lizenzen von allen Domains zu speichern, müssen wir einen Weg finden, die Zertifikate auszulagern. Zum Glück haben wir [diesen kleinen Container] (<a href="https://hub.docker.com/r/humenius/traefik-certs-dumper">https://hub.docker.com/r/humenius/traefik-certs-dumper</a>), der die Datei <code>acme.json</code> über ein Volume und eine Variable <code>DOMAIN=example. org</code>, und damit wird der Container die <code>cert.pem</code> und <code>key.pem</code> Dateien ausgeben, dafür lassen wir einfach den <code>traefik-certs-dumper</code> Container laufen, binden das <code>/traefik</code> Volume an den Ordner, in dem unsere <code>acme.json</code> gespeichert ist, binden das <code>/output</code> Volume an unseren mailcow <code>data/assets/ssl/</code> Ordner, und setzen die <code>DOMAIN=example.org</code> Variable auf die Domain, von der wir die Zertifikate ausgeben wollen. </p>
<p>Dieser Container überwacht die Datei <code>acme.json</code> auf Änderungen und generiert die Dateien <code>cert.pem</code> und <code>key.pem</code> direkt in <code>data/assets/ssl/</code>, wobei der Pfad mit dem <code>/output</code>-Pfad des Containers verbunden ist.</p>
@ -2680,18 +2694,18 @@ Dazu müssen wir <code>SKIP_LETS_ENCRYPT=y</code> in unserer <code>mailcow.conf<
<h3 id="optional-post-hook-skript-fur-nicht-mailcow-acme-clients">Optional: Post-Hook-Skript für nicht-mailcow ACME-Clients<a class="headerlink" href="#optional-post-hook-skript-fur-nicht-mailcow-acme-clients" title="Permanent link">&para;</a></h3>
<p>Die Verwendung eines lokalen Certbots (oder eines anderen ACME-Clients) erfordert den Neustart einiger Container, was Sie mit einem Post-Hook-Skript erledigen können.
Stellen Sie sicher, dass Sie die Pfade entsprechend ändern:
<div class="highlight"><pre><span></span><code>#!/bin/bash
cp /etc/letsencrypt/live/my.domain.tld/fullchain.pem /opt/mailcow-dockerized/data/assets/ssl/cert.pem
```</p>
<h1 id="binbash">!/bin/bash<a class="headerlink" href="#binbash" title="Permanent link">&para;</a></h1>
<p>cp /etc/letsencrypt/live/my.domain.tld/fullchain.pem /opt/mailcow-dockerized/data/assets/ssl/cert.pem
cp /etc/letsencrypt/live/my.domain.tld/privkey.pem /opt/mailcow-dockerized/data/assets/ssl/key.pem
postfix_c=$(docker ps -qaf name=postfix-mailcow)
dovecot_c=$(docker ps -qaf name=dovecot-mailcow)
nginx_c=$(docker ps -qaf name=nginx-mailcow)
docker restart ${postfix_c} ${dovecot_c} ${nginx_c}
</code></pre></div></p>
```</p>
<h3 id="hinzufugen-weiterer-servernamen-fur-mailcow-ui">Hinzufügen weiterer Servernamen für mailcow UI<a class="headerlink" href="#hinzufugen-weiterer-servernamen-fur-mailcow-ui" title="Permanent link">&para;</a></h3>
<p>Wenn Sie vorhaben, einen Servernamen zu verwenden, der nicht <code>MAILCOW_HOSTNAME</code> in Ihrem Reverse-Proxy ist, stellen Sie sicher, dass Sie diesen Namen zuerst in mailcow.conf über <code>ADDITIONAL_SERVER_NAMES</code> einpflegen. Die Namen müssen durch Kommas getrennt werden und <strong>dürfen</strong> keine Leerzeichen enthalten. Wenn Sie diesen Schritt überspringen, kann es sein, dass mailcow auf Ihren Reverse-Proxy mit einer falschen Seite antwortet.</p>
<div class="highlight"><pre><span></span><code>ADDITIONAL_SERVER_NAMES=webmail.domain.tld,other.example.tld
</code></pre></div>
<p><code>ADDITIONAL_SERVER_NAMES=webmail.domain.tld,other.example.tld</code></p>
<p>Führen Sie <code>docker-compose up -d</code> zum Anwenden aus.</p>
<hr>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#benutze-diese-ipv4-fur-ausgehende-verbindungen-snat" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -564,6 +569,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
SNAT
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,17 +2352,15 @@
<h1>SNAT</h1>
<p>SNAT wird verwendet, um die Quelladresse der von mailcow gesendeten Pakete zu ändern.
Es kann verwendet werden, um die ausgehende IP-Adresse auf Systemen mit mehreren IP-Adressen zu ändern.</p>
<p>Öffnen Sie <code>mailcow.conf</code>, setzen Sie einen oder beide der folgenden Parameter:</p>
<div class="highlight"><pre><span></span><code># Benutze diese IPv4 für ausgehende Verbindungen (SNAT)
SNAT_TO_SOURCE=1.2.3.4
# Benutze dieses IPv6 für ausgehende Verbindungen (SNAT)
SNAT6_TO_SOURCE=dead:beef
</code></pre></div>
<p>```</p>
<h1 id="benutze-diese-ipv4-fur-ausgehende-verbindungen-snat">Benutze diese IPv4 für ausgehende Verbindungen (SNAT)<a class="headerlink" href="#benutze-diese-ipv4-fur-ausgehende-verbindungen-snat" title="Permanent link">&para;</a></h1>
<p>SNAT_TO_SOURCE=1.2.3.4</p>
<h1 id="benutze-dieses-ipv6-fur-ausgehende-verbindungen-snat">Benutze dieses IPv6 für ausgehende Verbindungen (SNAT)<a class="headerlink" href="#benutze-dieses-ipv6-fur-ausgehende-verbindungen-snat" title="Permanent link">&para;</a></h1>
<p>SNAT6_TO_SOURCE=dead:beef
```</p>
<p>Führen Sie <code>docker-compose up -d</code> aus.</p>
<p>Die Werte werden von netfilter-mailcow gelesen. netfilter-mailcow stellt sicher, dass die Post-Routing-Regeln auf Position 1 in der Netfilter-Tabelle stehen. Es löscht sie automatisch und legt sie neu an, wenn sie an einer anderen Position als 1 gefunden werden.</p>
<p>Überprüfen Sie die Ausgabe von <code>docker-compose logs --tail=200 netfilter-mailcow</code>, um sicherzustellen, dass die SNAT-Einstellungen angewendet wurden.</p>

Datei anzeigen

@ -502,6 +502,19 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#prufen-sie-nun-die-logs-auf-eine-erneuerung" class="md-nav__link">
Prüfen Sie nun die Logs auf eine Erneuerung
</a>
<nav class="md-nav" aria-label="Prüfen Sie nun die Logs auf eine Erneuerung">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#validierungsfehler-und-wie-man-die-validierung-uberspringt" class="md-nav__link">
Validierungsfehler und wie man die Validierung überspringt
@ -574,6 +587,27 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#verbindung-uber-smtp-587" class="md-nav__link">
Verbindung über SMTP (587)
</a>
</li>
<li class="md-nav__item">
<a href="#verbindung-uber-imap-143" class="md-nav__link">
Verbindung über IMAP (143)
</a>
</li>
<li class="md-nav__item">
<a href="#verbindung-uber-https-443" class="md-nav__link">
Verbindung über HTTPS (443)
</a>
</li>
</ul>
@ -2478,6 +2512,19 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#prufen-sie-nun-die-logs-auf-eine-erneuerung" class="md-nav__link">
Prüfen Sie nun die Logs auf eine Erneuerung
</a>
<nav class="md-nav" aria-label="Prüfen Sie nun die Logs auf eine Erneuerung">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#validierungsfehler-und-wie-man-die-validierung-uberspringt" class="md-nav__link">
Validierungsfehler und wie man die Validierung überspringt
@ -2550,6 +2597,27 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#verbindung-uber-smtp-587" class="md-nav__link">
Verbindung über SMTP (587)
</a>
</li>
<li class="md-nav__item">
<a href="#verbindung-uber-imap-143" class="md-nav__link">
Verbindung über IMAP (143)
</a>
</li>
<li class="md-nav__item">
<a href="#verbindung-uber-https-443" class="md-nav__link">
Verbindung über HTTPS (443)
</a>
</li>
</ul>
@ -2570,8 +2638,6 @@
<h1>Erweitertes SSL</h1>
<h2 id="lets-encrypt-wird-mitgeliefert">Let's Encrypt (wird mitgeliefert)<a class="headerlink" href="#lets-encrypt-wird-mitgeliefert" title="Permanent link">&para;</a></h2>
<p>Der "acme-mailcow" Container wird versuchen, ein LE-Zertifikat für <code>${MAILCOW_HOSTNAME}</code>, <code>autodiscover.ADDED_MAIL_DOMAIN</code> und <code>autoconfig.ADDED_MAIL_DOMAIN</code> zu erhalten.</p>
<div class="admonition warning">
@ -2586,8 +2652,7 @@
<h3 id="zusatzliche-domain-namen">Zusätzliche Domain-Namen<a class="headerlink" href="#zusatzliche-domain-namen" title="Permanent link">&para;</a></h3>
<p>Bearbeiten Sie "mailcow.conf" und fügen Sie einen Parameter <code>ADDITIONAL_SAN</code> wie folgt hinzu:</p>
<p>Verwenden Sie keine Anführungszeichen (<code>"</code>) und keine Leerzeichen zwischen den Namen!</p>
<div class="highlight"><pre><span></span><code>ADDITIONAL_SAN=smtp.*,cert1.example.com,cert2.example.org,whatever.*
</code></pre></div>
<p><code>ADDITIONAL_SAN=smtp.*,cert1.example.com,cert2.example.org,whatever.*</code></p>
<p>Jeder Name wird anhand seiner IPv6-Adresse oder - wenn IPv6 in Ihrer Domäne nicht konfiguriert ist - anhand seiner IPv4-Adresse überprüft.</p>
<p>Ein Wildcard-Name wie <code>smtp.*</code> wird versuchen, ein smtp.DOMAIN_NAME SAN für jede zu mailcow hinzugefügte Domain zu erhalten.</p>
<p>Führen Sie <code>docker-compose up -d</code> aus, um betroffene Container automatisch neu zu erstellen.</p>
@ -2596,17 +2661,17 @@
<p>Die Verwendung anderer Namen als <code>MAILCOW_HOSTNAME</code> für den Zugriff auf das mailcow UI kann weitere Konfiguration erfordern.</p>
</div>
<p>Wenn Sie planen, einen anderen Servernamen als <code>MAILCOW_HOSTNAME</code> für den Zugriff auf die mailcow UI zu verwenden (z.B. durch Hinzufügen von <code>mail.*</code> zu <code>ADDITIONAL_SAN</code>), stellen Sie sicher, dass Sie diesen Namen in mailcow.conf über <code>ADDITIONAL_SERVER_NAMES</code> eintragen. Die Namen müssen durch Kommas getrennt sein und <strong>dürfen</strong> keine Leerzeichen enthalten. Wenn Sie diesen Schritt auslassen, kann mailcow mit einer falschen Seite antworten.</p>
<div class="highlight"><pre><span></span><code>ADDITIONAL_SERVER_NAMES=webmail.domain.tld,other.example.tld
</code></pre></div>
<p><code>ADDITIONAL_SERVER_NAMES=webmail.domain.tld,other.example.tld</code></p>
<p>Führen Sie <code>docker-compose up -d</code> aus, um es anzuwenden.</p>
<h3 id="erneuerung-erzwingen">Erneuerung erzwingen<a class="headerlink" href="#erneuerung-erzwingen" title="Permanent link">&para;</a></h3>
<p>Um eine Erneuerung zu erzwingen, müssen Sie eine Datei namens <code>force_renew</code> erstellen und den <code>acme-mailcow</code> Container neu starten:</p>
<div class="highlight"><pre><span></span><code>cd /opt/mailcow-dockerized
<p>```
cd /opt/mailcow-dockerized
touch data/assets/ssl/force_renew
docker-compose restart acme-mailcow
# Prüfen Sie nun die Logs auf eine Erneuerung
docker-compose logs --tail=200 -f acme-mailcow
</code></pre></div>
docker-compose restart acme-mailcow</p>
<h1 id="prufen-sie-nun-die-logs-auf-eine-erneuerung">Prüfen Sie nun die Logs auf eine Erneuerung<a class="headerlink" href="#prufen-sie-nun-die-logs-auf-eine-erneuerung" title="Permanent link">&para;</a></h1>
<p>docker-compose logs --tail=200 -f acme-mailcow
```</p>
<p>Die Datei wird automatisch gelöscht.</p>
<h3 id="validierungsfehler-und-wie-man-die-validierung-uberspringt">Validierungsfehler und wie man die Validierung überspringt<a class="headerlink" href="#validierungsfehler-und-wie-man-die-validierung-uberspringt" title="Permanent link">&para;</a></h3>
<p>Sie können die <strong>IP-Überprüfung</strong> überspringen, indem Sie <code>SKIP_IP_CHECK=y</code> in mailcow.conf setzen (keine Anführungszeichen). Seien Sie gewarnt, dass eine Fehlkonfiguration dazu führt, dass Sie von Let's Encrypt eingeschränkt werden! Dies ist vor allem für Multi-IP-Setups nützlich, bei denen der IP-Check die falsche Quell-IP-Adresse zurückgeben würde. Aufgrund der Verwendung von dynamischen IPs für acme-mailcow ist Source-NAT bei Neustarts nicht konsistent.</p>
@ -2653,35 +2718,33 @@ Sie sollten sicherstellen, dass diese Clients den <code>MAILCOW_HOSTNAME</code>
<p>Um Ihre eigenen Zertifikate zu verwenden, speichern Sie einfach das kombinierte Zertifikat (mit dem Zertifikat und der zwischengeschalteten CA/CA, falls vorhanden) unter <code>data/assets/ssl/cert.pem</code> und den entsprechenden Schlüssel unter <code>data/assets/ssl/key.pem</code>.</p>
<p><strong>WICHTIG:</strong> Verwenden Sie keine symbolischen Links! Stellen Sie sicher, dass Sie die Zertifikate kopieren und sie nicht mit <code>data/assets/ssl</code> verknüpfen.</p>
<p>Starten Sie die betroffenen Dienste anschließend neu:</p>
<div class="highlight"><pre><span></span><code>docker restart $(docker ps -qaf name=postfix-mailcow)
<p><code>docker restart $(docker ps -qaf name=postfix-mailcow)
docker neu starten $(docker ps -qaf name=nginx-mailcow)
docker restart $(docker ps -qaf name=dovecot-mailcow)
</code></pre></div>
docker restart $(docker ps -qaf name=dovecot-mailcow)</code></p>
<p>Siehe <a href="../firststeps-rp#optional-post-hook-skript-fur-nicht-mailcow-acme-clients">Post-Hook-Skript für Nicht-Mailcow-ACME-Clients</a> für ein vollständiges Beispielskript.</p>
<h3 id="test-gegen-das-acme-verzeichnis">Test gegen das ACME-Verzeichnis<a class="headerlink" href="#test-gegen-das-acme-verzeichnis" title="Permanent link">&para;</a></h3>
<p>Bearbeiten Sie <code>mailcow.conf</code> und fügen Sie <code>LE_STAGING=y</code> hinzu.</p>
<p>Führen Sie <code>docker-compose up -d</code> aus, um Ihre Änderungen zu aktivieren.</p>
<h3 id="benutzerdefinierte-verzeichnis-url">Benutzerdefinierte Verzeichnis-URL<a class="headerlink" href="#benutzerdefinierte-verzeichnis-url" title="Permanent link">&para;</a></h3>
<p>Editieren Sie <code>mailcow.conf</code> und fügen Sie die entsprechende Verzeichnis-URL in die neue Variable <code>DIRECTORY_URL</code> ein:</p>
<div class="highlight"><pre><span></span><code>DIRECTORY_URL=https://acme-custom-v9000.api.letsencrypt.org/directory
</code></pre></div>
<p><code>DIRECTORY_URL=https://acme-custom-v9000.api.letsencrypt.org/directory</code></p>
<p>Sie können <code>LE_STAGING</code> nicht mit <code>DIRECTORY_URL</code> verwenden. Wenn beide gesetzt sind, wird nur <code>LE_STAGING</code> verwendet.</p>
<p>Führen Sie <code>docker-compose up -d</code> aus, um Ihre Änderungen zu aktivieren.</p>
<h3 id="uberprufen-sie-ihre-konfiguration">Überprüfen Sie Ihre Konfiguration<a class="headerlink" href="#uberprufen-sie-ihre-konfiguration" title="Permanent link">&para;</a></h3>
<p>Führen Sie <code>docker-compose logs acme-mailcow</code> aus, um herauszufinden, warum eine Validierung fehlschlägt.</p>
<p>Um zu überprüfen, ob nginx das richtige Zertifikat verwendet, benutzen Sie einfach einen Browser Ihrer Wahl und überprüfen Sie das angezeigte Zertifikat.</p>
<p>Um das von Postfix, Dovecot und Nginx verwendete Zertifikat zu überprüfen, verwenden wir <code>openssl</code>:</p>
<div class="highlight"><pre><span></span><code># Verbindung über SMTP (587)
echo &quot;Q&quot; | openssl s_client -starttls smtp -crlf -connect mx.mailcow.email:587
# Verbindung über IMAP (143)
echo &quot;Q&quot; | openssl s_client -starttls imap -showcerts -connect mx.mailcow.email:143
# Verbindung über HTTPS (443)
echo &quot;Q&quot; | openssl s_client -connect mx.mailcow.email:443
</code></pre></div>
<p>```</p>
<h1 id="verbindung-uber-smtp-587">Verbindung über SMTP (587)<a class="headerlink" href="#verbindung-uber-smtp-587" title="Permanent link">&para;</a></h1>
<p>echo "Q" | openssl s_client -starttls smtp -crlf -connect mx.mailcow.email:587</p>
<h1 id="verbindung-uber-imap-143">Verbindung über IMAP (143)<a class="headerlink" href="#verbindung-uber-imap-143" title="Permanent link">&para;</a></h1>
<p>echo "Q" | openssl s_client -starttls imap -showcerts -connect mx.mailcow.email:143</p>
<h1 id="verbindung-uber-https-443">Verbindung über HTTPS (443)<a class="headerlink" href="#verbindung-uber-https-443" title="Permanent link">&para;</a></h1>
<p>echo "Q" | openssl s_client -connect mx.mailcow.email:443
```</p>
<p>Um die von openssl zurückgegebenen Verfallsdaten gegen MAILCOW_HOSTNAME zu validieren, können Sie unser Hilfsskript verwenden:</p>
<div class="highlight"><pre><span></span><code>cd /opt/mailcow-dockerized
bash helper-scripts/expiry-dates.sh
</code></pre></div>
<p><code>cd /opt/mailcow-dockerized
bash helper-scripts/expiry-dates.sh</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -364,27 +364,75 @@
</li>
<li class="md-nav__item">
<a href="#name-typ-wert" class="md-nav__link">
Name Typ Wert
</a>
<nav class="md-nav" aria-label="Name Typ Wert">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#dkim-spf-und-dmarc" class="md-nav__link">
DKIM, SPF und DMARC
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#name-typ-wert_1" class="md-nav__link">
Name Typ Wert
</a>
</li>
<li class="md-nav__item">
<a href="#name-typ-wert_2" class="md-nav__link">
Name Typ Wert
</a>
</li>
<li class="md-nav__item">
<a href="#name-typ-wert_3" class="md-nav__link">
Name Typ Wert
</a>
<nav class="md-nav" aria-label="Name Typ Wert">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#die-erweiterte-dns-konfiguration" class="md-nav__link">
Die erweiterte DNS-Konfiguration
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#name-typ-prioritat-gewicht-port-wert" class="md-nav__link">
Name Typ Priorität Gewicht Port Wert
</a>
<nav class="md-nav" aria-label="Name Typ Priorität Gewicht Port Wert">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#testen" class="md-nav__link">
Testen
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#verschiedenes" class="md-nav__link">
Verschiedenes
</a>
@ -406,6 +454,31 @@
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
```
</a>
</li>
<li class="md-nav__item">
<a href="#zusammenfassung-der-ergebnisse" class="md-nav__link">
Zusammenfassung der Ergebnisse
</a>
<nav class="md-nav" aria-label="Zusammenfassung der Ergebnisse">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#fully-qualified-domain-name-fqdn" class="md-nav__link">
Fully Qualified Domain Name (FQDN)
@ -2458,27 +2531,75 @@
</li>
<li class="md-nav__item">
<a href="#name-typ-wert" class="md-nav__link">
Name Typ Wert
</a>
<nav class="md-nav" aria-label="Name Typ Wert">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#dkim-spf-und-dmarc" class="md-nav__link">
DKIM, SPF und DMARC
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#name-typ-wert_1" class="md-nav__link">
Name Typ Wert
</a>
</li>
<li class="md-nav__item">
<a href="#name-typ-wert_2" class="md-nav__link">
Name Typ Wert
</a>
</li>
<li class="md-nav__item">
<a href="#name-typ-wert_3" class="md-nav__link">
Name Typ Wert
</a>
<nav class="md-nav" aria-label="Name Typ Wert">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#die-erweiterte-dns-konfiguration" class="md-nav__link">
Die erweiterte DNS-Konfiguration
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#name-typ-prioritat-gewicht-port-wert" class="md-nav__link">
Name Typ Priorität Gewicht Port Wert
</a>
<nav class="md-nav" aria-label="Name Typ Priorität Gewicht Port Wert">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#testen" class="md-nav__link">
Testen
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#verschiedenes" class="md-nav__link">
Verschiedenes
</a>
@ -2500,6 +2621,31 @@
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#_1" class="md-nav__link">
```
</a>
</li>
<li class="md-nav__item">
<a href="#zusammenfassung-der-ergebnisse" class="md-nav__link">
Zusammenfassung der Ergebnisse
</a>
<nav class="md-nav" aria-label="Zusammenfassung der Ergebnisse">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#fully-qualified-domain-name-fqdn" class="md-nav__link">
Fully Qualified Domain Name (FQDN)
@ -2530,8 +2676,6 @@
<h1>DNS Einstellungen</h1>
<p>Nachstehend finden Sie eine Liste von <strong>empfohlenen DNS-Einträgen</strong>. Einige sind für einen Mailserver obligatorisch (A, MX), andere werden empfohlen, um eine gute Reputation aufzubauen (TXT/SPF) oder für die automatische Konfiguration von Mailclients verwendet (SRV).</p>
<h2 id="referenzen">Referenzen<a class="headerlink" href="#referenzen" title="Permanent link">&para;</a></h2>
<ul>
@ -2548,33 +2692,38 @@
<p>Stellen Sie sicher, dass der PTR-Eintrag Ihrer IP-Adresse mit dem FQDN Ihres mailcow-Hosts übereinstimmt: <code>${MAILCOW_HOSTNAME}</code> <sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup>. Dieser Eintrag wird normalerweise bei dem Provider gesetzt, von dem Sie die IP-Adresse (Server) gemietet haben.</p>
<h2 id="die-minimale-dns-konfiguration">Die minimale DNS-Konfiguration<a class="headerlink" href="#die-minimale-dns-konfiguration" title="Permanent link">&para;</a></h2>
<p>Dieses Beispiel zeigt Ihnen eine Reihe von Einträgen für eine von mailcow verwaltete Domain. Jede Domain, die zu mailcow hinzugefügt wird, benötigt mindestens diesen Satz an Einträgen, um korrekt zu funktionieren.</p>
<div class="highlight"><pre><span></span><code># Name Typ Wert
mail IN A 1.2.3.4
<p>```</p>
<h1 id="name-typ-wert">Name Typ Wert<a class="headerlink" href="#name-typ-wert" title="Permanent link">&para;</a></h1>
<p>mail IN A 1.2.3.4
autodiscover IN CNAME mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
autoconfig IN CNAME mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
@ IN MX 10 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
</code></pre></div>
```</p>
<h2 id="dkim-spf-und-dmarc">DKIM, SPF und DMARC<a class="headerlink" href="#dkim-spf-und-dmarc" title="Permanent link">&para;</a></h2>
<p>Im folgenden Beispiel für eine DNS-Zonendatei wird ein einfacher <strong>SPF</strong> TXT-Eintrag verwendet, um nur DIESEM Server (dem MX) zu erlauben, E-Mails für Ihre Domäne zu senden. Jeder andere Server ist nicht zugelassen, kann es aber tun ("<code>~all</code>"). Weitere Informationen finden Sie im <a href="http://www.open-spf.org/">SPF-Projekt</a>.</p>
<div class="highlight"><pre><span></span><code># Name Typ Wert
@ IN TXT &quot;v=spf1 mx a -all&quot;
</code></pre></div>
<p>```</p>
<h1 id="name-typ-wert_1">Name Typ Wert<a class="headerlink" href="#name-typ-wert_1" title="Permanent link">&para;</a></h1>
<p>@ IN TXT "v=spf1 mx a -all"
```</p>
<p>Es wird dringend empfohlen, einen <strong>DKIM</strong> TXT-Eintrag in Ihrer mailcow UI zu erstellen und den entsprechenden TXT-Eintrag in Ihren DNS-Einträgen zu setzen. Bitte lesen Sie <a href="http://www.opendkim.org">OpenDKIM</a> für weitere Informationen.</p>
<div class="highlight"><pre><span></span><code># Name Typ Wert
dkim._domainkey IN TXT &quot;v=DKIM1; k=rsa; t=s; s=email; p=...&quot;
</code></pre></div>
<p>```</p>
<h1 id="name-typ-wert_2">Name Typ Wert<a class="headerlink" href="#name-typ-wert_2" title="Permanent link">&para;</a></h1>
<p>dkim._domainkey IN TXT "v=DKIM1; k=rsa; t=s; s=email; p=..."
```</p>
<p>Der letzte Schritt, um sich selbst und andere zu schützen, ist die Implementierung eines <strong>DMARC</strong> TXT-Datensatzes, zum Beispiel mit Hilfe des <a href="http://www.kitterman.com/dmarc/assistant.html">DMARC-Assistenten</a> (<a href="https://dmarcian.com/dmarc-inspector/google.com">check</a>).</p>
<div class="highlight"><pre><span></span><code># Name Typ Wert
_dmarc IN TXT &quot;v=DMARC1; p=reject; rua=mailto:mailauth-reports@example.org&quot;
</code></pre></div>
<p>```</p>
<h1 id="name-typ-wert_3">Name Typ Wert<a class="headerlink" href="#name-typ-wert_3" title="Permanent link">&para;</a></h1>
<p>_dmarc IN TXT "v=DMARC1; p=reject; rua=mailto:<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#97;&#105;&#108;&#97;&#117;&#116;&#104;&#45;&#114;&#101;&#112;&#111;&#114;&#116;&#115;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#111;&#114;&#103;">&#109;&#97;&#105;&#108;&#97;&#117;&#116;&#104;&#45;&#114;&#101;&#112;&#111;&#114;&#116;&#115;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#111;&#114;&#103;</a>"
```</p>
<h2 id="die-erweiterte-dns-konfiguration">Die erweiterte DNS-Konfiguration<a class="headerlink" href="#die-erweiterte-dns-konfiguration" title="Permanent link">&para;</a></h2>
<p><strong>SRV</strong>-Einträge geben den/die Server für ein bestimmtes Protokoll in Ihrer Domäne an. Wenn Sie einen Dienst explizit als nicht bereitgestellt ankündigen wollen, geben Sie "." als Zieladresse an (statt "mail.example.org."). Bitte beachten Sie <a href="https://tools.ietf.org/html/rfc2782">RFC 2782</a>.</p>
<div class="highlight"><pre><span></span><code># Name Typ Priorität Gewicht Port Wert
_autodiscover._tcp IN SRV 0 1 443 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
<p>```</p>
<h1 id="name-typ-prioritat-gewicht-port-wert">Name Typ Priorität Gewicht Port Wert<a class="headerlink" href="#name-typ-prioritat-gewicht-port-wert" title="Permanent link">&para;</a></h1>
<p>_autodiscover._tcp IN SRV 0 1 443 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_caldavs._tcp IN SRV 0 1 443 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_caldavs._tcp IN TXT &quot;path=/SOGo/dav/&quot;
_caldavs._tcp IN TXT "path=/SOGo/dav/"
_carddavs._tcp IN SRV 0 1 443 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_carddavs._tcp IN TXT &quot;path=/SOGo/dav/&quot;
_carddavs._tcp IN TXT "path=/SOGo/dav/"
_imap._tcp IN SRV 0 1 143 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_imaps._tcp IN SRV 0 1 993 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_pop3._tcp IN SRV 0 1 110 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
@ -2582,7 +2731,7 @@ _pop3s._tcp IN SRV 0 1 995 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_sieve._tcp IN SRV 0 1 4190 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_smtps._tcp IN SRV 0 1 465 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
_submission._tcp IN SRV 0 1 587 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
</code></pre></div>
```</p>
<h2 id="testen">Testen<a class="headerlink" href="#testen" title="Permanent link">&para;</a></h2>
<p>Hier finden Sie einige Tools, mit denen Sie Ihre DNS-Konfiguration überprüfen können:</p>
<ul>
@ -2613,20 +2762,18 @@ _submission._tcp IN SRV 0 1 587 mail.example.org. (Ihr ${MAILCOW_HOSTNAME})
<p>Diese Dienste stellen Ihnen möglicherweise einen TXT-Eintrag zur Verfügung, den Sie in Ihre DNS-Einträge einfügen müssen, so wie es der Anbieter vorschreibt. Bitte stellen Sie sicher, dass Sie die Dokumentation des Anbieters des von Ihnen gewählten Dienstes lesen, da dieser Prozess variieren kann.</p>
<h3 id="e-mail-test-fur-spf-dkim-und-dmarc">E-Mail-Test für SPF, DKIM und DMARC:<a class="headerlink" href="#e-mail-test-fur-spf-dkim-und-dmarc" title="Permanent link">&para;</a></h3>
<p>Um eine rudimentäre E-Mail-Authentifizierungsprüfung durchzuführen, senden Sie eine E-Mail an <code>check-auth at verifier.port25.com</code> und warten Sie auf eine Antwort. Sie werden einen Bericht ähnlich dem folgenden finden:</p>
<div class="highlight"><pre><span></span><code>==========================================================
Zusammenfassung der Ergebnisse
==========================================================
SPF-Prüfung: bestanden
&quot;iprev&quot;-Prüfung: bestanden
<h1 id="_1">```<a class="headerlink" href="#_1" title="Permanent link">&para;</a></h1>
<h1 id="zusammenfassung-der-ergebnisse">Zusammenfassung der Ergebnisse<a class="headerlink" href="#zusammenfassung-der-ergebnisse" title="Permanent link">&para;</a></h1>
<p>SPF-Prüfung: bestanden
"iprev"-Prüfung: bestanden
DKIM-Prüfung: bestanden
DKIM-Prüfung: bestanden
SpamAssassin-Prüfung: ham
==========================================================
SpamAssassin-Prüfung: ham</p>
<p>==========================================================
Einzelheiten:
==========================================================
....
</code></pre></div>
```</p>
<p>Der vollständige Bericht enthält weitere technische Details.</p>
<h3 id="fully-qualified-domain-name-fqdn">Fully Qualified Domain Name (FQDN)<a class="headerlink" href="#fully-qualified-domain-name-fqdn" title="Permanent link">&para;</a></h3>
<div class="footnote">

Datei anzeigen

@ -353,7 +353,14 @@
Firewall &amp; Ports
</a>
<nav class="md-nav" aria-label="Firewall &amp; Ports">
</li>
<li class="md-nav__item">
<a href="#oder" class="md-nav__link">
oder:
</a>
<nav class="md-nav" aria-label="oder:">
<ul class="md-nav__list">
<li class="md-nav__item">
@ -368,6 +375,13 @@
Wichtig für Hetzner Firewalls
</a>
</li>
<li class="md-nav__item">
<a href="#datum-und-uhrzeit" class="md-nav__link">
Datum und Uhrzeit
</a>
</li>
</ul>
@ -376,24 +390,50 @@
</li>
<li class="md-nav__item">
<a href="#datum-und-uhrzeit" class="md-nav__link">
Datum und Uhrzeit
<a href="#vim-etcsystemdtimesyncdconf" class="md-nav__link">
vim /etc/systemd/timesyncd.conf
</a>
</li>
<li class="md-nav__item">
<nav class="md-nav" aria-label="vim /etc/systemd/timesyncd.conf">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#hetzner-cloud-und-wahrscheinlich-andere" class="md-nav__link">
Hetzner Cloud (und wahrscheinlich andere)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#falsch" class="md-nav__link">
Falsch:
</a>
</li>
<li class="md-nav__item">
<a href="#richtig" class="md-nav__link">
Richtig:
</a>
<nav class="md-nav" aria-label="Richtig:">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mtu" class="md-nav__link">
MTU
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2453,7 +2493,14 @@
Firewall &amp; Ports
</a>
<nav class="md-nav" aria-label="Firewall &amp; Ports">
</li>
<li class="md-nav__item">
<a href="#oder" class="md-nav__link">
oder:
</a>
<nav class="md-nav" aria-label="oder:">
<ul class="md-nav__list">
<li class="md-nav__item">
@ -2468,6 +2515,13 @@
Wichtig für Hetzner Firewalls
</a>
</li>
<li class="md-nav__item">
<a href="#datum-und-uhrzeit" class="md-nav__link">
Datum und Uhrzeit
</a>
</li>
</ul>
@ -2476,24 +2530,50 @@
</li>
<li class="md-nav__item">
<a href="#datum-und-uhrzeit" class="md-nav__link">
Datum und Uhrzeit
<a href="#vim-etcsystemdtimesyncdconf" class="md-nav__link">
vim /etc/systemd/timesyncd.conf
</a>
</li>
<li class="md-nav__item">
<nav class="md-nav" aria-label="vim /etc/systemd/timesyncd.conf">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#hetzner-cloud-und-wahrscheinlich-andere" class="md-nav__link">
Hetzner Cloud (und wahrscheinlich andere)
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#falsch" class="md-nav__link">
Falsch:
</a>
</li>
<li class="md-nav__item">
<a href="#richtig" class="md-nav__link">
Richtig:
</a>
<nav class="md-nav" aria-label="Richtig:">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mtu" class="md-nav__link">
MTU
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2514,8 +2594,6 @@
<h1>Systemvoraussetzungen</h1>
<p>Bevor Sie <strong>mailcow: dockerized</strong> ausführen, sollten Sie einige Voraussetzungen überprüfen:</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
@ -2569,10 +2647,11 @@
<p>Im Rahmen unseres Supports können wir Ihnen bei der korrekten Planung Ihres Setups helfen.</p>
<h2 id="firewall-ports">Firewall &amp; Ports<a class="headerlink" href="#firewall-ports" title="Permanent link">&para;</a></h2>
<p>Bitte überprüfen Sie, ob alle Standard-Ports von mailcow offen sind und nicht von anderen Anwendungen genutzt werden:</p>
<div class="highlight"><pre><span></span><code>ss -tlpn | grep -E -w &#39;25|80|110|143|443|465|587|993|995|4190&#39;
# oder:
netstat -tulpn | grep -E -w &#39;25|80|110|143|443|465|587|993|995|4190&#39;
</code></pre></div>
<p>```
ss -tlpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'</p>
<h1 id="oder">oder:<a class="headerlink" href="#oder" title="Permanent link">&para;</a></h1>
<p>netstat -tulpn | grep -E -w '25|80|110|143|443|465|587|993|995|4190'
```</p>
<div class="admonition warnung">
<p class="admonition-title">Warnung</p>
<p>Es gibt einige Probleme mit dem Betrieb von mailcow auf einem Firewalld/ufw aktivierten System. Sie sollten es deaktivieren (wenn möglich) und stattdessen Ihren Regelsatz in die DOCKER-USER-Kette verschieben, die nicht durch einen Neustart des Docker-Dienstes gelöscht wird. Siehe <a href="https://blog.donnex.net/docker-and-iptables-filtering/">diese (blog.donnex.net)</a> oder <a href="https://unrouted.io/2017/08/15/docker-firewall/">diese (unrouted.io)</a> Anleitung für Informationen darüber, wie man iptables-persistent mit der DOCKER-USER Kette benutzt.
@ -2665,34 +2744,30 @@ Da mailcow im Docker-Modus läuft, haben INPUT-Regeln keinen Effekt auf die Besc
<p>Port 53 ist in diesem Fall für die Firewall-Konfiguration unwichtig. Laut Dokumentation verwendet unbound den Portbereich 1024-65535 für ausgehende Anfragen.
Da es sich bei der Hetzner Robot Firewall um eine statische Firewall handelt (jedes eingehende Paket wird isoliert geprüft) - müssen die folgenden Regeln angewendet werden:</p>
<p><strong>Für TCP</strong>
<div class="highlight"><pre><span></span><code>SRC-IP: ---
<code>SRC-IP: ---
DST-IP: ---
SRC-Port: ---
DST-Port: 1024-65535
Protokoll: tcp
TCP-Flags: ack
Aktion: Akzeptieren
</code></pre></div></p>
Aktion: Akzeptieren</code></p>
<p><strong>Für UDP</strong>
<div class="highlight"><pre><span></span><code>SRC-IP: ---
<code>SRC-IP: ---
DST-IP: ---
SRC-Port: ---
DST-Port: 1024-65535
Protokoll: udp
Aktion: Akzeptieren
</code></pre></div></p>
Aktion: Akzeptieren</code></p>
<p>Wenn man einen restriktiveren Portbereich anwenden will, muss man zuerst die Konfiguration von unbound ändern (nach der Installation):</p>
<p>{mailcow-dockerized}/data/conf/unbound/unbound.conf:
<div class="highlight"><pre><span></span><code>ausgehender-Port-vermeiden: 0-32767
</code></pre></div></p>
<code>ausgehender-Port-vermeiden: 0-32767</code></p>
<p>Nun können die Firewall-Regeln wie folgt angepasst werden:</p>
<div class="highlight"><pre><span></span><code>[...]
<p><code>[...]
DST Port: 32768-65535
[...]
</code></pre></div>
[...]</code></p>
<h2 id="datum-und-uhrzeit">Datum und Uhrzeit<a class="headerlink" href="#datum-und-uhrzeit" title="Permanent link">&para;</a></h2>
<p>Um sicherzustellen, dass Sie das richtige Datum und die richtige Zeit auf Ihrem System eingestellt haben, überprüfen Sie bitte die Ausgabe von <code>timedatectl status</code>:</p>
<div class="highlight"><pre><span></span><code>$ timedatectl status
<p><code>$ timedatectl status
Lokale Zeit: Sat 2017-05-06 02:12:33 CEST
Weltzeit: Sa 2017-05-06 00:12:33 UTC
RTC-Zeit: Sa 2017-05-06 00:12:32
@ -2706,23 +2781,24 @@ NTP synchronisiert: ja
So 2017-03-26 03:00:00 MESZ
Nächste Sommerzeitänderung: Die Sommerzeit endet (die Uhr springt eine Stunde rückwärts) am
Sun 2017-10-29 02:59:59 MESZ
Sun 2017-10-29 02:00:00 MEZ
</code></pre></div>
Sun 2017-10-29 02:00:00 MEZ</code></p>
<p>Die Zeilen <code>NTP aktiviert: ja</code> und <code>NTP synchronisiert: ja</code> zeigen an, ob Sie NTP aktiviert haben und ob es synchronisiert ist.</p>
<p>Um NTP zu aktivieren, müssen Sie den Befehl <code>timedatectl set-ntp true</code> ausführen. Sie müssen auch Ihre <code>/etc/systemd/timesyncd.conf</code> bearbeiten:</p>
<div class="highlight"><pre><span></span><code># vim /etc/systemd/timesyncd.conf
[Zeit]
<p>```</p>
<h1 id="vim-etcsystemdtimesyncdconf">vim /etc/systemd/timesyncd.conf<a class="headerlink" href="#vim-etcsystemdtimesyncdconf" title="Permanent link">&para;</a></h1>
<p>[Zeit]
NTP=0.pool.ntp.org 1.pool.ntp.org 2.pool.ntp.org 3.pool.ntp.org
</code></pre></div>
```</p>
<h2 id="hetzner-cloud-und-wahrscheinlich-andere">Hetzner Cloud (und wahrscheinlich andere)<a class="headerlink" href="#hetzner-cloud-und-wahrscheinlich-andere" title="Permanent link">&para;</a></h2>
<p>Prüfen Sie <code>/etc/network/interfaces.d/50-cloud-init.cfg</code> und ändern Sie die IPv6-Schnittstelle von eth0:0 auf eth0:</p>
<div class="highlight"><pre><span></span><code># Falsch:
auto eth0:0
iface eth0:0 inet6 static
# Richtig:
auto eth0
<p>```</p>
<h1 id="falsch">Falsch:<a class="headerlink" href="#falsch" title="Permanent link">&para;</a></h1>
<p>auto eth0:0
iface eth0:0 inet6 static</p>
<h1 id="richtig">Richtig:<a class="headerlink" href="#richtig" title="Permanent link">&para;</a></h1>
<p>auto eth0
iface eth0 inet6 static
</code></pre></div>
```</p>
<p>Starten Sie die Schnittstelle neu, um die Einstellungen zu übernehmen.
Sie können außerdem die <a href="https://wiki.hetzner.de/index.php/Cloud_IP_static/en#disable_cloud-init_network_changes">cloud-init Netzwerkänderungen deaktivieren.</a></p>
<h2 id="mtu">MTU<a class="headerlink" href="#mtu" title="Permanent link">&para;</a></h2>

Datei anzeigen

@ -2659,69 +2659,67 @@ Diese Anleitung behandelt nur die Grundlagen.</p>
<h3 id="erstellen-oder-andern-sie-docker-composeoverrideyml">Erstellen oder ändern Sie <code>docker-compose.override.yml</code><a class="headerlink" href="#erstellen-oder-andern-sie-docker-composeoverrideyml" title="Permanent link">&para;</a></h3>
<p>Im mailcow-dockerized Stammverzeichnis erstellen oder bearbeiten Sie <code>docker-compose.override.yml</code> und fügen Sie die folgende
Konfiguration ein:
<div class="highlight"><pre><span></span><code><span class="nt">version</span><span class="p">:</span><span class="w"> </span><span class="s">&#39;2.1&#39;</span><span class="w"></span>
<span class="nt">services</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">borgmatic-mailcow</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">b3vis/borgmatic</span><span class="w"></span>
<span class="w"> </span><span class="nt">hostname</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mailcow</span><span class="w"></span>
<span class="w"> </span><span class="nt">restart</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">always</span><span class="w"></span>
<span class="w"> </span><span class="nt">dns</span><span class="p">:</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">${IPV4_NETWORK:-172.22.1}.254</span><span class="w"></span>
<span class="w"> </span><span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">vmail-vol-1:/mnt/source/vmail:ro</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">crypt-vol-1:/mnt/source/crypt:ro</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">redis-vol-1:/mnt/source/redis:ro,z</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">rspamd-vol-1:/mnt/source/rspamd:ro,z</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">postfix-vol-1:/mnt/source/postfix:ro,z</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">mysql-socket-vol-1:/var/run/mysqld/:z</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">borg-config-vol-1:/root/.config/borg:Z</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">borg-cache-vol-1:/root/.cache/borg:Z</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./data/conf/borgmatic/etc:/etc/borgmatic.d:Z</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">./data/conf/borgmatic/ssh:/root/.ssh:Z</span><span class="w"></span>
<span class="w"> </span><span class="nt">environment</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">TZ=${TZ}</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">BORG_PASSPHRASE=YouBetterPutSomethingRealGoodHere</span><span class="w"></span>
<span class="w"> </span><span class="nt">networks</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">mailcow-network</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">aliases</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="p p-Indicator">-</span><span class="w"> </span><span class="l l-Scalar l-Scalar-Plain">borgmatic</span><span class="w"></span>
<span class="nt">volumes</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">borg-cache-vol-1</span><span class="p">:</span><span class="w"></span>
<span class="w"> </span><span class="nt">borg-config-vol-1</span><span class="p">:</span><span class="w"></span>
</code></pre></div></p>
```yaml
version: '2.1'</p>
<p>services:
borgmatic-mailcow:
image: b3vis/borgmatic
hostname: mailcow
restart: always
dns: ${IPV4_NETWORK:-172.22.1}.254
volumes:
- vmail-vol-1:/mnt/source/vmail:ro
- crypt-vol-1:/mnt/source/crypt:ro
- redis-vol-1:/mnt/source/redis:ro,z
- rspamd-vol-1:/mnt/source/rspamd:ro,z
- postfix-vol-1:/mnt/source/postfix:ro,z
- mysql-socket-vol-1:/var/run/mysqld/:z
- borg-config-vol-1:/root/.config/borg:Z
- borg-cache-vol-1:/root/.cache/borg:Z
- ./data/conf/borgmatic/etc:/etc/borgmatic.d:Z
- ./data/conf/borgmatic/ssh:/root/.ssh:Z
environment:
- TZ=${TZ}
- BORG_PASSPHRASE=YouBetterPutSomethingRealGoodHere
networks:
mailcow-network:
aliases:
- borgmatic</p>
<p>volumes:
borg-cache-vol-1:
borg-config-vol-1:
```</p>
<p>Stellen Sie sicher, dass Sie die <code>BORG_PASSPHRASE</code> in eine sichere Passphrase Ihrer Wahl ändern.</p>
<p>Aus Sicherheitsgründen mounten wir das maildir als schreibgeschützt. Wenn Sie später Daten wiederherstellen wollen, müssen Sie das
müssen Sie das <code>ro</code>-Flag entfernen, bevor Sie die Daten wiederherstellen. Dies wird im Abschnitt über die Wiederherstellung von Backups beschrieben.</p>
<h3 id="erstellen-sie-dataconfborgmaticetcconfigyaml">Erstellen Sie <code>data/conf/borgmatic/etc/config.yaml</code><a class="headerlink" href="#erstellen-sie-dataconfborgmaticetcconfigyaml" title="Permanent link">&para;</a></h3>
<p>Als nächstes müssen wir die borgmatic-Konfiguration erstellen.</p>
<div class="highlight"><pre><span></span><code><span class="nb">source</span> mailcow.conf
cat <span class="s">&lt;&lt;EOF &gt; data/conf/borgmatic/etc/config.yaml</span>
<span class="s">location:</span>
<span class="s"> source_directories:</span>
<span class="s"> - /mnt/source</span>
<span class="s"> repositories:</span>
<span class="s"> - user@rsync.net:mailcow</span>
<span class="s"> exclude_patterns:</span>
<span class="s"> - &#39;/mnt/source/postfix/public/&#39;</span>
<span class="s"> - &#39;/mnt/source/postfix/private/&#39;</span>
<span class="s"> - &#39;/mnt/source/rspamd/rspamd.sock&#39;</span>
<span class="s">retention:</span>
<span class="s"> keep_hourly: 24</span>
<span class="s"> keep_daily: 7</span>
<span class="s"> keep_weekly: 4</span>
<span class="s"> keep_monthly: 6</span>
<span class="s"> prefix: &quot;&quot;</span>
<span class="s">hooks:</span>
<span class="s"> mysql_databases:</span>
<span class="s"> - name: ${DBNAME}</span>
<span class="s"> username: ${DBUSER}</span>
<span class="s"> password: ${DBPASS}</span>
<span class="s"> options: --default-character-set=utf8mb4</span>
<span class="s">EOF</span>
</code></pre></div>
<p>```shell
source mailcow.conf
cat &lt;<EOF > data/conf/borgmatic/etc/config.yaml
location:
source_directories:
- /mnt/source
repositories:
- <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#117;&#115;&#101;&#114;&#64;&#114;&#115;&#121;&#110;&#99;&#46;&#110;&#101;&#116;">&#117;&#115;&#101;&#114;&#64;&#114;&#115;&#121;&#110;&#99;&#46;&#110;&#101;&#116;</a>:mailcow
exclude_patterns:
- '/mnt/source/postfix/public/'
- '/mnt/source/postfix/private/'
- '/mnt/source/rspamd/rspamd.sock'</p>
<p>retention:
keep_hourly: 24
keep_daily: 7
keep_weekly: 4
keep_monthly: 6
prefix: ""</p>
<p>hooks:
mysql_databases:
- name: ${DBNAME}
username: ${DBUSER}
password: ${DBPASS}
options: --default-character-set=utf8mb4
EOF
```</p>
<p>Das Erstellen der Datei auf diese Weise stellt sicher, dass die korrekten MySQL-Zugangsdaten aus <code>mailcow.conf</code> übernommen werden.</p>
<p>Diese Datei ist ein minimales Beispiel für die Verwendung von borgmatic mit einem Konto <code>user</code> beim Cloud-Speicheranbieter <code>rsync.net</code> für
ein Repository namens <code>mailcow</code> (siehe <code>repositories</code> Einstellung). Es wird sowohl das maildir als auch die MySQL-Datenbank sichern, was alles ist
@ -2737,8 +2735,7 @@ Container einbinden. Der Container definiert zu diesem Zweck ein Volume namens <
</div>
<h3 id="erstellen-sie-einen-crontab">Erstellen Sie einen crontab<a class="headerlink" href="#erstellen-sie-einen-crontab" title="Permanent link">&para;</a></h3>
<p>Erstellen Sie eine neue Textdatei in <code>data/conf/borgmatic/etc/crontab.txt</code> mit folgendem Inhalt:</p>
<div class="highlight"><pre><span></span><code>14 * * * * PATH=$PATH:/usr/bin /usr/bin/borgmatic --stats -v 0 2&gt;&amp;1
</code></pre></div>
<p><code>14 * * * * PATH=$PATH:/usr/bin /usr/bin/borgmatic --stats -v 0 2&gt;&amp;1</code></p>
<p>Diese Datei erwartet eine crontab-Syntax. Das hier gezeigte Beispiel veranlasst das Backup, jede Stunde um 14 Minuten nach
nach der vollen Stunde auszuführen und am Ende einige nette Statistiken zu protokollieren.</p>
<h3 id="ssh-schlussel-in-ordner-ablegen">SSH-Schlüssel in Ordner ablegen<a class="headerlink" href="#ssh-schlussel-in-ordner-ablegen" title="Permanent link">&para;</a></h3>
@ -2747,8 +2744,8 @@ nach der vollen Stunde auszuführen und am Ende einige nette Statistiken zu prot
oder OpenSSH wird sich weigern, den SSH-Schlüssel zu benutzen.</p>
<h3 id="den-container-hochfahren">Den Container hochfahren<a class="headerlink" href="#den-container-hochfahren" title="Permanent link">&para;</a></h3>
<p>Für den nächsten Schritt müssen wir den Container in einem konfigurierten Zustand hochfahren und laufen lassen. Um das zu tun, führen Sie aus:</p>
<div class="highlight"><pre><span></span><code>docker-compose up -d
</code></pre></div>
<p><code>shell
docker-compose up -d</code></p>
<h2 id="wiederherstellung-von-einem-backup">Wiederherstellung von einem Backup<a class="headerlink" href="#wiederherstellung-von-einem-backup" title="Permanent link">&para;</a></h2>
<p>Das Wiederherstellen eines Backups setzt voraus, dass Sie mit einer neuen Installation von mailcow beginnen, und dass Sie derzeit keine
keine benutzerdefinierten Daten in ihrem maildir oder ihrer mailcow Datenbank.</p>
@ -2768,8 +2765,8 @@ dieses Volume zu schreiben.</p>
<p>Bevor Sie eine Wiederherstellung durchführen, müssen Sie das vmail-Volume in <code>docker-compose.override.yml</code> beschreibbar machen, indem Sie das
das <code>ro</code>-Flag aus dem Volume entfernen.
Dann können Sie den folgenden Befehl verwenden, um das Maildir aus einem Backup wiederherzustellen:</p>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> borgmatic-mailcow borgmatic extract --path mnt/source --archive latest
</code></pre></div>
<p><code>shell
docker-compose exec borgmatic-mailcow borgmatic extract --path mnt/source --archive latest</code></p>
<p>Alternativ können Sie auch einen beliebigen Archivnamen aus der Liste der Archive angeben (siehe
<a href="#auflistung-aller-verfugbaren-archive">Auflistung aller verfügbaren Archive</a>)</p>
<h3 id="mysql-wiederherstellen">MySQL wiederherstellen<a class="headerlink" href="#mysql-wiederherstellen" title="Permanent link">&para;</a></h3>
@ -2778,30 +2775,30 @@ Dann können Sie den folgenden Befehl verwenden, um das Maildir aus einem Backup
<p>Die Ausführung dieses Befehls löscht und erstellt die mailcow-Datenbank neu! Führen sie diesen Befehl nicht aus, es sei denn sie beabsichtigen, die mailcow-Datenbank von einem Backup wiederherzustellen.</p>
</div>
<p>Um die MySQL-Datenbank aus dem letzten Archiv wiederherzustellen, verwenden Sie diesen Befehl:</p>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> borgmatic-mailcow borgmatic restore --archive latest
</code></pre></div>
<p><code>shell
docker-compose exec borgmatic-mailcow borgmatic restore --archive latest</code></p>
<p>Alternativ können Sie auch einen beliebigen Archivnamen aus der Liste der Archive angeben (siehe
<a href="#auflistung-aller-verfugbaren-archive">Auflistung aller verfügbaren Archive</a>)</p>
<h3 id="nach-der-wiederherstellung">Nach der Wiederherstellung<a class="headerlink" href="#nach-der-wiederherstellung" title="Permanent link">&para;</a></h3>
<p>Nach der Wiederherstellung müssen Sie mailcow neu starten. Wenn Sie den SELinux-Erzwingungsmodus deaktiviert haben, wäre jetzt ein guter Zeitpunkt, um
ihn wieder zu aktivieren.</p>
<p>Um mailcow neu zu starten, verwenden Sie den folgenden Befehl:</p>
<div class="highlight"><pre><span></span><code>docker-compose down <span class="o">&amp;&amp;</span> docker-compose up -d
</code></pre></div>
<p><code>shell
docker-compose down &amp;&amp; docker-compose up -d</code></p>
<p>Wenn Sie SELinux verwenden, werden dadurch auch alle Dateien in Ihrem vmail-Volume neu benannt. Seien Sie geduldig, denn dies kann
eine Weile dauern kann, wenn Sie viele Dateien haben.</p>
<h2 id="nutzliche-befehle">Nützliche Befehle<a class="headerlink" href="#nutzliche-befehle" title="Permanent link">&para;</a></h2>
<h3 id="manueller-archivierungslauf-mit-debugging-ausgabe">Manueller Archivierungslauf (mit Debugging-Ausgabe)<a class="headerlink" href="#manueller-archivierungslauf-mit-debugging-ausgabe" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> borgmatic-mailcow borgmatic -v <span class="m">2</span>
</code></pre></div>
<p><code>shell
docker-compose exec borgmatic-mailcow borgmatic -v 2</code></p>
<h3 id="auflistung-aller-verfugbaren-archive">Auflistung aller verfügbaren Archive<a class="headerlink" href="#auflistung-aller-verfugbaren-archive" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> borgmatic-mailcow borgmatic list
</code></pre></div>
<p><code>shell
docker-compose exec borgmatic-mailcow borgmatic list</code></p>
<h3 id="sperre-aufheben">Sperre aufheben<a class="headerlink" href="#sperre-aufheben" title="Permanent link">&para;</a></h3>
<p>Wenn borg während eines Archivierungslaufs unterbrochen wird, hinterlässt es eine veraltete Sperre, die gelöscht werden muss, bevor
neue Operationen durchgeführt werden können:</p>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> borgmatic-mailcow borg break-lock user@rsync.net:mailcow
</code></pre></div>
<p><code>shell
docker-compose exec borgmatic-mailcow borg break-lock user@rsync.net:mailcow</code></p>
<p>Wobei <code>user@rsync.net:mailcow</code> die URI zu Ihrem Repository ist.</p>
<p>Jetzt wäre ein guter Zeitpunkt, einen manuellen Archivierungslauf durchzuführen, um sicherzustellen, dass er erfolgreich durchgeführt werden kann.</p>
<h3 id="exportieren-von-schlusseln">Exportieren von Schlüsseln<a class="headerlink" href="#exportieren-von-schlusseln" title="Permanent link">&para;</a></h3>
@ -2810,8 +2807,8 @@ Schlüsseldateien werden erzeugt, wenn Sie das Repository initialisieren. Die <c
Repository, so dass eine manuelle Sicherung nicht so wichtig ist.</p>
<p>Beachten Sie, dass Sie in beiden Fällen auch die Passphrase haben müssen, um die Archive zu entschlüsseln.</p>
<p>Um die <code>keyfile</code> zu holen, führen Sie aus:</p>
<div class="highlight"><pre><span></span><code>docker-compose <span class="nb">exec</span> borgmatic-mailcow borg key <span class="nb">export</span> --paper user@rsync.net:mailcow
</code></pre></div>
<p><code>shell
docker-compose exec borgmatic-mailcow borg key export --paper user@rsync.net:mailcow</code></p>
<p>Wobei <code>user@rsync.net:mailcow</code> die URI zu Ihrem Repository ist.</p>
<hr>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#fur-gitea_ssh_port1270014000-in-mailcowconf-setzen" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -2209,6 +2214,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Gitea
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,45 +2352,43 @@
<h1>Gitea</h1>
<p>Mit der Fähigkeit von Gitea, sich über SMTP zu authentifizieren, ist es trivial, es mit mailcow zu integrieren. Es sind nur wenige Änderungen erforderlich:</p>
<p>1. Öffnen Sie <code>docker-compose.override.yml</code> und fügen Sie Gitea hinzu:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
gitea-mailcow:
image: gitea/gitea:1
volumes:
- ./data/gitea:/data
networks:
mailcow-network:
aliases:
- gitea
ports:
- &quot;${GITEA_SSH_PORT:-127.0.0.1:4000}:22&quot;
</code></pre></div>
<p>```
version: '2.1'
services:</p>
<pre><code> gitea-mailcow:
image: gitea/gitea:1
volumes:
- ./data/gitea:/data
networks:
mailcow-network:
aliases:
- gitea
ports:
- "${GITEA_SSH_PORT:-127.0.0.1:4000}:22"
</code></pre>
<p>```</p>
<p>2. Erstellen Sie <code>data/conf/nginx/site.gitea.custom</code>, fügen Sie folgendes hinzu:
<div class="highlight"><pre><span></span><code>location /gitea/ {
<code>location /gitea/ {
proxy_pass http://gitea:3000/;
}
</code></pre></div></p>
}</code></p>
<p>3. Öffne <code>mailcow.conf</code> und definiere den Port Bind, den Gitea für SSH verwenden soll. Beispiel:</p>
<div class="highlight"><pre><span></span><code>GITEA_SSH_PORT=127.0.0.1:4000
</code></pre></div>
<p><code>GITEA_SSH_PORT=127.0.0.1:4000</code></p>
<p>5. Führen Sie <code>docker-compose up -d</code> aus, um den Gitea-Container hochzufahren und führen Sie anschließend <code>docker-compose restart nginx-mailcow</code> aus.</p>
<p>6. Wenn Sie mailcow zu https gezwungen haben, führen Sie Schritt 9 aus und starten Sie gitea mit <code>docker-compose restart gitea-mailcow</code> neu. Fahren Sie mit Schritt 7 fort (Denken Sie daran, https anstelle von http zu verwenden, <code>https://mx.example.org/gitea/</code> </p>
<p>7. Öffnen Sie <code>http://${MAILCOW_HOSTNAME}/gitea/</code>, zum Beispiel <code>http://mx.example.org/gitea/</code>. Für die Datenbankdetails stellen Sie <code>mysql</code> als Datenbankhost ein. Verwenden Sie den in mailcow.conf gefundenen Wert von DBNAME als Datenbankname, DBUSER als Datenbankbenutzer und DBPASS als Datenbankpasswort.</p>
<p>8. Sobald die Installation abgeschlossen ist, loggen Sie sich als Administrator ein und setzen Sie "Einstellungen" -&gt; "Autorisierung" -&gt; "SMTP aktivieren". SMTP-Host sollte <code>postfix</code> mit Port <code>587</code> sein, setzen Sie <code>Skip TLS Verify</code>, da wir ein nicht gelistetes SAN verwenden ("postfix" ist höchstwahrscheinlich nicht Teil Ihres Zertifikats).</p>
<p>9. Erstellen Sie <code>data/gitea/gitea/conf/app.ini</code> und setzen Sie die folgenden Werte. Sie können <a href="https://docs.gitea.io/en-us/config-cheat-sheet/">gitea cheat sheet, leider bisher nur in Englisch verfügbar</a> für deren Bedeutung und andere mögliche Werte konsultieren.</p>
<div class="highlight"><pre><span></span><code>[server]
SSH_LISTEN_PORT = 22
# Für GITEA_SSH_PORT=127.0.0.1:4000 in mailcow.conf, setzen:
SSH_DOMAIN = 127.0.0.1
SSH_PORT = 4000
# Für MAILCOW_HOSTNAME=mx.example.org in mailcow.conf (und Standard-Ports für HTTPS), setzen:
ROOT_URL = https://mx.example.org/gitea/
</code></pre></div>
<p>```
[server]
SSH_LISTEN_PORT = 22</p>
<h1 id="fur-gitea_ssh_port1270014000-in-mailcowconf-setzen">Für GITEA_SSH_PORT=127.0.0.1:4000 in mailcow.conf, setzen:<a class="headerlink" href="#fur-gitea_ssh_port1270014000-in-mailcowconf-setzen" title="Permanent link">&para;</a></h1>
<p>SSH_DOMAIN = 127.0.0.1
SSH_PORT = 4000</p>
<h1 id="fur-mailcow_hostnamemxexampleorg-in-mailcowconf-und-standard-ports-fur-https-setzen">Für MAILCOW_HOSTNAME=mx.example.org in mailcow.conf (und Standard-Ports für HTTPS), setzen:<a class="headerlink" href="#fur-mailcow_hostnamemxexampleorg-in-mailcowconf-und-standard-ports-fur-https-setzen" title="Permanent link">&para;</a></h1>
<p>ROOT_URL = <a href="https://mx.example.org/gitea/">https://mx.example.org/gitea/</a>
```</p>
<p>10. Starten Sie gitea neu mit <code>docker-compose restart gitea-mailcow</code>. Ihre Nutzer sollten in der Lage sein, sich mit von mailcow verwalteten Konten anzumelden.</p>
<hr>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#fur-gogs_ssh_port1270014000-in-mailcowconf-setzen" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -2223,6 +2228,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Gogs
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,44 +2352,42 @@
<h1>Gogs</h1>
<p>Mit Gogs' Fähigkeit, sich über SMTP zu authentifizieren, ist es einfach, es mit mailcow zu verbinden. Es sind nur wenige Änderungen erforderlich:</p>
<p>1. Öffne <code>docker-compose.override.yml</code> und füge Gogs hinzu:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
gogs-mailcow:
image: gogs/gogs
volumes:
- ./data/gogs:/data
networks:
mailcow-network:
aliases:
- gogs
ports:
- &quot;${GOGS_SSH_PORT:-127.0.0.1:4000}:22&quot;
</code></pre></div>
<p>```
version: '2.1'
services:</p>
<pre><code>gogs-mailcow:
image: gogs/gogs
volumes:
- ./data/gogs:/data
networks:
mailcow-network:
aliases:
- gogs
ports:
- "${GOGS_SSH_PORT:-127.0.0.1:4000}:22"
</code></pre>
<p>```</p>
<p>2. Erstelle <code>data/conf/nginx/site.gogs.custom</code>, füge hinzu:
<div class="highlight"><pre><span></span><code>location /gogs/ {
<code>location /gogs/ {
proxy_pass http://gogs:3000/;
}
</code></pre></div></p>
}</code></p>
<p>3. Öffne <code>mailcow.conf</code> und definiere die Bindung, die Gogs für SSH verwenden soll. Beispiel:</p>
<div class="highlight"><pre><span></span><code>GOGS_SSH_PORT=127.0.0.1:4000
</code></pre></div>
<p><code>GOGS_SSH_PORT=127.0.0.1:4000</code></p>
<p>5. Führen Sie <code>docker-compose up -d</code> aus, um den Gogs-Container hochzufahren und führen Sie anschließend <code>docker-compose restart nginx-mailcow</code> aus.</p>
<p>6. Öffnen Sie <code>http://${MAILCOW_HOSTNAME}/gogs/</code>, zum Beispiel <code>http://mx.example.org/gogs/</code>. Für Datenbank-Details setzen Sie <code>mysql</code> als Datenbank-Host. Verwenden Sie den in mailcow.conf gefundenen Wert von DBNAME als Datenbankname, DBUSER als Datenbankbenutzer und DBPASS als Datenbankpasswort.</p>
<p>7. Sobald die Installation abgeschlossen ist, loggen Sie sich als Administrator ein und setzen Sie "Einstellungen" -&gt; "Autorisierung" -&gt; "SMTP aktivieren". SMTP-Host sollte <code>postfix</code> mit Port <code>587</code> sein, setzen Sie <code>Skip TLS Verify</code>, da wir ein nicht gelistetes SAN verwenden ("postfix" ist höchstwahrscheinlich nicht Teil Ihres Zertifikats).</p>
<p>8. Erstellen Sie <code>data/gogs/gogs/conf/app.ini</code> und setzen Sie die folgenden Werte. Sie können <a href="https://gogs.io/docs/advanced/configuration_cheat_sheet">Gogs cheat sheet</a> für ihre Bedeutung und andere mögliche Werte konsultieren.</p>
<div class="highlight"><pre><span></span><code>[server]
SSH_LISTEN_PORT = 22
# Für GOGS_SSH_PORT=127.0.0.1:4000 in mailcow.conf, setzen:
SSH_DOMAIN = 127.0.0.1
SSH_PORT = 4000
# Für MAILCOW_HOSTNAME=mx.example.org in mailcow.conf (und Standard-Ports für HTTPS), setzen:
ROOT_URL = https://mx.example.org/gogs/
</code></pre></div>
<p>```
[server]
SSH_LISTEN_PORT = 22</p>
<h1 id="fur-gogs_ssh_port1270014000-in-mailcowconf-setzen">Für GOGS_SSH_PORT=127.0.0.1:4000 in mailcow.conf, setzen:<a class="headerlink" href="#fur-gogs_ssh_port1270014000-in-mailcowconf-setzen" title="Permanent link">&para;</a></h1>
<p>SSH_DOMAIN = 127.0.0.1
SSH_PORT = 4000</p>
<h1 id="fur-mailcow_hostnamemxexampleorg-in-mailcowconf-und-standard-ports-fur-https-setzen">Für MAILCOW_HOSTNAME=mx.example.org in mailcow.conf (und Standard-Ports für HTTPS), setzen:<a class="headerlink" href="#fur-mailcow_hostnamemxexampleorg-in-mailcowconf-und-standard-ports-fur-https-setzen" title="Permanent link">&para;</a></h1>
<p>ROOT_URL = <a href="https://mx.example.org/gogs/">https://mx.example.org/gogs/</a>
```</p>
<p>9. Starten Sie Gogs neu mit <code>docker-compose restart gogs-mailcow</code>. Ihre Benutzer sollten in der Lage sein, sich mit von mailcow verwalteten Konten einzuloggen.</p>
<hr>

Datei anzeigen

@ -2289,162 +2289,6 @@
DNS-Einrichtung
</a>
</li>
<li class="md-nav__item">
<a href="#installieren-sie-apache-als-reverse-proxy" class="md-nav__link">
Installieren Sie Apache als Reverse Proxy
</a>
<nav class="md-nav" aria-label="Installieren Sie Apache als Reverse Proxy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#vhost-konfiguration" class="md-nav__link">
vHost-Konfiguration
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#beziehen-sie-ssl-zertifikate-mit-lets-encrypt" class="md-nav__link">
Beziehen Sie SSL-Zertifikate mit Let's Encrypt.
</a>
</li>
<li class="md-nav__item">
<a href="#installieren-sie-mailcow-mit-mailman-integration" class="md-nav__link">
Installieren Sie mailcow mit Mailman Integration
</a>
<nav class="md-nav" aria-label="Installieren Sie mailcow mit Mailman Integration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#installieren-sie-mailcow" class="md-nav__link">
Installieren Sie mailcow
</a>
</li>
<li class="md-nav__item">
<a href="#mailcow-konfigurieren" class="md-nav__link">
Mailcow konfigurieren
</a>
</li>
<li class="md-nav__item">
<a href="#mailman-integration-hinzufugen" class="md-nav__link">
Mailman-Integration hinzufügen
</a>
</li>
<li class="md-nav__item">
<a href="#ssl-zertifikate" class="md-nav__link">
SSL-Zertifikate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#installieren-sie-mailman" class="md-nav__link">
Installieren Sie Mailman.
</a>
<nav class="md-nav" aria-label="Installieren Sie Mailman.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mailman-konfigurieren" class="md-nav__link">
Mailman konfigurieren
</a>
</li>
<li class="md-nav__item">
<a href="#konfigurieren-sie-mailman-core-und-mailman-web" class="md-nav__link">
Konfigurieren Sie Mailman core und Mailman web
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#ausfuhren" class="md-nav__link">
🏃 Ausführen
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#bemerkungen" class="md-nav__link">
Bemerkungen
</a>
<nav class="md-nav" aria-label="Bemerkungen">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#neue-listen-werden-von-postfix-nicht-sofort-erkannt" class="md-nav__link">
Neue Listen werden von Postfix nicht sofort erkannt
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#update" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="#sicherung" class="md-nav__link">
Sicherung
</a>
</li>
<li class="md-nav__item">
<a href="#todo" class="md-nav__link">
ToDo
</a>
<nav class="md-nav" aria-label="ToDo">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#skript-installieren" class="md-nav__link">
Skript installieren
</a>
</li>
</ul>
@ -2569,162 +2413,6 @@
DNS-Einrichtung
</a>
</li>
<li class="md-nav__item">
<a href="#installieren-sie-apache-als-reverse-proxy" class="md-nav__link">
Installieren Sie Apache als Reverse Proxy
</a>
<nav class="md-nav" aria-label="Installieren Sie Apache als Reverse Proxy">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#vhost-konfiguration" class="md-nav__link">
vHost-Konfiguration
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#beziehen-sie-ssl-zertifikate-mit-lets-encrypt" class="md-nav__link">
Beziehen Sie SSL-Zertifikate mit Let's Encrypt.
</a>
</li>
<li class="md-nav__item">
<a href="#installieren-sie-mailcow-mit-mailman-integration" class="md-nav__link">
Installieren Sie mailcow mit Mailman Integration
</a>
<nav class="md-nav" aria-label="Installieren Sie mailcow mit Mailman Integration">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#installieren-sie-mailcow" class="md-nav__link">
Installieren Sie mailcow
</a>
</li>
<li class="md-nav__item">
<a href="#mailcow-konfigurieren" class="md-nav__link">
Mailcow konfigurieren
</a>
</li>
<li class="md-nav__item">
<a href="#mailman-integration-hinzufugen" class="md-nav__link">
Mailman-Integration hinzufügen
</a>
</li>
<li class="md-nav__item">
<a href="#ssl-zertifikate" class="md-nav__link">
SSL-Zertifikate
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#installieren-sie-mailman" class="md-nav__link">
Installieren Sie Mailman.
</a>
<nav class="md-nav" aria-label="Installieren Sie Mailman.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#mailman-konfigurieren" class="md-nav__link">
Mailman konfigurieren
</a>
</li>
<li class="md-nav__item">
<a href="#konfigurieren-sie-mailman-core-und-mailman-web" class="md-nav__link">
Konfigurieren Sie Mailman core und Mailman web
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#ausfuhren" class="md-nav__link">
🏃 Ausführen
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#bemerkungen" class="md-nav__link">
Bemerkungen
</a>
<nav class="md-nav" aria-label="Bemerkungen">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#neue-listen-werden-von-postfix-nicht-sofort-erkannt" class="md-nav__link">
Neue Listen werden von Postfix nicht sofort erkannt
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#update" class="md-nav__link">
Update
</a>
</li>
<li class="md-nav__item">
<a href="#sicherung" class="md-nav__link">
Sicherung
</a>
</li>
<li class="md-nav__item">
<a href="#todo" class="md-nav__link">
ToDo
</a>
<nav class="md-nav" aria-label="ToDo">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#skript-installieren" class="md-nav__link">
Skript installieren
</a>
</li>
</ul>
@ -2780,15 +2468,15 @@
</ol>
<h3 id="dns-einrichtung">DNS-Einrichtung<a class="headerlink" href="#dns-einrichtung" title="Permanent link">&para;</a></h3>
<p>Der größte Teil der Konfiguration ist in <em>mailcow</em>s <a href="../../prerequisite/prerequisite-dns/">DNS Konfiguration</a> enthalten. Nachdem diese Einrichtung abgeschlossen ist, fügen Sie eine weitere Subdomain für <em>Mailman</em> hinzu, z.B. <code>lists.example.org</code>, die auf denselben Server zeigt:</p>
<div class="highlight"><pre><span></span><code># Name Typ Wert
lists IN A 1.2.3.4
<p>```</p>
<h1 id="name-typ-wert">Name Typ Wert<a class="headerlink" href="#name-typ-wert" title="Permanent link">&para;</a></h1>
<p>lists IN A 1.2.3.4
lists IN AAAA dead:beef
</code></pre></div>
```</p>
<h3 id="installieren-sie-apache-als-reverse-proxy">Installieren Sie <em>Apache</em> als Reverse Proxy<a class="headerlink" href="#installieren-sie-apache-als-reverse-proxy" title="Permanent link">&para;</a></h3>
<p>Installieren Sie <em>Apache</em>, z.B. mit dieser Anleitung von <em>Digital Ocean</em>: <a href="https://www.digitalocean.com/community/tutorials/how-to-install-the-apache-web-server-on-ubuntu-20-04">How To Install the Apache Web Server on Ubuntu 20.04 (Englisch)</a>.</p>
<p>Aktivieren Sie bestimmte <em>Apache</em> Module (als <em>root</em> oder <em>sudo</em>):</p>
<div class="highlight"><pre><span></span><code>a2enmod rewrite proxy proxy_http headers ssl wsgi proxy_uwsgi http2
</code></pre></div>
<p><code>a2enmod rewrite proxy proxy_http headers ssl wsgi proxy_uwsgi http2</code></p>
<p>Möglicherweise müssen Sie weitere Pakete installieren, um diese Module zu erhalten. Dieses <a href="https://launchpad.net/~ondrej/+archive/ubuntu/apache2">PPA</a> von <em>Ondřej Surý</em> könnte Ihnen helfen.</p>
<h4 id="vhost-konfiguration">vHost-Konfiguration<a class="headerlink" href="#vhost-konfiguration" title="Permanent link">&para;</a></h4>
<p>Kopieren Sie die <a href="https://github.com/g4rf/dockerized-mailcow-mailman/tree/master/apache/mailcow.conf">mailcow.conf</a> und die <a href="https://github.com/g4rf/dockerized-mailcow-mailman/tree/master/apache/mailman.conf">mailman.conf</a> in den <em>Apache</em> conf Ordner <code>sites-available</code> (z.B. unter <code>/etc/apache2/sites-available</code>).</p>
@ -2806,51 +2494,46 @@ lists IN AAAA dead:beef
<li><a href="https://mxtoolbox.com/SuperTool.aspx?action=aaaa%3aMAILMAN_DOMAIN">https://mxtoolbox.com/SuperTool.aspx?action=aaaa%3aMAILMAN_DOMAIN</a></li>
</ul>
<p>Installieren Sie <a href="https://certbot.eff.org/">certbot</a> (als <em>root</em> oder <em>sudo</em>):</p>
<div class="highlight"><pre><span></span><code>apt install certbot
</code></pre></div>
<p><code>apt install certbot</code></p>
<p>Holen Sie sich die gewünschten Zertifikate (als <em>root</em> oder <em>sudo</em>):</p>
<div class="highlight"><pre><span></span><code>certbot certonly -d mailcow_HOSTNAME
certbot certonly -d MAILMAN_DOMAIN
</code></pre></div>
<p><code>certbot certonly -d mailcow_HOSTNAME
certbot certonly -d MAILMAN_DOMAIN</code></p>
<h3 id="installieren-sie-mailcow-mit-mailman-integration">Installieren Sie <em>mailcow</em> mit <em>Mailman</em> Integration<a class="headerlink" href="#installieren-sie-mailcow-mit-mailman-integration" title="Permanent link">&para;</a></h3>
<h4 id="installieren-sie-mailcow">Installieren Sie mailcow<a class="headerlink" href="#installieren-sie-mailcow" title="Permanent link">&para;</a></h4>
<p>Folgen Sie der <a href="../../i_u_m/i_u_m_install/">mailcow installation</a>. <strong>Schritt 5 auslassen und nicht mit <code>docker-compose</code> starten!</strong></p>
<h4 id="mailcow-konfigurieren">Mailcow konfigurieren<a class="headerlink" href="#mailcow-konfigurieren" title="Permanent link">&para;</a></h4>
<p>Dies ist auch <strong>Schritt 4</strong> in der offiziellen <em>mailcow-Installation</em> (<code>nano mailcow.conf</code>). Passen Sie also Ihre Bedürfnisse an und ändern Sie die folgenden Variablen:</p>
<div class="highlight"><pre><span></span><code>HTTP_PORT=18080 # verwenden Sie nicht 8080, da mailman es braucht
<p>```
HTTP_PORT=18080 # verwenden Sie nicht 8080, da mailman es braucht
HTTP_BIND=127.0.0.1 #
HTTPS_PORT=18443 # Sie können 8443 verwenden
HTTPS_BIND=127.0.0.1 # # HTTPS_BIND=127.0.0.1
SKIP_LETS_ENCRYPT=y # Der Reverse Proxy wird die SSL-Verifizierung durchführen
SNAT_TO_SOURCE=1.2.3.4 # ändern Sie dies in Ihre IPv4
HTTPS_BIND=127.0.0.1 # # HTTPS_BIND=127.0.0.1</p>
<p>SKIP_LETS_ENCRYPT=y # Der Reverse Proxy wird die SSL-Verifizierung durchführen</p>
<p>SNAT_TO_SOURCE=1.2.3.4 # ändern Sie dies in Ihre IPv4
SNAT6_TO_SOURCE=dead:beef # Ändern Sie dies in Ihre globale IPv6
</code></pre></div>
```</p>
<h4 id="mailman-integration-hinzufugen">Mailman-Integration hinzufügen<a class="headerlink" href="#mailman-integration-hinzufugen" title="Permanent link">&para;</a></h4>
<p>Erstelle die Datei <code>/opt/mailcow-dockerized/docker-compose.override.yml</code> (z.B. mit <code>nano</code>) und füge die folgenden Zeilen hinzu:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
<p>```
version: '2.1'</p>
<p>services:
postfix-mailcow:
volumes:
- /opt/mailman:/opt/mailman
networks:
- docker-mailman_mailman
networks:
- docker-mailman_mailman</p>
<p>networks:
docker-mailman_mailman:
external: true
</code></pre></div>
```</p>
<p>Das zusätzliche Volume wird von <em>Mailman</em> verwendet, um zusätzliche Konfigurationsdateien für <em>mailcow postfix</em> zu generieren. Das externe Netzwerk wird von <em>Mailman</em> erstellt und verwendet. <em>mailcow</em> benötigt es, um eingehende Listenmails an <em>Mailman</em> zu liefern.</p>
<p>Erstellen Sie die Datei <code>/opt/mailcow-dockerized/data/conf/postfix/extra.cf</code> (z.B. mit <code>nano</code>) und fügen Sie die folgenden Zeilen hinzu:</p>
<div class="highlight"><pre><span></span><code># mailman
recipient_delimiter = +
<p>```</p>
<h1 id="mailman">mailman<a class="headerlink" href="#mailman" title="Permanent link">&para;</a></h1>
<p>recipient_delimiter = +
unknown_local_recipient_reject_code = 550
owner_request_special = no
local_recipient_maps =
owner_request_special = no</p>
<p>local_recipient_maps =
regexp:/opt/mailman/core/var/data/postfix_lmtp,
proxy:unix:passwd.byname,
$alias_maps
@ -2869,7 +2552,7 @@ relay_domains =
relay_recipient_maps =
proxy:mysql:/opt/postfix/conf/sql/mysql_relay_recipient_maps.cf,
regexp:/opt/mailman/core/var/data/postfix_lmtp
</code></pre></div>
```</p>
<p>Da wir hier die <em>mailcow postfix</em> Konfiguration überschreiben, kann dieser Schritt Ihre normalen Mailtransporte unterbrechen. Überprüfen Sie die <a href="https://github.com/mailcow/mailcow-dockerized/tree/master/data/conf/postfix">originalen Konfigurationsdateien</a>, wenn sich etwas geändert hat.</p>
<h4 id="ssl-zertifikate">SSL-Zertifikate<a class="headerlink" href="#ssl-zertifikate" title="Permanent link">&para;</a></h4>
<p>Da wir <em>mailcow</em> als Proxy verwenden, müssen wir die SSL-Zertifikate in die <em>mailcow</em>-Dateistruktur kopieren. Diese Aufgabe wird das Skript <a href="https://github.com/g4rf/dockerized-mailcow-mailman/tree/master/scripts/renew-ssl.sh">renew-ssl.sh</a> für uns erledigen:</p>
@ -2880,28 +2563,25 @@ relay_recipient_maps =
<li><strong>Noch nicht ausführen, da wir zuerst Mailman benötigen</strong></li>
</ul>
<p>Sie müssen einen <em>cronjob</em> erstellen, so dass neue Zertifikate kopiert werden. Führen Sie ihn als <em>root</em> oder <em>sudo</em> aus:</p>
<div class="highlight"><pre><span></span><code>crontab -e
</code></pre></div>
<p><code>crontab -e</code></p>
<p>Um das Skript jeden Tag um 5 Uhr morgens laufen zu lassen, fügen Sie hinzu:</p>
<div class="highlight"><pre><span></span><code>0 5 * * * /opt/mailcow-dockerized/renew-ssl.sh
</code></pre></div>
<p><code>0 5 * * * /opt/mailcow-dockerized/renew-ssl.sh</code></p>
<h3 id="installieren-sie-mailman">Installieren Sie <em>Mailman</em>.<a class="headerlink" href="#installieren-sie-mailman" title="Permanent link">&para;</a></h3>
<p>Befolgen Sie im Wesentlichen die Anweisungen unter <a href="https://github.com/maxking/docker-mailman">docker-mailman</a>. Da sie sehr umfangreich sind, ist hier in aller Kürze beschrieben, was zu tun ist:</p>
<p>Als <em>root</em> oder <em>sudo</em>:</p>
<div class="highlight"><pre><span></span><code>cd /opt
<p><code>cd /opt
mkdir -p mailman/core
mkdir -p mailman/web
git clone https://github.com/maxking/docker-mailman
cd docker-mailman
</code></pre></div>
cd docker-mailman</code></p>
<h4 id="mailman-konfigurieren">Mailman konfigurieren<a class="headerlink" href="#mailman-konfigurieren" title="Permanent link">&para;</a></h4>
<p>Erstellen Sie einen langen Schlüssel für <em>Hyperkitty</em>, z.B. mit dem Linux-Befehl <code>cat /dev/urandom | tr -dc a-zA-Z0-9 | head -c30; echo</code>. Speichern Sie diesen Schlüssel vorerst als HYPERKITTY_KEY.</p>
<p>Erstellen Sie ein langes Passwort für die Datenbank, z. B. mit dem Linux-Befehl <code>cat /dev/urandom | tr -dc a-zA-Z0-9 | head -c30; echo</code>. Speichern Sie dieses Passwort zunächst als DBPASS.</p>
<p>Erstellen Sie einen langen Schlüssel für <em>Django</em>, z. B. mit dem Linux-Befehl <code>cat /dev/urandom | tr -dc a-zA-Z0-9 | head -c30; echo</code>. Speichern Sie diesen Schlüssel für einen Moment als DJANGO_KEY.</p>
<p>Erstellen Sie die Datei <code>/opt/docker-mailman/docker-compose.override.yaml</code> und ersetzen Sie <code>HYPERKITTY_KEY</code>, <code>DBPASS</code> und <code>DJANGO_KEY</code> durch die generierten Werte:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2&#39;
services:
<p>```
version: '2'</p>
<p>services:
mailman-core:
environment:
- DATABASE_URL=postgres://mailman:DBPASS@database/mailmandb
@ -2910,9 +2590,8 @@ services:
- MTA=postfix
restart: always
networks:
- mailman
mailman-web:
- mailman</p>
<p>mailman-web:
environment:
- DATABASE_URL=postgres://mailman:DBPASS@database/mailmandb
- HYPERKITTY_API_KEY=HYPERKITTY_KEY
@ -2920,57 +2599,51 @@ services:
- SECRET_KEY=DJANGO_KEY
- SERVE_FROM_DOMAIN=MAILMAN_DOMAIN # e.g. lists.example.org
- MAILMAN_ADMIN_USER=admin # the admin user
- MAILMAN_ADMIN_EMAIL=admin@example.org # the admin mail address
- MAILMAN_ADMIN_EMAIL=<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#97;&#100;&#109;&#105;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#111;&#114;&#103;">&#97;&#100;&#109;&#105;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#111;&#114;&#103;</a> # the admin mail address
- UWSGI_STATIC_MAP=/static=/opt/mailman-web-data/static
restart: always
database:
restart: always</p>
<p>database:
environment:
- POSTGRES_PASSWORD=DBPASS
restart: always
</code></pre></div>
```</p>
<p>Bei <code>mailman-web</code> geben Sie die korrekten Werte für <code>SERVE_FROM_DOMAIN</code> (z.B. <code>lists.example.org</code>), <code>MAILMAN_ADMIN_USER</code> und <code>MAILMAN_ADMIN_EMAIL</code> ein. Sie benötigen die Admin-Zugangsdaten, um sich in der Web-Oberfläche (<em>Pistorius</em>) anzumelden. Um <strong>das Passwort zum ersten Mal</strong> zu setzen, verwenden Sie die Funktion <em>Passwort vergessen</em> im Webinterface.</p>
<p>Über andere Konfigurationsoptionen lesen Sie die Dokumentationen <a href="https://github.com/maxking/docker-mailman#mailman-web-1">Mailman-web</a> und <a href="https://github.com/maxking/docker-mailman#mailman-core-1">Mailman-core</a>.</p>
<h4 id="konfigurieren-sie-mailman-core-und-mailman-web">Konfigurieren Sie Mailman core und Mailman web<a class="headerlink" href="#konfigurieren-sie-mailman-core-und-mailman-web" title="Permanent link">&para;</a></h4>
<p>Erstellen Sie die Datei <code>/opt/mailman/core/mailman-extra.cfg</code> mit dem folgenden Inhalt. <code>mailman@example.org</code> sollte auf ein gültiges Postfach oder eine Umleitung verweisen.</p>
<div class="highlight"><pre><span></span><code>[mailman]
<p><code>[mailman]
default_language: de
site_owner: mailman@example.org
</code></pre></div>
site_owner: mailman@example.org</code></p>
<p>Erstellen Sie die Datei <code>/opt/mailman/web/settings_local.py</code> mit dem folgenden Inhalt. <code>mailman@example.org</code> sollte auf ein gültiges Postfach oder eine Umleitung verweisen.</p>
<p><div class="highlight"><pre><span></span><code># Gebietsschema
LANGUAGE_CODE = &#39;de-de&#39;
# soziale Authentifizierung deaktivieren
SOCIALACCOUNT_PROVIDERS = {}
# ändern
DEFAULT_FROM_EMAIL = &#39;mailman@example.org&#39;
DEBUG = False
</code></pre></div>
Sie können <code>LANGUAGE_CODE</code> und <code>SOCIALACCOUNT_PROVIDERS</code> an Ihre Bedürfnisse anpassen. Im Moment hat <code>SOCIALACCOUNT_PROVIDERS</code> keinen Effekt, siehe <a href="https://github.com/g4rf/dockerized-mailcow-mailman/issues/2">issue #2</a>.</p>
<p>```</p>
<h1 id="gebietsschema">Gebietsschema<a class="headerlink" href="#gebietsschema" title="Permanent link">&para;</a></h1>
<p>LANGUAGE_CODE = 'de-de'</p>
<h1 id="soziale-authentifizierung-deaktivieren">soziale Authentifizierung deaktivieren<a class="headerlink" href="#soziale-authentifizierung-deaktivieren" title="Permanent link">&para;</a></h1>
<p>SOCIALACCOUNT_PROVIDERS = {}</p>
<h1 id="andern">ändern<a class="headerlink" href="#andern" title="Permanent link">&para;</a></h1>
<p>DEFAULT_FROM_EMAIL = '<a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#109;&#97;&#105;&#108;&#109;&#97;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#111;&#114;&#103;">&#109;&#97;&#105;&#108;&#109;&#97;&#110;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#111;&#114;&#103;</a>'</p>
<p>DEBUG = False
<code>``
Sie können</code>LANGUAGE_CODE<code>und</code>SOCIALACCOUNT_PROVIDERS<code>an Ihre Bedürfnisse anpassen. Im Moment hat</code>SOCIALACCOUNT_PROVIDERS` keinen Effekt, siehe <a href="https://github.com/g4rf/dockerized-mailcow-mailman/issues/2">issue #2</a>.</p>
<h3 id="ausfuhren">🏃 Ausführen<a class="headerlink" href="#ausfuhren" title="Permanent link">&para;</a></h3>
<p>Ausführen (als <em>root</em> oder <em>sudo</em>)</p>
<div class="highlight"><pre><span></span><code>a2ensite mailcow.conf
<p>```
a2ensite mailcow.conf
a2ensite mailman.conf
systemctl restart apache2
cd /opt/docker-mailman
systemctl restart apache2</p>
<p>cd /opt/docker-mailman
docker-compose pull
docker-compose up -d
cd /opt/mailcow-dockerized/
docker-compose up -d</p>
<p>cd /opt/mailcow-dockerized/
docker-compose pull
./renew-ssl.sh
</code></pre></div>
```</p>
<p><strong>Warten Sie ein paar Minuten!</strong> Die Container müssen ihre Datenbanken und Konfigurationsdateien erstellen. Dies kann bis zu 1 Minute und mehr dauern.</p>
<h2 id="bemerkungen">Bemerkungen<a class="headerlink" href="#bemerkungen" title="Permanent link">&para;</a></h2>
<h3 id="neue-listen-werden-von-postfix-nicht-sofort-erkannt">Neue Listen werden von Postfix nicht sofort erkannt<a class="headerlink" href="#neue-listen-werden-von-postfix-nicht-sofort-erkannt" title="Permanent link">&para;</a></h3>
<p>Wenn man eine neue Liste anlegt und versucht, sofort eine E-Mail zu versenden, antwortet <em>postfix</em> mit <code>Benutzer existiert nicht</code>, weil <em>postfix</em> die Liste noch nicht an <em>Mailman</em> übergeben hat. Die Konfiguration unter <code>/opt/mailman/core/var/data/postfix_lmtp</code> wird nicht sofort aktualisiert. Wenn Sie die Liste sofort benötigen, starten Sie <em>postifx</em> manuell neu:</p>
<div class="highlight"><pre><span></span><code>cd /opt/mailcow-dockerized
docker-compose restart postfix-mailcow
</code></pre></div>
<p><code>cd /opt/mailcow-dockerized
docker-compose restart postfix-mailcow</code></p>
<h2 id="update">Update<a class="headerlink" href="#update" title="Permanent link">&para;</a></h2>
<p><strong>mailcow</strong> hat sein eigenes Update-Skript in <code>/opt/mailcow-dockerized/update.sh</code>, <a href="../../i_u_m/i_u_m_update/">siehe die Dokumentation</a>.</p>
<p>Für <strong>Mailman</strong> holen Sie sich einfach die neueste Version aus dem <a href="https://github.com/maxking/docker-mailman">github repository</a>.</p>

Datei anzeigen

@ -2456,11 +2456,11 @@
</div>
<h2 id="das-zu-losende-problem">Das zu lösende Problem<a class="headerlink" href="#das-zu-losende-problem" title="Permanent link">&para;</a></h2>
<p>mailpiler bietet die Authentifizierung auf Basis von IMAP an, zum Beispiel:</p>
<div class="highlight"><pre><span></span><code><span class="x">$config[&#39;ENABLE_IMAP_AUTH&#39;] = 1;</span>
<span class="x">$config[&#39;IMAP_HOST&#39;] = &#39;mail.example.com&#39;;</span>
<span class="x">$config[&#39;IMAP_PORT&#39;] = 993;</span>
<span class="x">$config[&#39;IMAP_SSL&#39;] = true;</span>
</code></pre></div>
<p><code>php
$config['ENABLE_IMAP_AUTH'] = 1;
$config['IMAP_HOST'] = 'mail.example.com';
$config['IMAP_PORT'] = 993;
$config['IMAP_SSL'] = true;</code></p>
<ul>
<li>Wenn Sie sich also mit <code>patrik@example.com</code> anmelden, sehen Sie nur zugestellte E-Mails, die von oder an diese spezielle E-Mail-Adresse gesendet wurden.</li>
<li>Wenn zusätzliche Aliase in mailcow definiert werden, wie z.B. <code>team@example.com</code>, werden Sie keine Emails sehen, die an oder von dieser Email-Adresse gesendet wurden, auch wenn Sie ein Empfänger von Emails sind, die an diese Alias-Adresse gesendet wurden.</li>
@ -2487,19 +2487,19 @@
<ol>
<li>
<p>Setzen Sie die benutzerdefinierte Abfragefunktion von mailpiler und fügen Sie diese an <code>/usr/local/etc/piler/config-site.php</code> an:</p>
<div class="highlight"><pre><span></span><code><span class="x">$config[&#39;MAILCOW_API_KEY&#39;] = &#39;YOUR_READONLY_API_KEY&#39;;</span>
<span class="x">$config[&#39;MAILCOW_SET_REALNAME&#39;] = true; // wenn nicht angegeben, dann ist der Standardwert false</span>
<span class="x">$config[&#39;CUSTOM_EMAIL_QUERY_FUNCTION&#39;] = &#39;query_mailcow_for_email_access&#39;;</span>
<span class="x">include(&#39;auth-mailcow.php&#39;);</span>
</code></pre></div>
<p><code>php
$config['MAILCOW_API_KEY'] = 'YOUR_READONLY_API_KEY';
$config['MAILCOW_SET_REALNAME'] = true; // wenn nicht angegeben, dann ist der Standardwert false
$config['CUSTOM_EMAIL_QUERY_FUNCTION'] = 'query_mailcow_for_email_access';
include('auth-mailcow.php');</code></p>
<p>Sie können auch den mailcow-Hostnamen ändern, falls erforderlich:
<div class="highlight"><pre><span></span><code><span class="x">$config[&#39;MAILCOW_HOST&#39;] = &#39;mail.domain.tld&#39;; // standardmäßig $config[&#39;IMAP_HOST&#39;]</span>
</code></pre></div></p>
<code>php
$config['MAILCOW_HOST'] = 'mail.domain.tld'; // standardmäßig $config['IMAP_HOST']</code></p>
</li>
<li>
<p>Laden Sie die PHP-Datei mit den Funktionen aus dem <a href="https://github.com/patschi/mailpiler-mailcow-integration">GitHub Repo</a> herunter:</p>
<div class="highlight"><pre><span></span><code>curl -o /usr/local/etc/piler/auth-mailcow.php https://raw.githubusercontent.com/patschi/mailpiler-mailcow-integration/master/auth-mailcow.php
</code></pre></div>
<p><code>sh
curl -o /usr/local/etc/piler/auth-mailcow.php https://raw.githubusercontent.com/patschi/mailpiler-mailcow-integration/master/auth-mailcow.php</code></p>
</li>
<li>
<p>Erledigt!</p>

Datei anzeigen

@ -2458,14 +2458,13 @@
<h2 id="hintergrund-aufgaben">Hintergrund-Aufgaben<a class="headerlink" href="#hintergrund-aufgaben" title="Permanent link">&para;</a></h2>
<p>Zur Verwendung der empfohlenen Einstellung (Cron) zur Verarbeitung der Hintergrund-Aufgaben müssen in der <code>docker-compose.override.yml</code> folgende Zeilen
hinzugefügt werden:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
<p><code>version: '2.1'
services:
php-fpm-mailcow:
labels:
ofelia.enabled: &quot;true&quot;
ofelia.job-exec.nextcloud-cron.schedule: &quot;@every 5m&quot;
ofelia.job-exec.nextcloud-cron.command: &quot;su www-data -s /bin/bash -c \&quot;/usr/local/bin/php -f /web/nextcloud/cron.php\&quot;&quot;
</code></pre></div>
ofelia.enabled: "true"
ofelia.job-exec.nextcloud-cron.schedule: "@every 5m"
ofelia.job-exec.nextcloud-cron.command: "su www-data -s /bin/bash -c \"/usr/local/bin/php -f /web/nextcloud/cron.php\""</code></p>
<p>Nachdem diese Zeilen hinzugefügt wurden muss <code>docker-compose up -d</code> ausgeführt werden, um das Docker Image mit den entsprechenden Labels zu versehen. Danach muss
zudem der docker scheduler neu gestartet werden, um den neuen Job zu registrieren. Dazu wird <code>docker-compose restart ofelia-mailcow</code> ausgeführt. Zur
Überprüfung, ob die <code>ofelia</code> Konfiguration korrekt ist geladen wurde, kann mittels <code>docker-compose logs ofelia-mailcow</code> nach einer Zeile mit dem Inhalt
@ -2518,14 +2517,12 @@ services:
<p>Wenn Sie bisher Nextcloud mit mailcow-Authentifizierung über user_external/IMAP verwendet haben, müssen Sie einige zusätzliche Schritte durchführen, um Ihre bestehenden Benutzerkonten mit OAuth2 zu verknüpfen.</p>
<p>1. Klicken Sie auf die Schaltfläche in der oberen rechten Ecke und wählen Sie <em>Apps</em>. Scrollen Sie nach unten zur App <em>Externe Benutzerauthentifizierung</em> und klicken Sie daneben auf <em>Entfernen</em>.
2. Führen Sie die folgenden Abfragen in Ihrer Nextcloud-Datenbank aus (wenn Sie Nextcloud mit dem Skript von mailcow einrichten, können Sie <code>source mailcow.conf &amp;&amp; docker-compose exec mysql-mailcow mysql -u$DBUSER -p$DBPASS $DBNAME</code> ausführen):
<div class="highlight"><pre><span></span><code>INSERT INTO nc_users (uid, uid_lower) SELECT DISTINCT uid, LOWER(uid) FROM nc_users_external;
INSERT INTO nc_sociallogin_connect (uid, identifier) SELECT DISTINCT uid, CONCAT(&quot;Mailcow-&quot;, uid) FROM nc_users_external;
</code></pre></div></p>
<code>INSERT INTO nc_users (uid, uid_lower) SELECT DISTINCT uid, LOWER(uid) FROM nc_users_external;
INSERT INTO nc_sociallogin_connect (uid, identifier) SELECT DISTINCT uid, CONCAT("Mailcow-", uid) FROM nc_users_external;</code></p>
<hr />
<p>Wenn Sie Nextcloud bisher ohne mailcow-Authentifizierung, aber mit den gleichen Benutzernamen wie mailcow genutzt haben, können Sie Ihre bestehenden Benutzerkonten auch mit OAuth2 verknüpfen.</p>
<p>1. Führen Sie die folgenden Abfragen in Ihrer Nextcloud-Datenbank aus (wenn Sie Nextcloud mit dem Skript von mailcow einrichten, können Sie <code>source mailcow.conf &amp;&amp; docker-compose exec mysql-mailcow mysql -u$DBUSER -p$DBPASS $DBNAME</code> ausführen):
<div class="highlight"><pre><span></span><code>INSERT INTO nc_sociallogin_connect (uid, identifier) SELECT DISTINCT uid, CONCAT(&quot;Mailcow-&quot;, uid) FROM nc_users;
</code></pre></div></p>
<code>INSERT INTO nc_sociallogin_connect (uid, identifier) SELECT DISTINCT uid, CONCAT("Mailcow-", uid) FROM nc_users;</code></p>
<hr />
<h2 id="aktualisieren">Aktualisieren<a class="headerlink" href="#aktualisieren" title="Permanent link">&para;</a></h2>
<p>Die Nextcloud-Instanz kann einfach mit dem Web-Update-Mechanismus aktualisiert werden. Bei größeren Updates können nach dem Update weitere Änderungen vorgenommen werden. Nachdem die Nextcloud-Instanz geprüft wurde, werden Probleme angezeigt. Dies können z.B. fehlende Indizes in der DB oder ähnliches sein.
@ -2535,13 +2532,12 @@ Es wird angezeigt, welche Befehle ausgeführt werden müssen, diese müssen im p
<hr />
<h2 id="fehlersuche-und-fehlerbehebung">Fehlersuche und Fehlerbehebung<a class="headerlink" href="#fehlersuche-und-fehlerbehebung" title="Permanent link">&para;</a></h2>
<p>Es kann vorkommen, dass Sie die Nextcloud-Instanz von Ihrem Netzwerk aus nicht erreichen können. Dies kann daran liegen, dass der Eintrag Ihres Subnetzes im Array 'trusted_proxies' fehlt. Sie können Änderungen in der Nextcloud config.php in <code>data/web/nextcloud/config/*</code> vornehmen.</p>
<div class="highlight"><pre><span></span><code>&#39;trusted_proxies&#39; =&gt;
<p><code>'trusted_proxies' =&gt;
array (
0 =&gt; &#39;fd4d:6169:6c63:6f77::/64&#39;,
1 =&gt; &#39;172.22.1.0/24&#39;,
2 =&gt; &#39;NewSubnet/24&#39;,
),
</code></pre></div>
0 =&gt; 'fd4d:6169:6c63:6f77::/64',
1 =&gt; '172.22.1.0/24',
2 =&gt; 'NewSubnet/24',
),</code></p>
<p>Nachdem die Änderungen vorgenommen wurden, muss der nginx-Container neu gestartet werden.
<code>docker-compose restart nginx-mailcow</code></p>

Datei anzeigen

@ -2347,7 +2347,7 @@
<p>Um Portainer zu aktivieren, müssen die docker-compose.yml und site.conf für Nginx geändert werden.</p>
<p>1. Erstellen Sie eine neue Datei <code>docker-compose.override.yml</code> im mailcow-dockerized Stammverzeichnis und fügen Sie die folgende Konfiguration ein
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
<code>version: '2.1'
services:
portainer-mailcow:
image: portainer/portainer-ce
@ -2361,42 +2361,40 @@ services:
networks:
mailcow-network:
aliases:
- portainer
</code></pre></div>
- portainer</code>
2a. Erstelle <code>data/conf/nginx/portainer.conf</code>:
<div class="highlight"><pre><span></span><code>upstream portainer {
```
upstream portainer {
server portainer-mailcow:9000;
}
map $http_upgrade $connection_upgrade {
}</p>
<p>map $http_upgrade $connection_upgrade {
default upgrade;
&#39;&#39; close;
'' close;
}
</code></pre></div></p>
```</p>
<p>2b. Fügen Sie einen neuen Standort für die Standard-Mailcow-Site ein, indem Sie die Datei <code>data/conf/nginx/site.portainer.custom</code> erstellen:
<div class="highlight"><pre><span></span><code> location /portainer/ {
```
location /portainer/ {
proxy_http_version 1.1;
proxy_set_header Host $http_host; # required for docker client&#39;s sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client&#39;s IP
proxy_set_header Host $http_host; # required for docker client's sake
proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
proxy_set_header Connection &quot;&quot;;
proxy_buffers 32 4k;
proxy_pass http://portainer/;
}
location /portainer/api/websocket/ {
proxy_read_timeout 900;</p>
<pre><code>proxy_set_header Connection "";
proxy_buffers 32 4k;
proxy_pass http://portainer/;
</code></pre>
<p>}</p>
<p>location /portainer/api/websocket/ {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://portainer/api/websocket/;
proxy_pass <a href="http://portainer/api/websocket/">http://portainer/api/websocket/</a>;
}
</code></pre></div></p>
```</p>
<p>3. Übernehmen Sie Ihre Änderungen:
<div class="highlight"><pre><span></span><code>docker-compose up -d &amp;&amp; docker-compose restart nginx-mailcow
</code></pre></div></p>
<code>docker-compose up -d &amp;&amp; docker-compose restart nginx-mailcow</code></p>
<p>Nun können Sie einfach zu https://${MAILCOW_HOSTNAME}/portainer/ navigieren, um Ihre Portainer-Container-Überwachungsseite anzuzeigen. Sie werden dann aufgefordert, ein neues Passwort für den <strong>admin</strong> Account anzugeben. Nachdem Sie Ihr Passwort eingegeben haben, können Sie sich mit der Portainer UI verbinden.</p>
<hr>

Datei anzeigen

@ -2329,38 +2329,134 @@
</li>
<li class="md-nav__item">
<a href="#prufen-sie-ob-eine-neuere-version-vorliegt" class="md-nav__link">
Prüfen Sie, ob eine neuere Version vorliegt!
</a>
</li>
<li class="md-nav__item">
<a href="#andern-sie-den-ordnernamen" class="md-nav__link">
Ändern Sie den Ordnernamen
</a>
</li>
<li class="md-nav__item">
<a href="#berechtigungen-andern" class="md-nav__link">
Berechtigungen ändern
</a>
</li>
<li class="md-nav__item">
<a href="#fix-allow-remote-resources-httpsgithubcomroundcuberoundcubemailissues8170-sollte-in-16-nicht-erforderlich-sein" class="md-nav__link">
Fix Allow remote resources (https://github.com/roundcube/roundcubemail/issues/8170) sollte in 1.6 nicht erforderlich sein
</a>
</li>
<li class="md-nav__item">
<a href="#binbash" class="md-nav__link">
!/bin/bash
</a>
<nav class="md-nav" aria-label="!/bin/bash">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#konfigurieren-sie-die-managesieve-filterung" class="md-nav__link">
Konfigurieren Sie die ManageSieve-Filterung
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#aktivieren-sie-die-funktion-passwort-andern-in-roundcube" class="md-nav__link">
Aktivieren Sie die Funktion "Passwort ändern" in Roundcube
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#carddav-adressbucher-in-roundcube-einbinden" class="md-nav__link">
CardDAV Adressbücher in Roundcube einbinden
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#aktualisierung-von-roundcube" class="md-nav__link">
Aktualisierung von Roundcube
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#starten-sie-eine-bash-sitzung-des-mailcow-php-containers" class="md-nav__link">
Starten Sie eine Bash-Sitzung des mailcow PHP-Containers
</a>
</li>
<li class="md-nav__item">
<a href="#installieren-sie-die-erforderliche-upgrade-abhangigkeit-dann-aktualisieren-sie-roundcube-auf-die-gewunschte-version" class="md-nav__link">
Installieren Sie die erforderliche Upgrade-Abhängigkeit, dann aktualisieren Sie Roundcube auf die gewünschte Version
</a>
</li>
<li class="md-nav__item">
<a href="#geben-sie-y-ein-und-drucken-sie-die-eingabetaste-um-ihre-installation-von-roundcube-zu-aktualisieren" class="md-nav__link">
Geben Sie 'Y' ein und drücken Sie die Eingabetaste, um Ihre Installation von Roundcube zu aktualisieren.
</a>
</li>
<li class="md-nav__item">
<a href="#entfernen-sie-ubrig-gebliebene-dateien" class="md-nav__link">
Entfernen Sie übrig gebliebene Dateien
</a>
</li>
<li class="md-nav__item">
<a href="#fix-allow-remote-resources-httpsgithubcomroundcuberoundcubemailissues8170-sollte-in-16-nicht-benotigt-werden" class="md-nav__link">
Fix Allow remote resources (https://github.com/roundcube/roundcubemail/issues/8170) sollte in 1.6 nicht benötigt werden
</a>
<nav class="md-nav" aria-label="Fix Allow remote resources (https://github.com/roundcube/roundcubemail/issues/8170) sollte in 1.6 nicht benötigt werden">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#administratoren-ohne-passwort-in-roundcube-einloggen-lassen" class="md-nav__link">
Administratoren ohne Passwort in Roundcube einloggen lassen
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#erlaube-admins-sich-in-roundcube-als-email-benutzer-einzuloggen-ohne-passwort" class="md-nav__link">
Erlaube Admins, sich in Roundcube als Email-Benutzer einzuloggen (ohne Passwort)
</a>
</li>
<li class="md-nav__item">
<a href="#roundcube-mit-plugin-dovecot_impersonate-muss-zuerst-installiert-werden" class="md-nav__link">
Roundcube mit Plugin dovecot_impersonate muss zuerst installiert werden
</a>
</li>
</ul>
@ -2410,38 +2506,134 @@
</li>
<li class="md-nav__item">
<a href="#prufen-sie-ob-eine-neuere-version-vorliegt" class="md-nav__link">
Prüfen Sie, ob eine neuere Version vorliegt!
</a>
</li>
<li class="md-nav__item">
<a href="#andern-sie-den-ordnernamen" class="md-nav__link">
Ändern Sie den Ordnernamen
</a>
</li>
<li class="md-nav__item">
<a href="#berechtigungen-andern" class="md-nav__link">
Berechtigungen ändern
</a>
</li>
<li class="md-nav__item">
<a href="#fix-allow-remote-resources-httpsgithubcomroundcuberoundcubemailissues8170-sollte-in-16-nicht-erforderlich-sein" class="md-nav__link">
Fix Allow remote resources (https://github.com/roundcube/roundcubemail/issues/8170) sollte in 1.6 nicht erforderlich sein
</a>
</li>
<li class="md-nav__item">
<a href="#binbash" class="md-nav__link">
!/bin/bash
</a>
<nav class="md-nav" aria-label="!/bin/bash">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#konfigurieren-sie-die-managesieve-filterung" class="md-nav__link">
Konfigurieren Sie die ManageSieve-Filterung
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#aktivieren-sie-die-funktion-passwort-andern-in-roundcube" class="md-nav__link">
Aktivieren Sie die Funktion "Passwort ändern" in Roundcube
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#carddav-adressbucher-in-roundcube-einbinden" class="md-nav__link">
CardDAV Adressbücher in Roundcube einbinden
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#aktualisierung-von-roundcube" class="md-nav__link">
Aktualisierung von Roundcube
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#starten-sie-eine-bash-sitzung-des-mailcow-php-containers" class="md-nav__link">
Starten Sie eine Bash-Sitzung des mailcow PHP-Containers
</a>
</li>
<li class="md-nav__item">
<a href="#installieren-sie-die-erforderliche-upgrade-abhangigkeit-dann-aktualisieren-sie-roundcube-auf-die-gewunschte-version" class="md-nav__link">
Installieren Sie die erforderliche Upgrade-Abhängigkeit, dann aktualisieren Sie Roundcube auf die gewünschte Version
</a>
</li>
<li class="md-nav__item">
<a href="#geben-sie-y-ein-und-drucken-sie-die-eingabetaste-um-ihre-installation-von-roundcube-zu-aktualisieren" class="md-nav__link">
Geben Sie 'Y' ein und drücken Sie die Eingabetaste, um Ihre Installation von Roundcube zu aktualisieren.
</a>
</li>
<li class="md-nav__item">
<a href="#entfernen-sie-ubrig-gebliebene-dateien" class="md-nav__link">
Entfernen Sie übrig gebliebene Dateien
</a>
</li>
<li class="md-nav__item">
<a href="#fix-allow-remote-resources-httpsgithubcomroundcuberoundcubemailissues8170-sollte-in-16-nicht-benotigt-werden" class="md-nav__link">
Fix Allow remote resources (https://github.com/roundcube/roundcubemail/issues/8170) sollte in 1.6 nicht benötigt werden
</a>
<nav class="md-nav" aria-label="Fix Allow remote resources (https://github.com/roundcube/roundcubemail/issues/8170) sollte in 1.6 nicht benötigt werden">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#administratoren-ohne-passwort-in-roundcube-einloggen-lassen" class="md-nav__link">
Administratoren ohne Passwort in Roundcube einloggen lassen
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#erlaube-admins-sich-in-roundcube-als-email-benutzer-einzuloggen-ohne-passwort" class="md-nav__link">
Erlaube Admins, sich in Roundcube als Email-Benutzer einzuloggen (ohne Passwort)
</a>
</li>
<li class="md-nav__item">
<a href="#roundcube-mit-plugin-dovecot_impersonate-muss-zuerst-installiert-werden" class="md-nav__link">
Roundcube mit Plugin dovecot_impersonate muss zuerst installiert werden
</a>
</li>
</ul>
@ -2462,124 +2654,114 @@
<h1>Roundcube</h1>
<h2 id="installation-von-roundcube">Installation von Roundcube<a class="headerlink" href="#installation-von-roundcube" title="Permanent link">&para;</a></h2>
<p>Laden Sie Roundcube 1.5.x in das Web htdocs Verzeichnis herunter und entpacken Sie es (hier <code>rc/</code>):
<div class="highlight"><pre><span></span><code># Prüfen Sie, ob eine neuere Version vorliegt!
cd daten/web
wget -O - https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz | tar xfvz -
# Ändern Sie den Ordnernamen
mv roundcubemail-1.5.2 rc
# Berechtigungen ändern
chown -R root: rc/
# Fix Allow remote resources (https://github.com/roundcube/roundcubemail/issues/8170) sollte in 1.6 nicht erforderlich sein
sed -i &quot;s/\$prefix = &#39;\.\/&#39;;/\$prefix = preg_replace\(&#39;\/\[\?\&amp;]\.\*\$\/&#39;, &#39;&#39;, \$_SERVER\[&#39;REQUEST_URI&#39;] \?\? &#39;&#39;\) \?: &#39;\.\/&#39;;/g&quot; rc/program/include/rcmail.php
</code></pre></div></p>
```</p>
<h1 id="prufen-sie-ob-eine-neuere-version-vorliegt">Prüfen Sie, ob eine neuere Version vorliegt!<a class="headerlink" href="#prufen-sie-ob-eine-neuere-version-vorliegt" title="Permanent link">&para;</a></h1>
<p>cd daten/web
wget -O - <a href="https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz">https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz</a> | tar xfvz -</p>
<h1 id="andern-sie-den-ordnernamen">Ändern Sie den Ordnernamen<a class="headerlink" href="#andern-sie-den-ordnernamen" title="Permanent link">&para;</a></h1>
<p>mv roundcubemail-1.5.2 rc</p>
<h1 id="berechtigungen-andern">Berechtigungen ändern<a class="headerlink" href="#berechtigungen-andern" title="Permanent link">&para;</a></h1>
<p>chown -R root: rc/</p>
<h1 id="fix-allow-remote-resources-httpsgithubcomroundcuberoundcubemailissues8170-sollte-in-16-nicht-erforderlich-sein">Fix Allow remote resources (<a href="https://github.com/roundcube/roundcubemail/issues/8170">https://github.com/roundcube/roundcubemail/issues/8170</a>) sollte in 1.6 nicht erforderlich sein<a class="headerlink" href="#fix-allow-remote-resources-httpsgithubcomroundcuberoundcubemailissues8170-sollte-in-16-nicht-erforderlich-sein" title="Permanent link">&para;</a></h1>
<p>sed -i "s/\$prefix = '.\/';/\$prefix = preg_replace('\/[\?\&amp;].*\$\/', '', \$_SERVER['REQUEST_URI'] \?\? '') \?: '.\/';/g" rc/program/include/rcmail.php
```</p>
<p>Wenn Sie eine Rechtschreibprüfung benötigen, erstellen Sie eine Datei <code>data/hooks/phpfpm/aspell.sh</code> mit folgendem Inhalt und geben Sie dann <code>chmod +x data/hooks/phpfpm/aspell.sh</code> ein. Dadurch wird eine lokale Rechtschreibprüfung installiert. Beachten Sie, dass die meisten modernen Webbrowser eine eingebaute Rechtschreibprüfung haben, so dass Sie diese vielleicht nicht benötigen.
<div class="highlight"><pre><span></span><code>#!/bin/bash
apk update
```</p>
<h1 id="binbash">!/bin/bash<a class="headerlink" href="#binbash" title="Permanent link">&para;</a></h1>
<p>apk update
apk add aspell-de # oder jede andere Sprache
</code></pre></div></p>
```</p>
<p>Erstellen Sie eine Datei <code>data/web/rc/config/config.inc.php</code> mit dem folgenden Inhalt.
- <strong>Ändern Sie den Parameter <code>des_key</code> auf einen Zufallswert.</strong> Er wird verwendet, um Ihr IMAP-Passwort vorübergehend zu speichern.
- Der <code>db_prefix</code> ist optional, wird aber empfohlen.
- Wenn Sie die Rechtschreibprüfung im obigen Schritt nicht installiert haben, entfernen Sie den Parameter <code>spellcheck_engine</code> und ersetzen ihn durch <code>$config['enable_spellcheck'] = false;</code>.
<div class="highlight"><pre><span></span><code>&lt;?php
<code>&lt;?php
error_reporting(0);
if (!file_exists(&#39;/tmp/mime.types&#39;)) {
file_put_contents(&quot;/tmp/mime.types&quot;, fopen(&quot;http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types&quot;, &#39;r&#39;));
if (!file_exists('/tmp/mime.types')) {
file_put_contents("/tmp/mime.types", fopen("http://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types", 'r'));
}
$config = array();
$config[&#39;db_dsnw&#39;] = &#39;mysql://&#39; . getenv(&#39;DBUSER&#39;) . &#39;:&#39; . getenv(&#39;DBPASS&#39;) . &#39;@mysql/&#39; . getenv(&#39;DBNAME&#39;);
$config[&#39;default_host&#39;] = &#39;tls://dovecot&#39;;
$config[&#39;default_port&#39;] = &#39;143&#39;;
$config[&#39;smtp_server&#39;] = &#39;tls://postfix&#39;;
$config[&#39;smtp_port&#39;] = 587;
$config[&#39;smtp_user&#39;] = &#39;%u&#39;;
$config[&#39;smtp_pass&#39;] = &#39;%p&#39;;
$config[&#39;support_url&#39;] = &#39;&#39;;
$config[&#39;product_name&#39;] = &#39;Roundcube Webmail&#39;;
$config[&#39;des_key&#39;] = &#39;yourrandomstring_changeme&#39;;
$config[&#39;log_dir&#39;] = &#39;/dev/null&#39;;
$config[&#39;temp_dir&#39;] = &#39;/tmp&#39;;
$config[&#39;plugins&#39;] = array(
&#39;archive&#39;,
&#39;managesieve&#39;
$config['db_dsnw'] = 'mysql://' . getenv('DBUSER') . ':' . getenv('DBPASS') . '@mysql/' . getenv('DBNAME');
$config['default_host'] = 'tls://dovecot';
$config['default_port'] = '143';
$config['smtp_server'] = 'tls://postfix';
$config['smtp_port'] = 587;
$config['smtp_user'] = '%u';
$config['smtp_pass'] = '%p';
$config['support_url'] = '';
$config['product_name'] = 'Roundcube Webmail';
$config['des_key'] = 'yourrandomstring_changeme';
$config['log_dir'] = '/dev/null';
$config['temp_dir'] = '/tmp';
$config['plugins'] = array(
'archive',
'managesieve'
);
$config[&#39;spellcheck_engine&#39;] = &#39;aspell&#39;;
$config[&#39;mime_types&#39;] = &#39;/tmp/mime.types&#39;;
$config[&#39;imap_conn_options&#39;] = array(
&#39;ssl&#39; =&gt; array(&#39;verify_peer&#39; =&gt; false, &#39;verify_peer_name&#39; =&gt; false, &#39;allow_self_signed&#39; =&gt; true)
$config['spellcheck_engine'] = 'aspell';
$config['mime_types'] = '/tmp/mime.types';
$config['imap_conn_options'] = array(
'ssl' =&gt; array('verify_peer' =&gt; false, 'verify_peer_name' =&gt; false, 'allow_self_signed' =&gt; true)
);
$config[&#39;enable_installer&#39;] = true;
$config[&#39;smtp_conn_options&#39;] = array(
&#39;ssl&#39; =&gt; array(&#39;verify_peer&#39; =&gt; false, &#39;verify_peer_name&#39; =&gt; false, &#39;allow_self_signed&#39; =&gt; true)
$config['enable_installer'] = true;
$config['smtp_conn_options'] = array(
'ssl' =&gt; array('verify_peer' =&gt; false, 'verify_peer_name' =&gt; false, 'allow_self_signed' =&gt; true)
);
$config[&#39;db_prefix&#39;] = &#39;mailcow_rc1&#39;;
</code></pre></div></p>
$config['db_prefix'] = 'mailcow_rc1';</code></p>
<p>Richten Sie Ihren Browser auf <code>https://myserver/rc/installer</code> und folgen Sie den Anweisungen.
Initialisiere die Datenbank und verlasse das Installationsprogramm.</p>
<p>**Löschen Sie das Verzeichnis <code>data/web/rc/installer</code> nach einer erfolgreichen Installation!</p>
<h2 id="konfigurieren-sie-die-managesieve-filterung">Konfigurieren Sie die ManageSieve-Filterung<a class="headerlink" href="#konfigurieren-sie-die-managesieve-filterung" title="Permanent link">&para;</a></h2>
<p>Öffnen Sie <code>data/web/rc/plugins/managesieve/config.inc.php</code> und ändern Sie die folgenden Parameter (oder fügen Sie sie am Ende der Datei hinzu):
<div class="highlight"><pre><span></span><code>$config[&#39;managesieve_port&#39;] = 4190;
$config[&#39;managesieve_host&#39;] = &#39;tls://dovecot&#39;;
$config[&#39;managesieve_conn_options&#39;] = array(
ssl&#39; =&gt; array(&#39;verify_peer&#39; =&gt; false, &#39;verify_peer_name&#39; =&gt; false, &#39;allow_self_signed&#39; =&gt; true)
<code>$config['managesieve_port'] = 4190;
$config['managesieve_host'] = 'tls://dovecot';
$config['managesieve_conn_options'] = array(
ssl' =&gt; array('verify_peer' =&gt; false, 'verify_peer_name' =&gt; false, 'allow_self_signed' =&gt; true)
);
// Aktiviert separate Verwaltungsschnittstelle für Urlaubsantworten (außer Haus)
// 0 - kein separater Abschnitt (Standard),
// 1 - Abschnitt &quot;Urlaub&quot; hinzufügen,
// 2 - Abschnitt &quot;Urlaub&quot; hinzufügen, aber Abschnitt &quot;Filter&quot; ausblenden
$config[&#39;managesieve_vacation&#39;] = 1;
</code></pre></div></p>
// 1 - Abschnitt "Urlaub" hinzufügen,
// 2 - Abschnitt "Urlaub" hinzufügen, aber Abschnitt "Filter" ausblenden
$config['managesieve_vacation'] = 1;</code></p>
<h2 id="aktivieren-sie-die-funktion-passwort-andern-in-roundcube">Aktivieren Sie die Funktion "Passwort ändern" in Roundcube<a class="headerlink" href="#aktivieren-sie-die-funktion-passwort-andern-in-roundcube" title="Permanent link">&para;</a></h2>
<p>Öffnen Sie <code>data/web/rc/config/config.inc.php</code> und aktivieren Sie das Passwort-Plugin:</p>
<div class="highlight"><pre><span></span><code>[...]
$config[&#39;plugins&#39;] = array(
&#39;archive&#39;,
&#39;password&#39;,
<p><code>[...]
$config['plugins'] = array(
'archive',
'password',
);
[...]
</code></pre></div>
[...]</code></p>
<p>Öffnen Sie <code>data/web/rc/plugins/password/password.php</code>, suchen Sie nach <code>case 'ssha':</code> und fügen Sie oben hinzu:</p>
<div class="highlight"><pre><span></span><code> case &#39;ssha256&#39;:
<p><code>case 'ssha256':
$salt = rcube_utils::random_bytes(8);
$crypted = base64_encode( hash(&#39;sha256&#39;, $password . $salt, TRUE ) . $salt );
$prefix = &#39;{SSHA256}&#39;;
break;
</code></pre></div>
$crypted = base64_encode( hash('sha256', $password . $salt, TRUE ) . $salt );
$prefix = '{SSHA256}';
break;</code></p>
<p>Öffnen Sie <code>data/web/rc/plugins/password/config.inc.php</code> und ändern Sie die folgenden Parameter (oder fügen Sie sie am Ende der Datei hinzu):</p>
<div class="highlight"><pre><span></span><code>$config[&#39;password_driver&#39;] = &#39;sql&#39;;
$config[&#39;password_algorithm&#39;] = &#39;ssha256&#39;;
$config[&#39;password_algorithm_prefix&#39;] = &#39;{SSHA256}&#39;;
$config[&#39;password_query&#39;] = &quot;UPDATE mailbox SET password = %P WHERE username = %u&quot;;
</code></pre></div>
<p><code>$config['password_driver'] = 'sql';
$config['password_algorithm'] = 'ssha256';
$config['password_algorithm_prefix'] = '{SSHA256}';
$config['password_query'] = "UPDATE mailbox SET password = %P WHERE username = %u";</code></p>
<h2 id="carddav-adressbucher-in-roundcube-einbinden">CardDAV Adressbücher in Roundcube einbinden<a class="headerlink" href="#carddav-adressbucher-in-roundcube-einbinden" title="Permanent link">&para;</a></h2>
<p>Laden Sie die neueste Version von <a href="https://github.com/mstilkerich/rcmcarddav">RCMCardDAV</a> in das Roundcube Plugin Verzeichnis und entpacken Sie es (hier <code>rc/plugins</code>):
<div class="highlight"><pre><span></span><code>cd data/web/rc/plugins
<code>cd data/web/rc/plugins
wget -O - https://github.com/mstilkerich/rcmcarddav/releases/download/v4.3.0/carddav-v4.3.0.tar.gz | tar xfvz -
chown -R root: carddav/
</code></pre></div></p>
chown -R root: carddav/</code></p>
<p>Kopieren Sie die Datei <code>config.inc.php.dist</code> nach <code>config.inc.php</code> (hier in <code>rc/plugins/carddav</code>) und fügen Sie die folgende Voreinstellung an das Ende der Datei an - vergessen Sie nicht, <code>mx.example.org</code> durch Ihren eigenen Hostnamen zu ersetzen:
<div class="highlight"><pre><span></span><code>$prefs[&#39;SOGo&#39;] = array(
&#39;name&#39; =&gt; &#39;SOGo&#39;,
&#39;username&#39; =&gt; &#39;%u&#39;,
&#39;password&#39; =&gt; &#39;%p&#39;,
&#39;url&#39; =&gt; &#39;https://mx.example.org/SOGo/dav/%u/&#39;,
&#39;carddav_name_only&#39; =&gt; true,
&#39;use_categories&#39; =&gt; true,
&#39;active&#39; =&gt; true,
&#39;readonly&#39; =&gt; false,
&#39;refresh_time&#39; =&gt; &#39;02:00:00&#39;,
&#39;fixed&#39; =&gt; array( &#39;active&#39;, &#39;name&#39;, &#39;username&#39;, &#39;password&#39;, &#39;refresh_time&#39; ),
&#39;hide&#39; =&gt; false,
);
</code></pre></div>
<code>$prefs['SOGo'] = array(
'name' =&gt; 'SOGo',
'username' =&gt; '%u',
'password' =&gt; '%p',
'url' =&gt; 'https://mx.example.org/SOGo/dav/%u/',
'carddav_name_only' =&gt; true,
'use_categories' =&gt; true,
'active' =&gt; true,
'readonly' =&gt; false,
'refresh_time' =&gt; '02:00:00',
'fixed' =&gt; array( 'active', 'name', 'username', 'password', 'refresh_time' ),
'hide' =&gt; false,
);</code>
Bitte beachten Sie, dass dieses Preset nur das Standard-Adressbuch integriert (dasjenige, das den Namen "Persönliches Adressbuch" trägt und nicht gelöscht werden kann). Weitere Adressbücher werden derzeit nicht automatisch erkannt, können aber manuell in den Roundcube-Einstellungen hinzugefügt werden.</p>
<p>Aktivieren Sie das Plugin, indem Sie <code>carddav</code> zu <code>$config['plugins']</code> in <code>rc/config/config.inc.php</code> hinzufügen.</p>
<p>Wenn Sie die Standard-Adressbücher (die in der Roundcube-Datenbank gespeichert sind) entfernen möchten, so dass nur die CardDAV-Adressbücher zugänglich sind, fügen Sie <code>$config['address_book_type'] = '';</code> in die Konfigurationsdatei <code>data/web/rc/config/config.inc.php</code> ein.</p>
@ -2587,75 +2769,70 @@ Bitte beachten Sie, dass dieses Preset nur das Standard-Adressbuch integriert (d
<p>Optional können Sie Roundcube's Link zu der mailcow Apps Liste hinzufügen.
Um dies zu tun, öffnen oder erstellen Sie <code>data/web/inc/vars.local.inc.php</code> und fügen Sie den folgenden Code-Block hinzu:</p>
<p><em>HINWEIS: Vergessen Sie nicht, das <code>&lt;?php</code> Trennzeichen in der ersten Zeile einzufügen</em></p>
<div class="highlight"><pre><span></span><code>...
<p><code>...
$MAILCOW_APPS = array(
array(
&#39;name&#39; =&gt; &#39;SOGo&#39;,
&#39;link&#39; =&gt; &#39;/SOGo/&#39;
'name' =&gt; 'SOGo',
'link' =&gt; '/SOGo/'
),
array(
&#39;name&#39; =&gt; &#39;Roundcube&#39;,
&#39;link&#39; =&gt; &#39;/rc/&#39;
'name' =&gt; 'Roundcube',
'link' =&gt; '/rc/'
)
);
...
</code></pre></div>
...</code></p>
<h2 id="aktualisierung-von-roundcube">Aktualisierung von Roundcube<a class="headerlink" href="#aktualisierung-von-roundcube" title="Permanent link">&para;</a></h2>
<p>Ein Upgrade von Roundcube ist recht einfach: Gehen Sie auf die <a href="https://github.com/roundcube/roundcubemail/releases">Github releases</a> Seite für Roundcube und holen Sie sich den Link für die "complete.tar.gz" Datei für die gewünschte Version. Dann folgen Sie den untenstehenden Befehlen und ändern Sie die URL und den Namen des Roundcube-Ordners, falls nötig. </p>
<div class="highlight"><pre><span></span><code># Starten Sie eine Bash-Sitzung des mailcow PHP-Containers
docker exec -it mailcowdockerized_php-fpm-mailcow_1 bash
# Installieren Sie die erforderliche Upgrade-Abhängigkeit, dann aktualisieren Sie Roundcube auf die gewünschte Version
apk add rsync
<p>```</p>
<h1 id="starten-sie-eine-bash-sitzung-des-mailcow-php-containers">Starten Sie eine Bash-Sitzung des mailcow PHP-Containers<a class="headerlink" href="#starten-sie-eine-bash-sitzung-des-mailcow-php-containers" title="Permanent link">&para;</a></h1>
<p>docker exec -it mailcowdockerized_php-fpm-mailcow_1 bash</p>
<h1 id="installieren-sie-die-erforderliche-upgrade-abhangigkeit-dann-aktualisieren-sie-roundcube-auf-die-gewunschte-version">Installieren Sie die erforderliche Upgrade-Abhängigkeit, dann aktualisieren Sie Roundcube auf die gewünschte Version<a class="headerlink" href="#installieren-sie-die-erforderliche-upgrade-abhangigkeit-dann-aktualisieren-sie-roundcube-auf-die-gewunschte-version" title="Permanent link">&para;</a></h1>
<p>apk add rsync
cd /tmp
wget -O - https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz | tar xfvz -
wget -O - <a href="https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz">https://github.com/roundcube/roundcubemail/releases/download/1.5.2/roundcubemail-1.5.2-complete.tar.gz</a> | tar xfvz -
cd roundcubemail-1.5.2
bin/installto.sh /web/rc
# Geben Sie &#39;Y&#39; ein und drücken Sie die Eingabetaste, um Ihre Installation von Roundcube zu aktualisieren.
# Entfernen Sie übrig gebliebene Dateien
cd /tmp
rm -rf roundcube*
# Fix Allow remote resources (https://github.com/roundcube/roundcubemail/issues/8170) sollte in 1.6 nicht benötigt werden
sed -i &quot;s/\$prefix = &#39;\.\/&#39;;/\$prefix = preg_replace\(&#39;\/\[\?\&amp;]\.\*\$\/&#39;, &#39;&#39;, \$_SERVER\[&#39;REQUEST_URI&#39;] \?\? &#39;&#39;\) \?: &#39;\.\/&#39;;/g&quot; /web/rc/program/include/rcmail.php
</code></pre></div>
bin/installto.sh /web/rc</p>
<h1 id="geben-sie-y-ein-und-drucken-sie-die-eingabetaste-um-ihre-installation-von-roundcube-zu-aktualisieren">Geben Sie 'Y' ein und drücken Sie die Eingabetaste, um Ihre Installation von Roundcube zu aktualisieren.<a class="headerlink" href="#geben-sie-y-ein-und-drucken-sie-die-eingabetaste-um-ihre-installation-von-roundcube-zu-aktualisieren" title="Permanent link">&para;</a></h1>
<h1 id="entfernen-sie-ubrig-gebliebene-dateien">Entfernen Sie übrig gebliebene Dateien<a class="headerlink" href="#entfernen-sie-ubrig-gebliebene-dateien" title="Permanent link">&para;</a></h1>
<p>cd /tmp
rm -rf roundcube*</p>
<h1 id="fix-allow-remote-resources-httpsgithubcomroundcuberoundcubemailissues8170-sollte-in-16-nicht-benotigt-werden">Fix Allow remote resources (<a href="https://github.com/roundcube/roundcubemail/issues/8170">https://github.com/roundcube/roundcubemail/issues/8170</a>) sollte in 1.6 nicht benötigt werden<a class="headerlink" href="#fix-allow-remote-resources-httpsgithubcomroundcuberoundcubemailissues8170-sollte-in-16-nicht-benotigt-werden" title="Permanent link">&para;</a></h1>
<p>sed -i "s/\$prefix = '.\/';/\$prefix = preg_replace('\/[\?\&amp;].*\$\/', '', \$_SERVER['REQUEST_URI'] \?\? '') \?: '.\/';/g" /web/rc/program/include/rcmail.php
```</p>
<h2 id="administratoren-ohne-passwort-in-roundcube-einloggen-lassen">Administratoren ohne Passwort in Roundcube einloggen lassen<a class="headerlink" href="#administratoren-ohne-passwort-in-roundcube-einloggen-lassen" title="Permanent link">&para;</a></h2>
<p>Installieren Sie zunächst das Plugin [dovecot_impersonate] (<a href="https://github.com/corbosman/dovecot_impersonate/">https://github.com/corbosman/dovecot_impersonate/</a>) und fügen Sie Roundcube als App hinzu (siehe oben).</p>
<p>Editieren Sie <code>mailcow.conf</code> und fügen Sie folgendes hinzu:</p>
<div class="highlight"><pre><span></span><code># Erlaube Admins, sich in Roundcube als Email-Benutzer einzuloggen (ohne Passwort)
# Roundcube mit Plugin dovecot_impersonate muss zuerst installiert werden
ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE=y
</code></pre></div>
<p>```</p>
<h1 id="erlaube-admins-sich-in-roundcube-als-email-benutzer-einzuloggen-ohne-passwort">Erlaube Admins, sich in Roundcube als Email-Benutzer einzuloggen (ohne Passwort)<a class="headerlink" href="#erlaube-admins-sich-in-roundcube-als-email-benutzer-einzuloggen-ohne-passwort" title="Permanent link">&para;</a></h1>
<h1 id="roundcube-mit-plugin-dovecot_impersonate-muss-zuerst-installiert-werden">Roundcube mit Plugin dovecot_impersonate muss zuerst installiert werden<a class="headerlink" href="#roundcube-mit-plugin-dovecot_impersonate-muss-zuerst-installiert-werden" title="Permanent link">&para;</a></h1>
<p>ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE=y
```</p>
<p>Editieren Sie <code>docker-compose.override.yml</code> und verfassen/erweitern Sie den Abschnitt für <code>php-fpm-mailcow</code>:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
<p><code>yml
version: '2.1'
services:
php-fpm-mailcow:
environment:
- ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE=${ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE:-n}
</code></pre></div>
- ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE=${ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE:-n}</code></p>
<p>Bearbeiten Sie <code>data/web/js/site/mailbox.js</code> und den folgenden Code nach <a href="https://github.com/mailcow/mailcow-dockerized/blob/2f9da5ae93d93bf62a8c2b7a5a6ae50a41170c48/data/web/js/site/mailbox.js#L485-L487"><code>if (ALLOW_ADMIN_EMAIL_LOGIN) { ... }</code></a></p>
<div class="highlight"><pre><span></span><code><span class="k">if</span> <span class="p">(</span><span class="nx">ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">action</span> <span class="o">+=</span> <span class="s1">&#39;&lt;a href=&quot;/rc-auth.php?login=&#39;</span> <span class="o">+</span> <span class="nb">encodeURIComponent</span><span class="p">(</span><span class="nx">item</span><span class="p">.</span><span class="nx">username</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;&quot; class=&quot;login_as btn btn-xs &#39;</span> <span class="o">+</span> <span class="nx">btnSize</span> <span class="o">+</span> <span class="s1">&#39; btn-primary&quot; target=&quot;_blank&quot;&gt;&lt;i class=&quot;bi bi-envelope-fill&quot;&gt;&lt;/i&gt; Roundcube&lt;/a&gt;&#39;</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div>
<p><code>js
if (ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE) {
item.action += '&lt;a href="/rc-auth.php?login=' + encodeURIComponent(item.username) + '" class="login_as btn btn-xs ' + btnSize + ' btn-primary" target="_blank"&gt;&lt;i class="bi bi-envelope-fill"&gt;&lt;/i&gt; Roundcube&lt;/a&gt;';
}</code></p>
<p>Bearbeiten Sie <code>data/web/mailbox.php</code> und fügen Sie diese Zeile zum Array <a href="https://github.com/mailcow/mailcow-dockerized/blob/2f9da5ae93d93bf62a8c2b7a5a6ae50a41170c48/data/web/mailbox.php#L33-L43"><code>$template_data</code></a> hinzu:</p>
<div class="highlight"><pre><span></span><code><span class="x"> &#39;allow_admin_email_login_roundcube&#39; =&gt; (preg_match(&quot;/^(yes|y)+$/i&quot;, $_ENV[&quot;ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE&quot;])) ? &#39;true&#39; : &#39;false&#39;,</span>
</code></pre></div>
<p><code>php
'allow_admin_email_login_roundcube' =&gt; (preg_match("/^(yes|y)+$/i", $_ENV["ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE"])) ? 'true' : 'false',</code></p>
<p>Bearbeiten Sie <code>data/web/templates/mailbox.twig</code> und fügen Sie diesen Code am Ende des [javascript-Abschnitts] ein (<a href="https://github.com/mailcow/mailcow-dockerized/blob/2f9da5ae93d93bf62a8c2b7a5a6ae50a41170c48/data/web/templates/mailbox.twig#L49-L57">https://github.com/mailcow/mailcow-dockerized/blob/2f9da5ae93d93bf62a8c2b7a5a6ae50a41170c48/data/web/templates/mailbox.twig#L49-L57</a>):</p>
<div class="highlight"><pre><span></span><code> <span class="kd">var</span> <span class="nx">ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE</span> <span class="o">=</span> <span class="p">{{</span> <span class="nx">allow_admin_email_login_roundcube</span> <span class="p">}};</span>
</code></pre></div>
<p><code>js
var ALLOW_ADMIN_EMAIL_LOGIN_ROUNDCUBE = {{ allow_admin_email_login_roundcube }};</code></p>
<p>Kopieren Sie den Inhalt der folgenden Dateien aus diesem <a href="https://gitlab.com/-/snippets/2038244">Snippet</a>:</p>
<ul>
<li><code>data/web/inc/lib/RoundcubeAutoLogin.php</code></li>
<li><code>data/web/rc-auth.php</code></li>
</ul>
<p>Starten Sie schließlich mailcow neu</p>
<div class="highlight"><pre><span></span><code>docker-compose down
docker-compose up -d
</code></pre></div>
<p><code>docker-compose down
docker-compose up -d</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2427,11 +2427,9 @@ Dazu wird ein zusätzlicher Link zu SOGo in der Mailbox-Liste (mailcow UI) angez
<p>Auch mehrere gleichzeitige Admin-Logins auf verschiedene Postfächer sind mit dieser Funktion möglich.</p>
<h2 id="aktivieren-der-funktion">Aktivieren der Funktion<a class="headerlink" href="#aktivieren-der-funktion" title="Permanent link">&para;</a></h2>
<p>Die Funktion ist standardmäßig deaktiviert. Es kann in der <code>mailcow.conf</code> durch Setzen aktiviert werden:
<div class="highlight"><pre><span></span><code>ALLOW_ADMIN_EMAIL_LOGIN=y
</code></pre></div>
<code>ALLOW_ADMIN_EMAIL_LOGIN=y</code>
und die betroffenen Container neu erstellen mit
<div class="highlight"><pre><span></span><code>docker-compose up -d
</code></pre></div></p>
<code>docker-compose up -d</code></p>
<h2 id="nachteile-bei-aktivierung">Nachteile bei Aktivierung<a class="headerlink" href="#nachteile-bei-aktivierung" title="Permanent link">&para;</a></h2>
<ul>
<li>Jeder SOGo-Seiten-Load und jede Active-Sync-Anfrage verursacht eine zusätzliche Ausführung eines internen PHP-Skripts.

Datei anzeigen

@ -2476,17 +2476,14 @@
<h2 id="anhangen-eines-containers-an-ihre-shell">Anhängen eines Containers an Ihre Shell<a class="headerlink" href="#anhangen-eines-containers-an-ihre-shell" title="Permanent link">&para;</a></h2>
<p>Um einen Container an Ihre Shell anzuhängen, können Sie einfach folgendes ausführen</p>
<div class="highlight"><pre><span></span><code>docker-compose exec $Dienst_Name /bin/bash
</code></pre></div>
<p><code>docker-compose exec $Dienst_Name /bin/bash</code></p>
<h3 id="verbindung-zu-diensten-herstellen">Verbindung zu Diensten herstellen<a class="headerlink" href="#verbindung-zu-diensten-herstellen" title="Permanent link">&para;</a></h3>
<p>Wenn Sie sich direkt mit einem Dienst / einer Anwendung verbinden wollen, ist es immer eine gute Idee, <code>source mailcow.conf</code> zu benutzen, um alle relevanten Variablen in Ihre Umgebung zu bekommen.</p>
<h4 id="mysql">MySQL<a class="headerlink" href="#mysql" title="Permanent link">&para;</a></h4>
<div class="highlight"><pre><span></span><code>Quelle mailcow.conf
docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}
</code></pre></div>
<p><code>Quelle mailcow.conf
docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}</code></p>
<h4 id="redis">Redis<a class="headerlink" href="#redis" title="Permanent link">&para;</a></h4>
<div class="highlight"><pre><span></span><code>docker-compose exec redis-mailcow redis-cli
</code></pre></div>
<p><code>docker-compose exec redis-mailcow redis-cli</code></p>
<h2 id="dienstbeschreibungen">Dienstbeschreibungen<a class="headerlink" href="#dienstbeschreibungen" title="Permanent link">&para;</a></h2>
<p>Hier ist eine kurze Übersicht, welcher Container / Dienst was macht:</p>
<table>

Datei anzeigen

@ -801,52 +801,65 @@
</li>
<li class="md-nav__item">
<a href="#telnet-7412513327-465" class="md-nav__link">
telnet 74.125.133.27 465
</a>
<nav class="md-nav" aria-label="telnet 74.125.133.27 465">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#meine-mails-werden-als-spam-identifiziert" class="md-nav__link">
Meine Mails werden als Spam identifiziert
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#docker-compose-wirft-seltsame-fehler-aus" class="md-nav__link">
docker-compose wirft seltsame Fehler aus.
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#container-xy-ist-ungesund" class="md-nav__link">
Container XY ist ungesund
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#adresse-bereits-in-gebrauch" class="md-nav__link">
Adresse bereits in Gebrauch
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#xyz-kann-keine-verbindung-zu" class="md-nav__link">
XYZ kann keine Verbindung zu ...
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#inotify-instanz-limit-uberschritten-fur-benutzer-5000-uid-vmail-siehe-453" class="md-nav__link">
Inotify-Instanz-Limit überschritten für Benutzer 5000 (UID vmail) (siehe #453).
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#dovecot-startet-standig-neu-siehe-2672" class="md-nav__link">
Dovecot startet ständig neu (siehe #2672).
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2438,52 +2451,65 @@
</li>
<li class="md-nav__item">
<a href="#telnet-7412513327-465" class="md-nav__link">
telnet 74.125.133.27 465
</a>
<nav class="md-nav" aria-label="telnet 74.125.133.27 465">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#meine-mails-werden-als-spam-identifiziert" class="md-nav__link">
Meine Mails werden als Spam identifiziert
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#docker-compose-wirft-seltsame-fehler-aus" class="md-nav__link">
docker-compose wirft seltsame Fehler aus.
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#container-xy-ist-ungesund" class="md-nav__link">
Container XY ist ungesund
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#adresse-bereits-in-gebrauch" class="md-nav__link">
Adresse bereits in Gebrauch
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#xyz-kann-keine-verbindung-zu" class="md-nav__link">
XYZ kann keine Verbindung zu ...
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#inotify-instanz-limit-uberschritten-fur-benutzer-5000-uid-vmail-siehe-453" class="md-nav__link">
Inotify-Instanz-Limit überschritten für Benutzer 5000 (UID vmail) (siehe #453).
</a>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#dovecot-startet-standig-neu-siehe-2672" class="md-nav__link">
Dovecot startet ständig neu (siehe #2672).
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2504,8 +2530,6 @@
<h1>Häufig auftretende Probleme</h1>
<p>Hier sind häufige Probleme und mögliche Lösungen:</p>
<h2 id="mail-kommt-in-einer-schleife-zu-sich-selbst-zuruck">Mail kommt in einer Schleife zu sich selbst zurück.<a class="headerlink" href="#mail-kommt-in-einer-schleife-zu-sich-selbst-zuruck" title="Permanent link">&para;</a></h2>
<p>Bitte überprüfen Sie in Ihrer mailcow UI, ob Sie die Domain als <strong>Backup MX</strong> eingestellt haben:
@ -2516,11 +2540,12 @@
<li>Prüfen Sie, ob Ihre IP-Adresse auf einer schwarzen Liste steht. Sie können <a href="http://www.dnsbl.info/">dnsbl.info</a> oder einen ähnlichen Dienst verwenden, um Ihre IP-Adresse zu überprüfen.</li>
<li>Es gibt einige ISP-Router, die Mail-Ports für nicht auf der Blacklist stehende Domains blockieren. Bitte überprüfen Sie, ob Sie Ihren Server über die Ports <code>465</code> oder <code>587</code> erreichen können:</li>
</ul>
<div class="highlight"><pre><span></span><code># telnet 74.125.133.27 465
Versucht 74.125.133.27...
<p>```</p>
<h1 id="telnet-7412513327-465">telnet 74.125.133.27 465<a class="headerlink" href="#telnet-7412513327-465" title="Permanent link">&para;</a></h1>
<p>Versucht 74.125.133.27...
Verbunden mit 74.125.133.27.
Escape-Zeichen ist &#39;^]&#39;.
</code></pre></div>
Escape-Zeichen ist '^]'.
```</p>
<h2 id="meine-mails-werden-als-spam-identifiziert">Meine Mails werden als Spam identifiziert<a class="headerlink" href="#meine-mails-werden-als-spam-identifiziert" title="Permanent link">&para;</a></h2>
<p>Bitte lesen Sie unsere <a href="../../prerequisite/prerequisite-dns/">DNS-Konfiguration</a> Anleitung.</p>
<h2 id="docker-compose-wirft-seltsame-fehler-aus">docker-compose wirft seltsame Fehler aus.<a class="headerlink" href="#docker-compose-wirft-seltsame-fehler-aus" title="Permanent link">&para;</a></h2>
@ -2537,8 +2562,7 @@ Escape-Zeichen ist &#39;^]&#39;.
<p>Es könnte auch eine falsch verknüpfte Datei sein (z. B. ein SSL-Zertifikat), die den Start eines wichtigen Containers (nginx) verhindert. Prüfen Sie daher immer Ihre Protokolle, um herauszufinden, woher das Problem kommt.</p>
<h2 id="adresse-bereits-in-gebrauch">Adresse bereits in Gebrauch<a class="headerlink" href="#adresse-bereits-in-gebrauch" title="Permanent link">&para;</a></h2>
<p>Wenn Sie eine Fehlermeldung erhalten wie:</p>
<div class="highlight"><pre><span></span><code>ERROR: for postfix-mailcow Cannot start service postfix-mailcow: driver failed programming external connectivity on endpoint mailcowdockerized_postfix-mailcow_1: Error starting userland proxy: listen tcp 0.0.0:25: bind: address already in use
</code></pre></div>
<p><code>ERROR: for postfix-mailcow Cannot start service postfix-mailcow: driver failed programming external connectivity on endpoint mailcowdockerized_postfix-mailcow_1: Error starting userland proxy: listen tcp 0.0.0:25: bind: address already in use</code></p>
<p>während Sie versuchen, mailcow: dockerized zu starten / zu installieren, stellen Sie sicher, dass Sie unseren Abschnitt über <a href="../prerequisite/prerequisite-system.de.md/#firewall-ports">prerequisites</a> befolgt haben.</p>
<h2 id="xyz-kann-keine-verbindung-zu">XYZ kann keine Verbindung zu ...<a class="headerlink" href="#xyz-kann-keine-verbindung-zu" title="Permanent link">&para;</a></h2>
<p>Bitte überprüfen Sie Ihre lokale Firewall!
@ -2546,19 +2570,17 @@ Docker und iptables-basierte Firewalls erstellen manchmal widersprüchliche Rege
<p>Wenn Sie Verbindungsprobleme von zu Hause aus haben, überprüfen Sie bitte auch die Firewall Ihres ISP-Routers, da einige von ihnen den E-Mail-Verkehr über die Ports <em>SMTP</em> (587) oder <em>SMTPS</em> (465) blockieren. Es könnte auch sein, dass Ihr ISP die Ports für <em>SUBMISSION</em> (25) blockiert.</p>
<p>Während Linux-Benutzer aus einer Vielzahl von Tools<sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup> wählen können, um zu überprüfen, ob ein Port offen ist, steht Windows-Benutzern standardmäßig nur der PowerShell-Befehl <code>Test-NetConnection -ComputerName host -Port port</code> zur Verfügung.</p>
<p>Um Telnet auf einem Windows nach Vista zu aktivieren, lesen Sie bitte diese <a href="https://social.technet.microsoft.com/wiki/contents/articles/910.windows-7-enabling-telnet-client.aspx">Anleitung</a> oder geben Sie den folgenden Befehl in einem Terminal <strong>mit Administratorrechten</strong> ein:</p>
<div class="highlight"><pre><span></span><code>dism /online /Enable-Feature /FeatureName:TelnetClient
</code></pre></div>
<p><code>dism /online /Enable-Feature /FeatureName:TelnetClient</code></p>
<h2 id="inotify-instanz-limit-uberschritten-fur-benutzer-5000-uid-vmail-siehe-453">Inotify-Instanz-Limit überschritten für Benutzer 5000 (UID vmail) (<a href="https://github.com/mailcow/mailcow-dockerized/issues/453#issuecomment-314711232">siehe #453</a>).<a class="headerlink" href="#inotify-instanz-limit-uberschritten-fur-benutzer-5000-uid-vmail-siehe-453" title="Permanent link">&para;</a></h2>
<p>Docker-Container verwenden die inotify-Limits von Docker-Hosts. Wenn Sie sie auf Ihrem Docker-Host setzen, werden sie an den Container weitergegeben.</p>
<h2 id="dovecot-startet-standig-neu-siehe-2672">Dovecot startet ständig neu (siehe <a href="https://github.com/mailcow/mailcow-dockerized/issues/2672">#2672</a>).<a class="headerlink" href="#dovecot-startet-standig-neu-siehe-2672" title="Permanent link">&para;</a></h2>
<p>Stellen Sie sicher, dass Sie mindestens die folgenden Dateien in <code>data/assets/ssl</code> haben:</p>
<div class="highlight"><pre><span></span><code>cert.pem
<p><code>cert.pem
dhparams.pem
key.pem
</code></pre></div>
key.pem</code></p>
<p>Wenn <code>dhparams.pem</code> fehlt, können Sie es mit Bash</p>
<div class="highlight"><pre><span></span><code>openssl dhparam -out data/assets/ssl/dhparams.pem <span class="m">4096</span>
</code></pre></div>
<p><code>bash
openssl dhparam -out data/assets/ssl/dhparams.pem 4096</code></p>
<div class="footnote">
<hr />
<ol>

Datei anzeigen

@ -833,6 +833,41 @@
MariaDB: Aria-Wiederherstellung nach Absturz
</a>
</li>
<li class="md-nav__item">
<a href="#stoppe-den-stack-fuhre-nicht-down-aus" class="md-nav__link">
Stoppe den Stack, führe nicht "down" aus
</a>
</li>
<li class="md-nav__item">
<a href="#fuhren-sie-eine-bash-in-dem-gestoppten-container-als-benutzer-mysql-aus" class="md-nav__link">
Führen Sie eine Bash in dem gestoppten Container als Benutzer mysql aus
</a>
</li>
<li class="md-nav__item">
<a href="#cd-in-das-sql-datenverzeichnis" class="md-nav__link">
cd in das SQL-Datenverzeichnis
</a>
</li>
<li class="md-nav__item">
<a href="#aria_chk-ausfuhren" class="md-nav__link">
aria_chk ausführen
</a>
</li>
<li class="md-nav__item">
<a href="#loschen-der-aria-logdateien" class="md-nav__link">
Löschen der aria-Logdateien
</a>
</li>
</ul>
@ -2372,6 +2407,41 @@
MariaDB: Aria-Wiederherstellung nach Absturz
</a>
</li>
<li class="md-nav__item">
<a href="#stoppe-den-stack-fuhre-nicht-down-aus" class="md-nav__link">
Stoppe den Stack, führe nicht "down" aus
</a>
</li>
<li class="md-nav__item">
<a href="#fuhren-sie-eine-bash-in-dem-gestoppten-container-als-benutzer-mysql-aus" class="md-nav__link">
Führen Sie eine Bash in dem gestoppten Container als Benutzer mysql aus
</a>
</li>
<li class="md-nav__item">
<a href="#cd-in-das-sql-datenverzeichnis" class="md-nav__link">
cd in das SQL-Datenverzeichnis
</a>
</li>
<li class="md-nav__item">
<a href="#aria_chk-ausfuhren" class="md-nav__link">
aria_chk ausführen
</a>
</li>
<li class="md-nav__item">
<a href="#loschen-der-aria-logdateien" class="md-nav__link">
Löschen der aria-Logdateien
</a>
</li>
</ul>
@ -2392,23 +2462,22 @@
<h1>Abgestürzte Aria-Speicher-Engine wiederherstellen</h1>
<h2 id="mariadb-aria-wiederherstellung-nach-absturz">MariaDB: Aria-Wiederherstellung nach Absturz<a class="headerlink" href="#mariadb-aria-wiederherstellung-nach-absturz" title="Permanent link">&para;</a></h2>
<p>Wenn Ihr Server abgestürzt ist und MariaDB eine Fehlermeldung ähnlich <code>[ERROR] mysqld: Aria recovery failed. Please run aria_chk -r on all Aria tables (*.MAI) and delete all aria_log.######## files</code>, können Sie Folgendes versuchen, um die Datenbank in einen gesunden Zustand zu bringen:</p>
<p>Starten Sie den Stack und warten Sie, bis mysql-mailcow beginnt, einen Neustart zu melden. Überprüfen Sie dies, indem Sie <code>docker-compose ps</code> ausführen.</p>
<p>Führen Sie nun die folgenden Befehle aus:</p>
<div class="highlight"><pre><span></span><code># Stoppe den Stack, führe nicht &quot;down&quot; aus
docker-compose stop
# Führen Sie eine Bash in dem gestoppten Container als Benutzer mysql aus
docker-compose run --rm --entrypoint &#39;/bin/sh -c &quot;gosu mysql bash&quot;&#39; mysql-mailcow
# cd in das SQL-Datenverzeichnis
cd /var/lib/mysql
# aria_chk ausführen
aria_chk --check --force */*.MAI
# Löschen der aria-Logdateien
rm aria_log.*
</code></pre></div>
<p>```</p>
<h1 id="stoppe-den-stack-fuhre-nicht-down-aus">Stoppe den Stack, führe nicht "down" aus<a class="headerlink" href="#stoppe-den-stack-fuhre-nicht-down-aus" title="Permanent link">&para;</a></h1>
<p>docker-compose stop</p>
<h1 id="fuhren-sie-eine-bash-in-dem-gestoppten-container-als-benutzer-mysql-aus">Führen Sie eine Bash in dem gestoppten Container als Benutzer mysql aus<a class="headerlink" href="#fuhren-sie-eine-bash-in-dem-gestoppten-container-als-benutzer-mysql-aus" title="Permanent link">&para;</a></h1>
<p>docker-compose run --rm --entrypoint '/bin/sh -c "gosu mysql bash"' mysql-mailcow</p>
<h1 id="cd-in-das-sql-datenverzeichnis">cd in das SQL-Datenverzeichnis<a class="headerlink" href="#cd-in-das-sql-datenverzeichnis" title="Permanent link">&para;</a></h1>
<p>cd /var/lib/mysql</p>
<h1 id="aria_chk-ausfuhren">aria_chk ausführen<a class="headerlink" href="#aria_chk-ausfuhren" title="Permanent link">&para;</a></h1>
<p>aria_chk --check --force <em>/</em>.MAI</p>
<h1 id="loschen-der-aria-logdateien">Löschen der aria-Logdateien<a class="headerlink" href="#loschen-der-aria-logdateien" title="Permanent link">&para;</a></h1>
<p>rm aria_log.*
```</p>
<p>Führen Sie nun <code>docker-compose down</code> gefolgt von <code>docker-compose up -d</code> aus.</p>
<hr>

Datei anzeigen

@ -2396,13 +2396,11 @@
<h2 id="fuhren-sie-ein-manuelles-mysql_upgrade-durch">Führen Sie ein manuelles mysql_upgrade durch.<a class="headerlink" href="#fuhren-sie-ein-manuelles-mysql_upgrade-durch" title="Permanent link">&para;</a></h2>
<p>Dieser Schritt ist normalerweise nicht notwendig. </p>
<div class="highlight"><pre><span></span><code>docker-compose stop mysql-mailcow watchdog-mailcow
docker-compose run --rm --entrypoint &#39;/bin/sh -c &quot;gosu mysql mysqld --skip-grant-tables &amp; sleep 10 &amp;&amp; bash &amp;&amp; exit 0&quot;&#39; mysql-mailcow
</code></pre></div>
<p><code>docker-compose stop mysql-mailcow watchdog-mailcow
docker-compose run --rm --entrypoint '/bin/sh -c "gosu mysql mysqld --skip-grant-tables &amp; sleep 10 &amp;&amp; bash &amp;&amp; exit 0"' mysql-mailcow</code></p>
<p>Sobald die SQL-Shell gestartet wurde, führen Sie <code>mysql_upgrade</code> aus und verlassen den Container:</p>
<div class="highlight"><pre><span></span><code>mysql_upgrade
exit
</code></pre></div>
<p><code>mysql_upgrade
exit</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -878,6 +878,26 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#source-mailcowconf" class="md-nav__link">
source mailcow.conf
</a>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-mysql-mailcow-mysql-udbuser-pdbpass-dbname" class="md-nav__link">
docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}
</a>
<nav class="md-nav" aria-label="docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#2-einen-oder-mehrere-benutzer-zurucksetzen" class="md-nav__link">
2. Einen oder mehrere Benutzer zurücksetzen
@ -905,12 +925,7 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#zwei-faktor-authentifizierung-entfernen" class="md-nav__link">
Zwei-Faktor-Authentifizierung entfernen
</a>
@ -935,6 +950,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@ -2463,6 +2483,26 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#source-mailcowconf" class="md-nav__link">
source mailcow.conf
</a>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-mysql-mailcow-mysql-udbuser-pdbpass-dbname" class="md-nav__link">
docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}
</a>
<nav class="md-nav" aria-label="docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#2-einen-oder-mehrere-benutzer-zurucksetzen" class="md-nav__link">
2. Einen oder mehrere Benutzer zurücksetzen
@ -2490,12 +2530,7 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#zwei-faktor-authentifizierung-entfernen" class="md-nav__link">
Zwei-Faktor-Authentifizierung entfernen
</a>
@ -2520,6 +2555,11 @@
</ul>
</nav>
</li>
</ul>
</nav>
</li>
</ul>
@ -2540,22 +2580,19 @@
<h1>Passwörter zurücksetzen (inkl. SQL)</h1>
<h2 id="mailcow-admin-konto">mailcow Admin-Konto<a class="headerlink" href="#mailcow-admin-konto" title="Permanent link">&para;</a></h2>
<p>Setzt den mailcow Admin Account auf ein zufälliges Passwort zurück. Ältere mailcow: dockerisierte Installationen können das <code>mailcow-reset-admin.sh</code> Skript in ihrem mailcow Stammverzeichnis (mailcow_path) finden.</p>
<div class="highlight"><pre><span></span><code>cd mailcow_pfad
./helper-scripts/mailcow-reset-admin.sh
</code></pre></div>
<p><code>cd mailcow_pfad
./helper-scripts/mailcow-reset-admin.sh</code></p>
<h2 id="mysql-passworter-zurucksetzen">MySQL-Passwörter zurücksetzen<a class="headerlink" href="#mysql-passworter-zurucksetzen" title="Permanent link">&para;</a></h2>
<p>Stoppen Sie den Stack, indem Sie <code>docker-compose stop</code> ausführen.</p>
<p>Wenn die Container heruntergefahren sind, führen Sie diesen Befehl aus:</p>
<div class="highlight"><pre><span></span><code>docker-compose run --rm --entrypoint &#39;/bin/sh -c &quot;gosu mysql mysqld --skip-grant-tables &amp; sleep 10 &amp;&amp; mysql -hlocalhost -uroot &amp;&amp; exit 0&quot;&#39; mysql-mailcow
</code></pre></div>
<p><code>docker-compose run --rm --entrypoint '/bin/sh -c "gosu mysql mysqld --skip-grant-tables &amp; sleep 10 &amp;&amp; mysql -hlocalhost -uroot &amp;&amp; exit 0"' mysql-mailcow</code></p>
<h3 id="1-datenbank-name-finden">1. Datenbank-Name finden<a class="headerlink" href="#1-datenbank-name-finden" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code># source mailcow.conf
# docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}
MariaDB [(none)]&gt; show databases;
<p>```</p>
<h1 id="source-mailcowconf">source mailcow.conf<a class="headerlink" href="#source-mailcowconf" title="Permanent link">&para;</a></h1>
<h1 id="docker-compose-exec-mysql-mailcow-mysql-udbuser-pdbpass-dbname">docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME}<a class="headerlink" href="#docker-compose-exec-mysql-mailcow-mysql-udbuser-pdbpass-dbname" title="Permanent link">&para;</a></h1>
<p>MariaDB [(none)]&gt; show databases;
+--------------------+
| Database |
+--------------------+
@ -2565,49 +2602,47 @@ MariaDB [(none)]&gt; show databases;
| performance_schema |
+--------------------+
4 rows in set (0.00 sec)
</code></pre></div>
```</p>
<h3 id="2-einen-oder-mehrere-benutzer-zurucksetzen">2. Einen oder mehrere Benutzer zurücksetzen<a class="headerlink" href="#2-einen-oder-mehrere-benutzer-zurucksetzen" title="Permanent link">&para;</a></h3>
<h4 id="21-maria-db-104-altere-mailcow-installationen">2.1 Maria DB &lt; 10.4 (ältere mailcow-Installationen)<a class="headerlink" href="#21-maria-db-104-altere-mailcow-installationen" title="Permanent link">&para;</a></h4>
<p>Sowohl "password" als auch "authentication_string" existieren. Derzeit wird "password" verwendet, aber besser ist es, beide zu setzen.</p>
<div class="highlight"><pre><span></span><code>MariaDB [(none)]&gt; SELECT user FROM mysql.user;
<p>```
MariaDB [(none)]&gt; SELECT user FROM mysql.user;
+--------------+
| user |
+--------------+
| mailcow | &lt;=====
| root |
+--------------+
2 rows in set (0.00 sec)
2 rows in set (0.00 sec)</p>
<p>MariaDB [(none)]&gt; FLUSH PRIVILEGES;
MariaDB [(none)]&gt; UPDATE mysql.user SET authentication_string = PASSWORD('gotr00t'), password = PASSWORD('gotr00t') WHERE User = 'root';
MariaDB [(none)]&gt; UPDATE mysql.user SET authentication_string = PASSWORD('mookuh'), password = PASSWORD('mookuh') WHERE User = 'mailcow' AND Host = '%';
MariaDB [(none)]&gt; FLUSH PRIVILEGES;
MariaDB [(none)]&gt; UPDATE mysql.user SET authentication_string = PASSWORD(&#39;gotr00t&#39;), password = PASSWORD(&#39;gotr00t&#39;) WHERE User = &#39;root&#39;;
MariaDB [(none)]&gt; UPDATE mysql.user SET authentication_string = PASSWORD(&#39;mookuh&#39;), password = PASSWORD(&#39;mookuh&#39;) WHERE User = &#39;mailcow&#39; AND Host = &#39;%&#39;;
MariaDB [(none)]&gt; FLUSH PRIVILEGES;
</code></pre></div>
```</p>
<h4 id="22-maria-db-104-aktuelle-mailcows">2.2 Maria DB &gt;= 10.4 (aktuelle mailcows)<a class="headerlink" href="#22-maria-db-104-aktuelle-mailcows" title="Permanent link">&para;</a></h4>
<div class="highlight"><pre><span></span><code>MariaDB [(none)]&gt; SELECT user FROM mysql.user;
<p>```
MariaDB [(none)]&gt; SELECT user FROM mysql.user;
+--------------+
| user |
+--------------+
| mailcow | &lt;=====
| root |
+--------------+
2 rows in set (0.00 sec)
2 rows in set (0.00 sec)</p>
<p>MariaDB [(none)]&gt; FLUSH PRIVILEGES;
MariaDB [(none)]&gt; ALTER USER 'mailcow'@'%' IDENTIFIED BY 'mookuh';
MariaDB [(none)]&gt; ALTER USER 'root'@'%' IDENTIFIED BY 'gotr00t'; MariaDB [(none)]&gt; ALTER USER 'root'@'%' IDENTIFIED BY 'gotr00t';
MariaDB [(none)]&gt; ALTER USER 'root'@'localhost' IDENTIFIED BY 'gotr00t'; MariaDB [(none)]&gt; ALTER USER 'root'@'localhost' IDENTIFIED BY 'gotr00t';
MariaDB [(none)]&gt; FLUSH PRIVILEGES;
MariaDB [(none)]&gt; ALTER USER &#39;mailcow&#39;@&#39;%&#39; IDENTIFIED BY &#39;mookuh&#39;;
MariaDB [(none)]&gt; ALTER USER &#39;root&#39;@&#39;%&#39; IDENTIFIED BY &#39;gotr00t&#39;; MariaDB [(none)]&gt; ALTER USER &#39;root&#39;@&#39;%&#39; IDENTIFIED BY &#39;gotr00t&#39;;
MariaDB [(none)]&gt; ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;gotr00t&#39;; MariaDB [(none)]&gt; ALTER USER &#39;root&#39;@&#39;localhost&#39; IDENTIFIED BY &#39;gotr00t&#39;;
MariaDB [(none)]&gt; FLUSH PRIVILEGES;
</code></pre></div>
```</p>
<h2 id="zwei-faktor-authentifizierung-entfernen">Zwei-Faktor-Authentifizierung entfernen<a class="headerlink" href="#zwei-faktor-authentifizierung-entfernen" title="Permanent link">&para;</a></h2>
<h3 id="fur-mailcow-webui">Für mailcow WebUI:<a class="headerlink" href="#fur-mailcow-webui" title="Permanent link">&para;</a></h3>
<p>Dies funktioniert ähnlich wie das Zurücksetzen eines MySQL-Passworts, jetzt machen wir es vom Host aus, ohne uns mit dem MySQL CLI zu verbinden:</p>
<div class="highlight"><pre><span></span><code>Quelle mailcow.conf
docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e &quot;DELETE FROM tfa WHERE username=&#39;YOUR_USERNAME&#39;;&quot;
</code></pre></div>
<p><code>Quelle mailcow.conf
docker-compose exec mysql-mailcow mysql -u${DBUSER} -p${DBPASS} ${DBNAME} -e "DELETE FROM tfa WHERE username='YOUR_USERNAME';"</code></p>
<h3 id="fur-sogo">Für SOGo:<a class="headerlink" href="#fur-sogo" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>docker-compose exec -u sogo sogo-mailcow sogo-tool user-preferences set defaults user@example.com SOGoGoogleAuthenticatorEnabled &#39;{&quot;SOGoGoogleAuthenticatorEnabled&quot;:0}&#39;
</code></pre></div>
<p><code>docker-compose exec -u sogo sogo-mailcow sogo-tool user-preferences set defaults user@example.com SOGoGoogleAuthenticatorEnabled '{"SOGoGoogleAuthenticatorEnabled":0}'</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2346,14 +2346,13 @@
<h1>TLS-Zertifikate zurücksetzen</h1>
<p>Sollten Sie Probleme mit Ihrem Zertifikat, Schlüssel oder Let's Encrypt-Konto haben, versuchen Sie bitte, die TLS-Assets zurückzusetzen:</p>
<div class="highlight"><pre><span></span><code>source mailcow.conf
<p><code>source mailcow.conf
docker-compose down
rm -rf data/assets/ssl
mkdir data/assets/ssl
openssl req -x509 -newkey rsa:4096 -keyout data/assets/ssl-example/key.pem -out data/assets/ssl-example/cert.pem -days 365 -subj &quot;/C=DE/ST=NRW/L=Willich/O=mailcow/OU=mailcow/CN=${MAILCOW_HOSTNAME}&quot; -sha256 -nodes
openssl req -x509 -newkey rsa:4096 -keyout data/assets/ssl-example/key.pem -out data/assets/ssl-example/cert.pem -days 365 -subj "/C=DE/ST=NRW/L=Willich/O=mailcow/OU=mailcow/CN=${MAILCOW_HOSTNAME}" -sha256 -nodes
cp -n -d data/assets/ssl-example/*.pem data/assets/ssl/
docker-compose up -d
</code></pre></div>
docker-compose up -d</code></p>
<p>Dies wird mailcow stoppen, die benötigten Variablen beschaffen, ein selbstsigniertes Zertifikat erstellen und mailcow starten.</p>
<p>Wenn Sie Let's Encrypt verwenden, sollten Sie vorsichtig sein, da Sie ein neues Konto und einen neuen Satz von Zertifikaten erstellen werden. Sie werden früher oder später auf ein Ratelimit stoßen.</p>
<p>Bitte beachten Sie auch, dass frühere TLSA-Datensätze ungültig werden.</p>

Datei anzeigen

@ -2348,8 +2348,7 @@
<p>Es kann sein, dass Sie einen Satz persistenter Daten entfernen wollen, um einen Konflikt zu lösen oder um neu zu beginnen.</p>
<p><code>mailcowdockerized</code> kann variieren und hängt von Ihrem Compose-Projektnamen ab (wenn er unverändert ist, ist <code>mailcowdockerized</code> der richtige Wert). Wenn Sie sich unsicher sind, führen Sie <code>docker volume ls</code> aus, um eine vollständige Liste zu erhalten.</p>
<p>Löschen Sie ein einzelnes Volume:</p>
<div class="highlight"><pre><span></span><code>docker volume rm mailcowdockerized_${VOLUME_NAME}
</code></pre></div>
<p><code>docker volume rm mailcowdockerized_${VOLUME_NAME}</code></p>
<ul>
<li>Entfernen Sie Volume <code>mysql-vol-1</code>, um alle MySQL-Daten zu entfernen.</li>
<li>Entfernen Sie Volume <code>redis-vol-1</code> um alle Redis Daten zu entfernen.</li>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#fugen-sie-vor-exec-die-folgenden-zeilen-ein" class="md-skip">
Zum Inhalt
</a>
</div>
<div data-md-component="announce">
@ -730,6 +735,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Fortgeschritten: Memory-Leaks in Rspamd finden
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,24 +2352,18 @@
<h1>Fortgeschritten: Memory-Leaks in Rspamd finden</h1>
<p>Eine kurze Anleitung, um einen schlecht funktionierenden Rspamd tiefgehend zu analysieren.</p>
<div class="highlight"><pre><span></span><code>docker-compose exec rspamd-mailcow bash
if ! grep -qi &#39;apt-stable-asan&#39; /etc/apt/sources.list.d/rspamd.list; then
sed -i &#39;s/apt-stabil/apt-stabil-asan/i&#39; /etc/apt/sources.list.d/rspamd.list
fi
apt-get update ; apt-get upgrade rspamd
nano /docker-entrypoint.sh
# Fügen Sie vor &quot;exec &quot;$@&quot;&quot; die folgenden Zeilen ein:
export G_SLICE=always-malloc
export ASAN_OPTIONS=new_delete_type_mismatch=0:detect_leaks=1:detect_odr_violation=0:log_path=/tmp/rspamd-asan:quarantine_size_mb=2048:malloc_context_size=8:fast_unwind_on_malloc=0
</code></pre></div>
<p>```
docker-compose exec rspamd-mailcow bash</p>
<p>if ! grep -qi 'apt-stable-asan' /etc/apt/sources.list.d/rspamd.list; then
sed -i 's/apt-stabil/apt-stabil-asan/i' /etc/apt/sources.list.d/rspamd.list
fi</p>
<p>apt-get update ; apt-get upgrade rspamd</p>
<p>nano /docker-entrypoint.sh</p>
<h1 id="fugen-sie-vor-exec-die-folgenden-zeilen-ein">Fügen Sie vor "exec "$@"" die folgenden Zeilen ein:<a class="headerlink" href="#fugen-sie-vor-exec-die-folgenden-zeilen-ein" title="Permanent link">&para;</a></h1>
<p>export G_SLICE=always-malloc
export ASAN_OPTIONS=new_delete_type_mismatch=0:detect_leaks=1:detect_odr_violation=0:log_path=/tmp/rspamd-asan:quarantine_size_mb=2048:malloc_context_size=8:fast_unwind_on_malloc=0</p>
<p>```</p>
<p>Starten Sie Rspamd neu: <code>docker-compose restart rspamd-mailcow</code></p>
<p>Ihr Speicherverbrauch wird stark ansteigen, er wird auch stetig wachsen, was nicht mit einem möglichen Memory Leak zusammenhängt, nach dem Sie suchen.</p>
<p>Lassen Sie den Container für ein paar Minuten, Stunden oder Tage laufen (es sollte die Zeit sein, die Sie normalerweise warten, bis der Memory Leak "passiert") und starten Sie ihn neu: <code>docker-compose restart rspamd-mailcow</code>.</p>

Datei anzeigen

@ -2428,9 +2428,8 @@
<p>To restore make sure you are actually restoring to the same mailcow it was deleted from or you use the same encryption keys in <code>crypt-vol-1</code>.</p>
<p><strong>Make sure the user you want to restore exists in your mailcow</strong>. Re-create them if they are missing.</p>
<p>Copy the folders from <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/_garbage/[timestamp]_[domain_sanitized][user_sanitized]</code> back to <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/[domain]/[user]</code> and resync the folder and recalc the quota:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm force-resync -u restoreme@example.net &#39;*&#39;
docker-compose exec dovecot-mailcow doveadm quota recalc -u restoreme@example.net
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm force-resync -u restoreme@example.net '*'
docker-compose exec dovecot-mailcow doveadm quota recalc -u restoreme@example.net</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -961,6 +961,47 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" class="md-nav__link">
./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
</a>
</li>
<li class="md-nav__item">
<a href="#backup-all-delete-backups-older-than-3-days" class="md-nav__link">
Backup all, delete backups older than 3 days
</a>
</li>
<li class="md-nav__item">
<a href="#backup-vmail-crypt-and-mysql-data-delete-backups-older-than-30-days" class="md-nav__link">
Backup vmail, crypt and mysql data, delete backups older than 30 days
</a>
</li>
<li class="md-nav__item">
<a href="#backup-vmail" class="md-nav__link">
Backup vmail
</a>
<nav class="md-nav" aria-label="Backup vmail">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cronjob" class="md-nav__link">
Cronjob
@ -971,6 +1012,34 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binsh" class="md-nav__link">
!/bin/sh
</a>
</li>
<li class="md-nav__item">
<a href="#backup-mailcow-data" class="md-nav__link">
Backup mailcow data
</a>
</li>
<li class="md-nav__item">
<a href="#httpsmailcowgithubiomailcow-dockerized-docsbackup_restoreb_n_r-backup" class="md-nav__link">
https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/
</a>
</li>
<li class="md-nav__item">
<a href="#run-command" class="md-nav__link">
run command
</a>
</li>
<li class="md-nav__item">
@ -978,6 +1047,13 @@
Backup strategy with rsync and mailcow backup script
</a>
</li>
<li class="md-nav__item">
<a href="#if-you-want-to-use-the-acl-util-to-backup-permissions-of-someall-foldersfiles-getfacl-rn-path" class="md-nav__link">
If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path
</a>
</li>
</ul>
@ -2411,6 +2487,47 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" class="md-nav__link">
./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
</a>
</li>
<li class="md-nav__item">
<a href="#backup-all-delete-backups-older-than-3-days" class="md-nav__link">
Backup all, delete backups older than 3 days
</a>
</li>
<li class="md-nav__item">
<a href="#backup-vmail-crypt-and-mysql-data-delete-backups-older-than-30-days" class="md-nav__link">
Backup vmail, crypt and mysql data, delete backups older than 30 days
</a>
</li>
<li class="md-nav__item">
<a href="#backup-vmail" class="md-nav__link">
Backup vmail
</a>
<nav class="md-nav" aria-label="Backup vmail">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#cronjob" class="md-nav__link">
Cronjob
@ -2421,6 +2538,34 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binsh" class="md-nav__link">
!/bin/sh
</a>
</li>
<li class="md-nav__item">
<a href="#backup-mailcow-data" class="md-nav__link">
Backup mailcow data
</a>
</li>
<li class="md-nav__item">
<a href="#httpsmailcowgithubiomailcow-dockerized-docsbackup_restoreb_n_r-backup" class="md-nav__link">
https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/
</a>
</li>
<li class="md-nav__item">
<a href="#run-command" class="md-nav__link">
run command
</a>
</li>
<li class="md-nav__item">
@ -2428,6 +2573,13 @@
Backup strategy with rsync and mailcow backup script
</a>
</li>
<li class="md-nav__item">
<a href="#if-you-want-to-use-the-acl-util-to-backup-permissions-of-someall-foldersfiles-getfacl-rn-path" class="md-nav__link">
If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path
</a>
</li>
</ul>
@ -2454,65 +2606,57 @@
<p>Please do not copy this script to another location.</p>
<p>To run a backup, write "backup" as first parameter and either one or more components to backup as following parameters.
You can also use "all" as second parameter to backup all components. Append <code>--delete-days n</code> to delete backups older than n days.</p>
<div class="highlight"><pre><span></span><code># Syntax:
# ./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)
# Backup all, delete backups older than 3 days
./helper-scripts/backup_and_restore.sh backup all --delete-days 3
# Backup vmail, crypt and mysql data, delete backups older than 30 days
./helper-scripts/backup_and_restore.sh backup vmail crypt mysql --delete-days 30
# Backup vmail
./helper-scripts/backup_and_restore.sh backup vmail
</code></pre></div>
<p>```</p>
<h1 id="syntax">Syntax:<a class="headerlink" href="#syntax" title="Permanent link">&para;</a></h1>
<h1 id="helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days">./helper-scripts/backup_and_restore.sh backup (vmail|crypt|redis|rspamd|postfix|mysql|all|--delete-days)<a class="headerlink" href="#helper-scriptsbackup_and_restoresh-backup-vmailcryptredisrspamdpostfixmysqlall-delete-days" title="Permanent link">&para;</a></h1>
<h1 id="backup-all-delete-backups-older-than-3-days">Backup all, delete backups older than 3 days<a class="headerlink" href="#backup-all-delete-backups-older-than-3-days" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup all --delete-days 3</p>
<h1 id="backup-vmail-crypt-and-mysql-data-delete-backups-older-than-30-days">Backup vmail, crypt and mysql data, delete backups older than 30 days<a class="headerlink" href="#backup-vmail-crypt-and-mysql-data-delete-backups-older-than-30-days" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup vmail crypt mysql --delete-days 30</p>
<h1 id="backup-vmail">Backup vmail<a class="headerlink" href="#backup-vmail" title="Permanent link">&para;</a></h1>
<p>./helper-scripts/backup_and_restore.sh backup vmail</p>
<p>```</p>
<p>The script will ask you for a backup location. Inside of this location it will create folders in the format "mailcow_DATE".
You should not rename those folders to not break the restore process.</p>
<p>To run a backup unattended, define MAILCOW_BACKUP_LOCATION as environment variable before starting the script:</p>
<div class="highlight"><pre><span></span><code>MAILCOW_BACKUP_LOCATION=/opt/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all
</code></pre></div>
<p><code>MAILCOW_BACKUP_LOCATION=/opt/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all</code></p>
<h4 id="cronjob">Cronjob<a class="headerlink" href="#cronjob" title="Permanent link">&para;</a></h4>
<p>You can run the backup script regularly via cronjob. Make sure <code>BACKUP_LOCATION</code> exists:</p>
<div class="highlight"><pre><span></span><code>5 4 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/mnt/mailcow_backups /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3
</code></pre></div>
<p><code>5 4 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/mnt/mailcow_backups /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3</code></p>
<p>Per default cron sends the full result of each backup operation by email. If you want cron to only mail on error (non-zero exit code) you may want to use the following snippet. Pathes need to be modified according to your setup (this script is a user contribution).</p>
<p>This following script may be placed in <code>/etc/cron.daily/mailcow-backup</code> - do not forget to mark it as executable via <code>chmod +x</code>:</p>
<div class="highlight"><pre><span></span><code>#!/bin/sh
# Backup mailcow data
# https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/
set -e
OUT=&quot;$(mktemp)&quot;
export MAILCOW_BACKUP_LOCATION=&quot;/opt/backup&quot;
SCRIPT=&quot;/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh&quot;
PARAMETERS=&quot;backup all&quot;
OPTIONS=&quot;--delete-days 30&quot;
# run command
set +e
&quot;${SCRIPT}&quot; ${PARAMETERS} ${OPTIONS} 2&gt;&amp;1 &gt; &quot;$OUT&quot;
RESULT=$?
if [ $RESULT -ne 0 ]
<p>```</p>
<h1 id="binsh">!/bin/sh<a class="headerlink" href="#binsh" title="Permanent link">&para;</a></h1>
<h1 id="backup-mailcow-data">Backup mailcow data<a class="headerlink" href="#backup-mailcow-data" title="Permanent link">&para;</a></h1>
<h1 id="httpsmailcowgithubiomailcow-dockerized-docsbackup_restoreb_n_r-backup"><a href="https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/">https://mailcow.github.io/mailcow-dockerized-docs/backup_restore/b_n_r-backup/</a><a class="headerlink" href="#httpsmailcowgithubiomailcow-dockerized-docsbackup_restoreb_n_r-backup" title="Permanent link">&para;</a></h1>
<p>set -e</p>
<p>OUT="$(mktemp)"
export MAILCOW_BACKUP_LOCATION="/opt/backup"
SCRIPT="/opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh"
PARAMETERS="backup all"
OPTIONS="--delete-days 30"</p>
<h1 id="run-command">run command<a class="headerlink" href="#run-command" title="Permanent link">&para;</a></h1>
<p>set +e
"${SCRIPT}" ${PARAMETERS} ${OPTIONS} 2&gt;&amp;1 &gt; "$OUT"
RESULT=$?</p>
<p>if [ $RESULT -ne 0 ]
then
echo &quot;${SCRIPT} ${PARAMETERS} ${OPTIONS} encounters an error:&quot;
echo &quot;RESULT=$RESULT&quot;
echo &quot;STDOUT / STDERR:&quot;
cat &quot;$OUT&quot;
echo "${SCRIPT} ${PARAMETERS} ${OPTIONS} encounters an error:"
echo "RESULT=$RESULT"
echo "STDOUT / STDERR:"
cat "$OUT"
fi
</code></pre></div>
```</p>
<h1 id="backup-strategy-with-rsync-and-mailcow-backup-script">Backup strategy with rsync and mailcow backup script<a class="headerlink" href="#backup-strategy-with-rsync-and-mailcow-backup-script" title="Permanent link">&para;</a></h1>
<p>Create the destination directory for mailcows helper script:
<div class="highlight"><pre><span></span><code>mkdir -p /external_share/backups/backup_script
</code></pre></div></p>
<code>mkdir -p /external_share/backups/backup_script</code></p>
<p>Create cronjobs:
<div class="highlight"><pre><span></span><code>25 1 * * * rsync -aH --delete /opt/mailcow-dockerized /external_share/backups/mailcow-dockerized
```
25 1 * * * rsync -aH --delete /opt/mailcow-dockerized /external_share/backups/mailcow-dockerized
40 2 * * * rsync -aH --delete /var/lib/docker/volumes /external_share/backups/var_lib_docker_volumes
5 4 * * * cd /opt/mailcow-dockerized/; BACKUP_LOCATION=/external_share/backups/backup_script /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3
# If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path
</code></pre></div></p>
5 4 * * * cd /opt/mailcow-dockerized/; BACKUP_LOCATION=/external_share/backups/backup_script /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup mysql crypt redis --delete-days 3</p>
<h1 id="if-you-want-to-use-the-acl-util-to-backup-permissions-of-someall-foldersfiles-getfacl-rn-path">If you want to, use the acl util to backup permissions of some/all folders/files: getfacl -Rn /path<a class="headerlink" href="#if-you-want-to-use-the-acl-util-to-backup-permissions-of-someall-foldersfiles-getfacl-rn-path" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>On the destination (in this case <code>/external_share/backups</code>) you may want to have snapshot capabilities (ZFS, Btrfs etc.). Snapshot daily and keep for n days for a consistent backup.
Do <strong>not</strong> rsync to a Samba share, you need to keep the correct permissions!</p>
<p>To restore you'd simply need to run rsync the other way round and restart Docker to re-read the volumes. Run <code>docker-compose pull</code> and <code>docker-compose up -d</code>.</p>

Datei anzeigen

@ -2412,15 +2412,13 @@
<h3 id="backup">Backup<a class="headerlink" href="#backup" title="Permanent link">&para;</a></h3>
<p>This line backups the vmail directory to a file backup_vmail.tar.gz in the mailcow root directory:
<div class="highlight"><pre><span></span><code>cd /path/to/mailcow-dockerized
docker run --rm -i -v $(docker inspect --format &#39;{{ range .Mounts }}{{ if eq .Destination &quot;/var/vmail&quot; }}{{ .Name }}{{ end }}{{ end }}&#39; $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar cvfz /backup/backup_vmail.tar.gz /vmail
</code></pre></div></p>
<code>cd /path/to/mailcow-dockerized
docker run --rm -i -v $(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/var/vmail" }}{{ .Name }}{{ end }}{{ end }}' $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar cvfz /backup/backup_vmail.tar.gz /vmail</code></p>
<p>You can change the path by adjusting ${PWD} (which equals to the current directory) to any path you have write-access to.
Set the filename <code>backup_vmail.tar.gz</code> to any custom name, but leave the path as it is. Example: <code>[...] tar cvfz /backup/my_own_filename_.tar.gz</code></p>
<h3 id="restore">Restore<a class="headerlink" href="#restore" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code>cd /path/to/mailcow-dockerized
docker run --rm -it -v $(docker inspect --format &#39;{{ range .Mounts }}{{ if eq .Destination &quot;/var/vmail&quot; }}{{ .Name }}{{ end }}{{ end }}&#39; $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar xvfz /backup/backup_vmail.tar.gz
</code></pre></div>
<p><code>cd /path/to/mailcow-dockerized
docker run --rm -it -v $(docker inspect --format '{{ range .Mounts }}{{ if eq .Destination "/var/vmail" }}{{ .Name }}{{ end }}{{ end }}' $(docker-compose ps -q dovecot-mailcow)):/vmail -v ${PWD}:/backup debian:stretch-slim tar xvfz /backup/backup_vmail.tar.gz</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2411,20 +2411,18 @@
<h1>MySQL (mysqldump)</h1>
<h2 id="backup">Backup<a class="headerlink" href="#backup" title="Permanent link">&para;</a></h2>
<div class="highlight"><pre><span></span><code>cd /path/to/mailcow-dockerized
<p><code>cd /path/to/mailcow-dockerized
source mailcow.conf
DATE=$(date +&quot;%Y%m%d_%H%M%S&quot;)
docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 -u${DBUSER} -p${DBPASS} ${DBNAME} &gt; backup_${DBNAME}_${DATE}.sql
</code></pre></div>
DATE=$(date +"%Y%m%d_%H%M%S")
docker-compose exec -T mysql-mailcow mysqldump --default-character-set=utf8mb4 -u${DBUSER} -p${DBPASS} ${DBNAME} &gt; backup_${DBNAME}_${DATE}.sql</code></p>
<h2 id="restore">Restore<a class="headerlink" href="#restore" title="Permanent link">&para;</a></h2>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>You should redirect the SQL dump without <code>docker-compose</code> to prevent parsing errors.</p>
</div>
<div class="highlight"><pre><span></span><code>cd /path/to/mailcow-dockerized
<p><code>cd /path/to/mailcow-dockerized
source mailcow.conf
docker exec -i $(docker-compose ps -q mysql-mailcow) mysql -u${DBUSER} -p${DBPASS} ${DBNAME} &lt; backup_file.sql
</code></pre></div>
docker exec -i $(docker-compose ps -q mysql-mailcow) mysql -u${DBUSER} -p${DBPASS} ${DBNAME} &lt; backup_file.sql</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2459,10 +2459,9 @@
<p>You will need a SSH-enabled destination and a keyfile to connect to said destination. The key should not be protected by a password for the script to work unattended.</p>
<p>In your mailcow base directory, e.g. <code>/opt/mailcow-dockerized</code> you will find a file <code>create_cold_standby.sh</code>.</p>
<p>Edit this file and change the exported variables:</p>
<div class="highlight"><pre><span></span><code>export REMOTE_SSH_KEY=/path/to/keyfile
<p><code>export REMOTE_SSH_KEY=/path/to/keyfile
export REMOTE_SSH_PORT=22
export REMOTE_SSH_HOST=mailcow-backup.host.name
</code></pre></div>
export REMOTE_SSH_HOST=mailcow-backup.host.name</code></p>
<p>The key must be owned and readable by root only.</p>
<p>Both the source and destination require <code>rsync</code> &gt;= v3.1.0.
The destination must have Docker and docker-compose <strong>v1</strong> available.</p>
@ -2470,28 +2469,23 @@ The destination must have Docker and docker-compose <strong>v1</strong> availabl
<p>You may want to test the connection by running <code>ssh mailcow-backup.host.name -p22 -i /path/to/keyfile</code>.</p>
<h2 id="backup-and-refresh-the-cold-standby">Backup and refresh the cold-standby<a class="headerlink" href="#backup-and-refresh-the-cold-standby" title="Permanent link">&para;</a></h2>
<p>Run the first backup, this may take a while depending on the connection:</p>
<div class="highlight"><pre><span></span><code>bash /opt/mailcow-dockerized/create_cold_standby.sh
</code></pre></div>
<p><code>bash /opt/mailcow-dockerized/create_cold_standby.sh</code></p>
<p>That was easy, wasn't it?</p>
<p>Updating your cold-standby is just as easy:</p>
<div class="highlight"><pre><span></span><code>bash /opt/mailcow-dockerized/create_cold_standby.sh
</code></pre></div>
<p><code>bash /opt/mailcow-dockerized/create_cold_standby.sh</code></p>
<p>It's the same command.</p>
<h2 id="automated-backups-with-cron">Automated backups with cron<a class="headerlink" href="#automated-backups-with-cron" title="Permanent link">&para;</a></h2>
<p>First make sure that the <code>cron</code> service is enabled and running:</p>
<div class="highlight"><pre><span></span><code>systemctl enable cron.service &amp;&amp; systemctl start cron.service
</code></pre></div>
<p><code>systemctl enable cron.service &amp;&amp; systemctl start cron.service</code></p>
<p>To automate the backups to the cold-standby server you can use a cron job. To edit the cron jobs for the root user run:</p>
<div class="highlight"><pre><span></span><code>crontab -e
</code></pre></div>
<p><code>crontab -e</code></p>
<p>Add the following lines to synchronize the cold standby server daily at 03:00. In this example errors of the last execution are logged into a file.</p>
<div class="highlight"><pre><span></span><code>PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
0 3 * * * bash /opt/mailcow-dockerized/create_cold_standby.sh 2&gt; /var/log/mailcow-coldstandby-sync.log
</code></pre></div>
<p>```
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin</p>
<p>0 3 * * * bash /opt/mailcow-dockerized/create_cold_standby.sh 2&gt; /var/log/mailcow-coldstandby-sync.log
```</p>
<p>If saved correctly, the cron job should be shown by typing:</p>
<div class="highlight"><pre><span></span><code>crontab -l
</code></pre></div>
<p><code>crontab -l</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -965,6 +965,20 @@
Restore
</a>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-restore" class="md-nav__link">
./helper-scripts/backup_and_restore.sh restore
</a>
</li>
</ul>
@ -2374,6 +2388,20 @@
Restore
</a>
</li>
<li class="md-nav__item">
<a href="#syntax" class="md-nav__link">
Syntax:
</a>
</li>
<li class="md-nav__item">
<a href="#helper-scriptsbackup_and_restoresh-restore" class="md-nav__link">
./helper-scripts/backup_and_restore.sh restore
</a>
</li>
</ul>
@ -2394,14 +2422,13 @@
<h1>Restore</h1>
<h3 id="restore">Restore<a class="headerlink" href="#restore" title="Permanent link">&para;</a></h3>
<p>Please do not copy this script to another location.</p>
<p>To run a restore, <strong>start mailcow</strong>, use the script with "restore" as first parameter.</p>
<div class="highlight"><pre><span></span><code># Syntax:
# ./helper-scripts/backup_and_restore.sh restore
</code></pre></div>
<p>```</p>
<h1 id="syntax">Syntax:<a class="headerlink" href="#syntax" title="Permanent link">&para;</a></h1>
<h1 id="helper-scriptsbackup_and_restoresh-restore">./helper-scripts/backup_and_restore.sh restore<a class="headerlink" href="#helper-scriptsbackup_and_restoresh-restore" title="Permanent link">&para;</a></h1>
<p>```</p>
<p>The script will ask you for a backup location containing the mailcow_DATE folders.</p>
<hr>

Datei anzeigen

@ -2346,8 +2346,7 @@
<h1>Deinstallation</h1>
<p>To remove mailcow: dockerized with all it's volumes, images and containers do:</p>
<div class="highlight"><pre><span></span><code>docker-compose down -v --rmi all --remove-orphans
</code></pre></div>
<p><code>docker-compose down -v --rmi all --remove-orphans</code></p>
<div class="admonition info">
<p class="admonition-title">Info</p>
<ul>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#after-the-installation-process-is-finished-you-may-need-to-enable-the-service-and-make-sure-it-is-started-eg-centos-7" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
@ -362,6 +367,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Installation
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,66 +2352,58 @@
<h1>Installation</h1>
<p>You need Docker (a version &gt;= <code>20.10.2</code> is required) and Docker Compose (a version <code>&lt;= 2.0</code> is required).</p>
<p><strong>1.</strong> Learn how to install <a href="https://docs.docker.com/install/">Docker</a> and <a href="https://docs.docker.com/compose/install/">Docker Compose</a>.</p>
<p>Quick installation for most operation systems:</p>
<ul>
<li>
<p>Docker
<div class="highlight"><pre><span></span><code>curl -sSL https://get.docker.com/ | CHANNEL=stable sh
# After the installation process is finished, you may need to enable the service and make sure it is started (e.g. CentOS 7)
systemctl enable --now docker
</code></pre></div></p>
</li>
<li>
<p>Docker-Compose</p>
</li>
<li>Docker
```
curl -sSL <a href="https://get.docker.com/">https://get.docker.com/</a> | CHANNEL=stable sh</li>
</ul>
<h1 id="after-the-installation-process-is-finished-you-may-need-to-enable-the-service-and-make-sure-it-is-started-eg-centos-7">After the installation process is finished, you may need to enable the service and make sure it is started (e.g. CentOS 7)<a class="headerlink" href="#after-the-installation-process-is-finished-you-may-need-to-enable-the-service-and-make-sure-it-is-started-eg-centos-7" title="Permanent link">&para;</a></h1>
<p>systemctl enable --now docker
```</p>
<ul>
<li>Docker-Compose</li>
</ul>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p><strong>mailcow requires the latest version of docker-compose v1.</strong> It is highly recommended to use the commands below to install <code>docker-compose</code>. Package managers (e.g. <code>apt</code>, <code>yum</code>) <strong>likely won't</strong> give you the correct version.
<em>Note: This command downloads docker-compose from the official Docker Github repository and is a safe method. The snippet will determine the latest supported version by mailcow. In almost all cases this is the latest version available (exceptions are broken releases or major changes not yet supported by mailcow).</em></p>
</div>
<div class="highlight"><pre><span></span><code>curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
</code></pre></div>
<p><code>curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose</code></p>
<p>Please use the latest Docker engine available and do not use the engine that ships with your distros repository.</p>
<p><strong>1.1.</strong> On SELinux enabled systems, e.g. CentOS 7:</p>
<ul>
<li>Check if "container-selinux" package is present on your system:</li>
</ul>
<div class="highlight"><pre><span></span><code>rpm -qa | grep container-selinux
</code></pre></div>
<p><code>rpm -qa | grep container-selinux</code></p>
<p>If the above command returns an empty or no output, you should install it via your package manager.</p>
<ul>
<li>Check if docker has SELinux support enabled:</li>
</ul>
<div class="highlight"><pre><span></span><code>docker info | grep selinux
</code></pre></div>
<p><code>docker info | grep selinux</code></p>
<p>If the above command returns an empty or no output, create or edit <code>/etc/docker/daemon.json</code> and add <code>"selinux-enabled": true</code>. Example file content:</p>
<div class="highlight"><pre><span></span><code>{
&quot;selinux-enabled&quot;: true
}
</code></pre></div>
<p><code>{
"selinux-enabled": true
}</code></p>
<p>Restart the docker daemon and verify SELinux is now enabled.</p>
<p>This step is required to make sure mailcows volumes are properly labeled as declared in the compose file.
If you are interested in how this works, you can check out the readme of <a href="https://github.com/containers/container-selinux">https://github.com/containers/container-selinux</a> which links to a lot of useful information on that topic.</p>
<p><strong>2.</strong> Clone the master branch of the repository, make sure your umask equals 0022. Please clone the repository as root user and also control the stack as root. We will modify attributes - if necessary - while bootstrapping the containers automatically and make sure everything is secured. The update.sh script must therefore also be run as root. It might be necessary to change ownership and other attributes of files you will otherwise not have access to. <strong>We drop permissions for every exposed application</strong> and will not run an exposed service as root! Controlling the Docker daemon as non-root user does not give you additional security. The unprivileged user will spawn the containers as root likewise. The behaviour of the stack is identical.</p>
<div class="highlight"><pre><span></span><code>$ su
# umask
0022 # &lt;- Verify it is 0022
# cd /opt
# git clone https://github.com/mailcow/mailcow-dockerized
# cd mailcow-dockerized
</code></pre></div>
<p>```
$ su</p>
<h1 id="umask">umask<a class="headerlink" href="#umask" title="Permanent link">&para;</a></h1>
<p>0022 # &lt;- Verify it is 0022</p>
<h1 id="cd-opt">cd /opt<a class="headerlink" href="#cd-opt" title="Permanent link">&para;</a></h1>
<h1 id="git-clone-httpsgithubcommailcowmailcow-dockerized">git clone <a href="https://github.com/mailcow/mailcow-dockerized">https://github.com/mailcow/mailcow-dockerized</a><a class="headerlink" href="#git-clone-httpsgithubcommailcowmailcow-dockerized" title="Permanent link">&para;</a></h1>
<h1 id="cd-mailcow-dockerized">cd mailcow-dockerized<a class="headerlink" href="#cd-mailcow-dockerized" title="Permanent link">&para;</a></h1>
<p>```</p>
<p><strong>3.</strong> Generate a configuration file. Use a FQDN (<code>host.domain.tld</code>) as hostname when asked.
<div class="highlight"><pre><span></span><code>./generate_config.sh
</code></pre></div></p>
<code>./generate_config.sh</code></p>
<p><strong>4.</strong> Change configuration if you want or need to.
<div class="highlight"><pre><span></span><code>nano mailcow.conf
</code></pre></div>
<code>nano mailcow.conf</code>
If you plan to use a reverse proxy, you can, for example, bind HTTPS to 127.0.0.1 on port 8443 and HTTP to 127.0.0.1 on port 8080.</p>
<p>You may need to stop an existing pre-installed MTA which blocks port 25/tcp. See <a href="../../post_installation/firststeps-local_mta/">this chapter</a> to learn how to reconfigure Postfix to run besides mailcow after a successful installation.</p>
<p>Some updates modify mailcow.conf and add new parameters. It is hard to keep track of them in the documentation. Please check their description and, if unsure, ask at the known channels for advise.</p>
@ -2410,20 +2411,18 @@ If you plan to use a reverse proxy, you can, for example, bind HTTPS to 127.0.0.
<p><strong>Whenever you run into trouble and strange phenomena, please check your MTU.</strong></p>
<p>Edit <code>docker-compose.yml</code> and change the network settings according to your MTU.
Add the new driver_opts parameter like this:
<div class="highlight"><pre><span></span><code>networks:
<code>networks:
mailcow-network:
...
driver_opts:
com.docker.network.driver.mtu: 1450
...
</code></pre></div></p>
...</code></p>
<p><strong>4.2.</strong> Users without an IPv6 enabled network on their host system:</p>
<p><strong>Enable IPv6. Finally.</strong></p>
<p>If you do not have an IPv6 enabled network on your host and you don't care for a better internet (thehe), it is recommended to <a href="../../post_installation/firststeps-disable_ipv6/">disable IPv6</a> for the mailcow network to prevent unforeseen issues.</p>
<p><strong>5.</strong> Pull the images and run the compose file. The parameter <code>-d</code> will start mailcow: dockerized detached:
<div class="highlight"><pre><span></span><code>docker-compose pull
docker-compose up -d
</code></pre></div></p>
<code>docker-compose pull
docker-compose up -d</code></p>
<p>Done!</p>
<p>You can now access <strong>https://${MAILCOW_HOSTNAME}</strong> with the default credentials <code>admin</code> + password <code>moohoo</code>.</p>
<div class="admonition info">

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#after-the-installation-process-is-finished-you-may-need-to-enable-the-service-and-make-sure-it-is-started-eg-centos-7" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
@ -390,6 +395,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Migration
@ -2326,6 +2333,8 @@
</nav>
</div>
@ -2343,8 +2352,6 @@
<h1>Migration</h1>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>This guide assumes you intend to migrate an existing mailcow server (source) over to a brand new, empty server (target). It takes no care about preserving any existing data on your target server and will erase anything within <code>/var/lib/docker/volumes</code> and thus any Docker volumes you may have already set up.</p>
@ -2357,45 +2364,37 @@
Install <a href="https://docs.docker.com/engine/installation/linux/">Docker</a> and <a href="https://docs.docker.com/compose/install/">Docker Compose</a> on your new server.</p>
<p>Quick installation for most operation systems:</p>
<ul>
<li>
<p>Docker
<div class="highlight"><pre><span></span><code>curl -sSL https://get.docker.com/ | CHANNEL=stable sh
# After the installation process is finished, you may need to enable the service and make sure it is started (e.g. CentOS 7)
systemctl enable docker.service
</code></pre></div></p>
</li>
<li>
<p>docker-compose
<div class="highlight"><pre><span></span><code>curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
</code></pre></div></p>
</li>
<li>Docker
```
curl -sSL <a href="https://get.docker.com/">https://get.docker.com/</a> | CHANNEL=stable sh</li>
</ul>
<h1 id="after-the-installation-process-is-finished-you-may-need-to-enable-the-service-and-make-sure-it-is-started-eg-centos-7">After the installation process is finished, you may need to enable the service and make sure it is started (e.g. CentOS 7)<a class="headerlink" href="#after-the-installation-process-is-finished-you-may-need-to-enable-the-service-and-make-sure-it-is-started-eg-centos-7" title="Permanent link">&para;</a></h1>
<p>systemctl enable docker.service
```</p>
<ul>
<li>docker-compose
<code>curl -L https://github.com/docker/compose/releases/download/$(curl -Ls https://www.servercow.de/docker-compose/latest.php)/docker-compose-$(uname -s)-$(uname -m) &gt; /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose</code></li>
</ul>
<p>Please use the latest Docker engine available and do not use the engine that ships with your distros repository.</p>
<p><strong>2.</strong> Stop Docker and assure Docker has stopped:
<div class="highlight"><pre><span></span><code>systemctl stop docker.service
systemctl status docker.service
</code></pre></div></p>
<code>systemctl stop docker.service
systemctl status docker.service</code></p>
<p><strong>3.</strong> Run the following commands on the source machine (take care of adding the trailing slashes in the first path parameter as shown below!) - <strong>WARNING: This command will erase anything that may already exist under <code>/var/lib/docker/volumes</code> on the target machine</strong>:
<div class="highlight"><pre><span></span><code>rsync -aHhP --numeric-ids --delete /opt/mailcow-dockerized/ root@target-machine.example.com:/opt/mailcow-dockerized
rsync -aHhP --numeric-ids --delete /var/lib/docker/volumes/ root@target-machine.example.com:/var/lib/docker/volumes
</code></pre></div></p>
<code>rsync -aHhP --numeric-ids --delete /opt/mailcow-dockerized/ root@target-machine.example.com:/opt/mailcow-dockerized
rsync -aHhP --numeric-ids --delete /var/lib/docker/volumes/ root@target-machine.example.com:/var/lib/docker/volumes</code></p>
<p><strong>4.</strong> Shut down mailcow and stop Docker on the source machine.
<div class="highlight"><pre><span></span><code>cd /opt/mailcow-dockerized
<code>cd /opt/mailcow-dockerized
docker-compose down
systemctl stop docker.service
</code></pre></div></p>
systemctl stop docker.service</code></p>
<p><strong>5.</strong> Repeat step 3 with the same commands. This will be much quicker than the first time.</p>
<p><strong>6.</strong> Switch over to the target machine and start Docker.
<div class="highlight"><pre><span></span><code>systemctl start docker.service
</code></pre></div></p>
<code>systemctl start docker.service</code></p>
<p><strong>7.</strong> Now pull the mailcow Docker images on the target machine.
<div class="highlight"><pre><span></span><code>cd /opt/mailcow-dockerized
docker-compose pull
</code></pre></div></p>
<code>cd /opt/mailcow-dockerized
docker-compose pull</code></p>
<p><strong>8.</strong> Start the whole mailcow stack and everything should be done!
<div class="highlight"><pre><span></span><code>docker-compose up -d
</code></pre></div></p>
<code>docker-compose up -d</code></p>
<p><strong>9.</strong> Finally, change your DNS settings to point to the target server.</p>
<hr>

Datei anzeigen

@ -419,6 +419,75 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#options-can-be-combined" class="md-nav__link">
Options can be combined
</a>
</li>
<li class="md-nav__item">
<a href="#-check-for-updates-and-show-changes" class="md-nav__link">
- Check for updates and show changes
</a>
</li>
<li class="md-nav__item">
<a href="#do-not-try-to-update-docker-compose-make-sure-to-use-the-latest-docker-compose-available" class="md-nav__link">
Do not try to update docker-compose, make sure to use the latest docker-compose available
</a>
</li>
<li class="md-nav__item">
<a href="#-do-not-start-mailcow-after-applying-an-update" class="md-nav__link">
- Do not start mailcow after applying an update
</a>
</li>
<li class="md-nav__item">
<a href="#-force-update-unattended-but-unsupported-use-at-own-risk" class="md-nav__link">
- Force update (unattended, but unsupported, use at own risk)
</a>
</li>
<li class="md-nav__item">
<a href="#-run-garbage-collector-to-cleanup-old-image-tags-and-exit" class="md-nav__link">
- Run garbage collector to cleanup old image tags and exit
</a>
</li>
<li class="md-nav__item">
<a href="#-update-with-merge-strategy-option-ours-instead-of-theirs" class="md-nav__link">
- Update with merge strategy option "ours" instead of "theirs"
</a>
</li>
<li class="md-nav__item">
<a href="#this-will-solve-conflicts-when-merging-in-favor-for-your-local-changes-and-should-be-avoided-local-changes-will-always-be-kept-unless-we-changed-file-xy-too" class="md-nav__link">
This will solve conflicts when merging in favor for your local changes and should be avoided. Local changes will always be kept, unless we changed file XY, too.
</a>
</li>
<li class="md-nav__item">
<a href="#-dont-update-but-prefetch-images-and-exit" class="md-nav__link">
- Don't update, but prefetch images and exit
</a>
<nav class="md-nav" aria-label="- Don't update, but prefetch images and exit">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#i-forgot-what-i-changed-before-running-updatesh" class="md-nav__link">
I forgot what I changed before running update.sh
@ -433,6 +502,19 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#replace-commit-id-22cd00b5e28893ef9ddef3c2b5436453cc5223ab-by-your-id" class="md-nav__link">
Replace commit ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab by your ID
</a>
<nav class="md-nav" aria-label="Replace commit ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab by your ID">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#hooks" class="md-nav__link">
Hooks
@ -440,16 +522,16 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#footnotes" class="md-nav__link">
Footnotes
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2423,6 +2505,75 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#options-can-be-combined" class="md-nav__link">
Options can be combined
</a>
</li>
<li class="md-nav__item">
<a href="#-check-for-updates-and-show-changes" class="md-nav__link">
- Check for updates and show changes
</a>
</li>
<li class="md-nav__item">
<a href="#do-not-try-to-update-docker-compose-make-sure-to-use-the-latest-docker-compose-available" class="md-nav__link">
Do not try to update docker-compose, make sure to use the latest docker-compose available
</a>
</li>
<li class="md-nav__item">
<a href="#-do-not-start-mailcow-after-applying-an-update" class="md-nav__link">
- Do not start mailcow after applying an update
</a>
</li>
<li class="md-nav__item">
<a href="#-force-update-unattended-but-unsupported-use-at-own-risk" class="md-nav__link">
- Force update (unattended, but unsupported, use at own risk)
</a>
</li>
<li class="md-nav__item">
<a href="#-run-garbage-collector-to-cleanup-old-image-tags-and-exit" class="md-nav__link">
- Run garbage collector to cleanup old image tags and exit
</a>
</li>
<li class="md-nav__item">
<a href="#-update-with-merge-strategy-option-ours-instead-of-theirs" class="md-nav__link">
- Update with merge strategy option "ours" instead of "theirs"
</a>
</li>
<li class="md-nav__item">
<a href="#this-will-solve-conflicts-when-merging-in-favor-for-your-local-changes-and-should-be-avoided-local-changes-will-always-be-kept-unless-we-changed-file-xy-too" class="md-nav__link">
This will solve conflicts when merging in favor for your local changes and should be avoided. Local changes will always be kept, unless we changed file XY, too.
</a>
</li>
<li class="md-nav__item">
<a href="#-dont-update-but-prefetch-images-and-exit" class="md-nav__link">
- Don't update, but prefetch images and exit
</a>
<nav class="md-nav" aria-label="- Don't update, but prefetch images and exit">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#i-forgot-what-i-changed-before-running-updatesh" class="md-nav__link">
I forgot what I changed before running update.sh
@ -2437,6 +2588,19 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#replace-commit-id-22cd00b5e28893ef9ddef3c2b5436453cc5223ab-by-your-id" class="md-nav__link">
Replace commit ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab by your ID
</a>
<nav class="md-nav" aria-label="Replace commit ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab by your ID">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#hooks" class="md-nav__link">
Hooks
@ -2444,16 +2608,16 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<li class="md-nav__item">
<a href="#footnotes" class="md-nav__link">
Footnotes
</a>
</li>
</ul>
</nav>
</li>
</ul>
@ -2474,57 +2638,48 @@
<h1>Update</h1>
<h2 id="automatic-update">Automatic update<a class="headerlink" href="#automatic-update" title="Permanent link">&para;</a></h2>
<p>An update script in your mailcow-dockerized directory will take care of updates.</p>
<p>But use it with caution! If you think you made a lot of changes to the mailcow code, you should use the manual update guide below.</p>
<p>Run the update script:
<div class="highlight"><pre><span></span><code>./update.sh
</code></pre></div></p>
<code>./update.sh</code></p>
<p>If it needs to, it will ask you how you wish to proceed.
Merge errors will be reported.
Some minor conflicts will be auto-corrected (in favour for the mailcow: dockerized repository code).</p>
<h3 id="options">Options<a class="headerlink" href="#options" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code># Options can be combined
# - Check for updates and show changes
./update.sh --check
# Do not try to update docker-compose, **make sure to use the latest docker-compose available**
./update.sh --no-update-compose
# - Do not start mailcow after applying an update
./update.sh --skip-start
# - Force update (unattended, but unsupported, use at own risk)
./update.sh --force
# - Run garbage collector to cleanup old image tags and exit
./update.sh --gc
# - Update with merge strategy option &quot;ours&quot; instead of &quot;theirs&quot;
# This will **solve conflicts** when merging in favor for your local changes and should be avoided. Local changes will always be kept, unless we changed file XY, too.
./update.sh --ours
# - Don&#39;t update, but prefetch images and exit
./update.sh --prefetch
</code></pre></div>
<p>```</p>
<h1 id="options-can-be-combined">Options can be combined<a class="headerlink" href="#options-can-be-combined" title="Permanent link">&para;</a></h1>
<h1 id="-check-for-updates-and-show-changes">- Check for updates and show changes<a class="headerlink" href="#-check-for-updates-and-show-changes" title="Permanent link">&para;</a></h1>
<p>./update.sh --check</p>
<h1 id="do-not-try-to-update-docker-compose-make-sure-to-use-the-latest-docker-compose-available">Do not try to update docker-compose, <strong>make sure to use the latest docker-compose available</strong><a class="headerlink" href="#do-not-try-to-update-docker-compose-make-sure-to-use-the-latest-docker-compose-available" title="Permanent link">&para;</a></h1>
<p>./update.sh --no-update-compose</p>
<h1 id="-do-not-start-mailcow-after-applying-an-update">- Do not start mailcow after applying an update<a class="headerlink" href="#-do-not-start-mailcow-after-applying-an-update" title="Permanent link">&para;</a></h1>
<p>./update.sh --skip-start</p>
<h1 id="-force-update-unattended-but-unsupported-use-at-own-risk">- Force update (unattended, but unsupported, use at own risk)<a class="headerlink" href="#-force-update-unattended-but-unsupported-use-at-own-risk" title="Permanent link">&para;</a></h1>
<p>./update.sh --force</p>
<h1 id="-run-garbage-collector-to-cleanup-old-image-tags-and-exit">- Run garbage collector to cleanup old image tags and exit<a class="headerlink" href="#-run-garbage-collector-to-cleanup-old-image-tags-and-exit" title="Permanent link">&para;</a></h1>
<p>./update.sh --gc</p>
<h1 id="-update-with-merge-strategy-option-ours-instead-of-theirs">- Update with merge strategy option "ours" instead of "theirs"<a class="headerlink" href="#-update-with-merge-strategy-option-ours-instead-of-theirs" title="Permanent link">&para;</a></h1>
<h1 id="this-will-solve-conflicts-when-merging-in-favor-for-your-local-changes-and-should-be-avoided-local-changes-will-always-be-kept-unless-we-changed-file-xy-too">This will <strong>solve conflicts</strong> when merging in favor for your local changes and should be avoided. Local changes will always be kept, unless we changed file XY, too.<a class="headerlink" href="#this-will-solve-conflicts-when-merging-in-favor-for-your-local-changes-and-should-be-avoided-local-changes-will-always-be-kept-unless-we-changed-file-xy-too" title="Permanent link">&para;</a></h1>
<p>./update.sh --ours</p>
<h1 id="-dont-update-but-prefetch-images-and-exit">- Don't update, but prefetch images and exit<a class="headerlink" href="#-dont-update-but-prefetch-images-and-exit" title="Permanent link">&para;</a></h1>
<p>./update.sh --prefetch
```</p>
<h3 id="i-forgot-what-i-changed-before-running-updatesh">I forgot what I changed before running update.sh<a class="headerlink" href="#i-forgot-what-i-changed-before-running-updatesh" title="Permanent link">&para;</a></h3>
<p>See <code>git log --pretty=oneline | grep -i "before update"</code>, you will have an output similar to this:</p>
<div class="highlight"><pre><span></span><code>22cd00b5e28893ef9ddef3c2b5436453cc5223ab Before update on 2020-09-28_19_25_45
dacd4fb9b51e9e1c8a37d84485b92ffaf6c59353 Before update on 2020-08-07_13_31_31
</code></pre></div>
<p><code>22cd00b5e28893ef9ddef3c2b5436453cc5223ab Before update on 2020-09-28_19_25_45
dacd4fb9b51e9e1c8a37d84485b92ffaf6c59353 Before update on 2020-08-07_13_31_31</code></p>
<p>Run <code>git diff 22cd00b5e28893ef9ddef3c2b5436453cc5223ab</code> to see what changed.</p>
<h3 id="can-i-roll-back">Can I roll back?<a class="headerlink" href="#can-i-roll-back" title="Permanent link">&para;</a></h3>
<p>Yes.</p>
<p>See the topic above, instead of a diff, you run checkout:</p>
<div class="highlight"><pre><span></span><code>docker-compose down
# Replace commit ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab by your ID
git checkout 22cd00b5e28893ef9ddef3c2b5436453cc5223ab
<p>```
docker-compose down</p>
<h1 id="replace-commit-id-22cd00b5e28893ef9ddef3c2b5436453cc5223ab-by-your-id">Replace commit ID 22cd00b5e28893ef9ddef3c2b5436453cc5223ab by your ID<a class="headerlink" href="#replace-commit-id-22cd00b5e28893ef9ddef3c2b5436453cc5223ab-by-your-id" title="Permanent link">&para;</a></h1>
<p>git checkout 22cd00b5e28893ef9ddef3c2b5436453cc5223ab
docker-compose pull
docker-compose up -d
</code></pre></div>
```</p>
<h3 id="hooks">Hooks<a class="headerlink" href="#hooks" title="Permanent link">&para;</a></h3>
<p>You can hook into the update mechanism by adding scripts called <code>pre_commit_hook.sh</code> and <code>post_commit_hook.sh</code> to your mailcows root directory. See <a href="../../manual-guides/u_e-update-hooks/">this</a> for more details.</p>
<h2 id="footnotes">Footnotes<a class="headerlink" href="#footnotes" title="Permanent link">&para;</a></h2>

Datei anzeigen

@ -2466,21 +2466,20 @@
<li>You will need to get <code>your_id</code> from one of the download links, they are individual for every user</li>
<li>
<p>Add to <code>data/conf/clamav/freshclam.conf</code> with replaced <code>your_id</code> part:
<div class="highlight"><pre><span></span><code>DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfo.hdb
<code>DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfo.hdb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfo.ign2
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/javascript.ndb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/spam_marketing.ndb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfohtml.hdb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfoascii.hdb
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfopdf.hdb
</code></pre></div></p>
DatabaseCustomURL https://www.securiteinfo.com/get/signatures/your_id/securiteinfopdf.hdb</code></p>
</li>
<li>
<p>For free SecuriteInfo databases, download speed is limited to 300 kB/s. In <code>data/conf/clamav/freshclam.conf</code>, increase the default <code>ReceiveTimeout 20</code> value to <code>ReceiveTimeout 90</code> (time in seconds), otherwise some of the database downloads could fail because of their size.</p>
</li>
<li>
<p>Adjust <code>data/conf/clamav/clamd.conf</code> to align with next settings:
<div class="highlight"><pre><span></span><code>DetectPUA yes
<code>DetectPUA yes
ExcludePUA PUA.Win.Packer
ExcludePUA PUA.Win.Trojan.Packed
ExcludePUA PUA.Win.Trojan.Molebox
@ -2492,12 +2491,11 @@ MaxRecursion 40
MaxEmbeddedPE 100M
MaxHTMLNormalize 50M
MaxScriptNormalize 50M
MaxZipTypeRcg 50M
</code></pre></div></p>
MaxZipTypeRcg 50M</code></p>
</li>
<li>Restart ClamAV container:
<div class="highlight"><pre><span></span><code>docker-compose restart clamd-mailcow
</code></pre></div></li>
<code>bash
docker-compose restart clamd-mailcow</code></li>
</ol>
<p>Please note:</p>
<ul>
@ -2509,14 +2507,13 @@ MaxZipTypeRcg 50M
<h3 id="enable-interserver-databases">Enable InterServer databases<a class="headerlink" href="#enable-interserver-databases" title="Permanent link">&para;</a></h3>
<ol>
<li>Add to <code>data/conf/clamav/freshclam.conf</code>:
<div class="highlight"><pre><span></span><code>DatabaseCustomURL http://sigs.interserver.net/interserver256.hdb
<code>DatabaseCustomURL http://sigs.interserver.net/interserver256.hdb
DatabaseCustomURL http://sigs.interserver.net/interservertopline.db
DatabaseCustomURL http://sigs.interserver.net/shell.ldb
DatabaseCustomURL http://sigs.interserver.net/whitelist.fp
</code></pre></div></li>
DatabaseCustomURL http://sigs.interserver.net/whitelist.fp</code></li>
<li>Restart ClamAV container:
<div class="highlight"><pre><span></span><code>docker-compose restart clamd-mailcow
</code></pre></div></li>
<code>bash
docker-compose restart clamd-mailcow</code></li>
</ol>
<hr>

Datei anzeigen

@ -1842,6 +1842,13 @@
Whitelist specific ClamAV signatures
</a>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-redis-mailcow-binsh" class="md-nav__link">
docker-compose exec redis-mailcow /bin/sh
</a>
</li>
</ul>
@ -2374,6 +2381,13 @@
Whitelist specific ClamAV signatures
</a>
</li>
<li class="md-nav__item">
<a href="#docker-compose-exec-redis-mailcow-binsh" class="md-nav__link">
docker-compose exec redis-mailcow /bin/sh
</a>
</li>
</ul>
@ -2394,26 +2408,25 @@
<h1>Whitelist</h1>
<h2 id="whitelist-specific-clamav-signatures">Whitelist specific ClamAV signatures<a class="headerlink" href="#whitelist-specific-clamav-signatures" title="Permanent link">&para;</a></h2>
<p>You may find that legitimate (clean) mail is being blocked by ClamAV (Rspamd will flag the mail with <code>VIRUS_FOUND</code>). For instance, interactive PDF form attachments are blocked by default because the embedded Javascript code may be used for nefarious purposes. Confirm by looking at the clamd logs, e.g.:</p>
<div class="highlight"><pre><span></span><code>docker-compose logs clamd-mailcow <span class="p">|</span> grep <span class="s2">&quot;FOUND&quot;</span>
</code></pre></div>
<p><code>bash
docker-compose logs clamd-mailcow | grep "FOUND"</code></p>
<p>This line confirms that such was identified:</p>
<div class="highlight"><pre><span></span><code>clamd-mailcow_1 | Sat Sep 28 07:43:24 2019 -&gt; instream(local): PUA.Pdf.Trojan.EmbeddedJavaScript-1(e887d2ac324ce90750768b86b63d0749:363325) FOUND
</code></pre></div>
<p><code>text
clamd-mailcow_1 | Sat Sep 28 07:43:24 2019 -&gt; instream(local): PUA.Pdf.Trojan.EmbeddedJavaScript-1(e887d2ac324ce90750768b86b63d0749:363325) FOUND</code></p>
<p>To whitelist this particular signature (and enable sending this type of file attached), add it to the ClamAV signature whitelist file:</p>
<div class="highlight"><pre><span></span><code><span class="nb">echo</span> <span class="s1">&#39;PUA.Pdf.Trojan.EmbeddedJavaScript-1&#39;</span> &gt;&gt; data/conf/clamav/whitelist.ign2
</code></pre></div>
<p><code>bash
echo 'PUA.Pdf.Trojan.EmbeddedJavaScript-1' &gt;&gt; data/conf/clamav/whitelist.ign2</code></p>
<p>Then restart the clamd-mailcow service container in the mailcow UI or using docker-compose:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart clamd-mailcow
</code></pre></div>
<p><code>bash
docker-compose restart clamd-mailcow</code></p>
<p>Cleanup cached ClamAV results in Redis:</p>
<div class="highlight"><pre><span></span><code># docker-compose exec redis-mailcow /bin/sh
/data # redis-cli KEYS rs_cl* | xargs redis-cli DEL
<p>```</p>
<h1 id="docker-compose-exec-redis-mailcow-binsh">docker-compose exec redis-mailcow /bin/sh<a class="headerlink" href="#docker-compose-exec-redis-mailcow-binsh" title="Permanent link">&para;</a></h1>
<p>/data # redis-cli KEYS rs_cl* | xargs redis-cli DEL
/data # exit
</code></pre></div>
```</p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2348,14 +2348,11 @@
<h1>Customize Dockerfiles</h1>
<p>You need to copy the override file with corresponding build tags to the mailcow: dockerized root folder (i.e. <code>/opt/mailcow-dockerized</code>):</p>
<div class="highlight"><pre><span></span><code>cp helper-scripts/docker-compose.override.yml.d/BUILD_FLAGS/docker-compose.override.yml docker-compose.override.yml
</code></pre></div>
<p><code>cp helper-scripts/docker-compose.override.yml.d/BUILD_FLAGS/docker-compose.override.yml docker-compose.override.yml</code></p>
<p>Make your changes in <code>data/Dockerfiles/$service</code> and build the image locally:</p>
<div class="highlight"><pre><span></span><code>docker build data/Dockerfiles/service -t mailcow/$service
</code></pre></div>
<p><code>docker build data/Dockerfiles/service -t mailcow/$service</code></p>
<p>Now auto-recreate modified containers:</p>
<div class="highlight"><pre><span></span><code>docker-compose up -d
</code></pre></div>
<p><code>docker-compose up -d</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2348,8 +2348,7 @@
<h1>Docker Compose Bash Completion</h1>
<p>To get some sexy bash completion inside your containers simply execute the following:</p>
<div class="highlight"><pre><span></span><code>curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
</code></pre></div>
<p><code>curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2349,8 +2349,7 @@
<p>On August the 17th, we disabled the possibility to share with "any" or "all authenticated users" by default.</p>
<p>This function can be re-enabled by setting <code>ACL_ANYONE</code> to <code>allow</code> in mailcow.conf:</p>
<div class="highlight"><pre><span></span><code>ACL_ANYONE=allow
</code></pre></div>
<p><code>ACL_ANYONE=allow</code></p>
<p>Apply the changes by running <code>docker-compose up -d</code>.</p>
<hr>

Datei anzeigen

@ -1564,6 +1564,33 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binbash" class="md-nav__link">
!/bin/bash
</a>
</li>
<li class="md-nav__item">
<a href="#path-to-mailcow-dockerized-eg-optmailcow-dockerized" class="md-nav__link">
Path to mailcow-dockerized, e.g. /opt/mailcow-dockerized
</a>
</li>
<li class="md-nav__item">
<a href="#execute-everyday-at-0400-am" class="md-nav__link">
Execute everyday at 04:00 A.M.
</a>
<nav class="md-nav" aria-label="Execute everyday at 04:00 A.M.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#via-docker-job-scheduler" class="md-nav__link">
via Docker job scheduler
@ -2418,6 +2445,33 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#binbash" class="md-nav__link">
!/bin/bash
</a>
</li>
<li class="md-nav__item">
<a href="#path-to-mailcow-dockerized-eg-optmailcow-dockerized" class="md-nav__link">
Path to mailcow-dockerized, e.g. /opt/mailcow-dockerized
</a>
</li>
<li class="md-nav__item">
<a href="#execute-everyday-at-0400-am" class="md-nav__link">
Execute everyday at 04:00 A.M.
</a>
<nav class="md-nav" aria-label="Execute everyday at 04:00 A.M.">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#via-docker-job-scheduler" class="md-nav__link">
via Docker job scheduler
@ -2448,23 +2502,17 @@
<h1>Expunge a Users mails</h1>
<p>If you want to delete old mails out of the <code>.Junk</code> or <code>.Trash</code> folders or maybe delete all read mails that are older than a certain amount of time you may use dovecot's tool doveadm <a href="https://wiki.dovecot.org/Tools/Doveadm/Expunge">man doveadm-expunge</a>.</p>
<h2 id="the-manual-way">The manual way<a class="headerlink" href="#the-manual-way" title="Permanent link">&para;</a></h2>
<p>That said, let's dive in:</p>
<p>Delete a user's mails inside the junk folder that <strong>are read</strong> and <strong>older</strong> than 4 hours</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm expunge -u &#39;mailbox@example.com&#39; mailbox &#39;Junk&#39; SEEN not SINCE 4h
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm expunge -u 'mailbox@example.com' mailbox 'Junk' SEEN not SINCE 4h</code></p>
<p>Delete <strong>all</strong> user's mails in the junk folder that are <strong>older</strong> than 7 days</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm expunge -A mailbox &#39;Junk&#39; savedbefore 7d
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm expunge -A mailbox 'Junk' savedbefore 7d</code></p>
<p>Delete <strong>all</strong> mails (of all users) in <strong>all</strong> folders that are <strong>older</strong> than 52 weeks (internal date of the mail, not the date it was saved on the system =&gt; <code>before</code> instead of <code>savedbefore</code>). Useful for deleting very old mails on all users and folders (thus especially useful for GDPR-compliance).</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm expunge -A mailbox % before 52w
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm expunge -A mailbox % before 52w</code></p>
<p>Delete mails inside a custom folder <strong>inside</strong> a user's inbox that are <strong>not</strong> flagged and <strong>older</strong> than 2 weeks</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm expunge -u &#39;mailbox@example.com&#39; mailbox &#39;INBOX/custom-folder&#39; not FLAGGED not SINCE 2w
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm expunge -u 'mailbox@example.com' mailbox 'INBOX/custom-folder' not FLAGGED not SINCE 2w</code></p>
<div class="admonition info">
<p class="admonition-title">Info</p>
<p>For possible <a href="https://wiki.dovecot.org/Tools/Doveadm/SearchQuery#section_date_specification">time spans</a> or <a href="https://wiki.dovecot.org/Tools/Doveadm/SearchQuery#section_search_keys">search keys</a> have a look at <a href="https://wiki.dovecot.org/Tools/Doveadm/SearchQuery">man doveadm-search-query</a></p>
@ -2472,44 +2520,42 @@
<h2 id="job-scheduler">Job scheduler<a class="headerlink" href="#job-scheduler" title="Permanent link">&para;</a></h2>
<h3 id="via-the-host-system-cron">via the host system cron<a class="headerlink" href="#via-the-host-system-cron" title="Permanent link">&para;</a></h3>
<p>If you want to automate such a task you can create a cron job on your host that calls a script like the one below:</p>
<div class="highlight"><pre><span></span><code>#!/bin/bash
# Path to mailcow-dockerized, e.g. /opt/mailcow-dockerized
cd /path/to/your/mailcow-dockerized
/usr/local/bin/docker-compose exec -T dovecot-mailcow doveadm expunge -A mailbox &#39;Junk&#39; savedbefore 2w
/usr/local/bin/docker-compose exec -T dovecot-mailcow doveadm expunge -A mailbox &#39;Junk&#39; SEEN not SINCE 12h
<p>```</p>
<h1 id="binbash">!/bin/bash<a class="headerlink" href="#binbash" title="Permanent link">&para;</a></h1>
<h1 id="path-to-mailcow-dockerized-eg-optmailcow-dockerized">Path to mailcow-dockerized, e.g. /opt/mailcow-dockerized<a class="headerlink" href="#path-to-mailcow-dockerized-eg-optmailcow-dockerized" title="Permanent link">&para;</a></h1>
<p>cd /path/to/your/mailcow-dockerized</p>
<p>/usr/local/bin/docker-compose exec -T dovecot-mailcow doveadm expunge -A mailbox 'Junk' savedbefore 2w
/usr/local/bin/docker-compose exec -T dovecot-mailcow doveadm expunge -A mailbox 'Junk' SEEN not SINCE 12h
[...]
</code></pre></div>
```</p>
<p>To create a cron job you may execute <code>crontab -e</code> and insert something like the following to execute a script:</p>
<div class="highlight"><pre><span></span><code># Execute everyday at 04:00 A.M.
0 4 * * * /path/to/your/expunge_mailboxes.sh
</code></pre></div>
<p>```</p>
<h1 id="execute-everyday-at-0400-am">Execute everyday at 04:00 A.M.<a class="headerlink" href="#execute-everyday-at-0400-am" title="Permanent link">&para;</a></h1>
<p>0 4 * * * /path/to/your/expunge_mailboxes.sh
```</p>
<h3 id="via-docker-job-scheduler">via Docker job scheduler<a class="headerlink" href="#via-docker-job-scheduler" title="Permanent link">&para;</a></h3>
<p>To archive this with a docker job scheduler use this docker-compose.override.yml with your mailcow: </p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
services:
ofelia:
<p>```
version: '2.1'</p>
<p>services:</p>
<p>ofelia:
image: mcuadros/ofelia:latest
restart: always
command: daemon --docker
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
network_mode: none
dovecot-mailcow:
- /var/run/docker.sock:/var/run/docker.sock:ro <br />
network_mode: none</p>
<p>dovecot-mailcow:
labels:
- &quot;ofelia.enabled=true&quot;
- &quot;ofelia.job-exec.dovecot-expunge-trash.schedule=0 4 * * *&quot;
- &quot;ofelia.job-exec.dovecot-expunge-trash.command=doveadm expunge -A mailbox &#39;Junk&#39; savedbefore 2w&quot;
- &quot;ofelia.job-exec.dovecot-expunge-trash.tty=false&quot;
</code></pre></div>
- "ofelia.enabled=true"
- "ofelia.job-exec.dovecot-expunge-trash.schedule=0 4 * * *"
- "ofelia.job-exec.dovecot-expunge-trash.command=doveadm expunge -A mailbox 'Junk' savedbefore 2w"
- "ofelia.job-exec.dovecot-expunge-trash.tty=false"</p>
<p>```</p>
<p>The job controller just need access to the docker control socket to be able to emulate the behavior of "exec". Then we add a few label to our dovecot-container to activate the job scheduler and tell him in a cron compatible scheduling format when to run. If you struggle with that schedule string you can use <a href="https://crontab.guru/">crontab guru</a>.
This docker-compose.override.yml deletes all mails older then 2 weeks from the "Junk" folder every day at 4 am. To see if things ran proper, you can not only see in your mailbox but also check Ofelia's docker log if it looks something like this:</p>
<div class="highlight"><pre><span></span><code>common.go:124 ▶ NOTICE [Job &quot;dovecot-expunge-trash&quot; (8759567efa66)] Started - doveadm expunge -A mailbox &#39;Junk&#39; savedbefore 2w,
common.go:124 ▶ NOTICE [Job &quot;dovecot-expunge-trash&quot; (8759567efa66)] Finished in &quot;285.032291ms&quot;, failed: false, skipped: false, error: none,
</code></pre></div>
<p><code>common.go:124 ▶ NOTICE [Job "dovecot-expunge-trash" (8759567efa66)] Started - doveadm expunge -A mailbox 'Junk' savedbefore 2w,
common.go:124 ▶ NOTICE [Job "dovecot-expunge-trash" (8759567efa66)] Finished in "285.032291ms", failed: false, skipped: false, error: none,</code></p>
<p>If it failed it will say so and give you the output of the doveadm in the log to make it easy on you to debug.</p>
<p>In case you want to add more jobs, ensure you change the "dovecot-expunge-trash" part after "ofelia.job-exec." to something else, it defines the name of the job. Syntax of the labels you find at <a href="https://github.com/mcuadros/ofelia">mcuadros/ofelia</a>.</p>

Datei anzeigen

@ -2349,8 +2349,7 @@
<p>Create a file <code>data/conf/dovecot/extra.conf</code> - if missing - and add your additional content here.</p>
<p>Restart <code>dovecot-mailcow</code> to apply your changes:</p>
<div class="highlight"><pre><span></span><code>docker-compose restart dovecot-mailcow
</code></pre></div>
<p><code>docker-compose restart dovecot-mailcow</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -1571,6 +1571,40 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#single-user" class="md-nav__link">
single user
</a>
</li>
<li class="md-nav__item">
<a href="#all-users" class="md-nav__link">
all users
</a>
</li>
<li class="md-nav__item">
<a href="#single-user_1" class="md-nav__link">
single user
</a>
</li>
<li class="md-nav__item">
<a href="#all-users-but-obviously-slower-and-more-dangerous" class="md-nav__link">
all users, but obviously slower and more dangerous
</a>
<nav class="md-nav" aria-label="all users, but obviously slower and more dangerous">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#delete-mailbox-data" class="md-nav__link">
Delete mailbox data
@ -2404,6 +2438,40 @@
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#single-user" class="md-nav__link">
single user
</a>
</li>
<li class="md-nav__item">
<a href="#all-users" class="md-nav__link">
all users
</a>
</li>
<li class="md-nav__item">
<a href="#single-user_1" class="md-nav__link">
single user
</a>
</li>
<li class="md-nav__item">
<a href="#all-users-but-obviously-slower-and-more-dangerous" class="md-nav__link">
all users, but obviously slower and more dangerous
</a>
<nav class="md-nav" aria-label="all users, but obviously slower and more dangerous">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#delete-mailbox-data" class="md-nav__link">
Delete mailbox data
@ -2434,8 +2502,6 @@
<h1>FTS (Solr)</h1>
<h2 id="fts-solr">FTS Solr<a class="headerlink" href="#fts-solr" title="Permanent link">&para;</a></h2>
<p>Solr is used for setups with memory &gt;= 3.5 GiB to provide full-text search in Dovecot.</p>
<p>Please be aware that applications like Solr <em>may</em> need maintenance from time to time.</p>
@ -2443,19 +2509,21 @@
<p>The default heap size (1024 M) is defined in mailcow.conf.</p>
<p>Since we run in Docker and create our containers with the "restart: always" flag, a oom situation will at least only trigger a restart of the container.</p>
<h3 id="fts-related-dovecot-commands">FTS related Dovecot commands<a class="headerlink" href="#fts-related-dovecot-commands" title="Permanent link">&para;</a></h3>
<div class="highlight"><pre><span></span><code># single user
docker-compose exec dovecot-mailcow doveadm fts rescan -u user@domain
# all users
docker-compose exec dovecot-mailcow doveadm fts rescan -A
</code></pre></div>
<p>```</p>
<h1 id="single-user">single user<a class="headerlink" href="#single-user" title="Permanent link">&para;</a></h1>
<p>docker-compose exec dovecot-mailcow doveadm fts rescan -u user@domain</p>
<h1 id="all-users">all users<a class="headerlink" href="#all-users" title="Permanent link">&para;</a></h1>
<p>docker-compose exec dovecot-mailcow doveadm fts rescan -A
```</p>
<p>Dovecot Wiki: "Scan what mails exist in the full text search index and compare those to what actually exist in mailboxes. This removes mails from the index that have already been expunged and makes sure that the next doveadm index will index all the missing mails (if any)."</p>
<p>This does <strong>not</strong> re-index a mailbox. It basically repairs a given index.</p>
<p>If you want to re-index data immediately, you can run the followig command, where '*' can also be a mailbox mask like 'Sent'. You do not need to run these commands, but it will speed things up a bit:</p>
<div class="highlight"><pre><span></span><code># single user
docker-compose exec dovecot-mailcow doveadm index -u user@domain &#39;*&#39;
# all users, but obviously slower and more dangerous
docker-compose exec dovecot-mailcow doveadm index -A &#39;*&#39;
</code></pre></div>
<p>```</p>
<h1 id="single-user_1">single user<a class="headerlink" href="#single-user_1" title="Permanent link">&para;</a></h1>
<p>docker-compose exec dovecot-mailcow doveadm index -u user@domain '*'</p>
<h1 id="all-users-but-obviously-slower-and-more-dangerous">all users, but obviously slower and more dangerous<a class="headerlink" href="#all-users-but-obviously-slower-and-more-dangerous" title="Permanent link">&para;</a></h1>
<p>docker-compose exec dovecot-mailcow doveadm index -A '*'
```</p>
<p>This <strong>will</strong> take some time depending on your machine and Solr can run oom, monitor it!</p>
<p>Because re-indexing is very sensible, we did not include it to mailcow UI. You will need to take care of any errors while re-indexing a mailbox.</p>
<h3 id="delete-mailbox-data">Delete mailbox data<a class="headerlink" href="#delete-mailbox-data" title="Permanent link">&para;</a></h3>

Datei anzeigen

@ -2462,8 +2462,7 @@
<h3 id="change-configuration">Change configuration<a class="headerlink" href="#change-configuration" title="Permanent link">&para;</a></h3>
<p>Create a new file <code>data/conf/dovecot/extra.conf</code> (or edit it if it already exists).
Insert the setting followed by the new value. For example, to set the interval to 5 minutes you could type:</p>
<div class="highlight"><pre><span></span><code>imap_idle_notify_interval = 5 mins
</code></pre></div>
<p><code>imap_idle_notify_interval = 5 mins</code></p>
<p>29 minutes is the maximum value allowed by the <a href="https://tools.ietf.org/html/rfc2177">corresponding RFC</a>.</p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
@ -2471,13 +2470,11 @@ Insert the setting followed by the new value. For example, to set the interval t
</div>
<h3 id="reload-dovecot">Reload Dovecot<a class="headerlink" href="#reload-dovecot" title="Permanent link">&para;</a></h3>
<p>Now reload Dovecot:
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow dovecot reload
</code></pre></div></p>
<code>docker-compose exec dovecot-mailcow dovecot reload</code></p>
<div class="admonition info">
<p class="admonition-title">Info</p>
<p>You can check the value of this setting with
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow dovecot -a | grep &quot;imap_idle_notify_interval&quot;
</code></pre></div>
<code>docker-compose exec dovecot-mailcow dovecot -a | grep "imap_idle_notify_interval"</code>
If you didn't change it, it should be at 2m. If you did change it, you should see your new value.</p>
</div>

Datei anzeigen

@ -66,6 +66,11 @@
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#decrypt-varvmail" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
@ -1556,6 +1561,8 @@
<input class="md-nav__toggle md-toggle" data-md-toggle="toc" type="checkbox" id="__toc">
<a href="./" class="md-nav__link md-nav__link--active">
Mail crypt
@ -2328,6 +2335,8 @@
</nav>
</div>
@ -2345,36 +2354,34 @@
<h1>Mail crypt</h1>
<p>Mails are stored compressed (lz4) and encrypted. The key pair can be found in crypt-vol-1.</p>
<p>If you want to decode/encode existing maildir files, you can use the following script at your own risk:</p>
<p>Enter Dovecot by running <code>docker-compose exec dovecot-mailcow /bin/bash</code> in the mailcow-dockerized location.</p>
<div class="highlight"><pre><span></span><code># Decrypt /var/vmail
find /var/vmail/ -type f -regextype egrep -regex &#39;.*S=.*W=.*&#39; | while read -r file; do
if [[ $(head -c7 &quot;$file&quot;) == &quot;CRYPTED&quot; ]]; then
<p>```</p>
<h1 id="decrypt-varvmail">Decrypt /var/vmail<a class="headerlink" href="#decrypt-varvmail" title="Permanent link">&para;</a></h1>
<p>find /var/vmail/ -type f -regextype egrep -regex '.<em>S=.</em>W=.*' | while read -r file; do
if [[ $(head -c7 "$file") == "CRYPTED" ]]; then
doveadm fs get compress lz4:0:crypt:private_key_path=/mail_crypt/ecprivkey.pem:public_key_path=/mail_crypt/ecpubkey.pem:posix:prefix=/ \
&quot;$file&quot; &gt; &quot;/tmp/$(basename &quot;$file&quot;)&quot;
if [[ -s &quot;/tmp/$(basename &quot;$file&quot;)&quot; ]]; then
chmod 600 &quot;/tmp/$(basename &quot;$file&quot;)&quot;
chown 5000:5000 &quot;/tmp/$(basename &quot;$file&quot;)&quot;
mv &quot;/tmp/$(basename &quot;$file&quot;)&quot; &quot;$file&quot;
"$file" &gt; "/tmp/$(basename "$file")"
if [[ -s "/tmp/$(basename "$file")" ]]; then
chmod 600 "/tmp/$(basename "$file")"
chown 5000:5000 "/tmp/$(basename "$file")"
mv "/tmp/$(basename "$file")" "$file"
else
rm &quot;/tmp/$(basename &quot;$file&quot;)&quot;
rm "/tmp/$(basename "$file")"
fi
fi
done
# Encrypt /var/vmail
find /var/vmail/ -type f -regextype egrep -regex &#39;.*S=.*W=.*&#39; | while read -r file; do
if [[ $(head -c7 &quot;$file&quot;) != &quot;CRYPTED&quot; ]]; then
done</p>
<h1 id="encrypt-varvmail">Encrypt /var/vmail<a class="headerlink" href="#encrypt-varvmail" title="Permanent link">&para;</a></h1>
<p>find /var/vmail/ -type f -regextype egrep -regex '.<em>S=.</em>W=.*' | while read -r file; do
if [[ $(head -c7 "$file") != "CRYPTED" ]]; then
doveadm fs put crypt private_key_path=/mail_crypt/ecprivkey.pem:public_key_path=/mail_crypt/ecpubkey.pem:posix:prefix=/ \
&quot;$file&quot; &quot;$file&quot;
chmod 600 &quot;$file&quot;
chown 5000:5000 &quot;$file&quot;
"$file" "$file"
chmod 600 "$file"
chown 5000:5000 "$file"
fi
done
</code></pre></div>
```</p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2414,25 +2414,19 @@
<h2 id="doveadm-quota">doveadm quota<a class="headerlink" href="#doveadm-quota" title="Permanent link">&para;</a></h2>
<p>The <code>quota get</code> and <code>quota recalc</code><sup id="fnref:1"><a class="footnote-ref" href="#fn:1">1</a></sup> commands are used to display or recalculate the current user's quota usage. The reported values are in <em>kilobytes</em>.</p>
<p>To list the current quota status for a user / mailbox, do:</p>
<div class="highlight"><pre><span></span><code>doveadm quota get -u &#39;mailbox@example.org&#39;
</code></pre></div>
<p><code>doveadm quota get -u 'mailbox@example.org'</code></p>
<p>To list the quota storage value for <strong>all</strong> users, do:</p>
<div class="highlight"><pre><span></span><code>doveadm quota get -A |grep &quot;STORAGE&quot;
</code></pre></div>
<p><code>doveadm quota get -A |grep "STORAGE"</code></p>
<p>Recalculate a single user's quota usage:</p>
<div class="highlight"><pre><span></span><code>doveadm quota recalc -u &#39;mailbox@example.org&#39;
</code></pre></div>
<p><code>doveadm quota recalc -u 'mailbox@example.org'</code></p>
<h2 id="doveadm-search">doveadm search<a class="headerlink" href="#doveadm-search" title="Permanent link">&para;</a></h2>
<p>The <code>doveadm search</code><sup id="fnref:2"><a class="footnote-ref" href="#fn:2">2</a></sup> command is used to find messages matching your query. It can return the username, mailbox-GUID / -UID and message-GUIDs / -UIDs.</p>
<p>To view the number of messages, by user, in their <strong>.Trash</strong> folder:</p>
<div class="highlight"><pre><span></span><code>doveadm search -A mailbox &#39;Trash&#39; | awk &#39;{print $1}&#39; | sort | uniq -c
</code></pre></div>
<p><code>doveadm search -A mailbox 'Trash' | awk '{print $1}' | sort | uniq -c</code></p>
<p>Show all messages in a user's <strong>inbox</strong> older then 90 days:</p>
<div class="highlight"><pre><span></span><code>doveadm search -u &#39;mailbox@example.org&#39; mailbox &#39;INBOX&#39; savedbefore 90d
</code></pre></div>
<p><code>doveadm search -u 'mailbox@example.org' mailbox 'INBOX' savedbefore 90d</code></p>
<p>Show <strong>all messages</strong> in <strong>any folder</strong> that are <strong>older</strong> then 30 days for <code>mailbox@example.org</code>:</p>
<div class="highlight"><pre><span></span><code>doveadm search -u &#39;mailbox@example.org&#39; mailbox &quot;*&quot; savedbefore 30d
</code></pre></div>
<p><code>doveadm search -u 'mailbox@example.org' mailbox "*" savedbefore 30d</code></p>
<div class="footnote">
<hr />
<ol>

Datei anzeigen

@ -2398,28 +2398,25 @@
<p>Create a new public namespace "Public" and a mailbox "Develcow" inside that namespace:</p>
<p>Edit or create <code>data/conf/dovecot/extra.conf</code>, add:</p>
<div class="highlight"><pre><span></span><code>namespace {
<p><code>namespace {
type = public
separator = /
prefix = Public/
location = maildir:/var/vmail/public:INDEXPVT=~/public
subscriptions = yes
mailbox &quot;Develcow&quot; {
mailbox "Develcow" {
auto = subscribe
}
}
</code></pre></div>
}</code></p>
<p><code>:INDEXPVT=~/public</code> can be omitted if per-user seen flags are not wanted.</p>
<p>The new mailbox in the public namespace will be auto-subscribed by users.</p>
<p>To allow all authenticated users access full to that new mailbox (not the whole namespace), run:</p>
<div class="highlight"><pre><span></span><code>docker-compose exec dovecot-mailcow doveadm acl set -A &quot;Public/Develcow&quot; &quot;authenticated&quot; lookup read write write-seen write-deleted insert post delete expunge create
</code></pre></div>
<p><code>docker-compose exec dovecot-mailcow doveadm acl set -A "Public/Develcow" "authenticated" lookup read write write-seen write-deleted insert post delete expunge create</code></p>
<p>Adjust the command to your needs if you like to assign more granular rights per user (use <code>-u user@domain</code> instead of <code>-A</code> for example).</p>
<h2 id="allow-authenticated-users-access-to-the-whole-public-namespace">Allow authenticated users access to the whole public namespace<a class="headerlink" href="#allow-authenticated-users-access-to-the-whole-public-namespace" title="Permanent link">&para;</a></h2>
<p>To allow all authenticated users access full access to the whole public namespace and its subfolders, create a new <code>dovecot-acl</code> file in the namespace root directory:</p>
<p>Open/edit/create <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data/public/dovecot-acl</code> (adjust the path accordingly) to create the global ACL file with the following content:</p>
<div class="highlight"><pre><span></span><code>authenticated kxeilprwts
</code></pre></div>
<p><code>authenticated kxeilprwts</code></p>
<p><code>kxeilprwts</code> equals to <code>lookup read write write-seen write-deleted insert post delete expunge create</code>.</p>
<p>You can use <code>doveadm acl set -u user@domain "Public/Develcow" user=user@domain lookup read</code> to limit access for a single user. You may also turn it around to limit access for all users to "lr" and grant only some users full access.</p>
<p>See <a href="https://doc.dovecot.org/settings/plugin/acl/">Dovecot ACL</a> for further information about ACL.</p>

Datei anzeigen

@ -2351,9 +2351,8 @@
<p><strong>That's recommended and should not be changed.</strong></p>
<p>If you need the user to be static anyway, please specify two variables in <code>mailcow.conf</code>.</p>
<p><strong>Both</strong> parameters must not be empty!</p>
<div class="highlight"><pre><span></span><code>DOVECOT_MASTER_USER=mymasteruser
DOVECOT_MASTER_PASS=mysecretpass
</code></pre></div>
<p><code>DOVECOT_MASTER_USER=mymasteruser
DOVECOT_MASTER_PASS=mysecretpass</code></p>
<p>Run <code>docker-compose up -d</code> to apply your changes.</p>
<p>The static master username will be expanded to <code>DOVECOT_MASTER_USER@mailcow.local</code>.</p>
<p>To login as <code>test@example.org</code> this would equal to <code>test@example.org*mymasteruser@mailcow.local</code> with the specified password above.</p>

Datei anzeigen

@ -2442,41 +2442,39 @@
<p>Newer Docker versions seem to complain about existing volumes. You can fix this temporarily by removing the existing volume and start mailcow with the override file. But it seems to be problematic after a reboot (needs to be confirmed).</p>
</div>
<p>An easy, dirty, yet stable workaround is to stop mailcow (<code>docker-compose down</code>), remove <code>/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data</code> and create a new link to your remote filesystem location, for example:</p>
<div class="highlight"><pre><span></span><code>mv /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data_backup
ln -s /mnt/volume-xy/vmail_data /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data
</code></pre></div>
<p><code>mv /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data_backup
ln -s /mnt/volume-xy/vmail_data /var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data</code></p>
<p>Start mailcow afterwards.</p>
<hr />
<h2 id="the-old-way">The "old" way<a class="headerlink" href="#the-old-way" title="Permanent link">&para;</a></h2>
<p>If you want to use another folder for the vmail-volume, you can create a <code>docker-compose.override.yml</code> file and add the following content:</p>
<div class="highlight"><pre><span></span><code>version: &#39;2.1&#39;
<p><code>version: '2.1'
volumes:
vmail-vol-1:
driver_opts:
type: none
device: /data/mailcow/vmail
o: bind
</code></pre></div>
o: bind</code></p>
<h3 id="moving-an-existing-vmail-folder">Moving an existing vmail folder:<a class="headerlink" href="#moving-an-existing-vmail-folder" title="Permanent link">&para;</a></h3>
<ul>
<li>Locate the current vmail folder by its "Mountpoint" attribute: <code>docker volume inspect mailcowdockerized_vmail-vol-1</code></li>
</ul>
<div class="highlight"><pre><span></span><code>[
<p><code>hl_lines="10"
[
{
&quot;CreatedAt&quot;: &quot;2019-06-16T22:08:34+02:00&quot;,
&quot;Driver&quot;: &quot;local&quot;,
&quot;Labels&quot;: {
&quot;com.docker.compose.project&quot;: &quot;mailcowdockerized&quot;,
&quot;com.docker.compose.version&quot;: &quot;1.23.2&quot;,
&quot;com.docker.compose.volume&quot;: &quot;vmail-vol-1&quot;
"CreatedAt": "2019-06-16T22:08:34+02:00",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "mailcowdockerized",
"com.docker.compose.version": "1.23.2",
"com.docker.compose.volume": "vmail-vol-1"
},
<span class="hll"> &quot;Mountpoint&quot;: &quot;/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data&quot;,
</span> &quot;Name&quot;: &quot;mailcowdockerized_vmail-vol-1&quot;,
&quot;Options&quot;: null,
&quot;Scope&quot;: &quot;local&quot;
"Mountpoint": "/var/lib/docker/volumes/mailcowdockerized_vmail-vol-1/_data",
"Name": "mailcowdockerized_vmail-vol-1",
"Options": null,
"Scope": "local"
}
]
</code></pre></div>
]</code></p>
<ul>
<li>Copy the content of the <code>Mountpoint</code> folder to the new location (e.g. <code>/data/mailcow/vmail</code>) using <code>cp -a</code>, <code>rsync -a</code> or a similar non strcuture breaking copy command</li>
<li>Stop mailcow by executing <code>docker-compose down</code> from within your mailcow root folder (e.g. <code>/opt/mailcow-dockerized</code>)</li>

Datei anzeigen

@ -2444,9 +2444,9 @@
<h2 id="new-site">New site<a class="headerlink" href="#new-site" title="Permanent link">&para;</a></h2>
<p>To create persistent (over updates) sites hosted by mailcow: dockerized, a new site configuration must be placed inside <code>data/conf/nginx/</code>:</p>
<p>A good template to begin with:</p>
<div class="highlight"><pre><span></span><code>nano data/conf/nginx/my_custom_site.conf
</code></pre></div>
<div class="highlight"><pre><span></span><code>server {
<p><code>nano data/conf/nginx/my_custom_site.conf</code></p>
<p>``` hl_lines="16"
server {
ssl_certificate /etc/ssl/mail/cert.pem;
ssl_certificate_key /etc/ssl/mail/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
@ -2461,29 +2461,27 @@
# Location: data/web
root /web;
# Location: data/web/mysite.com
<span class="hll"> #root /web/mysite.com
</span> include /etc/nginx/conf.d/listen_plain.active;
#root /web/mysite.com
include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/conf.d/listen_ssl.active;
server_name mysite.example.org;
server_tokens off;
# This allows acme to be validated even with a different web root
server_tokens off;</p>
<p># This allows acme to be validated even with a different web root
location ^~ /.well-known/acme-challenge/ {
default_type &quot;text/plain&quot;;
default_type "text/plain";
rewrite /.well-known/acme-challenge/(.*) /$1 break;
root /web/.well-known/acme-challenge/;
}
if ($scheme = http) {
}</p>
<p>if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
}
</code></pre></div>
```</p>
<h2 id="new-site-with-proxy-to-a-remote-location">New site with proxy to a remote location<a class="headerlink" href="#new-site-with-proxy-to-a-remote-location" title="Permanent link">&para;</a></h2>
<p>Another example with a reverse proxy configuration:</p>
<div class="highlight"><pre><span></span><code>nano data/conf/nginx/my_custom_site.conf
</code></pre></div>
<div class="highlight"><pre><span></span><code>server {
<p><code>nano data/conf/nginx/my_custom_site.conf</code></p>
<p>``` hl_lines="16 28"
server {
ssl_certificate /etc/ssl/mail/cert.pem;
ssl_certificate_key /etc/ssl/mail/key.pem;
ssl_protocols TLSv1.2 TLSv1.3;
@ -2498,20 +2496,17 @@
root /web;
include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/conf.d/listen_ssl.active;
<span class="hll"> server_name example.domain.tld;
</span> server_tokens off;
location ^~ /.well-known/acme-challenge/ {
server_name example.domain.tld;
server_tokens off;</p>
<p>location ^~ /.well-known/acme-challenge/ {
allow all;
default_type &quot;text/plain&quot;;
}
if ($scheme = http) {
default_type "text/plain";
}</p>
<p>if ($scheme = http) {
return 301 https://$host$request_uri;
}
<span class="hll"> location / {
</span> proxy_pass http://service:3000/;
}</p>
<p>location / {
proxy_pass <a href="http://service:3000/">http://service:3000/</a>;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
@ -2519,18 +2514,16 @@
client_max_body_size 0;
}
}
</code></pre></div>
```</p>
<h2 id="config-expansion-in-mailcows-nginx">Config expansion in mailcows Nginx<a class="headerlink" href="#config-expansion-in-mailcows-nginx" title="Permanent link">&para;</a></h2>
<p>The filename used for a new site is not important, as long as the filename carries a .conf extension.</p>
<p>It is also possible to extend the configuration of the default file <code>site.conf</code> file:</p>
<div class="highlight"><pre><span></span><code>nano data/conf/nginx/site.my_content.custom
</code></pre></div>
<p><code>nano data/conf/nginx/site.my_content.custom</code></p>
<p>This filename does not need to have a ".conf" extension but follows the pattern <code>site.*.custom</code>, where <code>*</code> is a custom name.</p>
<p>If PHP is to be included in a custom site, please use the PHP-FPM listener on phpfpm:9002 or create a new listener in <code>data/conf/phpfpm/php-fpm.d/pools.conf</code>.</p>
<p>Restart Nginx (and PHP-FPM, if a new listener was created):</p>
<div class="highlight"><pre><span></span><code>docker-compose restart nginx-mailcow
docker-compose restart php-fpm-mailcow
</code></pre></div>
<p><code>docker-compose restart nginx-mailcow
docker-compose restart php-fpm-mailcow</code></p>
<hr>
<div class="md-source-file">

Datei anzeigen

@ -2350,7 +2350,8 @@
<p><strong>IMPORTANT</strong>: This guide only applies to non SNI enabled configurations. The certificate path needs to be adjusted if SNI is enabled. Something like <code>ssl_certificate,key /etc/ssl/mail/webmail.example.org/cert.pem,key.pem;</code> will do. <strong>But</strong>: The certificate should be acquired <strong>first</strong> and only after the certificate exists a site config should be created. Nginx will fail to start if it cannot find the certificate and key.</p>
<p>To create a subdomain <code>webmail.example.org</code> and redirect it to SOGo, you need to create a <strong>new</strong> Nginx site. Take care of "CHANGE_TO_MAILCOW_HOSTNAME"!</p>
<p><strong>nano data/conf/nginx/webmail.conf</strong></p>
<div class="highlight"><pre><span></span><code>server {
<p>``` hl_lines="9 17"
server {
ssl_certificate /etc/ssl/mail/cert.pem;
ssl_certificate_key /etc/ssl/mail/key.pem;
index index.php index.html;
@ -2358,23 +2359,21 @@
root /web;
include /etc/nginx/conf.d/listen_plain.active;
include /etc/nginx/conf.d/listen_ssl.active;
<span class="hll"> server_name webmail.example.org;
</span> server_tokens off;
server_name webmail.example.org;
server_tokens off;
location ^~ /.well-known/acme-challenge/ {
allow all;
default_type &quot;text/plain&quot;;
default_type "text/plain";
}</p>
<p>location / {
return 301 <a href="https://CHANGE_TO_MAILCOW_HOSTNAME/SOGo">https://CHANGE_TO_MAILCOW_HOSTNAME/SOGo</a>;
}
location / {
<span class="hll"> return 301 https://CHANGE_TO_MAILCOW_HOSTNAME/SOGo;
</span> }
}
</code></pre></div>
```</p>
<p>Save and restart Nginx: <code>docker-compose restart nginx-mailcow</code>.</p>
<p>Now open <code>mailcow.conf</code> and find <code>ADDITIONAL_SAN</code>.
Add <code>webmail.example.org</code> to this array, don't use quotes!</p>
<div class="highlight"><pre><span></span><code>ADDITIONAL_SAN=webmail.example.org
</code></pre></div>
<p><code>ADDITIONAL_SAN=webmail.example.org</code></p>
<p>Run <code>docker-compose up -d</code>. See "acme-mailcow" and "nginx-mailcow" logs if anything fails.</p>
<hr>

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden Mehr anzeigen