Merge branch 'staging' into nightly

This commit is contained in:
DerLinkman 2024-08-13 16:03:30 +02:00
commit 3396e1b427
No known key found for this signature in database
GPG Key ID: AA4A82514748F5A9
14 changed files with 185 additions and 85 deletions

View File

@ -1,13 +1,13 @@
FROM debian:bullseye-slim FROM debian:bookworm-slim
LABEL maintainer="The Infrastructure Company GmbH <info@servercow.de>" LABEL maintainer="The Infrastructure Company GmbH <info@servercow.de>"
ARG DEBIAN_FRONTEND=noninteractive ARG DEBIAN_FRONTEND=noninteractive
ARG DEBIAN_VERSION=bullseye ARG DEBIAN_VERSION=bookworm
ARG SOGO_DEBIAN_REPOSITORY=http://www.axis.cz/linux/debian ARG SOGO_DEBIAN_REPOSITORY=http://www.axis.cz/linux/debian
# renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced extractVersion=^(?<version>.*)$ # renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced extractVersion=^(?<version>.*)$
ARG GOSU_VERSION=1.17 ARG GOSU_VERSION=1.17
ENV LC_ALL C ENV LC_ALL=C
# Prerequisites # Prerequisites
RUN echo "Building from repository $SOGO_DEBIAN_REPOSITORY" \ RUN echo "Building from repository $SOGO_DEBIAN_REPOSITORY" \

View File

@ -1,4 +1,4 @@
@version: 3.28 @version: 3.38
@include "scl.conf" @include "scl.conf"
options { options {
chain_hostnames(off); chain_hostnames(off);

View File

@ -1,4 +1,4 @@
@version: 3.28 @version: 3.38
@include "scl.conf" @include "scl.conf"
options { options {
chain_hostnames(off); chain_hostnames(off);

View File

@ -5,11 +5,14 @@ LABEL maintainer = "The Infrastructure Company GmbH <info@servercow.de>"
RUN apk add --update --no-cache \ RUN apk add --update --no-cache \
curl \ curl \
bind-tools \ bind-tools \
coreutils \
unbound \ unbound \
bash \ bash \
openssl \ openssl \
drill \ drill \
tzdata \ tzdata \
syslog-ng \
supervisor \
&& curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache \ && curl -o /etc/unbound/root.hints https://www.internic.net/domain/named.cache \
&& chown root:unbound /etc/unbound \ && chown root:unbound /etc/unbound \
&& adduser unbound tty \ && adduser unbound tty \
@ -21,9 +24,13 @@ COPY docker-entrypoint.sh /docker-entrypoint.sh
# healthcheck (dig, ping) # healthcheck (dig, ping)
COPY healthcheck.sh /healthcheck.sh COPY healthcheck.sh /healthcheck.sh
COPY syslog-ng.conf /etc/syslog-ng/syslog-ng.conf
COPY supervisord.conf /etc/supervisor/supervisord.conf
COPY stop-supervisor.sh /usr/local/sbin/stop-supervisor.sh
RUN chmod +x /healthcheck.sh RUN chmod +x /healthcheck.sh
HEALTHCHECK --interval=30s --timeout=30s CMD [ "/healthcheck.sh" ] HEALTHCHECK --interval=30s --timeout=10s \
CMD sh -c '[ -f /tmp/healthcheck_status ] && [ "$(cat /tmp/healthcheck_status)" -eq 0 ] || exit 1'
ENTRYPOINT ["/docker-entrypoint.sh"] ENTRYPOINT ["/docker-entrypoint.sh"]
CMD exec /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
CMD ["/usr/sbin/unbound"]

View File

@ -1,76 +1,102 @@
#!/bin/bash #!/bin/bash
# Skip Unbound (DNS Resolver) Healthchecks (NOT Recommended!) STATUS_FILE="/tmp/healthcheck_status"
if [[ "${SKIP_UNBOUND_HEALTHCHECK}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then RUNS=0
SKIP_UNBOUND_HEALTHCHECK=y
fi
# Reset logfile # Declare log function for logfile to stdout
echo "$(date +"%Y-%m-%d %H:%M:%S"): Starting health check - logs can be found in /var/log/healthcheck.log" function log_to_stdout() {
echo "$(date +"%Y-%m-%d %H:%M:%S"): Starting health check" > /var/log/healthcheck.log echo "$(date +"%Y-%m-%d %H:%M:%S"): $1"
# Declare log function for logfile inside container
function log_to_file() {
echo "$(date +"%Y-%m-%d %H:%M:%S"): $1" >> /var/log/healthcheck.log
} }
# General Ping function to check general pingability # General Ping function to check general pingability
function check_ping() { function check_ping() {
declare -a ipstoping=("1.1.1.1" "8.8.8.8" "9.9.9.9") declare -a ipstoping=("1.1.1.1" "8.8.8.8" "9.9.9.9")
local fail_tolerance=1
local failures=0
for ip in "${ipstoping[@]}" ; do for ip in "${ipstoping[@]}" ; do
ping -q -c 3 -w 5 "$ip" success=false
if [ $? -ne 0 ]; then for ((i=1; i<=3; i++)); do
log_to_file "Healthcheck: Couldn't ping $ip for 5 seconds... Gave up!" ping -q -c 3 -w 5 "$ip" > /dev/null
log_to_file "Please check your internet connection or firewall rules to fix this error, because a simple ping test should always go through from the unbound container!" if [ $? -eq 0 ]; then
return 1 success=true
break
else
log_to_stdout "Healthcheck: Failed to ping $ip on attempt $i. Trying again..."
fi fi
done done
log_to_file "Healthcheck: Ping Checks WORKING properly!" if [ "$success" = false ]; then
log_to_stdout "Healthcheck: Couldn't ping $ip after 3 attempts. Marking this IP as failed."
((failures++))
fi
done
if [ $failures -gt $fail_tolerance ]; then
log_to_stdout "Healthcheck: Too many ping failures ($fail_tolerance failures allowed, you got $failures failures), marking Healthcheck as unhealthy..."
return 1
fi
return 0 return 0
} }
# General DNS Resolve Check against Unbound Resolver himself # General DNS Resolve Check against Unbound Resolver himself
function check_dns() { function check_dns() {
declare -a domains=("mailcow.email" "github.com" "hub.docker.com") declare -a domains=("fuzzy.mailcow.email" "github.com" "hub.docker.com")
local fail_tolerance=1
local failures=0
for domain in "${domains[@]}" ; do for domain in "${domains[@]}" ; do
success=false
for ((i=1; i<=3; i++)); do for ((i=1; i<=3; i++)); do
dig +short +timeout=2 +tries=1 "$domain" @127.0.0.1 > /dev/null dig_output=$(dig +short +timeout=2 +tries=1 "$domain" @127.0.0.1 2>/dev/null)
if [ $? -ne 0 ]; then dig_rc=$?
log_to_file "Healthcheck: DNS Resolution Failed on $i attempt! Trying again..."
if [ $i -eq 3 ]; then if [ $dig_rc -ne 0 ] || [ -z "$dig_output" ]; then
log_to_file "Healthcheck: DNS Resolution not possible after $i attempts... Gave up!" log_to_stdout "Healthcheck: DNS Resolution Failed on attempt $i for $domain! Trying again..."
log_to_file "Maybe check your outbound firewall, as it needs to resolve DNS over TCP AND UDP!" else
success=true
break
fi
done
if [ "$success" = false ]; then
log_to_stdout "Healthcheck: DNS Resolution not possible after 3 attempts for $domain... Gave up!"
((failures++))
fi
done
if [ $failures -gt $fail_tolerance ]; then
log_to_stdout "Healthcheck: Too many DNS failures ($fail_tolerance failures allowed, you got $failures failures), marking Healthcheck as unhealthy..."
return 1 return 1
fi fi
fi
done
done
log_to_file "Healthcheck: DNS Resolver WORKING properly!"
return 0 return 0
} }
while true; do
if [[ ${SKIP_UNBOUND_HEALTHCHECK} == "y" ]]; then if [[ ${SKIP_UNBOUND_HEALTHCHECK} == "y" ]]; then
log_to_file "Healthcheck: ALL CHECKS WERE SKIPPED! Unbound is healthy!" log_to_stdout "Healthcheck: ALL CHECKS WERE SKIPPED! Unbound is healthy!"
exit 0 echo "0" > $STATUS_FILE
sleep 365d
fi fi
# run checks, if check is not returning 0 (return value if check is ok), healthcheck will exit with 1 (marked in docker as unhealthy) # run checks, if check is not returning 0 (return value if check is ok), healthcheck will exit with 1 (marked in docker as unhealthy)
check_ping check_ping
PING_STATUS=$?
if [ $? -ne 0 ]; then
exit 1
fi
check_dns check_dns
DNS_STATUS=$?
if [ $? -ne 0 ]; then if [ $PING_STATUS -ne 0 ] || [ $DNS_STATUS -ne 0 ]; then
exit 1 echo "1" > $STATUS_FILE
else
echo "0" > $STATUS_FILE
fi fi
log_to_file "Healthcheck: ALL CHECKS WERE SUCCESSFUL! Unbound is healthy!" sleep 30
exit 0
done

View File

@ -0,0 +1,10 @@
#!/bin/bash
printf "READY\n";
while read line; do
echo "Processing Event: $line" >&2;
kill -3 $(cat "/var/run/supervisord.pid")
done < /dev/stdin
rm -rf /tmp/healthcheck_status

View File

@ -0,0 +1,32 @@
[supervisord]
nodaemon=true
user=root
pidfile=/var/run/supervisord.pid
[program:syslog-ng]
command=/usr/sbin/syslog-ng --foreground --no-caps
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
autostart=true
[program:unbound]
command=/usr/sbin/unbound
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
autorestart=true
[program:unbound-healthcheck]
command=/bin/bash /healthcheck.sh
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile=/dev/stderr
stderr_logfile_maxbytes=0
autorestart=true
[eventlistener:processes]
command=/usr/local/sbin/stop-supervisor.sh
events=PROCESS_STATE_STOPPED, PROCESS_STATE_EXITED, PROCESS_STATE_FATAL

View File

@ -0,0 +1,21 @@
@version: 4.5
@include "scl.conf"
options {
chain_hostnames(off);
flush_lines(0);
use_dns(no);
use_fqdn(no);
owner("root"); group("adm"); perm(0640);
stats(freq(0));
keep_timestamp(no);
bad_hostname("^gconfd$");
};
source s_dgram {
unix-dgram("/dev/log");
internal();
};
destination d_stdout { pipe("/dev/stdout"); };
log {
source(s_dgram);
destination(d_stdout);
};

View File

@ -1,12 +1,14 @@
classifier "bayes" { classifier "bayes" {
# name = "custom"; # 'name' parameter must be set if multiple classifiers are defined
learn_condition = 'return require("lua_bayes_learn").can_learn';
new_schema = true;
tokenizer { tokenizer {
name = "osb"; name = "osb";
} }
backend = "redis"; backend = "redis";
min_tokens = 11; min_tokens = 11;
min_learns = 5; min_learns = 5;
new_schema = true; expire = 7776000;
expire = 2592000;
statfile { statfile {
symbol = "BAYES_HAM"; symbol = "BAYES_HAM";
spam = false; spam = false;

View File

@ -5365,7 +5365,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
'msg' => 'Could not move maildir to garbage collector: variables local_part and/or domain empty' 'msg' => 'Could not move maildir to garbage collector: variables local_part and/or domain empty'
); );
} }
if (strtolower(getenv('SKIP_SOLR')) == 'n') { if (strtolower(getenv('SKIP_SOLR')) == 'n' && strtolower(getenv('FLATCURVE_EXPERIMENTAL')) != 'y') {
$curl = curl_init(); $curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://solr:8983/solr/dovecot-fts/update?commit=true'); curl_setopt($curl, CURLOPT_URL, 'http://solr:8983/solr/dovecot-fts/update?commit=true');
curl_setopt($curl, CURLOPT_HTTPHEADER,array('Content-Type: text/xml')); curl_setopt($curl, CURLOPT_HTTPHEADER,array('Content-Type: text/xml'));

View File

@ -2,7 +2,7 @@
"acl": { "acl": {
"alias_domains": "Создание псевдонимов домена", "alias_domains": "Создание псевдонимов домена",
"app_passwds": "Пароли приложений", "app_passwds": "Пароли приложений",
"bcc_maps": "Правила BBC", "bcc_maps": "Правила BCC",
"delimiter_action": "Обработка тегированной почты", "delimiter_action": "Обработка тегированной почты",
"domain_desc": "Изменение описания домена", "domain_desc": "Изменение описания домена",
"domain_relayhost": "Изменение промежуточных узлов для домена", "domain_relayhost": "Изменение промежуточных узлов для домена",
@ -389,7 +389,7 @@
"imagick_exception": "Ошибка в Imagick при чтении изображения", "imagick_exception": "Ошибка в Imagick при чтении изображения",
"img_invalid": "Невозможно проверить файл изображения", "img_invalid": "Невозможно проверить файл изображения",
"img_tmp_missing": "Невозможно проверить файл изображения: временный файл не найден", "img_tmp_missing": "Невозможно проверить файл изображения: временный файл не найден",
"invalid_bcc_map_type": "Неверный тип правила BBC", "invalid_bcc_map_type": "Неверный тип правила BCC",
"invalid_destination": "Назначение \"%s\" указано неверно", "invalid_destination": "Назначение \"%s\" указано неверно",
"invalid_filter_type": "Неверный тип фильтра", "invalid_filter_type": "Неверный тип фильтра",
"invalid_host": "Хост %s указан неверно", "invalid_host": "Хост %s указан неверно",
@ -523,7 +523,7 @@
"app_passwd": "Пароль приложения", "app_passwd": "Пароль приложения",
"automap": "Автоматическое слияние папок (\"Sent items\", \"Sent\" => \"Sent\" etc.)", "automap": "Автоматическое слияние папок (\"Sent items\", \"Sent\" => \"Sent\" etc.)",
"backup_mx_options": "Параметры резервного копирования MX", "backup_mx_options": "Параметры резервного копирования MX",
"bcc_dest_format": "Назначением для правила BBC должен быть единственный действительный адрес электронной почты.", "bcc_dest_format": "Назначением для правила BCC должен быть единственный действительный адрес электронной почты.",
"client_id": "ID клиента", "client_id": "ID клиента",
"client_secret": "Секретный ключ пользователя", "client_secret": "Секретный ключ пользователя",
"comment_info": "Приватный комментарий не виден пользователям, а публичный - отображается рядом с псевдонимом в личном кабинете пользователя", "comment_info": "Приватный комментарий не виден пользователям, а публичный - отображается рядом с псевдонимом в личном кабинете пользователя",
@ -701,7 +701,7 @@
"add": "Добавить", "add": "Добавить",
"add_alias": "Добавить псевдоним", "add_alias": "Добавить псевдоним",
"add_alias_expand": "Скопировать псевдонимы на псевдонимы домена", "add_alias_expand": "Скопировать псевдонимы на псевдонимы домена",
"add_bcc_entry": "Добавить правило BBC", "add_bcc_entry": "Добавить правило BCC",
"add_domain": "Добавить домен", "add_domain": "Добавить домен",
"add_domain_alias": "Добавить псевдоним домена", "add_domain_alias": "Добавить псевдоним домена",
"add_domain_record_first": "Пожалуйста, сначала добавьте домен", "add_domain_record_first": "Пожалуйста, сначала добавьте домен",
@ -720,14 +720,14 @@
"allow_from_smtp_info": "Укажите IPv4/IPv6 адреса и/или подсети.<br>Оставьте поле пустым, чтобы разрешить отправку с любых адресов.", "allow_from_smtp_info": "Укажите IPv4/IPv6 адреса и/или подсети.<br>Оставьте поле пустым, чтобы разрешить отправку с любых адресов.",
"allowed_protocols": "Разрешенные протоколы", "allowed_protocols": "Разрешенные протоколы",
"backup_mx": "Резервный MX", "backup_mx": "Резервный MX",
"bcc": "Правила BBC", "bcc": "Правила BCC",
"bcc_destination": "Назначение BCC", "bcc_destination": "Назначение BCC",
"bcc_destinations": "Назначение BCC", "bcc_destinations": "Назначение BCC",
"bcc_info": "Правила BCC используются для скрытой пересылки копий всех сообщений на другой адрес. Правило типа \"получатель\" используется, когда локальный получатель выступает в качестве получателя почты. Правило типа \"отправитель\" соответствуют тому же принципу. Локальный домен не будут проинформированы о неудачной доставке.", "bcc_info": "Правила BCC используются для скрытой пересылки копий всех сообщений на другой адрес. Правило типа \"получатель\" используется, когда локальный получатель выступает в качестве получателя почты. Правило типа \"отправитель\" соответствуют тому же принципу. Локальный домен не будут проинформированы о неудачной доставке.",
"bcc_local_dest": "Локальный домен", "bcc_local_dest": "Локальный домен",
"bcc_map": "Правила BBC", "bcc_map": "Правила BCC",
"bcc_map_type": "Тип BCC", "bcc_map_type": "Тип BCC",
"bcc_maps": "Правила BBC", "bcc_maps": "Правила BCC",
"bcc_rcpt_map": "Получатель", "bcc_rcpt_map": "Получатель",
"bcc_sender_map": "Отправитель", "bcc_sender_map": "Отправитель",
"bcc_to_rcpt": "Переключиться на тип \"получатель\"", "bcc_to_rcpt": "Переключиться на тип \"получатель\"",

View File

@ -391,7 +391,7 @@
"last_key": "Останній ключ не можна видалити, натомість вимкніть TFA.", "last_key": "Останній ключ не можна видалити, натомість вимкніть TFA.",
"login_failed": "Введено неправильний логін або пароль", "login_failed": "Введено неправильний логін або пароль",
"mailbox_invalid": "Неприпустима адреса поштового акаунту", "mailbox_invalid": "Неприпустима адреса поштового акаунту",
"mailbox_quota_left_exceeded": "Недостатньо вільного місця (місця залишилося: %d МіБ)", "mailbox_quota_left_exceeded": "Недостатньо вільного місця (залишилося: %d МіБ)",
"malformed_username": "Некоректне ім'я користувача", "malformed_username": "Некоректне ім'я користувача",
"map_content_empty": "Зміст правила не може бути порожнім", "map_content_empty": "Зміст правила не може бути порожнім",
"max_alias_exceeded": "Перевищено максимальну кількість псевдонімів", "max_alias_exceeded": "Перевищено максимальну кількість псевдонімів",
@ -478,7 +478,8 @@
"extended_sender_acl_denied": "відсутній ACL для встановлення зовнішніх адрес відправників", "extended_sender_acl_denied": "відсутній ACL для встановлення зовнішніх адрес відправників",
"template_exists": "Шаблон %s вже існує", "template_exists": "Шаблон %s вже існує",
"template_id_invalid": "Ідентифікатор шаблону %s недійсний", "template_id_invalid": "Ідентифікатор шаблону %s недійсний",
"template_name_invalid": "Ім'я шаблону невірне" "template_name_invalid": "Ім'я шаблону невірне",
"img_size_exceeded": "Зображення перевищує максимальний розмір файлу"
}, },
"debug": { "debug": {
"chart_this_server": "Діаграма (цей сервер)", "chart_this_server": "Діаграма (цей сервер)",
@ -626,7 +627,7 @@
"admin": "Редагувати адміністратора", "admin": "Редагувати адміністратора",
"allow_from_smtp": "Дозволити <b>SMTP</b> тільки для цих IP", "allow_from_smtp": "Дозволити <b>SMTP</b> тільки для цих IP",
"allow_from_smtp_info": "Вкажіть IPv4/IPv6 адреси та/або підмережі.<br>Залиште поле порожнім, щоб дозволити відправлення з будь-яких адрес.", "allow_from_smtp_info": "Вкажіть IPv4/IPv6 адреси та/або підмережі.<br>Залиште поле порожнім, щоб дозволити відправлення з будь-яких адрес.",
"bcc_dest_format": "Призначенням правила BBC має бути єдина дійсна адреса електронної пошти.<br>Якщо вам потрібно надіслати копію на кілька адрес, створіть псевдонім і використовуйте його тут.", "bcc_dest_format": "Призначенням правила BCC має бути єдина дійсна адреса електронної пошти.<br>Якщо вам потрібно надіслати копію на кілька адрес, створіть псевдонім і використовуйте його тут.",
"comment_info": "Приватний коментар не видно користувачам, а публічний - відображається поряд із псевдонімом в особистому кабінеті користувача", "comment_info": "Приватний коментар не видно користувачам, а публічний - відображається поряд із псевдонімом в особистому кабінеті користувача",
"domain_quota": "Квота домену", "domain_quota": "Квота домену",
"dont_check_sender_acl": "Вимкнути перевірку відправника для домену %s та псевдонімів домену", "dont_check_sender_acl": "Вимкнути перевірку відправника для домену %s та псевдонімів домену",
@ -725,7 +726,7 @@
"add": "Додати", "add": "Додати",
"add_alias": "Додати псевдонім", "add_alias": "Додати псевдонім",
"add_alias_expand": "Копіювати псевдоніми на псевдоніми домену", "add_alias_expand": "Копіювати псевдоніми на псевдоніми домену",
"add_bcc_entry": "Додати правило BBC", "add_bcc_entry": "Додати правило BCC",
"add_domain": "Додати домен", "add_domain": "Додати домен",
"add_domain_alias": "Додати псевдонім домену", "add_domain_alias": "Додати псевдонім домену",
"add_filter": "Додати фільтр", "add_filter": "Додати фільтр",
@ -745,7 +746,7 @@
"bcc_local_dest": "Локальний домен", "bcc_local_dest": "Локальний домен",
"bcc_map": "Правила ВВС", "bcc_map": "Правила ВВС",
"bcc_map_type": "Тип BCC", "bcc_map_type": "Тип BCC",
"bcc_maps": "Правила BBC", "bcc_maps": "Правила BCC",
"bcc_rcpt_map": "Одержувач", "bcc_rcpt_map": "Одержувач",
"bcc_sender_map": "Відправник", "bcc_sender_map": "Відправник",
"bcc_to_rcpt": "Перейти на тип \"одержувач\"", "bcc_to_rcpt": "Перейти на тип \"одержувач\"",

View File

@ -1,7 +1,7 @@
services: services:
unbound-mailcow: unbound-mailcow:
image: mailcow/unbound:1.22 image: mailcow/unbound:1.23
environment: environment:
- TZ=${TZ} - TZ=${TZ}
- SKIP_UNBOUND_HEALTHCHECK=${SKIP_UNBOUND_HEALTHCHECK:-n} - SKIP_UNBOUND_HEALTHCHECK=${SKIP_UNBOUND_HEALTHCHECK:-n}
@ -175,6 +175,7 @@ services:
- DEMO_MODE=${DEMO_MODE:-n} - DEMO_MODE=${DEMO_MODE:-n}
- WEBAUTHN_ONLY_TRUSTED_VENDORS=${WEBAUTHN_ONLY_TRUSTED_VENDORS:-n} - WEBAUTHN_ONLY_TRUSTED_VENDORS=${WEBAUTHN_ONLY_TRUSTED_VENDORS:-n}
- CLUSTERMODE=${CLUSTERMODE:-} - CLUSTERMODE=${CLUSTERMODE:-}
- FLATCURVE_EXPERIMENTAL=${FLATCURVE_EXPERIMENTAL:-}
restart: always restart: always
labels: labels:
ofelia.enabled: "true" ofelia.enabled: "true"
@ -190,7 +191,7 @@ services:
- phpfpm - phpfpm
sogo-mailcow: sogo-mailcow:
image: mailcow/sogo:nightly-20240731 image: mailcow/sogo:nightly-20240813
environment: environment:
- DBNAME=${DBNAME} - DBNAME=${DBNAME}
- DBUSER=${DBUSER} - DBUSER=${DBUSER}

View File

@ -199,7 +199,7 @@ function restore() {
case "$1" in case "$1" in
vmail) vmail)
docker stop $(docker ps -qf name=dovecot-mailcow) docker stop $(docker ps -qf name=dovecot-mailcow)
docker run -it --name mailcow-backup --rm \ docker run -i --name mailcow-backup --rm \
-v ${RESTORE_LOCATION}:/backup:z \ -v ${RESTORE_LOCATION}:/backup:z \
-v $(docker volume ls -qf name=^${CMPS_PRJ}_vmail-vol-1$):/vmail:z \ -v $(docker volume ls -qf name=^${CMPS_PRJ}_vmail-vol-1$):/vmail:z \
${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_vmail.tar.gz ${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_vmail.tar.gz
@ -218,7 +218,7 @@ function restore() {
;; ;;
redis) redis)
docker stop $(docker ps -qf name=redis-mailcow) docker stop $(docker ps -qf name=redis-mailcow)
docker run -it --name mailcow-backup --rm \ docker run -i --name mailcow-backup --rm \
-v ${RESTORE_LOCATION}:/backup:z \ -v ${RESTORE_LOCATION}:/backup:z \
-v $(docker volume ls -qf name=^${CMPS_PRJ}_redis-vol-1$):/redis:z \ -v $(docker volume ls -qf name=^${CMPS_PRJ}_redis-vol-1$):/redis:z \
${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_redis.tar.gz ${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_redis.tar.gz
@ -226,7 +226,7 @@ function restore() {
;; ;;
crypt) crypt)
docker stop $(docker ps -qf name=dovecot-mailcow) docker stop $(docker ps -qf name=dovecot-mailcow)
docker run -it --name mailcow-backup --rm \ docker run -i --name mailcow-backup --rm \
-v ${RESTORE_LOCATION}:/backup:z \ -v ${RESTORE_LOCATION}:/backup:z \
-v $(docker volume ls -qf name=^${CMPS_PRJ}_crypt-vol-1$):/crypt:z \ -v $(docker volume ls -qf name=^${CMPS_PRJ}_crypt-vol-1$):/crypt:z \
${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_crypt.tar.gz ${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_crypt.tar.gz
@ -239,7 +239,7 @@ function restore() {
echo -e "Continuing anyhow. If rspamd is crashing opon boot try remove the rspamd volume with docker volume rm ${CMPS_PRJ}_rspamd-vol-1 after you've stopped the stack.\e[0m" echo -e "Continuing anyhow. If rspamd is crashing opon boot try remove the rspamd volume with docker volume rm ${CMPS_PRJ}_rspamd-vol-1 after you've stopped the stack.\e[0m"
sleep 2 sleep 2
docker stop $(docker ps -qf name=rspamd-mailcow) docker stop $(docker ps -qf name=rspamd-mailcow)
docker run -it --name mailcow-backup --rm \ docker run -i --name mailcow-backup --rm \
-v ${RESTORE_LOCATION}:/backup:z \ -v ${RESTORE_LOCATION}:/backup:z \
-v $(docker volume ls -qf name=^${CMPS_PRJ}_rspamd-vol-1$):/rspamd:z \ -v $(docker volume ls -qf name=^${CMPS_PRJ}_rspamd-vol-1$):/rspamd:z \
${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_rspamd.tar.gz ${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_rspamd.tar.gz
@ -250,7 +250,7 @@ function restore() {
echo -e "Skipping rspamd due to compatibility issues!\e[0m" echo -e "Skipping rspamd due to compatibility issues!\e[0m"
else else
docker stop $(docker ps -qf name=rspamd-mailcow) docker stop $(docker ps -qf name=rspamd-mailcow)
docker run -it --name mailcow-backup --rm \ docker run -i --name mailcow-backup --rm \
-v ${RESTORE_LOCATION}:/backup:z \ -v ${RESTORE_LOCATION}:/backup:z \
-v $(docker volume ls -qf name=^${CMPS_PRJ}_rspamd-vol-1$):/rspamd:z \ -v $(docker volume ls -qf name=^${CMPS_PRJ}_rspamd-vol-1$):/rspamd:z \
${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_rspamd.tar.gz ${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_rspamd.tar.gz
@ -259,7 +259,7 @@ function restore() {
;; ;;
postfix) postfix)
docker stop $(docker ps -qf name=postfix-mailcow) docker stop $(docker ps -qf name=postfix-mailcow)
docker run -it --name mailcow-backup --rm \ docker run -i --name mailcow-backup --rm \
-v ${RESTORE_LOCATION}:/backup:z \ -v ${RESTORE_LOCATION}:/backup:z \
-v $(docker volume ls -qf name=^${CMPS_PRJ}_postfix-vol-1$):/postfix:z \ -v $(docker volume ls -qf name=^${CMPS_PRJ}_postfix-vol-1$):/postfix:z \
${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_postfix.tar.gz ${DEBIAN_DOCKER_IMAGE} /bin/tar --use-compress-program="pigz -d -p ${THREADS}" -Pxvf /backup/backup_postfix.tar.gz
@ -295,7 +295,7 @@ function restore() {
${SQLIMAGE} /bin/bash -c "shopt -s dotglob ; /bin/rm -rf /var/lib/mysql/* ; rsync -avh --usermap=root:mysql --groupmap=root:mysql /backup/ /var/lib/mysql/" ${SQLIMAGE} /bin/bash -c "shopt -s dotglob ; /bin/rm -rf /var/lib/mysql/* ; rsync -avh --usermap=root:mysql --groupmap=root:mysql /backup/ /var/lib/mysql/"
elif [[ -f "${RESTORE_LOCATION}/backup_mysql.gz" ]]; then elif [[ -f "${RESTORE_LOCATION}/backup_mysql.gz" ]]; then
docker run \ docker run \
-it --name mailcow-backup --rm \ -i --name mailcow-backup --rm \
-v $(docker volume ls -qf name=^${CMPS_PRJ}_mysql-vol-1$):/var/lib/mysql/:z \ -v $(docker volume ls -qf name=^${CMPS_PRJ}_mysql-vol-1$):/var/lib/mysql/:z \
--entrypoint= \ --entrypoint= \
-u mysql \ -u mysql \