mirror of
https://github.com/mailcow/mailcow-dockerized.git
synced 2025-12-13 18:06:01 +00:00
Merge branch 'staging' into nightly
This commit is contained in:
2
.github/ISSUE_TEMPLATE/config.yml
vendored
2
.github/ISSUE_TEMPLATE/config.yml
vendored
@@ -1,7 +1,7 @@
|
|||||||
blank_issues_enabled: false
|
blank_issues_enabled: false
|
||||||
contact_links:
|
contact_links:
|
||||||
- name: ❓ Community-driven support (Free)
|
- name: ❓ Community-driven support (Free)
|
||||||
url: https://docs.mailcow.email/#get-support
|
url: https://docs.mailcow.email/#community-support-and-chat
|
||||||
about: Please use the community forum for questions or assistance
|
about: Please use the community forum for questions or assistance
|
||||||
- name: 🔥 Premium Support (Paid)
|
- name: 🔥 Premium Support (Paid)
|
||||||
url: https://www.servercow.de/mailcow?lang=en#support
|
url: https://www.servercow.de/mailcow?lang=en#support
|
||||||
|
|||||||
6
.github/renovate.json
vendored
6
.github/renovate.json
vendored
@@ -15,12 +15,6 @@
|
|||||||
"data\/web\/inc\/lib\/vendor\/**"
|
"data\/web\/inc\/lib\/vendor\/**"
|
||||||
],
|
],
|
||||||
"regexManagers": [
|
"regexManagers": [
|
||||||
{
|
|
||||||
"fileMatch": ["^helper-scripts\/nextcloud.sh$"],
|
|
||||||
"matchStrings": [
|
|
||||||
"#\\srenovate:\\sdatasource=(?<datasource>.*?) depName=(?<depName>.*?)( versioning=(?<versioning>.*?))?( extractVersion=(?<extractVersion>.*?))?\\s.*?_VERSION=(?<currentValue>.*)"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"fileMatch": ["(^|/)Dockerfile[^/]*$"],
|
"fileMatch": ["(^|/)Dockerfile[^/]*$"],
|
||||||
"matchStrings": [
|
"matchStrings": [
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ jobs:
|
|||||||
pull-requests: write
|
pull-requests: write
|
||||||
steps:
|
steps:
|
||||||
- name: Mark/Close Stale Issues and Pull Requests 🗑️
|
- name: Mark/Close Stale Issues and Pull Requests 🗑️
|
||||||
uses: actions/stale@v9.0.0
|
uses: actions/stale@v9.1.0
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.STALE_ACTION_PAT }}
|
repo-token: ${{ secrets.STALE_ACTION_PAT }}
|
||||||
days-before-stale: 60
|
days-before-stale: 60
|
||||||
|
|||||||
1
.github/workflows/image_builds.yml
vendored
1
.github/workflows/image_builds.yml
vendored
@@ -23,7 +23,6 @@ jobs:
|
|||||||
- "postfix-mailcow"
|
- "postfix-mailcow"
|
||||||
- "rspamd-mailcow"
|
- "rspamd-mailcow"
|
||||||
- "sogo-mailcow"
|
- "sogo-mailcow"
|
||||||
- "solr-mailcow"
|
|
||||||
- "unbound-mailcow"
|
- "unbound-mailcow"
|
||||||
- "watchdog-mailcow"
|
- "watchdog-mailcow"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -23,6 +23,7 @@ data/conf/dovecot/sni.conf
|
|||||||
data/conf/dovecot/sogo-sso.conf
|
data/conf/dovecot/sogo-sso.conf
|
||||||
data/conf/dovecot/sogo_trusted_ip.conf
|
data/conf/dovecot/sogo_trusted_ip.conf
|
||||||
data/conf/dovecot/sql
|
data/conf/dovecot/sql
|
||||||
|
data/conf/dovecot/conf.d/fts.conf
|
||||||
data/conf/nextcloud-*.bak
|
data/conf/nextcloud-*.bak
|
||||||
data/conf/nginx/*.active
|
data/conf/nginx/*.active
|
||||||
data/conf/nginx/*.bak
|
data/conf/nginx/*.bak
|
||||||
|
|||||||
@@ -109,7 +109,6 @@ RUN addgroup -g 5000 vmail \
|
|||||||
dovecot-submissiond \
|
dovecot-submissiond \
|
||||||
dovecot-pigeonhole-plugin \
|
dovecot-pigeonhole-plugin \
|
||||||
dovecot-pop3d \
|
dovecot-pop3d \
|
||||||
dovecot-fts-solr \
|
|
||||||
dovecot-fts-flatcurve \
|
dovecot-fts-flatcurve \
|
||||||
&& arch=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) \
|
&& arch=$(arch | sed s/aarch64/arm64/ | sed s/x86_64/amd64/) \
|
||||||
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$arch" \
|
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$arch" \
|
||||||
|
|||||||
@@ -110,21 +110,16 @@ EOF
|
|||||||
|
|
||||||
echo -n ${ACL_ANYONE} > /etc/dovecot/acl_anyone
|
echo -n ${ACL_ANYONE} > /etc/dovecot/acl_anyone
|
||||||
|
|
||||||
if [[ "${FLATCURVE_EXPERIMENTAL}" =~ ^([yY][eE][sS]|[yY]) ]]; then
|
if [[ "${SKIP_FTS}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
||||||
echo -e "\e[33mActivating Flatcurve as FTS Backend...\e[0m"
|
echo -e "\e[33mDetecting SKIP_FTS=y... not enabling Flatcurve (FTS) then...\e[0m"
|
||||||
echo -e "\e[33mDepending on your previous setup a full reindex might be needed... \e[0m"
|
|
||||||
echo -e "\e[34mVisit https://docs.mailcow.email/manual-guides/Dovecot/u_e-dovecot-fts/#fts-related-dovecot-commands to learn how to reindex\e[0m"
|
|
||||||
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify fts fts_flatcurve listescape replication lazy_expunge' > /etc/dovecot/mail_plugins
|
|
||||||
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify mail_log fts fts_flatcurve listescape replication' > /etc/dovecot/mail_plugins_imap
|
|
||||||
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl fts fts_flatcurve notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
|
||||||
elif [[ "${SKIP_SOLR}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
|
||||||
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify listescape replication lazy_expunge' > /etc/dovecot/mail_plugins
|
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify listescape replication lazy_expunge' > /etc/dovecot/mail_plugins
|
||||||
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify listescape replication mail_log' > /etc/dovecot/mail_plugins_imap
|
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify listescape replication mail_log' > /etc/dovecot/mail_plugins_imap
|
||||||
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
||||||
else
|
else
|
||||||
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify fts fts_solr listescape replication lazy_expunge' > /etc/dovecot/mail_plugins
|
echo -e "\e[32mDetecting SKIP_FTS=n... enabling Flatcurve (FTS)\e[0m"
|
||||||
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify mail_log fts fts_solr listescape replication' > /etc/dovecot/mail_plugins_imap
|
echo -n 'quota acl zlib mail_crypt mail_crypt_acl mail_log notify fts fts_flatcurve listescape replication lazy_expunge' > /etc/dovecot/mail_plugins
|
||||||
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl fts fts_solr notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
echo -n 'quota imap_quota imap_acl acl zlib imap_zlib imap_sieve mail_crypt mail_crypt_acl notify mail_log fts fts_flatcurve listescape replication' > /etc/dovecot/mail_plugins_imap
|
||||||
|
echo -n 'quota sieve acl zlib mail_crypt mail_crypt_acl fts fts_flatcurve notify listescape replication' > /etc/dovecot/mail_plugins_lmtp
|
||||||
fi
|
fi
|
||||||
chmod 644 /etc/dovecot/mail_plugins /etc/dovecot/mail_plugins_imap /etc/dovecot/mail_plugins_lmtp /templates/quarantine.tpl
|
chmod 644 /etc/dovecot/mail_plugins /etc/dovecot/mail_plugins_imap /etc/dovecot/mail_plugins_lmtp /templates/quarantine.tpl
|
||||||
|
|
||||||
@@ -137,51 +132,6 @@ iterate_query = SELECT username FROM mailbox WHERE active = '1' OR active = '2';
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
||||||
# Temporarily set FTS depending on user choice inside mailcow.conf. Will be removed as soon as Solr is dropped
|
|
||||||
if [[ "${FLATCURVE_EXPERIMENTAL}" =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
||||||
cat <<EOF > /etc/dovecot/conf.d/fts.conf
|
|
||||||
# Autogenerated by mailcow
|
|
||||||
plugin {
|
|
||||||
fts_autoindex = yes
|
|
||||||
fts_autoindex_exclude = \Junk
|
|
||||||
fts_autoindex_exclude2 = \Trash
|
|
||||||
fts = flatcurve
|
|
||||||
|
|
||||||
# Maximum term length can be set via the 'maxlen' argument (maxlen is
|
|
||||||
# specified in bytes, not number of UTF-8 characters)
|
|
||||||
fts_tokenizer_email_address = maxlen=100
|
|
||||||
fts_tokenizer_generic = algorithm=simple maxlen=30
|
|
||||||
|
|
||||||
# These are not flatcurve settings, but required for Dovecot FTS. See
|
|
||||||
# Dovecot FTS Configuration link above for further information.
|
|
||||||
fts_languages = en es de
|
|
||||||
fts_tokenizers = generic email-address
|
|
||||||
|
|
||||||
# OPTIONAL: Recommended default FTS core configuration
|
|
||||||
fts_filters = normalizer-icu snowball stopwords
|
|
||||||
fts_filters_en = lowercase snowball english-possessive stopwords
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
elif [[ ! "${SKIP_SOLR}" =~ ^([yY][eE][sS]|[yY])$ ]]; then
|
|
||||||
cat <<EOF > /etc/dovecot/conf.d/fts.conf
|
|
||||||
# Autogenerated by mailcow
|
|
||||||
plugin {
|
|
||||||
fts = solr
|
|
||||||
fts_autoindex = yes
|
|
||||||
fts_autoindex_exclude = \Junk
|
|
||||||
fts_autoindex_exclude2 = \Trash
|
|
||||||
fts_solr = url=http://solr:8983/solr/dovecot-fts/
|
|
||||||
|
|
||||||
fts_tokenizers = generic email-address
|
|
||||||
fts_tokenizer_generic = algorithm=simple
|
|
||||||
|
|
||||||
fts_filters = normalizer-icu snowball stopwords
|
|
||||||
fts_filters_en = lowercase snowball english-possessive stopwords
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# Migrate old sieve_after file
|
# Migrate old sieve_after file
|
||||||
[[ -f /etc/dovecot/sieve_after ]] && mv /etc/dovecot/sieve_after /etc/dovecot/global_sieve_after
|
[[ -f /etc/dovecot/sieve_after ]] && mv /etc/dovecot/sieve_after /etc/dovecot/global_sieve_after
|
||||||
# Create global sieve scripts
|
# Create global sieve scripts
|
||||||
@@ -274,6 +224,15 @@ mail_replica = tcp:${MAILCOW_REPLICA_IP}:${DOVEADM_REPLICA_PORT}
|
|||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Setting variables for indexer-worker inside fts.conf automatically according to mailcow.conf settings
|
||||||
|
if [[ "${SKIP_FTS}" =~ ^([nN][oO]|[nN])+$ ]]; then
|
||||||
|
echo -e "\e[94mConfiguring FTS Settings...\e[0m"
|
||||||
|
echo -e "\e[94mSetting FTS Memory Limit (per process) to ${FTS_HEAP} MB\e[0m"
|
||||||
|
sed -i "s/vsz_limit\s*=\s*[0-9]*\s*MB*/vsz_limit=${FTS_HEAP} MB/" /etc/dovecot/conf.d/fts.conf
|
||||||
|
echo -e "\e[94mSetting FTS Process Limit to ${FTS_PROCS}\e[0m"
|
||||||
|
sed -i "s/process_limit\s*=\s*[0-9]*/process_limit=${FTS_PROCS}/" /etc/dovecot/conf.d/fts.conf
|
||||||
|
fi
|
||||||
|
|
||||||
# 401 is user dovecot
|
# 401 is user dovecot
|
||||||
if [[ ! -s /mail_crypt/ecprivkey.pem || ! -s /mail_crypt/ecpubkey.pem ]]; then
|
if [[ ! -s /mail_crypt/ecprivkey.pem || ! -s /mail_crypt/ecpubkey.pem ]]; then
|
||||||
openssl ecparam -name prime256v1 -genkey | openssl pkey -out /mail_crypt/ecprivkey.pem
|
openssl ecparam -name prime256v1 -genkey | openssl pkey -out /mail_crypt/ecprivkey.pem
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
if [[ "${SKIP_SOLR}" =~ ^([yY][eE][sS]|[yY])+$ && ! "${FLATCURVE_EXPERIMENTAL}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
if [[ "${SKIP_FTS}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
||||||
exit 0
|
exit 0
|
||||||
else
|
else
|
||||||
doveadm fts optimize -A
|
doveadm fts optimize -A
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Deploy
|
# Deploy
|
||||||
if curl --connect-timeout 15 --retry 10 --max-time 30 https://www.spamassassin.heinlein-support.de/$(dig txt 1.4.3.spamassassin.heinlein-support.de +short | tr -d '"' | tr -dc '0-9').tar.gz --output /tmp/sa-rules-heinlein.tar.gz; then
|
if curl --connect-timeout 15 --retry 5 --max-time 30 https://www.spamassassin.heinlein-support.de/$(dig txt 1.4.3.spamassassin.heinlein-support.de +short | tr -d '"' | tr -dc '0-9').tar.gz --output /tmp/sa-rules-heinlein.tar.gz; then
|
||||||
if gzip -t /tmp/sa-rules-heinlein.tar.gz; then
|
if gzip -t /tmp/sa-rules-heinlein.tar.gz; then
|
||||||
tar xfvz /tmp/sa-rules-heinlein.tar.gz -C /tmp/sa-rules-heinlein
|
tar xfvz /tmp/sa-rules-heinlein.tar.gz -C /tmp/sa-rules-heinlein
|
||||||
cat /tmp/sa-rules-heinlein/*cf > /etc/rspamd/custom/sa-rules
|
cat /tmp/sa-rules-heinlein/*cf > /etc/rspamd/custom/sa-rules
|
||||||
|
|||||||
@@ -2,6 +2,27 @@ import os
|
|||||||
import subprocess
|
import subprocess
|
||||||
from jinja2 import Environment, FileSystemLoader
|
from jinja2 import Environment, FileSystemLoader
|
||||||
|
|
||||||
|
def includes_conf(env, template_vars):
|
||||||
|
server_name = "server_name.active"
|
||||||
|
listen_plain = "listen_plain.active"
|
||||||
|
listen_ssl = "listen_ssl.active"
|
||||||
|
|
||||||
|
server_name_config = f"server_name {template_vars['MAILCOW_HOSTNAME']} autodiscover.* autoconfig.* {template_vars['ADDITIONAL_SERVER_NAMES']};"
|
||||||
|
listen_plain_config = f"listen {template_vars['HTTP_PORT']};"
|
||||||
|
listen_ssl_config = f"listen {template_vars['HTTPS_PORT']};"
|
||||||
|
if not template_vars['DISABLE_IPv6']:
|
||||||
|
listen_plain_config += f"\nlisten [::]:{template_vars['HTTP_PORT']};"
|
||||||
|
listen_ssl_config += f"\nlisten [::]:{template_vars['HTTPS_PORT']} ssl;"
|
||||||
|
listen_ssl_config += "\nhttp2 on;"
|
||||||
|
|
||||||
|
with open(f"/etc/nginx/conf.d/{server_name}", "w") as f:
|
||||||
|
f.write(server_name_config)
|
||||||
|
|
||||||
|
with open(f"/etc/nginx/conf.d/{listen_plain}", "w") as f:
|
||||||
|
f.write(listen_plain_config)
|
||||||
|
|
||||||
|
with open(f"/etc/nginx/conf.d/{listen_ssl}", "w") as f:
|
||||||
|
f.write(listen_ssl_config)
|
||||||
|
|
||||||
def sites_default_conf(env, template_vars):
|
def sites_default_conf(env, template_vars):
|
||||||
config_name = "sites-default.conf"
|
config_name = "sites-default.conf"
|
||||||
@@ -20,8 +41,9 @@ def nginx_conf(env, template_vars):
|
|||||||
f.write(config)
|
f.write(config)
|
||||||
|
|
||||||
def prepare_template_vars():
|
def prepare_template_vars():
|
||||||
|
ipv4_network = os.getenv("IPV4_NETWORK", "172.22.1")
|
||||||
template_vars = {
|
template_vars = {
|
||||||
'IPV4_NETWORK': os.getenv("IPV4_NETWORK", "172.22.1"),
|
'IPV4_NETWORK': ipv4_network,
|
||||||
'TRUSTED_NETWORK': os.getenv("TRUSTED_NETWORK", False),
|
'TRUSTED_NETWORK': os.getenv("TRUSTED_NETWORK", False),
|
||||||
'SKIP_RSPAMD': os.getenv("SKIP_RSPAMD", "n").lower() in ("y", "yes"),
|
'SKIP_RSPAMD': os.getenv("SKIP_RSPAMD", "n").lower() in ("y", "yes"),
|
||||||
'SKIP_SOGO': os.getenv("SKIP_SOGO", "n").lower() in ("y", "yes"),
|
'SKIP_SOGO': os.getenv("SKIP_SOGO", "n").lower() in ("y", "yes"),
|
||||||
@@ -30,9 +52,10 @@ def prepare_template_vars():
|
|||||||
'ADDITIONAL_SERVER_NAMES': os.getenv("ADDITIONAL_SERVER_NAMES", "").replace(',', ' '),
|
'ADDITIONAL_SERVER_NAMES': os.getenv("ADDITIONAL_SERVER_NAMES", "").replace(',', ' '),
|
||||||
'HTTP_PORT': os.getenv("HTTP_PORT", "80"),
|
'HTTP_PORT': os.getenv("HTTP_PORT", "80"),
|
||||||
'HTTPS_PORT': os.getenv("HTTPS_PORT", "443"),
|
'HTTPS_PORT': os.getenv("HTTPS_PORT", "443"),
|
||||||
'SOGOHOST': os.getenv("SOGOHOST", "sogo-mailcow"),
|
'SOGOHOST': os.getenv("SOGOHOST", ipv4_network + ".248"),
|
||||||
'RSPAMDHOST': os.getenv("RSPAMDHOST", "rspamd-mailcow"),
|
'RSPAMDHOST': os.getenv("RSPAMDHOST", "rspamd-mailcow"),
|
||||||
'PHPFPMHOST': os.getenv("PHPFPMHOST", "php-fpm-mailcow"),
|
'PHPFPMHOST': os.getenv("PHPFPMHOST", "php-fpm-mailcow"),
|
||||||
|
'DISABLE_IPv6': os.getenv("DISABLE_IPv6", "n").lower() in ("y", "yes"),
|
||||||
}
|
}
|
||||||
|
|
||||||
ssl_dir = '/etc/ssl/mail/'
|
ssl_dir = '/etc/ssl/mail/'
|
||||||
@@ -59,17 +82,14 @@ def prepare_template_vars():
|
|||||||
return template_vars
|
return template_vars
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
env = Environment(loader=FileSystemLoader('./etc/nginx/conf.d'))
|
env = Environment(loader=FileSystemLoader('./etc/nginx/conf.d/templates'))
|
||||||
|
|
||||||
# Render config
|
# Render config
|
||||||
print("Render config")
|
print("Render config")
|
||||||
template_vars = prepare_template_vars()
|
template_vars = prepare_template_vars()
|
||||||
sites_default_conf(env, template_vars)
|
sites_default_conf(env, template_vars)
|
||||||
nginx_conf(env, template_vars)
|
nginx_conf(env, template_vars)
|
||||||
|
includes_conf(env, template_vars)
|
||||||
# Validate config
|
|
||||||
print("Validate config")
|
|
||||||
subprocess.run(["nginx", "-qt"])
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
until ping ${REDISHOST} -c1 > /dev/null; do
|
PHPFPMHOST=${PHPFPMHOST:-"php-fpm-mailcow"}
|
||||||
echo "Waiting for Redis..."
|
SOGOHOST=${SOGOHOST:-"$IPV4_NETWORK.248"}
|
||||||
sleep 1
|
RSPAMDHOST=${RSPAMDHOST:-"rspamd-mailcow"}
|
||||||
done
|
|
||||||
until ping ${PHPFPMHOST} -c1 > /dev/null; do
|
until ping ${PHPFPMHOST} -c1 > /dev/null; do
|
||||||
echo "Waiting for PHP..."
|
echo "Waiting for PHP..."
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ RUN apk add -U --no-cache autoconf \
|
|||||||
--with-webp \
|
--with-webp \
|
||||||
--with-xpm \
|
--with-xpm \
|
||||||
--with-avif \
|
--with-avif \
|
||||||
&& docker-php-ext-install -j 4 exif gd gettext intl ldap opcache pcntl pdo pdo_mysql pspell soap sockets sysvsem zip bcmath gmp \
|
&& docker-php-ext-install -j 4 exif gd gettext intl ldap opcache pcntl pdo pdo_mysql pspell soap sockets zip bcmath gmp \
|
||||||
&& docker-php-ext-configure imap --with-imap --with-imap-ssl \
|
&& docker-php-ext-configure imap --with-imap --with-imap-ssl \
|
||||||
&& docker-php-ext-install -j 4 imap \
|
&& docker-php-ext-install -j 4 imap \
|
||||||
&& curl --silent --show-error https://getcomposer.org/installer | php -- --version=${COMPOSER_VERSION} \
|
&& curl --silent --show-error https://getcomposer.org/installer | php -- --version=${COMPOSER_VERSION} \
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
FROM solr:7.7-slim
|
|
||||||
LABEL maintainer "The Infrastructure Company GmbH <info@servercow.de>"
|
|
||||||
|
|
||||||
USER root
|
|
||||||
|
|
||||||
# renovate: datasource=github-releases depName=tianon/gosu versioning=semver-coerced extractVersion=(?<version>.*)$
|
|
||||||
ARG GOSU_VERSION=1.17
|
|
||||||
|
|
||||||
COPY solr.sh /
|
|
||||||
COPY solr-config-7.7.0.xml /
|
|
||||||
COPY solr-schema-7.7.0.xml /
|
|
||||||
|
|
||||||
RUN dpkgArch="$(dpkg --print-architecture | awk -F- '{ print $NF }')" \
|
|
||||||
&& wget -O /usr/local/bin/gosu "https://github.com/tianon/gosu/releases/download/$GOSU_VERSION/gosu-$dpkgArch" \
|
|
||||||
&& chmod +x /usr/local/bin/gosu \
|
|
||||||
&& gosu nobody true \
|
|
||||||
&& apt-get update && apt-get install -y --no-install-recommends \
|
|
||||||
tzdata \
|
|
||||||
curl \
|
|
||||||
bash \
|
|
||||||
zip \
|
|
||||||
&& apt-get autoclean \
|
|
||||||
&& rm -rf /var/lib/apt/lists/* \
|
|
||||||
&& chmod +x /solr.sh \
|
|
||||||
&& sync \
|
|
||||||
&& bash /solr.sh --bootstrap
|
|
||||||
|
|
||||||
RUN zip -q -d /opt/solr/server/lib/ext/log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class
|
|
||||||
|
|
||||||
RUN apt remove zip -y
|
|
||||||
|
|
||||||
CMD ["/solr.sh"]
|
|
||||||
@@ -1,289 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
|
||||||
|
|
||||||
<!-- This is the default config with stuff non-essential to Dovecot removed. -->
|
|
||||||
|
|
||||||
<config>
|
|
||||||
<!-- Controls what version of Lucene various components of Solr
|
|
||||||
adhere to. Generally, you want to use the latest version to
|
|
||||||
get all bug fixes and improvements. It is highly recommended
|
|
||||||
that you fully re-index after changing this setting as it can
|
|
||||||
affect both how text is indexed and queried.
|
|
||||||
-->
|
|
||||||
<luceneMatchVersion>7.7.0</luceneMatchVersion>
|
|
||||||
|
|
||||||
<!-- A 'dir' option by itself adds any files found in the directory
|
|
||||||
to the classpath, this is useful for including all jars in a
|
|
||||||
directory.
|
|
||||||
|
|
||||||
When a 'regex' is specified in addition to a 'dir', only the
|
|
||||||
files in that directory which completely match the regex
|
|
||||||
(anchored on both ends) will be included.
|
|
||||||
|
|
||||||
If a 'dir' option (with or without a regex) is used and nothing
|
|
||||||
is found that matches, a warning will be logged.
|
|
||||||
|
|
||||||
The examples below can be used to load some solr-contribs along
|
|
||||||
with their external dependencies.
|
|
||||||
-->
|
|
||||||
<lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />
|
|
||||||
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-cell-\d.*\.jar" />
|
|
||||||
|
|
||||||
<lib dir="${solr.install.dir:../../../..}/contrib/clustering/lib/" regex=".*\.jar" />
|
|
||||||
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-clustering-\d.*\.jar" />
|
|
||||||
|
|
||||||
<lib dir="${solr.install.dir:../../../..}/contrib/langid/lib/" regex=".*\.jar" />
|
|
||||||
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-langid-\d.*\.jar" />
|
|
||||||
|
|
||||||
<lib dir="${solr.install.dir:../../../..}/contrib/velocity/lib" regex=".*\.jar" />
|
|
||||||
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-velocity-\d.*\.jar" />
|
|
||||||
|
|
||||||
<!-- Data Directory
|
|
||||||
|
|
||||||
Used to specify an alternate directory to hold all index data
|
|
||||||
other than the default ./data under the Solr home. If
|
|
||||||
replication is in use, this should match the replication
|
|
||||||
configuration.
|
|
||||||
-->
|
|
||||||
<dataDir>${solr.data.dir:}</dataDir>
|
|
||||||
|
|
||||||
<!-- The default high-performance update handler -->
|
|
||||||
<updateHandler class="solr.DirectUpdateHandler2">
|
|
||||||
|
|
||||||
<!-- Enables a transaction log, used for real-time get, durability, and
|
|
||||||
and solr cloud replica recovery. The log can grow as big as
|
|
||||||
uncommitted changes to the index, so use of a hard autoCommit
|
|
||||||
is recommended (see below).
|
|
||||||
"dir" - the target directory for transaction logs, defaults to the
|
|
||||||
solr data directory.
|
|
||||||
"numVersionBuckets" - sets the number of buckets used to keep
|
|
||||||
track of max version values when checking for re-ordered
|
|
||||||
updates; increase this value to reduce the cost of
|
|
||||||
synchronizing access to version buckets during high-volume
|
|
||||||
indexing, this requires 8 bytes (long) * numVersionBuckets
|
|
||||||
of heap space per Solr core.
|
|
||||||
-->
|
|
||||||
<updateLog>
|
|
||||||
<str name="dir">${solr.ulog.dir:}</str>
|
|
||||||
<int name="numVersionBuckets">${solr.ulog.numVersionBuckets:65536}</int>
|
|
||||||
</updateLog>
|
|
||||||
|
|
||||||
<!-- AutoCommit
|
|
||||||
|
|
||||||
Perform a hard commit automatically under certain conditions.
|
|
||||||
Instead of enabling autoCommit, consider using "commitWithin"
|
|
||||||
when adding documents.
|
|
||||||
|
|
||||||
http://wiki.apache.org/solr/UpdateXmlMessages
|
|
||||||
|
|
||||||
maxDocs - Maximum number of documents to add since the last
|
|
||||||
commit before automatically triggering a new commit.
|
|
||||||
|
|
||||||
maxTime - Maximum amount of time in ms that is allowed to pass
|
|
||||||
since a document was added before automatically
|
|
||||||
triggering a new commit.
|
|
||||||
openSearcher - if false, the commit causes recent index changes
|
|
||||||
to be flushed to stable storage, but does not cause a new
|
|
||||||
searcher to be opened to make those changes visible.
|
|
||||||
|
|
||||||
If the updateLog is enabled, then it's highly recommended to
|
|
||||||
have some sort of hard autoCommit to limit the log size.
|
|
||||||
-->
|
|
||||||
<autoCommit>
|
|
||||||
<maxTime>${solr.autoCommit.maxTime:15000}</maxTime>
|
|
||||||
<openSearcher>false</openSearcher>
|
|
||||||
</autoCommit>
|
|
||||||
|
|
||||||
<!-- softAutoCommit is like autoCommit except it causes a
|
|
||||||
'soft' commit which only ensures that changes are visible
|
|
||||||
but does not ensure that data is synced to disk. This is
|
|
||||||
faster and more near-realtime friendly than a hard commit.
|
|
||||||
-->
|
|
||||||
<autoSoftCommit>
|
|
||||||
<maxTime>${solr.autoSoftCommit.maxTime:-1}</maxTime>
|
|
||||||
</autoSoftCommit>
|
|
||||||
|
|
||||||
<!-- Update Related Event Listeners
|
|
||||||
|
|
||||||
Various IndexWriter related events can trigger Listeners to
|
|
||||||
take actions.
|
|
||||||
|
|
||||||
postCommit - fired after every commit or optimize command
|
|
||||||
postOptimize - fired after every optimize command
|
|
||||||
-->
|
|
||||||
|
|
||||||
</updateHandler>
|
|
||||||
|
|
||||||
<!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
Query section - these settings control query time things like caches
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
|
|
||||||
<query>
|
|
||||||
<!-- Solr Internal Query Caches
|
|
||||||
|
|
||||||
There are two implementations of cache available for Solr,
|
|
||||||
LRUCache, based on a synchronized LinkedHashMap, and
|
|
||||||
FastLRUCache, based on a ConcurrentHashMap.
|
|
||||||
|
|
||||||
FastLRUCache has faster gets and slower puts in single
|
|
||||||
threaded operation and thus is generally faster than LRUCache
|
|
||||||
when the hit ratio of the cache is high (> 75%), and may be
|
|
||||||
faster under other scenarios on multi-cpu systems.
|
|
||||||
-->
|
|
||||||
|
|
||||||
<!-- Filter Cache
|
|
||||||
|
|
||||||
Cache used by SolrIndexSearcher for filters (DocSets),
|
|
||||||
unordered sets of *all* documents that match a query. When a
|
|
||||||
new searcher is opened, its caches may be prepopulated or
|
|
||||||
"autowarmed" using data from caches in the old searcher.
|
|
||||||
autowarmCount is the number of items to prepopulate. For
|
|
||||||
LRUCache, the autowarmed items will be the most recently
|
|
||||||
accessed items.
|
|
||||||
|
|
||||||
Parameters:
|
|
||||||
class - the SolrCache implementation LRUCache or
|
|
||||||
(LRUCache or FastLRUCache)
|
|
||||||
size - the maximum number of entries in the cache
|
|
||||||
initialSize - the initial capacity (number of entries) of
|
|
||||||
the cache. (see java.util.HashMap)
|
|
||||||
autowarmCount - the number of entries to prepopulate from
|
|
||||||
and old cache.
|
|
||||||
maxRamMB - the maximum amount of RAM (in MB) that this cache is allowed
|
|
||||||
to occupy. Note that when this option is specified, the size
|
|
||||||
and initialSize parameters are ignored.
|
|
||||||
-->
|
|
||||||
<filterCache class="solr.FastLRUCache"
|
|
||||||
size="512"
|
|
||||||
initialSize="512"
|
|
||||||
autowarmCount="0"/>
|
|
||||||
|
|
||||||
<!-- Query Result Cache
|
|
||||||
|
|
||||||
Caches results of searches - ordered lists of document ids
|
|
||||||
(DocList) based on a query, a sort, and the range of documents requested.
|
|
||||||
Additional supported parameter by LRUCache:
|
|
||||||
maxRamMB - the maximum amount of RAM (in MB) that this cache is allowed
|
|
||||||
to occupy
|
|
||||||
-->
|
|
||||||
<queryResultCache class="solr.LRUCache"
|
|
||||||
size="512"
|
|
||||||
initialSize="512"
|
|
||||||
autowarmCount="0"/>
|
|
||||||
|
|
||||||
<!-- Document Cache
|
|
||||||
|
|
||||||
Caches Lucene Document objects (the stored fields for each
|
|
||||||
document). Since Lucene internal document ids are transient,
|
|
||||||
this cache will not be autowarmed.
|
|
||||||
-->
|
|
||||||
<documentCache class="solr.LRUCache"
|
|
||||||
size="512"
|
|
||||||
initialSize="512"
|
|
||||||
autowarmCount="0"/>
|
|
||||||
|
|
||||||
<!-- custom cache currently used by block join -->
|
|
||||||
<cache name="perSegFilter"
|
|
||||||
class="solr.search.LRUCache"
|
|
||||||
size="10"
|
|
||||||
initialSize="0"
|
|
||||||
autowarmCount="10"
|
|
||||||
regenerator="solr.NoOpRegenerator" />
|
|
||||||
|
|
||||||
<!-- Lazy Field Loading
|
|
||||||
|
|
||||||
If true, stored fields that are not requested will be loaded
|
|
||||||
lazily. This can result in a significant speed improvement
|
|
||||||
if the usual case is to not load all stored fields,
|
|
||||||
especially if the skipped fields are large compressed text
|
|
||||||
fields.
|
|
||||||
-->
|
|
||||||
<enableLazyFieldLoading>true</enableLazyFieldLoading>
|
|
||||||
|
|
||||||
<!-- Result Window Size
|
|
||||||
|
|
||||||
An optimization for use with the queryResultCache. When a search
|
|
||||||
is requested, a superset of the requested number of document ids
|
|
||||||
are collected. For example, if a search for a particular query
|
|
||||||
requests matching documents 10 through 19, and queryWindowSize is 50,
|
|
||||||
then documents 0 through 49 will be collected and cached. Any further
|
|
||||||
requests in that range can be satisfied via the cache.
|
|
||||||
-->
|
|
||||||
<queryResultWindowSize>20</queryResultWindowSize>
|
|
||||||
|
|
||||||
<!-- Maximum number of documents to cache for any entry in the
|
|
||||||
queryResultCache.
|
|
||||||
-->
|
|
||||||
<queryResultMaxDocsCached>200</queryResultMaxDocsCached>
|
|
||||||
|
|
||||||
<!-- Use Cold Searcher
|
|
||||||
|
|
||||||
If a search request comes in and there is no current
|
|
||||||
registered searcher, then immediately register the still
|
|
||||||
warming searcher and use it. If "false" then all requests
|
|
||||||
will block until the first searcher is done warming.
|
|
||||||
-->
|
|
||||||
<useColdSearcher>false</useColdSearcher>
|
|
||||||
|
|
||||||
</query>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- Request Dispatcher
|
|
||||||
|
|
||||||
This section contains instructions for how the SolrDispatchFilter
|
|
||||||
should behave when processing requests for this SolrCore.
|
|
||||||
|
|
||||||
-->
|
|
||||||
<requestDispatcher>
|
|
||||||
<httpCaching never304="true" />
|
|
||||||
</requestDispatcher>
|
|
||||||
|
|
||||||
<!-- Request Handlers
|
|
||||||
|
|
||||||
http://wiki.apache.org/solr/SolrRequestHandler
|
|
||||||
|
|
||||||
Incoming queries will be dispatched to a specific handler by name
|
|
||||||
based on the path specified in the request.
|
|
||||||
|
|
||||||
If a Request Handler is declared with startup="lazy", then it will
|
|
||||||
not be initialized until the first request that uses it.
|
|
||||||
|
|
||||||
-->
|
|
||||||
<!-- SearchHandler
|
|
||||||
|
|
||||||
http://wiki.apache.org/solr/SearchHandler
|
|
||||||
|
|
||||||
For processing Search Queries, the primary Request Handler
|
|
||||||
provided with Solr is "SearchHandler" It delegates to a sequent
|
|
||||||
of SearchComponents (see below) and supports distributed
|
|
||||||
queries across multiple shards
|
|
||||||
-->
|
|
||||||
<requestHandler name="/select" class="solr.SearchHandler">
|
|
||||||
<!-- default values for query parameters can be specified, these
|
|
||||||
will be overridden by parameters in the request
|
|
||||||
-->
|
|
||||||
<lst name="defaults">
|
|
||||||
<str name="echoParams">explicit</str>
|
|
||||||
<int name="rows">10</int>
|
|
||||||
</lst>
|
|
||||||
</requestHandler>
|
|
||||||
|
|
||||||
<initParams path="/update/**,/select">
|
|
||||||
<lst name="defaults">
|
|
||||||
<str name="df">_text_</str>
|
|
||||||
</lst>
|
|
||||||
</initParams>
|
|
||||||
|
|
||||||
<!-- Response Writers
|
|
||||||
|
|
||||||
http://wiki.apache.org/solr/QueryResponseWriter
|
|
||||||
|
|
||||||
Request responses will be written using the writer specified by
|
|
||||||
the 'wt' request parameter matching the name of a registered
|
|
||||||
writer.
|
|
||||||
|
|
||||||
The "default" writer is the default and will be used if 'wt' is
|
|
||||||
not specified in the request.
|
|
||||||
-->
|
|
||||||
<queryResponseWriter name="xml"
|
|
||||||
default="true"
|
|
||||||
class="solr.XMLResponseWriter" />
|
|
||||||
</config>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
|
|
||||||
<schema name="dovecot-fts" version="2.0">
|
|
||||||
<fieldType name="string" class="solr.StrField" omitNorms="true" sortMissingLast="true"/>
|
|
||||||
<fieldType name="long" class="solr.LongPointField" positionIncrementGap="0"/>
|
|
||||||
<fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
|
|
||||||
|
|
||||||
<fieldType name="text" class="solr.TextField" autoGeneratePhraseQueries="true" positionIncrementGap="100">
|
|
||||||
<analyzer type="index">
|
|
||||||
<tokenizer class="solr.StandardTokenizerFactory"/>
|
|
||||||
<filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20"/>
|
|
||||||
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
|
|
||||||
<filter class="solr.WordDelimiterGraphFilterFactory" catenateNumbers="1" generateNumberParts="1" splitOnCaseChange="1" generateWordParts="1" splitOnNumerics="1" catenateAll="1" catenateWords="1"/>
|
|
||||||
<filter class="solr.FlattenGraphFilterFactory"/>
|
|
||||||
<filter class="solr.LowerCaseFilterFactory"/>
|
|
||||||
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
|
|
||||||
<filter class="solr.PorterStemFilterFactory"/>
|
|
||||||
</analyzer>
|
|
||||||
<analyzer type="query">
|
|
||||||
<tokenizer class="solr.StandardTokenizerFactory"/>
|
|
||||||
<filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
|
|
||||||
<filter class="solr.FlattenGraphFilterFactory"/>
|
|
||||||
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
|
|
||||||
<filter class="solr.WordDelimiterGraphFilterFactory" catenateNumbers="1" generateNumberParts="1" splitOnCaseChange="1" generateWordParts="1" splitOnNumerics="1" catenateAll="1" catenateWords="1"/>
|
|
||||||
<filter class="solr.LowerCaseFilterFactory"/>
|
|
||||||
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
|
|
||||||
<filter class="solr.PorterStemFilterFactory"/>
|
|
||||||
</analyzer>
|
|
||||||
</fieldType>
|
|
||||||
|
|
||||||
<field name="id" type="string" indexed="true" required="true" stored="true"/>
|
|
||||||
<field name="uid" type="long" indexed="true" required="true" stored="true"/>
|
|
||||||
<field name="box" type="string" indexed="true" required="true" stored="true"/>
|
|
||||||
<field name="user" type="string" indexed="true" required="true" stored="true"/>
|
|
||||||
|
|
||||||
<field name="hdr" type="text" indexed="true" stored="false"/>
|
|
||||||
<field name="body" type="text" indexed="true" stored="false"/>
|
|
||||||
|
|
||||||
<field name="from" type="text" indexed="true" stored="false"/>
|
|
||||||
<field name="to" type="text" indexed="true" stored="false"/>
|
|
||||||
<field name="cc" type="text" indexed="true" stored="false"/>
|
|
||||||
<field name="bcc" type="text" indexed="true" stored="false"/>
|
|
||||||
<field name="subject" type="text" indexed="true" stored="false"/>
|
|
||||||
|
|
||||||
<!-- Used by Solr internally: -->
|
|
||||||
<field name="_version_" type="long" indexed="true" stored="true"/>
|
|
||||||
|
|
||||||
<uniqueKey>id</uniqueKey>
|
|
||||||
</schema>
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
if [[ "${FLATCURVE_EXPERIMENTAL}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
|
||||||
echo "FLATCURVE_EXPERIMENTAL=y, skipping Solr but enabling Flatcurve as FTS for Dovecot!"
|
|
||||||
echo "Solr will be removed in the future!"
|
|
||||||
sleep 365d
|
|
||||||
exit 0
|
|
||||||
elif [[ "${SKIP_SOLR}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
|
||||||
echo "SKIP_SOLR=y, skipping Solr..."
|
|
||||||
echo "HINT: You could try the newer FTS Backend Flatcurve, which is currently in experimental state..."
|
|
||||||
echo "Simply set FLATCURVE_EXPERIMENTAL=y inside your mailcow.conf and restart the stack afterwards!"
|
|
||||||
echo "Solr will be removed in the future!"
|
|
||||||
sleep 365d
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
MEM_TOTAL=$(awk '/MemTotal/ {print $2}' /proc/meminfo)
|
|
||||||
|
|
||||||
if [[ "${1}" != "--bootstrap" ]]; then
|
|
||||||
if [ ${MEM_TOTAL} -lt "2097152" ]; then
|
|
||||||
echo "System memory less than 2 GB, skipping Solr..."
|
|
||||||
sleep 365d
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
# run the optional initdb
|
|
||||||
. /opt/docker-solr/scripts/run-initdb
|
|
||||||
|
|
||||||
# fixing volume permission
|
|
||||||
[[ -d /opt/solr/server/solr/dovecot-fts/data ]] && chown -R solr:solr /opt/solr/server/solr/dovecot-fts/data
|
|
||||||
if [[ "${1}" != "--bootstrap" ]]; then
|
|
||||||
sed -i '/SOLR_HEAP=/c\SOLR_HEAP="'${SOLR_HEAP:-1024}'m"' /opt/solr/bin/solr.in.sh
|
|
||||||
else
|
|
||||||
sed -i '/SOLR_HEAP=/c\SOLR_HEAP="256m"' /opt/solr/bin/solr.in.sh
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ "${1}" == "--bootstrap" ]]; then
|
|
||||||
echo "Creating initial configuration"
|
|
||||||
echo "Modifying default config set"
|
|
||||||
cp /solr-config-7.7.0.xml /opt/solr/server/solr/configsets/_default/conf/solrconfig.xml
|
|
||||||
cp /solr-schema-7.7.0.xml /opt/solr/server/solr/configsets/_default/conf/schema.xml
|
|
||||||
rm /opt/solr/server/solr/configsets/_default/conf/managed-schema
|
|
||||||
|
|
||||||
echo "Starting local Solr instance to setup configuration"
|
|
||||||
gosu solr start-local-solr
|
|
||||||
|
|
||||||
echo "Creating core \"dovecot-fts\""
|
|
||||||
gosu solr /opt/solr/bin/solr create -c "dovecot-fts"
|
|
||||||
|
|
||||||
# See https://github.com/docker-solr/docker-solr/issues/27
|
|
||||||
echo "Checking core"
|
|
||||||
while ! wget -O - 'http://localhost:8983/solr/admin/cores?action=STATUS' | grep -q instanceDir; do
|
|
||||||
echo "Could not find any cores, waiting..."
|
|
||||||
sleep 3
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Created core \"dovecot-fts\""
|
|
||||||
|
|
||||||
echo "Stopping local Solr"
|
|
||||||
gosu solr stop-local-solr
|
|
||||||
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "Starting up Solr..."
|
|
||||||
echo -e "\e[31mSolr is deprecated! You can try the new FTS System now by enabling FLATCURVE_EXPERIMENTAL=y inside mailcow.conf and restarting the stack\e[0m"
|
|
||||||
echo -e "\e[31mSolr will be removed completely soon!\e[0m"
|
|
||||||
|
|
||||||
sleep 15
|
|
||||||
|
|
||||||
exec gosu solr solr-foreground
|
|
||||||
|
|
||||||
@@ -1,130 +0,0 @@
|
|||||||
map $http_x_forwarded_proto $client_req_scheme_nc {
|
|
||||||
default $scheme;
|
|
||||||
https https;
|
|
||||||
}
|
|
||||||
|
|
||||||
server {
|
|
||||||
include /etc/nginx/conf.d/listen_ssl.active;
|
|
||||||
include /etc/nginx/conf.d/listen_plain.active;
|
|
||||||
include /etc/nginx/mime.types;
|
|
||||||
charset utf-8;
|
|
||||||
override_charset on;
|
|
||||||
|
|
||||||
ssl_certificate /etc/ssl/mail/cert.pem;
|
|
||||||
ssl_certificate_key /etc/ssl/mail/key.pem;
|
|
||||||
ssl_protocols TLSv1.2 TLSv1.3;
|
|
||||||
ssl_prefer_server_ciphers on;
|
|
||||||
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
|
|
||||||
ssl_ecdh_curve X25519:X448:secp384r1:secp256k1;
|
|
||||||
ssl_session_cache shared:SSL:50m;
|
|
||||||
ssl_session_timeout 1d;
|
|
||||||
ssl_session_tickets off;
|
|
||||||
add_header Referrer-Policy "no-referrer" always;
|
|
||||||
add_header X-Content-Type-Options "nosniff" always;
|
|
||||||
add_header X-Download-Options "noopen" always;
|
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
||||||
add_header X-Permitted-Cross-Domain-Policies "none" always;
|
|
||||||
add_header X-Robots-Tag "noindex, nofollow" always;
|
|
||||||
add_header X-XSS-Protection "1; mode=block" always;
|
|
||||||
|
|
||||||
fastcgi_hide_header X-Powered-By;
|
|
||||||
|
|
||||||
server_name NC_SUBD;
|
|
||||||
|
|
||||||
root /web/nextcloud/;
|
|
||||||
|
|
||||||
location = /robots.txt {
|
|
||||||
allow all;
|
|
||||||
log_not_found off;
|
|
||||||
access_log off;
|
|
||||||
}
|
|
||||||
|
|
||||||
location = /.well-known/carddav {
|
|
||||||
return 301 $client_req_scheme_nc://$host/remote.php/dav;
|
|
||||||
}
|
|
||||||
|
|
||||||
location = /.well-known/caldav {
|
|
||||||
return 301 $client_req_scheme_nc://$host/remote.php/dav;
|
|
||||||
}
|
|
||||||
|
|
||||||
location = /.well-known/webfinger {
|
|
||||||
return 301 $client_req_scheme_nc://$host/index.php/.well-known/webfinger;
|
|
||||||
}
|
|
||||||
|
|
||||||
location = /.well-known/nodeinfo {
|
|
||||||
return 301 $client_req_scheme_nc://$host/index.php/.well-known/nodeinfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ^~ /.well-known/acme-challenge/ {
|
|
||||||
default_type "text/plain";
|
|
||||||
root /web;
|
|
||||||
}
|
|
||||||
|
|
||||||
fastcgi_buffers 64 4K;
|
|
||||||
|
|
||||||
gzip on;
|
|
||||||
gzip_vary on;
|
|
||||||
gzip_comp_level 4;
|
|
||||||
gzip_min_length 256;
|
|
||||||
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
|
|
||||||
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
|
|
||||||
set_real_ip_from fc00::/7;
|
|
||||||
set_real_ip_from 10.0.0.0/8;
|
|
||||||
set_real_ip_from 172.16.0.0/12;
|
|
||||||
set_real_ip_from 192.168.0.0/16;
|
|
||||||
real_ip_header X-Forwarded-For;
|
|
||||||
real_ip_recursive on;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
rewrite ^ /index.php$uri;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ ^\/(?:build|tests|config|lib|3rdparty|templates|data)\/ {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
location ~ ^\/(?:\.|autotest|occ|issue|indie|db_|console) {
|
|
||||||
deny all;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ ^\/(?:index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+)\.php(?:$|\/) {
|
|
||||||
fastcgi_split_path_info ^(.+?\.php)(\/.*|)$;
|
|
||||||
set $path_info $fastcgi_path_info;
|
|
||||||
try_files $fastcgi_script_name =404;
|
|
||||||
include fastcgi_params;
|
|
||||||
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
|
|
||||||
fastcgi_param PATH_INFO $path_info;
|
|
||||||
fastcgi_param HTTPS on;
|
|
||||||
# Avoid sending the security headers twice
|
|
||||||
fastcgi_param modHeadersAvailable true;
|
|
||||||
# Enable pretty urls
|
|
||||||
fastcgi_param front_controller_active true;
|
|
||||||
fastcgi_pass phpfpm:9002;
|
|
||||||
fastcgi_intercept_errors on;
|
|
||||||
fastcgi_request_buffering off;
|
|
||||||
client_max_body_size 0;
|
|
||||||
fastcgi_read_timeout 1200;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ ^\/(?:updater|ocs-provider)(?:$|\/) {
|
|
||||||
try_files $uri/ =404;
|
|
||||||
index index.php;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ \.(?:css|js|woff2?|svg|gif|map)$ {
|
|
||||||
try_files $uri /index.php$request_uri;
|
|
||||||
add_header Cache-Control "public, max-age=15778463";
|
|
||||||
add_header Referrer-Policy "no-referrer" always;
|
|
||||||
add_header X-Content-Type-Options "nosniff" always;
|
|
||||||
add_header X-Download-Options "noopen" always;
|
|
||||||
add_header X-Frame-Options "SAMEORIGIN" always;
|
|
||||||
add_header X-Permitted-Cross-Domain-Policies "none" always;
|
|
||||||
add_header X-Robots-Tag "none" always;
|
|
||||||
add_header X-XSS-Protection "1; mode=block" always;
|
|
||||||
access_log off;
|
|
||||||
}
|
|
||||||
|
|
||||||
location ~ \.(?:png|html|ttf|ico|jpg|jpeg|bcmap)$ {
|
|
||||||
try_files $uri /index.php$request_uri;
|
|
||||||
access_log off;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) php /web/nextcloud/occ ${@}
|
|
||||||
37
data/conf/dovecot/conf.d/fts.conf
Normal file
37
data/conf/dovecot/conf.d/fts.conf
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
# mailcow FTS Flatcurve Settings, change them as you like.
|
||||||
|
plugin {
|
||||||
|
fts_autoindex = yes
|
||||||
|
fts_autoindex_exclude = \Junk
|
||||||
|
fts_autoindex_exclude2 = \Trash
|
||||||
|
# Tweak this setting if you only want to ensure big and frequent folders are indexed, not all.
|
||||||
|
fts_autoindex_max_recent_msgs = 20
|
||||||
|
fts = flatcurve
|
||||||
|
|
||||||
|
# Maximum term length can be set via the 'maxlen' argument (maxlen is
|
||||||
|
# specified in bytes, not number of UTF-8 characters)
|
||||||
|
fts_tokenizer_email_address = maxlen=100
|
||||||
|
fts_tokenizer_generic = algorithm=simple maxlen=30
|
||||||
|
|
||||||
|
# These are not flatcurve settings, but required for Dovecot FTS. See
|
||||||
|
# Dovecot FTS Configuration link above for further information.
|
||||||
|
fts_languages = en es de
|
||||||
|
fts_tokenizers = generic email-address
|
||||||
|
|
||||||
|
# OPTIONAL: Recommended default FTS core configuration
|
||||||
|
fts_filters = normalizer-icu snowball stopwords
|
||||||
|
fts_filters_en = lowercase snowball english-possessive stopwords
|
||||||
|
|
||||||
|
fts_index_timeout = 300
|
||||||
|
}
|
||||||
|
|
||||||
|
### THIS PART WILL BE CHANGED BY MODIFYING mailcow.conf AUTOMATICALLY DURING RUNTIME! ###
|
||||||
|
|
||||||
|
service indexer-worker {
|
||||||
|
# Max amount of simultaniously running indexer jobs.
|
||||||
|
process_limit=1
|
||||||
|
|
||||||
|
# Max amount of RAM used by EACH indexer process.
|
||||||
|
vsz_limit=128 MB
|
||||||
|
}
|
||||||
|
|
||||||
|
### THIS PART WILL BE CHANGED BY MODIFYING mailcow.conf AUTOMATICALLY DURING RUNTIME! ###
|
||||||
@@ -27,6 +27,8 @@ http {
|
|||||||
|
|
||||||
#gzip on;
|
#gzip on;
|
||||||
|
|
||||||
|
include /etc/nginx/conf.d/*.conf;
|
||||||
|
|
||||||
# map-size.conf:
|
# map-size.conf:
|
||||||
map_hash_max_size 256;
|
map_hash_max_size 256;
|
||||||
map_hash_bucket_size 256;
|
map_hash_bucket_size 256;
|
||||||
@@ -45,9 +47,11 @@ http {
|
|||||||
server {
|
server {
|
||||||
listen 127.0.0.1:65510; # sogo-auth verify internal
|
listen 127.0.0.1:65510; # sogo-auth verify internal
|
||||||
listen {{ HTTP_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%};
|
listen {{ HTTP_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%};
|
||||||
listen [::]:{{ HTTP_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%};
|
|
||||||
listen {{ HTTPS_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%} ssl;
|
listen {{ HTTPS_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%} ssl;
|
||||||
|
{% if not DISABLE_IPv6 %}
|
||||||
|
listen [::]:{{ HTTP_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%};
|
||||||
listen [::]:{{ HTTPS_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%} ssl;
|
listen [::]:{{ HTTPS_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%} ssl;
|
||||||
|
{%endif%}
|
||||||
http2 on;
|
http2 on;
|
||||||
|
|
||||||
ssl_certificate /etc/ssl/mail/cert.pem;
|
ssl_certificate /etc/ssl/mail/cert.pem;
|
||||||
@@ -61,7 +65,9 @@ http {
|
|||||||
# rspamd dynmaps:
|
# rspamd dynmaps:
|
||||||
server {
|
server {
|
||||||
listen 8081;
|
listen 8081;
|
||||||
|
{% if not DISABLE_IPv6 %}
|
||||||
listen [::]:8081;
|
listen [::]:8081;
|
||||||
|
{%endif%}
|
||||||
index index.php index.html;
|
index index.php index.html;
|
||||||
server_name _;
|
server_name _;
|
||||||
error_log /var/log/nginx/error.log;
|
error_log /var/log/nginx/error.log;
|
||||||
@@ -126,9 +132,11 @@ http {
|
|||||||
{% for cert in valid_cert_dirs %}
|
{% for cert in valid_cert_dirs %}
|
||||||
server {
|
server {
|
||||||
listen {{ HTTP_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%};
|
listen {{ HTTP_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%};
|
||||||
listen [::]:{{ HTTP_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%};
|
|
||||||
listen {{ HTTPS_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%} ssl;
|
listen {{ HTTPS_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%} ssl;
|
||||||
|
{% if not DISABLE_IPv6 %}
|
||||||
|
listen [::]:{{ HTTP_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%};
|
||||||
listen [::]:{{ HTTPS_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%} ssl;
|
listen [::]:{{ HTTPS_PORT }}{% if NGINX_USE_PROXY_PROTOCOL %} proxy_protocol{%endif%} ssl;
|
||||||
|
{%endif%}
|
||||||
http2 on;
|
http2 on;
|
||||||
|
|
||||||
ssl_certificate {{ cert.cert_path }}cert.pem;
|
ssl_certificate {{ cert.cert_path }}cert.pem;
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
# Whitelist generated by Postwhite v3.4 on Sun Dec 1 00:21:36 UTC 2024
|
# Whitelist generated by Postwhite v3.4 on Wed Jan 1 00:18:52 UTC 2025
|
||||||
# https://github.com/stevejenkins/postwhite/
|
# https://github.com/stevejenkins/postwhite/
|
||||||
# 1971 total rules
|
# 2014 total rules
|
||||||
2a00:1450:4000::/36 permit
|
2a00:1450:4000::/36 permit
|
||||||
2a01:111:f400::/48 permit
|
2a01:111:f400::/48 permit
|
||||||
2a01:111:f403:8000::/50 permit
|
2a01:111:f403:8000::/50 permit
|
||||||
@@ -19,6 +19,10 @@
|
|||||||
8.20.114.31 permit
|
8.20.114.31 permit
|
||||||
8.25.194.0/23 permit
|
8.25.194.0/23 permit
|
||||||
8.25.196.0/23 permit
|
8.25.196.0/23 permit
|
||||||
|
8.39.54.0/23 permit
|
||||||
|
8.39.54.250/31 permit
|
||||||
|
8.40.222.0/23 permit
|
||||||
|
8.40.222.250/31 permit
|
||||||
10.162.0.0/16 permit
|
10.162.0.0/16 permit
|
||||||
12.130.86.238 permit
|
12.130.86.238 permit
|
||||||
13.110.208.0/21 permit
|
13.110.208.0/21 permit
|
||||||
@@ -1472,6 +1476,9 @@
|
|||||||
163.114.135.16 permit
|
163.114.135.16 permit
|
||||||
164.152.23.32 permit
|
164.152.23.32 permit
|
||||||
164.177.132.168/30 permit
|
164.177.132.168/30 permit
|
||||||
|
165.173.128.0/24 permit
|
||||||
|
165.173.180.250/31 permit
|
||||||
|
165.173.182.250/31 permit
|
||||||
166.78.68.0/22 permit
|
166.78.68.0/22 permit
|
||||||
166.78.68.221 permit
|
166.78.68.221 permit
|
||||||
166.78.69.169 permit
|
166.78.69.169 permit
|
||||||
@@ -1500,6 +1507,12 @@
|
|||||||
168.245.12.252 permit
|
168.245.12.252 permit
|
||||||
168.245.46.9 permit
|
168.245.46.9 permit
|
||||||
168.245.127.231 permit
|
168.245.127.231 permit
|
||||||
|
169.148.129.0/24 permit
|
||||||
|
169.148.131.0/24 permit
|
||||||
|
169.148.142.10 permit
|
||||||
|
169.148.144.0/25 permit
|
||||||
|
169.148.144.10 permit
|
||||||
|
169.148.146.0/23 permit
|
||||||
170.10.128.0/24 permit
|
170.10.128.0/24 permit
|
||||||
170.10.129.0/24 permit
|
170.10.129.0/24 permit
|
||||||
170.10.132.56/29 permit
|
170.10.132.56/29 permit
|
||||||
@@ -1959,6 +1972,9 @@
|
|||||||
2603:1030:20e:3::23c permit
|
2603:1030:20e:3::23c permit
|
||||||
2603:1030:b:3::152 permit
|
2603:1030:b:3::152 permit
|
||||||
2603:1030:c02:8::14 permit
|
2603:1030:c02:8::14 permit
|
||||||
|
2607:13c0:0001:0000:0000:0000:0000:7000/116 permit
|
||||||
|
2607:13c0:0002:0000:0000:0000:0000:1000/116 permit
|
||||||
|
2607:13c0:0004:0000:0000:0000:0000:0000/116 permit
|
||||||
2607:f8b0:4000::/36 permit
|
2607:f8b0:4000::/36 permit
|
||||||
2620:109:c003:104::/64 permit
|
2620:109:c003:104::/64 permit
|
||||||
2620:109:c003:104::215 permit
|
2620:109:c003:104::215 permit
|
||||||
|
|||||||
@@ -16,6 +16,9 @@
|
|||||||
SOGoFoldersSendEMailNotifications = YES;
|
SOGoFoldersSendEMailNotifications = YES;
|
||||||
SOGoForwardEnabled = YES;
|
SOGoForwardEnabled = YES;
|
||||||
|
|
||||||
|
// Fixes "MODIFICATION_FAILED" error (HTTP 412) in Clients when accepting invitations from external services
|
||||||
|
SOGoDisableOrganizerEventCheck = YES;
|
||||||
|
|
||||||
// Option to set Users as admin to globally manage calendar permissions etc. Disabled by default
|
// Option to set Users as admin to globally manage calendar permissions etc. Disabled by default
|
||||||
// SOGoSuperUsernames = ("moo@example.com");
|
// SOGoSuperUsernames = ("moo@example.com");
|
||||||
|
|
||||||
|
|||||||
@@ -1531,6 +1531,9 @@ paths:
|
|||||||
port1:
|
port1:
|
||||||
description: the smtp port of the target mail server
|
description: the smtp port of the target mail server
|
||||||
type: string
|
type: string
|
||||||
|
user1:
|
||||||
|
description: the username of the mailbox
|
||||||
|
type: string
|
||||||
password:
|
password:
|
||||||
description: the password of the mailbox
|
description: the password of the mailbox
|
||||||
type: string
|
type: string
|
||||||
@@ -5415,12 +5418,6 @@ paths:
|
|||||||
started_at: "2019-12-22T20:59:58.382274592Z"
|
started_at: "2019-12-22T20:59:58.382274592Z"
|
||||||
state: running
|
state: running
|
||||||
type: info
|
type: info
|
||||||
solr-mailcow:
|
|
||||||
container: solr-mailcow
|
|
||||||
image: "mailcow/solr:1.7"
|
|
||||||
started_at: "2019-12-22T20:59:59.635413798Z"
|
|
||||||
state: running
|
|
||||||
type: info
|
|
||||||
unbound-mailcow:
|
unbound-mailcow:
|
||||||
container: unbound-mailcow
|
container: unbound-mailcow
|
||||||
image: "mailcow/unbound:1.10"
|
image: "mailcow/unbound:1.10"
|
||||||
@@ -5442,30 +5439,6 @@ paths:
|
|||||||
hey where started and a few other details.
|
hey where started and a few other details.
|
||||||
operationId: Get container status
|
operationId: Get container status
|
||||||
summary: Get container status
|
summary: Get container status
|
||||||
/api/v1/get/status/solr:
|
|
||||||
get:
|
|
||||||
responses:
|
|
||||||
"401":
|
|
||||||
$ref: "#/components/responses/Unauthorized"
|
|
||||||
"200":
|
|
||||||
content:
|
|
||||||
application/json:
|
|
||||||
examples:
|
|
||||||
response:
|
|
||||||
value:
|
|
||||||
solr_documents: null
|
|
||||||
solr_enabled: false
|
|
||||||
solr_size: null
|
|
||||||
type: info
|
|
||||||
description: OK
|
|
||||||
headers: {}
|
|
||||||
tags:
|
|
||||||
- Status
|
|
||||||
description: >-
|
|
||||||
Using this endpoint you can get the status of all containers and when
|
|
||||||
hey where started and a few other details.
|
|
||||||
operationId: Get solr status
|
|
||||||
summary: Get solr status
|
|
||||||
/api/v1/get/status/vmail:
|
/api/v1/get/status/vmail:
|
||||||
get:
|
get:
|
||||||
responses:
|
responses:
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ if (!isset($_SESSION['mailcow_cc_role']) || $_SESSION['mailcow_cc_role'] != "adm
|
|||||||
|
|
||||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/header.inc.php';
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/header.inc.php';
|
||||||
$_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
$_SESSION['return_to'] = $_SERVER['REQUEST_URI'];
|
||||||
$solr_status = (preg_match("/^([yY][eE][sS]|[yY])+$/", $_ENV["SKIP_SOLR"])) ? false : solr_status();
|
|
||||||
$clamd_status = (preg_match("/^([yY][eE][sS]|[yY])+$/", $_ENV["SKIP_CLAMD"])) ? false : true;
|
$clamd_status = (preg_match("/^([yY][eE][sS]|[yY])+$/", $_ENV["SKIP_CLAMD"])) ? false : true;
|
||||||
|
|
||||||
|
|
||||||
@@ -25,7 +24,6 @@ $vmail_df = explode(',', (string)json_decode(docker('post', 'dovecot-mailcow', '
|
|||||||
// containers
|
// containers
|
||||||
$containers_info = (array) docker('info');
|
$containers_info = (array) docker('info');
|
||||||
if ($clamd_status === false) unset($containers_info['clamd-mailcow']);
|
if ($clamd_status === false) unset($containers_info['clamd-mailcow']);
|
||||||
if ($solr_status === false) unset($containers_info['solr-mailcow']);
|
|
||||||
ksort($containers_info);
|
ksort($containers_info);
|
||||||
$containers = array();
|
$containers = array();
|
||||||
foreach ($containers_info as $container => $container_info) {
|
foreach ($containers_info as $container => $container_info) {
|
||||||
@@ -69,8 +67,6 @@ $template_data = [
|
|||||||
'timezone' => $timezone,
|
'timezone' => $timezone,
|
||||||
'gal' => @$_SESSION['gal'],
|
'gal' => @$_SESSION['gal'],
|
||||||
'license_guid' => license('guid'),
|
'license_guid' => license('guid'),
|
||||||
'solr_status' => $solr_status,
|
|
||||||
'solr_uptime' => round($solr_status['status']['dovecot-fts']['uptime'] / 1000 / 60 / 60),
|
|
||||||
'clamd_status' => $clamd_status,
|
'clamd_status' => $clamd_status,
|
||||||
'containers' => $containers,
|
'containers' => $containers,
|
||||||
'ip_check' => customize('get', 'ip_check'),
|
'ip_check' => customize('get', 'ip_check'),
|
||||||
|
|||||||
@@ -4,14 +4,14 @@ header('Content-Type: application/json');
|
|||||||
if (!isset($_SESSION['mailcow_cc_role'])) {
|
if (!isset($_SESSION['mailcow_cc_role'])) {
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
if (isset($_GET['script'])) {
|
if (isset($_REQUEST['script'])) {
|
||||||
$sieve = new Sieve\SieveParser();
|
$sieve = new Sieve\SieveParser();
|
||||||
try {
|
try {
|
||||||
if (empty($_GET['script'])) {
|
if (empty($_REQUEST['script'])) {
|
||||||
echo json_encode(array('type' => 'danger', 'msg' => $lang['danger']['script_empty']));
|
echo json_encode(array('type' => 'danger', 'msg' => $lang['danger']['script_empty']));
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
$sieve->parse($_GET['script']);
|
$sieve->parse($_REQUEST['script']);
|
||||||
}
|
}
|
||||||
catch (Exception $e) {
|
catch (Exception $e) {
|
||||||
echo json_encode(array('type' => 'danger', 'msg' => $e->getMessage()));
|
echo json_encode(array('type' => 'danger', 'msg' => $e->getMessage()));
|
||||||
|
|||||||
@@ -1023,7 +1023,7 @@ function user_get_alias_details($username) {
|
|||||||
AND `goto` != :username_goto2
|
AND `goto` != :username_goto2
|
||||||
AND `address` != :username_address");
|
AND `address` != :username_address");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
':username_goto' => '(^|,)'.$username.'($|,)',
|
':username_goto' => '(^|,)'.preg_quote($username, '/').'($|,)',
|
||||||
':username_goto2' => $username,
|
':username_goto2' => $username,
|
||||||
':username_address' => $username
|
':username_address' => $username
|
||||||
));
|
));
|
||||||
@@ -1071,7 +1071,7 @@ function user_get_alias_details($username) {
|
|||||||
$data['aliases_send_as_all'] = $row['send_as'];
|
$data['aliases_send_as_all'] = $row['send_as'];
|
||||||
}
|
}
|
||||||
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '') as `address` FROM `alias` WHERE `goto` REGEXP :username AND `address` LIKE '@%';");
|
$stmt = $pdo->prepare("SELECT IFNULL(GROUP_CONCAT(`address` SEPARATOR ', '), '') as `address` FROM `alias` WHERE `goto` REGEXP :username AND `address` LIKE '@%';");
|
||||||
$stmt->execute(array(':username' => '(^|,)'.$username.'($|,)'));
|
$stmt->execute(array(':username' => '(^|,)'.preg_quote($username, '/').'($|,)'));
|
||||||
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$run = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
while ($row = array_shift($run)) {
|
while ($row = array_shift($run)) {
|
||||||
$data['is_catch_all'] = $row['address'];
|
$data['is_catch_all'] = $row['address'];
|
||||||
@@ -3359,50 +3359,6 @@ function getGUID() {
|
|||||||
.substr($charid,16, 4).$hyphen
|
.substr($charid,16, 4).$hyphen
|
||||||
.substr($charid,20,12);
|
.substr($charid,20,12);
|
||||||
}
|
}
|
||||||
function solr_status() {
|
|
||||||
$curl = curl_init();
|
|
||||||
$endpoint = 'http://solr:8983/solr/admin/cores';
|
|
||||||
$params = array(
|
|
||||||
'action' => 'STATUS',
|
|
||||||
'core' => 'dovecot-fts',
|
|
||||||
'indexInfo' => 'true'
|
|
||||||
);
|
|
||||||
$url = $endpoint . '?' . http_build_query($params);
|
|
||||||
curl_setopt($curl, CURLOPT_URL, $url);
|
|
||||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
|
||||||
curl_setopt($curl, CURLOPT_POST, 0);
|
|
||||||
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
|
|
||||||
$response_core = curl_exec($curl);
|
|
||||||
if ($response_core === false) {
|
|
||||||
$err = curl_error($curl);
|
|
||||||
curl_close($curl);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
curl_close($curl);
|
|
||||||
$curl = curl_init();
|
|
||||||
$status_core = json_decode($response_core, true);
|
|
||||||
$url = 'http://solr:8983/solr/admin/info/system';
|
|
||||||
curl_setopt($curl, CURLOPT_URL, $url);
|
|
||||||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
|
|
||||||
curl_setopt($curl, CURLOPT_POST, 0);
|
|
||||||
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
|
|
||||||
$response_sysinfo = curl_exec($curl);
|
|
||||||
if ($response_sysinfo === false) {
|
|
||||||
$err = curl_error($curl);
|
|
||||||
curl_close($curl);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
curl_close($curl);
|
|
||||||
$status_sysinfo = json_decode($response_sysinfo, true);
|
|
||||||
$status = array_merge($status_core, $status_sysinfo);
|
|
||||||
return (!empty($status['status']['dovecot-fts']) && !empty($status['jvm']['memory'])) ? $status : false;
|
|
||||||
}
|
|
||||||
return (!empty($status['status']['dovecot-fts'])) ? $status['status']['dovecot-fts'] : false;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function cleanupJS($ignore = '', $folder = '/tmp/*.js') {
|
function cleanupJS($ignore = '', $folder = '/tmp/*.js') {
|
||||||
$now = time();
|
$now = time();
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
|||||||
$_data["validity"] = 8760;
|
$_data["validity"] = 8760;
|
||||||
}
|
}
|
||||||
$domain = $_data['domain'];
|
$domain = $_data['domain'];
|
||||||
|
$description = $_data['description'];
|
||||||
$valid_domains[] = mailbox('get', 'mailbox_details', $username)['domain'];
|
$valid_domains[] = mailbox('get', 'mailbox_details', $username)['domain'];
|
||||||
$valid_alias_domains = user_get_alias_details($username)['alias_domains'];
|
$valid_alias_domains = user_get_alias_details($username)['alias_domains'];
|
||||||
if (!empty($valid_alias_domains)) {
|
if (!empty($valid_alias_domains)) {
|
||||||
@@ -62,10 +63,11 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
$validity = strtotime("+" . $_data["validity"] . " hour");
|
$validity = strtotime("+" . $_data["validity"] . " hour");
|
||||||
$stmt = $pdo->prepare("INSERT INTO `spamalias` (`address`, `goto`, `validity`) VALUES
|
$stmt = $pdo->prepare("INSERT INTO `spamalias` (`address`, `description`, `goto`, `validity`) VALUES
|
||||||
(:address, :goto, :validity)");
|
(:address, :description, :goto, :validity)");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
':address' => readable_random_string(rand(rand(3, 9), rand(3, 9))) . '.' . readable_random_string(rand(rand(3, 9), rand(3, 9))) . '@' . $domain,
|
':address' => readable_random_string(rand(rand(3, 9), rand(3, 9))) . '.' . readable_random_string(rand(rand(3, 9), rand(3, 9))) . '@' . $domain,
|
||||||
|
':description' => $description,
|
||||||
':goto' => $username,
|
':goto' => $username,
|
||||||
':validity' => $validity
|
':validity' => $validity
|
||||||
));
|
));
|
||||||
@@ -3926,7 +3928,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
|||||||
$data['external_sender_aliases'] = array();
|
$data['external_sender_aliases'] = array();
|
||||||
// Fixed addresses
|
// Fixed addresses
|
||||||
$stmt = $pdo->prepare("SELECT `address` FROM `alias` WHERE `goto` REGEXP :goto AND `address` NOT LIKE '@%'");
|
$stmt = $pdo->prepare("SELECT `address` FROM `alias` WHERE `goto` REGEXP :goto AND `address` NOT LIKE '@%'");
|
||||||
$stmt->execute(array(':goto' => '(^|,)'.$_data.'($|,)'));
|
$stmt->execute(array(':goto' => '(^|,)'.preg_quote($_data, '/').'($|,)'));
|
||||||
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
while ($row = array_shift($rows)) {
|
while ($row = array_shift($rows)) {
|
||||||
$data['fixed_sender_aliases'][] = $row['address'];
|
$data['fixed_sender_aliases'][] = $row['address'];
|
||||||
@@ -4359,6 +4361,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
|||||||
}
|
}
|
||||||
$stmt = $pdo->prepare("SELECT `address`,
|
$stmt = $pdo->prepare("SELECT `address`,
|
||||||
`goto`,
|
`goto`,
|
||||||
|
`description`,
|
||||||
`validity`,
|
`validity`,
|
||||||
`created`,
|
`created`,
|
||||||
`modified`
|
`modified`
|
||||||
@@ -5595,25 +5598,6 @@ 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' && strtolower(getenv('FLATCURVE_EXPERIMENTAL')) != 'y') {
|
|
||||||
$curl = curl_init();
|
|
||||||
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_RETURNTRANSFER, 1);
|
|
||||||
curl_setopt($curl, CURLOPT_POST, 1);
|
|
||||||
curl_setopt($curl, CURLOPT_POSTFIELDS, '<delete><query>user:' . $username . '</query></delete>');
|
|
||||||
curl_setopt($curl, CURLOPT_TIMEOUT, 30);
|
|
||||||
$response = curl_exec($curl);
|
|
||||||
if ($response === false) {
|
|
||||||
$err = curl_error($curl);
|
|
||||||
$_SESSION['return'][] = array(
|
|
||||||
'type' => 'warning',
|
|
||||||
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
|
|
||||||
'msg' => 'Could not remove Solr index: ' . print_r($err, true)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
curl_close($curl);
|
|
||||||
}
|
|
||||||
$stmt = $pdo->prepare("DELETE FROM `alias` WHERE `goto` = :username");
|
$stmt = $pdo->prepare("DELETE FROM `alias` WHERE `goto` = :username");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
':username' => $username
|
':username' => $username
|
||||||
@@ -5714,7 +5698,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
|
|||||||
));
|
));
|
||||||
$stmt = $pdo->prepare("SELECT `address`, `goto` FROM `alias`
|
$stmt = $pdo->prepare("SELECT `address`, `goto` FROM `alias`
|
||||||
WHERE `goto` REGEXP :username");
|
WHERE `goto` REGEXP :username");
|
||||||
$stmt->execute(array(':username' => '(^|,)'.$username.'($|,)'));
|
$stmt->execute(array(':username' => '(^|,)'.preg_quote($username, '/').'($|,)'));
|
||||||
$GotoData = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
$GotoData = $stmt->fetchAll(PDO::FETCH_ASSOC);
|
||||||
foreach ($GotoData as $gotos) {
|
foreach ($GotoData as $gotos) {
|
||||||
$goto_exploded = explode(',', $gotos['goto']);
|
$goto_exploded = explode(',', $gotos['goto']);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
<?php
|
<?php
|
||||||
function init_db_schema() {
|
function init_db_schema()
|
||||||
|
{
|
||||||
try {
|
try {
|
||||||
global $pdo;
|
global $pdo;
|
||||||
|
|
||||||
@@ -489,7 +490,7 @@ function init_db_schema() {
|
|||||||
"quarantine_category" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
"quarantine_category" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
||||||
"app_passwds" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
"app_passwds" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
||||||
"pw_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
"pw_reset" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
||||||
),
|
),
|
||||||
"keys" => array(
|
"keys" => array(
|
||||||
"primary" => array(
|
"primary" => array(
|
||||||
"" => array("username")
|
"" => array("username")
|
||||||
@@ -528,6 +529,7 @@ function init_db_schema() {
|
|||||||
"cols" => array(
|
"cols" => array(
|
||||||
"address" => "VARCHAR(255) NOT NULL",
|
"address" => "VARCHAR(255) NOT NULL",
|
||||||
"goto" => "TEXT NOT NULL",
|
"goto" => "TEXT NOT NULL",
|
||||||
|
"description" => "TEXT NOT NULL",
|
||||||
"created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)",
|
"created" => "DATETIME(0) NOT NULL DEFAULT NOW(0)",
|
||||||
"modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP",
|
"modified" => "DATETIME ON UPDATE CURRENT_TIMESTAMP",
|
||||||
"validity" => "INT(11)"
|
"validity" => "INT(11)"
|
||||||
@@ -693,7 +695,7 @@ function init_db_schema() {
|
|||||||
"mailbox_relayhost" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
"mailbox_relayhost" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
||||||
"domain_relayhost" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
"domain_relayhost" => "TINYINT(1) NOT NULL DEFAULT '1'",
|
||||||
"domain_desc" => "TINYINT(1) NOT NULL DEFAULT '0'"
|
"domain_desc" => "TINYINT(1) NOT NULL DEFAULT '0'"
|
||||||
),
|
),
|
||||||
"keys" => array(
|
"keys" => array(
|
||||||
"primary" => array(
|
"primary" => array(
|
||||||
"" => array("username")
|
"" => array("username")
|
||||||
@@ -1166,7 +1168,7 @@ function init_db_schema() {
|
|||||||
while ($row = array_shift($rows)) {
|
while ($row = array_shift($rows)) {
|
||||||
$pdo->query($row['FKEY_DROP']);
|
$pdo->query($row['FKEY_DROP']);
|
||||||
}
|
}
|
||||||
foreach($properties['cols'] as $column => $type) {
|
foreach ($properties['cols'] as $column => $type) {
|
||||||
$stmt = $pdo->query("SHOW COLUMNS FROM `" . $table . "` LIKE '" . $column . "'");
|
$stmt = $pdo->query("SHOW COLUMNS FROM `" . $table . "` LIKE '" . $column . "'");
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
if ($num_results == 0) {
|
if ($num_results == 0) {
|
||||||
@@ -1180,12 +1182,11 @@ function init_db_schema() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
$pdo->query("ALTER TABLE `" . $table . "` ADD `" . $column . "` " . $type);
|
$pdo->query("ALTER TABLE `" . $table . "` ADD `" . $column . "` " . $type);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
$pdo->query("ALTER TABLE `" . $table . "` MODIFY COLUMN `" . $column . "` " . $type);
|
$pdo->query("ALTER TABLE `" . $table . "` MODIFY COLUMN `" . $column . "` " . $type);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach($properties['keys'] as $key_type => $key_content) {
|
foreach ($properties['keys'] as $key_type => $key_content) {
|
||||||
if (strtolower($key_type) == 'primary') {
|
if (strtolower($key_type) == 'primary') {
|
||||||
foreach ($key_content as $key_values) {
|
foreach ($key_content as $key_values) {
|
||||||
$fields = "`" . implode("`, `", $key_values) . "`";
|
$fields = "`" . implode("`, `", $key_values) . "`";
|
||||||
@@ -1242,18 +1243,18 @@ function init_db_schema() {
|
|||||||
$keys_to_exist = array();
|
$keys_to_exist = array();
|
||||||
if (isset($properties['keys']['unique']) && is_array($properties['keys']['unique'])) {
|
if (isset($properties['keys']['unique']) && is_array($properties['keys']['unique'])) {
|
||||||
foreach ($properties['keys']['unique'] as $key_name => $key_values) {
|
foreach ($properties['keys']['unique'] as $key_name => $key_values) {
|
||||||
$keys_to_exist[] = $key_name;
|
$keys_to_exist[] = $key_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (isset($properties['keys']['key']) && is_array($properties['keys']['key'])) {
|
if (isset($properties['keys']['key']) && is_array($properties['keys']['key'])) {
|
||||||
foreach ($properties['keys']['key'] as $key_name => $key_values) {
|
foreach ($properties['keys']['key'] as $key_name => $key_values) {
|
||||||
$keys_to_exist[] = $key_name;
|
$keys_to_exist[] = $key_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Index for foreign key must exist
|
// Index for foreign key must exist
|
||||||
if (isset($properties['keys']['fkey']) && is_array($properties['keys']['fkey'])) {
|
if (isset($properties['keys']['fkey']) && is_array($properties['keys']['fkey'])) {
|
||||||
foreach ($properties['keys']['fkey'] as $key_name => $key_values) {
|
foreach ($properties['keys']['fkey'] as $key_name => $key_values) {
|
||||||
$keys_to_exist[] = $key_name;
|
$keys_to_exist[] = $key_name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Step 2: Drop all vanished indexes
|
// Step 2: Drop all vanished indexes
|
||||||
@@ -1270,33 +1271,29 @@ function init_db_schema() {
|
|||||||
$pdo->query("ALTER TABLE `" . $table . "` DROP PRIMARY KEY");
|
$pdo->query("ALTER TABLE `" . $table . "` DROP PRIMARY KEY");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
// Create table if it is missing
|
// Create table if it is missing
|
||||||
$sql = "CREATE TABLE IF NOT EXISTS `" . $table . "` (";
|
$sql = "CREATE TABLE IF NOT EXISTS `" . $table . "` (";
|
||||||
foreach($properties['cols'] as $column => $type) {
|
foreach ($properties['cols'] as $column => $type) {
|
||||||
$sql .= "`" . $column . "` " . $type . ",";
|
$sql .= "`" . $column . "` " . $type . ",";
|
||||||
}
|
}
|
||||||
foreach($properties['keys'] as $key_type => $key_content) {
|
foreach ($properties['keys'] as $key_type => $key_content) {
|
||||||
if (strtolower($key_type) == 'primary') {
|
if (strtolower($key_type) == 'primary') {
|
||||||
foreach ($key_content as $key_values) {
|
foreach ($key_content as $key_values) {
|
||||||
$fields = "`" . implode("`, `", $key_values) . "`";
|
$fields = "`" . implode("`, `", $key_values) . "`";
|
||||||
$sql .= "PRIMARY KEY (" . $fields . ")" . ",";
|
$sql .= "PRIMARY KEY (" . $fields . ")" . ",";
|
||||||
}
|
}
|
||||||
}
|
} elseif (strtolower($key_type) == 'key') {
|
||||||
elseif (strtolower($key_type) == 'key') {
|
|
||||||
foreach ($key_content as $key_name => $key_values) {
|
foreach ($key_content as $key_name => $key_values) {
|
||||||
$fields = "`" . implode("`, `", $key_values) . "`";
|
$fields = "`" . implode("`, `", $key_values) . "`";
|
||||||
$sql .= "KEY `" . $key_name . "` (" . $fields . ")" . ",";
|
$sql .= "KEY `" . $key_name . "` (" . $fields . ")" . ",";
|
||||||
}
|
}
|
||||||
}
|
} elseif (strtolower($key_type) == 'unique') {
|
||||||
elseif (strtolower($key_type) == 'unique') {
|
|
||||||
foreach ($key_content as $key_name => $key_values) {
|
foreach ($key_content as $key_name => $key_values) {
|
||||||
$fields = "`" . implode("`, `", $key_values) . "`";
|
$fields = "`" . implode("`, `", $key_values) . "`";
|
||||||
$sql .= "UNIQUE KEY `" . $key_name . "` (" . $fields . ")" . ",";
|
$sql .= "UNIQUE KEY `" . $key_name . "` (" . $fields . ")" . ",";
|
||||||
}
|
}
|
||||||
}
|
} elseif (strtolower($key_type) == 'fkey') {
|
||||||
elseif (strtolower($key_type) == 'fkey') {
|
|
||||||
foreach ($key_content as $key_name => $key_values) {
|
foreach ($key_content as $key_name => $key_values) {
|
||||||
@list($table_ref, $field_ref) = explode('.', $key_values['ref']);
|
@list($table_ref, $field_ref) = explode('.', $key_values['ref']);
|
||||||
$sql .= "FOREIGN KEY `" . $key_name . "` (" . $key_values['col'] . ") REFERENCES `" . $table_ref . "` (`" . $field_ref . "`)
|
$sql .= "FOREIGN KEY `" . $key_name . "` (" . $key_values['col'] . ") REFERENCES `" . $table_ref . "` (`" . $field_ref . "`)
|
||||||
@@ -1310,7 +1307,6 @@ function init_db_schema() {
|
|||||||
}
|
}
|
||||||
// Reset table attributes
|
// Reset table attributes
|
||||||
$pdo->query("ALTER TABLE `" . $table . "` " . $properties['attr'] . ";");
|
$pdo->query("ALTER TABLE `" . $table . "` " . $properties['attr'] . ";");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recreate SQL views
|
// Recreate SQL views
|
||||||
@@ -1337,12 +1333,12 @@ function init_db_schema() {
|
|||||||
$stmt = $pdo->query("SELECT NULL FROM `admin`");
|
$stmt = $pdo->query("SELECT NULL FROM `admin`");
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
if ($num_results == 0) {
|
if ($num_results == 0) {
|
||||||
$pdo->query("INSERT INTO `admin` (`username`, `password`, `superadmin`, `created`, `modified`, `active`)
|
$pdo->query("INSERT INTO `admin` (`username`, `password`, `superadmin`, `created`, `modified`, `active`)
|
||||||
VALUES ('admin', '{SSHA256}K8eVJ6YsZbQCfuJvSUbaQRLr0HPLz5rC9IAp0PAFl0tmNDBkMDc0NDAyOTAxN2Rk', 1, NOW(), NOW(), 1)");
|
VALUES ('admin', '{SSHA256}K8eVJ6YsZbQCfuJvSUbaQRLr0HPLz5rC9IAp0PAFl0tmNDBkMDc0NDAyOTAxN2Rk', 1, NOW(), NOW(), 1)");
|
||||||
$pdo->query("INSERT INTO `domain_admins` (`username`, `domain`, `created`, `active`)
|
$pdo->query("INSERT INTO `domain_admins` (`username`, `domain`, `created`, `active`)
|
||||||
SELECT `username`, 'ALL', NOW(), 1 FROM `admin`
|
SELECT `username`, 'ALL', NOW(), 1 FROM `admin`
|
||||||
WHERE superadmin='1' AND `username` NOT IN (SELECT `username` FROM `domain_admins`);");
|
WHERE superadmin='1' AND `username` NOT IN (SELECT `username` FROM `domain_admins`);");
|
||||||
$pdo->query("DELETE FROM `admin` WHERE `username` NOT IN (SELECT `username` FROM `domain_admins`);");
|
$pdo->query("DELETE FROM `admin` WHERE `username` NOT IN (SELECT `username` FROM `domain_admins`);");
|
||||||
}
|
}
|
||||||
// Insert new DB schema version
|
// Insert new DB schema version
|
||||||
$pdo->query("REPLACE INTO `versions` (`application`, `version`) VALUES ('db_schema', '" . $db_version . "');");
|
$pdo->query("REPLACE INTO `versions` (`application`, `version`) VALUES ('db_schema', '" . $db_version . "');");
|
||||||
@@ -1370,7 +1366,7 @@ function init_db_schema() {
|
|||||||
$pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.mailbox_format', \"maildir:\") WHERE JSON_VALUE(`attributes`, '$.mailbox_format') IS NULL;");
|
$pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.mailbox_format', \"maildir:\") WHERE JSON_VALUE(`attributes`, '$.mailbox_format') IS NULL;");
|
||||||
$pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.quarantine_notification', \"never\") WHERE JSON_VALUE(`attributes`, '$.quarantine_notification') IS NULL;");
|
$pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.quarantine_notification', \"never\") WHERE JSON_VALUE(`attributes`, '$.quarantine_notification') IS NULL;");
|
||||||
$pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.quarantine_category', \"reject\") WHERE JSON_VALUE(`attributes`, '$.quarantine_category') IS NULL;");
|
$pdo->query("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.quarantine_category', \"reject\") WHERE JSON_VALUE(`attributes`, '$.quarantine_category') IS NULL;");
|
||||||
foreach($tls_options as $tls_user => $tls_options) {
|
foreach ($tls_options as $tls_user => $tls_options) {
|
||||||
$stmt = $pdo->prepare("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.tls_enforce_in', :tls_enforce_in),
|
$stmt = $pdo->prepare("UPDATE `mailbox` SET `attributes` = JSON_SET(`attributes`, '$.tls_enforce_in', :tls_enforce_in),
|
||||||
`attributes` = JSON_SET(`attributes`, '$.tls_enforce_out', :tls_enforce_out)
|
`attributes` = JSON_SET(`attributes`, '$.tls_enforce_out', :tls_enforce_out)
|
||||||
WHERE `username` = :username");
|
WHERE `username` = :username");
|
||||||
@@ -1449,7 +1445,7 @@ function init_db_schema() {
|
|||||||
":template" => $default_domain_template["template"]
|
":template" => $default_domain_template["template"]
|
||||||
));
|
));
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
if (empty($row)){
|
if (empty($row)) {
|
||||||
$stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`)
|
$stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`)
|
||||||
VALUES (:type, :template, :attributes)");
|
VALUES (:type, :template, :attributes)");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
@@ -1464,7 +1460,7 @@ function init_db_schema() {
|
|||||||
":template" => $default_mailbox_template["template"]
|
":template" => $default_mailbox_template["template"]
|
||||||
));
|
));
|
||||||
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
$row = $stmt->fetch(PDO::FETCH_ASSOC);
|
||||||
if (empty($row)){
|
if (empty($row)) {
|
||||||
$stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`)
|
$stmt = $pdo->prepare("INSERT INTO `templates` (`type`, `template`, `attributes`)
|
||||||
VALUES (:type, :template, :attributes)");
|
VALUES (:type, :template, :attributes)");
|
||||||
$stmt->execute(array(
|
$stmt->execute(array(
|
||||||
@@ -1486,8 +1482,7 @@ function init_db_schema() {
|
|||||||
'msg' => 'db_init_complete'
|
'msg' => 'db_init_complete'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
} catch (PDOException $e) {
|
||||||
catch (PDOException $e) {
|
|
||||||
if (php_sapi_name() == "cli") {
|
if (php_sapi_name() == "cli") {
|
||||||
echo "DB initialization failed: " . print_r($e, true) . PHP_EOL;
|
echo "DB initialization failed: " . print_r($e, true) . PHP_EOL;
|
||||||
} else {
|
} else {
|
||||||
@@ -1525,8 +1520,7 @@ if (php_sapi_name() == "cli") {
|
|||||||
try {
|
try {
|
||||||
update_sogo_static_view();
|
update_sogo_static_view();
|
||||||
echo "Fixed _sogo_static_view" . PHP_EOL;
|
echo "Fixed _sogo_static_view" . PHP_EOL;
|
||||||
}
|
} catch (Exception $e) {
|
||||||
catch ( Exception $e ) {
|
|
||||||
// Dunno
|
// Dunno
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1534,9 +1528,8 @@ if (php_sapi_name() == "cli") {
|
|||||||
$m = new Memcached();
|
$m = new Memcached();
|
||||||
$m->addServer('memcached', 11211);
|
$m->addServer('memcached', 11211);
|
||||||
$m->flush();
|
$m->flush();
|
||||||
echo "Cleaned up memcached". PHP_EOL;
|
echo "Cleaned up memcached" . PHP_EOL;
|
||||||
}
|
} catch (Exception $e) {
|
||||||
catch ( Exception $e ) {
|
|
||||||
// Dunno
|
// Dunno
|
||||||
}
|
}
|
||||||
init_db_schema();
|
init_db_schema();
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ if (!empty($_GET['sso_token'])) {
|
|||||||
$username = domain_admin_sso('check', $_GET['sso_token']);
|
$username = domain_admin_sso('check', $_GET['sso_token']);
|
||||||
|
|
||||||
if ($username !== false) {
|
if ($username !== false) {
|
||||||
|
session_regenerate_id();
|
||||||
$_SESSION['mailcow_cc_username'] = $username;
|
$_SESSION['mailcow_cc_username'] = $username;
|
||||||
$_SESSION['mailcow_cc_role'] = 'domainadmin';
|
$_SESSION['mailcow_cc_role'] = 'domainadmin';
|
||||||
header('Location: /mailbox');
|
header('Location: /mailbox');
|
||||||
@@ -137,13 +138,15 @@ if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) {
|
|||||||
$login_user = strtolower(trim($_POST["login_user"]));
|
$login_user = strtolower(trim($_POST["login_user"]));
|
||||||
$as = check_login($login_user, $_POST["pass_user"]);
|
$as = check_login($login_user, $_POST["pass_user"]);
|
||||||
|
|
||||||
if ($as == "admin") {
|
if ($as == "admin") {
|
||||||
|
session_regenerate_id();
|
||||||
$_SESSION['mailcow_cc_username'] = $login_user;
|
$_SESSION['mailcow_cc_username'] = $login_user;
|
||||||
$_SESSION['mailcow_cc_role'] = "admin";
|
$_SESSION['mailcow_cc_role'] = "admin";
|
||||||
header("Location: /debug");
|
header("Location: /debug");
|
||||||
die();
|
die();
|
||||||
}
|
}
|
||||||
elseif ($as == "domainadmin") {
|
elseif ($as == "domainadmin") {
|
||||||
|
session_regenerate_id();
|
||||||
$_SESSION['mailcow_cc_username'] = $login_user;
|
$_SESSION['mailcow_cc_username'] = $login_user;
|
||||||
$_SESSION['mailcow_cc_role'] = "domainadmin";
|
$_SESSION['mailcow_cc_role'] = "domainadmin";
|
||||||
header("Location: /mailbox");
|
header("Location: /mailbox");
|
||||||
@@ -151,6 +154,7 @@ if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) {
|
|||||||
}
|
}
|
||||||
elseif ($as == "user") {
|
elseif ($as == "user") {
|
||||||
set_user_loggedin_session($login_user);
|
set_user_loggedin_session($login_user);
|
||||||
|
session_regenerate_id();
|
||||||
$http_parameters = explode('&', $_SESSION['index_query_string']);
|
$http_parameters = explode('&', $_SESSION['index_query_string']);
|
||||||
unset($_SESSION['index_query_string']);
|
unset($_SESSION['index_query_string']);
|
||||||
if (in_array('mobileconfig', $http_parameters)) {
|
if (in_array('mobileconfig', $http_parameters)) {
|
||||||
@@ -170,6 +174,10 @@ if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) {
|
|||||||
} else {
|
} else {
|
||||||
header("Location: /user");
|
header("Location: /user");
|
||||||
die();
|
die();
|
||||||
|
}
|
||||||
|
if (!isset($_SESSION['oauth2_request'])) {
|
||||||
|
header("Location: /user");
|
||||||
|
die();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
elseif ($as != "pending") {
|
elseif ($as != "pending") {
|
||||||
@@ -178,7 +186,9 @@ if (isset($_POST["login_user"]) && isset($_POST["pass_user"])) {
|
|||||||
unset($_SESSION['pending_tfa_methods']);
|
unset($_SESSION['pending_tfa_methods']);
|
||||||
unset($_SESSION['mailcow_cc_username']);
|
unset($_SESSION['mailcow_cc_username']);
|
||||||
unset($_SESSION['mailcow_cc_role']);
|
unset($_SESSION['mailcow_cc_role']);
|
||||||
}
|
} else {
|
||||||
|
session_regenerate_id();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($_SESSION['mailcow_cc_role']) && (isset($_SESSION['acl']['login_as']) && $_SESSION['acl']['login_as'] == "1")) {
|
if (isset($_SESSION['mailcow_cc_role']) && (isset($_SESSION['acl']['login_as']) && $_SESSION['acl']['login_as'] == "1")) {
|
||||||
|
|||||||
@@ -93,6 +93,7 @@ $AVAILABLE_LANGUAGES = array(
|
|||||||
'gr-gr' => 'Ελληνικά (Greek)',
|
'gr-gr' => 'Ελληνικά (Greek)',
|
||||||
'hu-hu' => 'Magyar (Hungarian)',
|
'hu-hu' => 'Magyar (Hungarian)',
|
||||||
'it-it' => 'Italiano (Italian)',
|
'it-it' => 'Italiano (Italian)',
|
||||||
|
'ja-jp' => '日本語 (Japanese)',
|
||||||
'ko-kr' => '한국어 (Korean)',
|
'ko-kr' => '한국어 (Korean)',
|
||||||
'lv-lv' => 'latviešu (Latvian)',
|
'lv-lv' => 'latviešu (Latvian)',
|
||||||
'lt-lt' => 'Lietuvių (Lithuanian)',
|
'lt-lt' => 'Lietuvių (Lithuanian)',
|
||||||
|
|||||||
@@ -179,9 +179,8 @@ $(document).ready(function() {
|
|||||||
// Get script_data textarea content from form the button was clicked in
|
// Get script_data textarea content from form the button was clicked in
|
||||||
var script = $('textarea[name="script_data"]', $(this).parents('form:first')).val();
|
var script = $('textarea[name="script_data"]', $(this).parents('form:first')).val();
|
||||||
$.ajax({
|
$.ajax({
|
||||||
dataType: 'json',
|
|
||||||
url: "/inc/ajax/sieve_validation.php",
|
url: "/inc/ajax/sieve_validation.php",
|
||||||
type: "get",
|
type: "post",
|
||||||
data: { script: script },
|
data: { script: script },
|
||||||
complete: function(data) {
|
complete: function(data) {
|
||||||
var response = (data.responseText);
|
var response = (data.responseText);
|
||||||
|
|||||||
@@ -214,6 +214,14 @@ jQuery(function($){
|
|||||||
data: 'address',
|
data: 'address',
|
||||||
defaultContent: ''
|
defaultContent: ''
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: lang.description,
|
||||||
|
data: 'description',
|
||||||
|
defaultContent: '',
|
||||||
|
render: function (data, type) {
|
||||||
|
return escapeHtml(data);
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: lang.alias_valid_until,
|
title: lang.alias_valid_until,
|
||||||
data: 'validity',
|
data: 'validity',
|
||||||
|
|||||||
@@ -1078,9 +1078,10 @@ if (isset($_GET['query'])) {
|
|||||||
['db' => 'last_mail_login', 'dt' => 4, 'dummy' => true, 'order_subquery' => "SELECT MAX(`datetime`) FROM `sasl_log` WHERE `service` != 'SSO' AND `username` = `m`.`username`"],
|
['db' => 'last_mail_login', 'dt' => 4, 'dummy' => true, 'order_subquery' => "SELECT MAX(`datetime`) FROM `sasl_log` WHERE `service` != 'SSO' AND `username` = `m`.`username`"],
|
||||||
['db' => 'last_pw_change', 'dt' => 5, 'dummy' => true, 'order_subquery' => "JSON_EXTRACT(attributes, '$.passwd_update')"],
|
['db' => 'last_pw_change', 'dt' => 5, 'dummy' => true, 'order_subquery' => "JSON_EXTRACT(attributes, '$.passwd_update')"],
|
||||||
['db' => 'in_use', 'dt' => 6, 'dummy' => true, 'order_subquery' => "(SELECT SUM(bytes) FROM `quota2` WHERE `quota2`.`username` = `m`.`username`) / `m`.`quota`"],
|
['db' => 'in_use', 'dt' => 6, 'dummy' => true, 'order_subquery' => "(SELECT SUM(bytes) FROM `quota2` WHERE `quota2`.`username` = `m`.`username`) / `m`.`quota`"],
|
||||||
['db' => 'messages', 'dt' => 18, 'dummy' => true, 'order_subquery' => "SELECT SUM(messages) FROM `quota2` WHERE `quota2`.`username` = `m`.`username`"],
|
['db' => 'name', 'dt' => 7],
|
||||||
|
['db' => 'messages', 'dt' => 17, 'dummy' => true, 'order_subquery' => "SELECT SUM(messages) FROM `quota2` WHERE `quota2`.`username` = `m`.`username`"],
|
||||||
['db' => 'tags', 'dt' => 20, 'dummy' => true, 'search' => ['join' => 'LEFT JOIN `tags_mailbox` AS `tm` ON `tm`.`username` = `m`.`username`', 'where_column' => '`tm`.`tag_name`']],
|
['db' => 'tags', 'dt' => 20, 'dummy' => true, 'search' => ['join' => 'LEFT JOIN `tags_mailbox` AS `tm` ON `tm`.`username` = `m`.`username`', 'where_column' => '`tm`.`tag_name`']],
|
||||||
['db' => 'active', 'dt' => 21]
|
['db' => 'active', 'dt' => 21],
|
||||||
];
|
];
|
||||||
|
|
||||||
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/lib/ssp.class.php';
|
require_once $_SERVER['DOCUMENT_ROOT'] . '/inc/lib/ssp.class.php';
|
||||||
@@ -1638,23 +1639,6 @@ if (isset($_GET['query'])) {
|
|||||||
);
|
);
|
||||||
echo json_encode($temp, JSON_UNESCAPED_SLASHES);
|
echo json_encode($temp, JSON_UNESCAPED_SLASHES);
|
||||||
break;
|
break;
|
||||||
case "solr":
|
|
||||||
$solr_status = solr_status();
|
|
||||||
$solr_size = ($solr_status['status']['dovecot-fts']['index']['size']);
|
|
||||||
$solr_documents = ($solr_status['status']['dovecot-fts']['index']['numDocs']);
|
|
||||||
if (strtolower(getenv('SKIP_SOLR')) != 'n') {
|
|
||||||
$solr_enabled = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$solr_enabled = true;
|
|
||||||
}
|
|
||||||
echo json_encode(array(
|
|
||||||
'type' => 'info',
|
|
||||||
'solr_enabled' => $solr_enabled,
|
|
||||||
'solr_size' => $solr_size,
|
|
||||||
'solr_documents' => $solr_documents
|
|
||||||
));
|
|
||||||
break;
|
|
||||||
case "host":
|
case "host":
|
||||||
if (!$extra){
|
if (!$extra){
|
||||||
$stats = docker("host_stats");
|
$stats = docker("host_stats");
|
||||||
|
|||||||
@@ -493,6 +493,7 @@
|
|||||||
"client_configuration": "Guies de configuració per als clients de correu més habituals",
|
"client_configuration": "Guies de configuració per als clients de correu més habituals",
|
||||||
"create_syncjob": "Afegir treball de sincronitzaió",
|
"create_syncjob": "Afegir treball de sincronitzaió",
|
||||||
"day": "Dia",
|
"day": "Dia",
|
||||||
|
"description": "Descripció",
|
||||||
"direct_aliases": "Adreces àlies directes",
|
"direct_aliases": "Adreces àlies directes",
|
||||||
"direct_aliases_desc": "Els àlies directes sí que es veuen afectat per la configuració de l'usuari",
|
"direct_aliases_desc": "Els àlies directes sí que es veuen afectat per la configuració de l'usuari",
|
||||||
"eas_reset": "Fer un reset de la cache d'ActiveSync del dispositiu",
|
"eas_reset": "Fer un reset de la cache d'ActiveSync del dispositiu",
|
||||||
@@ -558,4 +559,4 @@
|
|||||||
"week": "Setmana",
|
"week": "Setmana",
|
||||||
"weeks": "Setmanes"
|
"weeks": "Setmanes"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -521,7 +521,6 @@
|
|||||||
"external_logs": "Externí logy",
|
"external_logs": "Externí logy",
|
||||||
"history_all_servers": "Záznam (všechny servery)",
|
"history_all_servers": "Záznam (všechny servery)",
|
||||||
"in_memory_logs": "Logy v paměti",
|
"in_memory_logs": "Logy v paměti",
|
||||||
"jvm_memory_solr": "Spotřeba paměti JVM",
|
|
||||||
"last_modified": "Naposledy změněn",
|
"last_modified": "Naposledy změněn",
|
||||||
"log_info": "<p><b>Logy v paměti</b> jsou shromažďovány v Redis seznamech a jsou oříznuty na LOG_LINES (%d) každou minutu, aby se nepřetěžoval server.\r\n <br>Logy v paměti nemají být trvalé. Všechny aplikace, které logují do paměti, zároveň logují i do Docker služby podle nastavení logging driveru.\r\n <br>Logy v paměti lze použít pro ladění drobných problémů s kontejnery.</p>\r\n <p><b>Externí logy</b> jsou shromažďovány pomocí API dané aplikace.</p>\r\n <p><b>Statické logy</b> jsou většinou logy činností, které nejsou zaznamenávány do Docker služby, ale přesto je dobré je schraňovat (výjimkou jsou logy API).</p>",
|
"log_info": "<p><b>Logy v paměti</b> jsou shromažďovány v Redis seznamech a jsou oříznuty na LOG_LINES (%d) každou minutu, aby se nepřetěžoval server.\r\n <br>Logy v paměti nemají být trvalé. Všechny aplikace, které logují do paměti, zároveň logují i do Docker služby podle nastavení logging driveru.\r\n <br>Logy v paměti lze použít pro ladění drobných problémů s kontejnery.</p>\r\n <p><b>Externí logy</b> jsou shromažďovány pomocí API dané aplikace.</p>\r\n <p><b>Statické logy</b> jsou většinou logy činností, které nejsou zaznamenávány do Docker služby, ale přesto je dobré je schraňovat (výjimkou jsou logy API).</p>",
|
||||||
"login_time": "Čas",
|
"login_time": "Čas",
|
||||||
@@ -530,8 +529,6 @@
|
|||||||
"restart_container": "Restartovat",
|
"restart_container": "Restartovat",
|
||||||
"service": "Služba",
|
"service": "Služba",
|
||||||
"size": "Velikost",
|
"size": "Velikost",
|
||||||
"solr_dead": "Solr se spouští, je vypnutý nebo spadl.",
|
|
||||||
"solr_status": "Stav Solr",
|
|
||||||
"started_at": "Spuštěn",
|
"started_at": "Spuštěn",
|
||||||
"started_on": "Spuštěno",
|
"started_on": "Spuštěno",
|
||||||
"static_logs": "Statické logy",
|
"static_logs": "Statické logy",
|
||||||
@@ -1164,6 +1161,7 @@
|
|||||||
"created_on": "Vytvoreno",
|
"created_on": "Vytvoreno",
|
||||||
"daily": "Každý den",
|
"daily": "Každý den",
|
||||||
"day": "den",
|
"day": "den",
|
||||||
|
"description": "Popis",
|
||||||
"delete_ays": "Potvrďte odstranění.",
|
"delete_ays": "Potvrďte odstranění.",
|
||||||
"direct_aliases": "Přímé aliasy",
|
"direct_aliases": "Přímé aliasy",
|
||||||
"direct_aliases_desc": "Na přímé aliasy se uplatňuje filtr spamu a nastavení pravidel TLS",
|
"direct_aliases_desc": "Na přímé aliasy se uplatňuje filtr spamu a nastavení pravidel TLS",
|
||||||
@@ -1309,4 +1307,4 @@
|
|||||||
"session_token": "Token formuláře není platný: Token mismatch",
|
"session_token": "Token formuláře není platný: Token mismatch",
|
||||||
"session_ua": "Token formuláře není platný: User-Agent validation error"
|
"session_ua": "Token formuláře není platný: User-Agent validation error"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -444,12 +444,9 @@
|
|||||||
"external_logs": "Eksterne logfiler",
|
"external_logs": "Eksterne logfiler",
|
||||||
"history_all_servers": "Historie (alle servere)",
|
"history_all_servers": "Historie (alle servere)",
|
||||||
"in_memory_logs": "In-memory logs",
|
"in_memory_logs": "In-memory logs",
|
||||||
"jvm_memory_solr": "Brug af JVM-hukommelse",
|
|
||||||
"log_info": "<p>mailcow <b>in-memory logs</b> er samlet i Redis-lister og trimmet til LOG_LINES (%d) hvert minut for at reducere hamring.\r\n <br>Logbøger i hukommelsen er ikke beregnet til at være vedholdende. Alle applikationer, der logger ind i hukommelsen, logger også på Docker-dæmonen og derfor til standardlogdriveren.\r\n <br>Logtypen i hukommelsen skal bruges til fejlfinding af mindre problemer med containere.</p>\r\n <p><b>Eksterne logfiler</b> indsamles via API for den givne applikation.</p>\r\n <p><b>Statiske logfiler</b> er for det meste aktivitetslogfiler, der ikke er logget på Dockerd, men stadig skal være vedholdende (undtagen API-logfiler).</p>",
|
"log_info": "<p>mailcow <b>in-memory logs</b> er samlet i Redis-lister og trimmet til LOG_LINES (%d) hvert minut for at reducere hamring.\r\n <br>Logbøger i hukommelsen er ikke beregnet til at være vedholdende. Alle applikationer, der logger ind i hukommelsen, logger også på Docker-dæmonen og derfor til standardlogdriveren.\r\n <br>Logtypen i hukommelsen skal bruges til fejlfinding af mindre problemer med containere.</p>\r\n <p><b>Eksterne logfiler</b> indsamles via API for den givne applikation.</p>\r\n <p><b>Statiske logfiler</b> er for det meste aktivitetslogfiler, der ikke er logget på Dockerd, men stadig skal være vedholdende (undtagen API-logfiler).</p>",
|
||||||
"logs": "Logs",
|
"logs": "Logs",
|
||||||
"restart_container": "Genstart",
|
"restart_container": "Genstart",
|
||||||
"solr_dead": "Solr starter, deaktiveres eller døde.",
|
|
||||||
"solr_status": "Solr-status",
|
|
||||||
"started_on": "Startede den",
|
"started_on": "Startede den",
|
||||||
"static_logs": "Statiske logfiler",
|
"static_logs": "Statiske logfiler",
|
||||||
"system_containers": "System og Beholdere",
|
"system_containers": "System og Beholdere",
|
||||||
@@ -971,6 +968,7 @@
|
|||||||
"create_syncjob": "Opret nyt sync job",
|
"create_syncjob": "Opret nyt sync job",
|
||||||
"daily": "Dagligt",
|
"daily": "Dagligt",
|
||||||
"day": "dag",
|
"day": "dag",
|
||||||
|
"description": "Beskrivelse",
|
||||||
"delete_ays": "Bekræft venligst ønsket om sletning.",
|
"delete_ays": "Bekræft venligst ønsket om sletning.",
|
||||||
"direct_aliases": "Direkte alias addresser",
|
"direct_aliases": "Direkte alias addresser",
|
||||||
"direct_aliases_desc": "Direkte alias-adresser påvirkes af spamfilter og TLS-politiske indstillinger.",
|
"direct_aliases_desc": "Direkte alias-adresser påvirkes af spamfilter og TLS-politiske indstillinger.",
|
||||||
@@ -1091,4 +1089,4 @@
|
|||||||
"first": "Først"
|
"first": "Først"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -541,7 +541,6 @@
|
|||||||
"external_logs": "Externe Logs",
|
"external_logs": "Externe Logs",
|
||||||
"history_all_servers": "History (alle Server)",
|
"history_all_servers": "History (alle Server)",
|
||||||
"in_memory_logs": "In-memory Logs",
|
"in_memory_logs": "In-memory Logs",
|
||||||
"jvm_memory_solr": "JVM-Speicherauslastung",
|
|
||||||
"last_modified": "Zuletzt geändert",
|
"last_modified": "Zuletzt geändert",
|
||||||
"log_info": "<p>mailcow <b>in-memory Logs</b> werden in Redis Listen gespeichert, die maximale Anzahl der Einträge pro Anwendung richtet sich nach LOG_LINES (%d).\r\n <br>In-memory Logs sind vergänglich und nicht zur ständigen Aufbewahrung bestimmt. Alle Anwendungen, die in-memory protokollieren, schreiben ebenso in den Docker Daemon.\r\n <br>Das in-memory Protokoll versteht sich als schnelle Übersicht zum Debugging eines Containers, für komplexere Protokolle sollte der Docker Daemon konsultiert werden.</p>\r\n <p><b>Externe Logs</b> werden via API externer Applikationen bezogen.</p>\r\n <p><b>Statische Logs</b> sind weitestgehend Aktivitätsprotokolle, die nicht in den Docker Daemon geschrieben werden, jedoch permanent verfügbar sein müssen (ausgeschlossen API Logs).</p>",
|
"log_info": "<p>mailcow <b>in-memory Logs</b> werden in Redis Listen gespeichert, die maximale Anzahl der Einträge pro Anwendung richtet sich nach LOG_LINES (%d).\r\n <br>In-memory Logs sind vergänglich und nicht zur ständigen Aufbewahrung bestimmt. Alle Anwendungen, die in-memory protokollieren, schreiben ebenso in den Docker Daemon.\r\n <br>Das in-memory Protokoll versteht sich als schnelle Übersicht zum Debugging eines Containers, für komplexere Protokolle sollte der Docker Daemon konsultiert werden.</p>\r\n <p><b>Externe Logs</b> werden via API externer Applikationen bezogen.</p>\r\n <p><b>Statische Logs</b> sind weitestgehend Aktivitätsprotokolle, die nicht in den Docker Daemon geschrieben werden, jedoch permanent verfügbar sein müssen (ausgeschlossen API Logs).</p>",
|
||||||
"login_time": "Zeit",
|
"login_time": "Zeit",
|
||||||
@@ -552,8 +551,6 @@
|
|||||||
"service": "Dienst",
|
"service": "Dienst",
|
||||||
"show_ip": "Zeige öffentliche IP",
|
"show_ip": "Zeige öffentliche IP",
|
||||||
"size": "Größe",
|
"size": "Größe",
|
||||||
"solr_dead": "Solr startet, ist deaktiviert oder temporär nicht erreichbar.",
|
|
||||||
"solr_status": "Solr Status",
|
|
||||||
"started_at": "Gestartet am",
|
"started_at": "Gestartet am",
|
||||||
"started_on": "Gestartet am",
|
"started_on": "Gestartet am",
|
||||||
"static_logs": "Statische Logs",
|
"static_logs": "Statische Logs",
|
||||||
@@ -1188,6 +1185,7 @@
|
|||||||
"created_on": "Erstellt am",
|
"created_on": "Erstellt am",
|
||||||
"daily": "Täglich",
|
"daily": "Täglich",
|
||||||
"day": "Tag",
|
"day": "Tag",
|
||||||
|
"description": "Beschreibung",
|
||||||
"delete_ays": "Soll der Löschvorgang wirklich ausgeführt werden?",
|
"delete_ays": "Soll der Löschvorgang wirklich ausgeführt werden?",
|
||||||
"direct_aliases": "Direkte Alias-Adressen",
|
"direct_aliases": "Direkte Alias-Adressen",
|
||||||
"direct_aliases_desc": "Nur direkte Alias-Adressen werden für benutzerdefinierte Einstellungen berücksichtigt.",
|
"direct_aliases_desc": "Nur direkte Alias-Adressen werden für benutzerdefinierte Einstellungen berücksichtigt.",
|
||||||
@@ -1344,4 +1342,4 @@
|
|||||||
"hour": "Nachrichten / Stunde",
|
"hour": "Nachrichten / Stunde",
|
||||||
"day": "Nachrichten / Tag"
|
"day": "Nachrichten / Tag"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -579,7 +579,6 @@
|
|||||||
"external_logs": "External logs",
|
"external_logs": "External logs",
|
||||||
"history_all_servers": "History (all servers)",
|
"history_all_servers": "History (all servers)",
|
||||||
"in_memory_logs": "In-memory logs",
|
"in_memory_logs": "In-memory logs",
|
||||||
"jvm_memory_solr": "JVM memory usage",
|
|
||||||
"last_modified": "Last modified",
|
"last_modified": "Last modified",
|
||||||
"log_info": "<p>mailcow <b>in-memory logs</b> are collected in Redis lists and trimmed to LOG_LINES (%d) every minute to reduce hammering.\r\n <br>In-memory logs are not meant to be persistent. All applications that log in-memory, also log to the Docker daemon and therefore to the default logging driver.\r\n <br>The in-memory log type should be used for debugging minor issues with containers.</p>\r\n <p><b>External logs</b> are collected via API of the given application.</p>\r\n <p><b>Static logs</b> are mostly activity logs, that are not logged to the Dockerd but still need to be persistent (except for API logs).</p>",
|
"log_info": "<p>mailcow <b>in-memory logs</b> are collected in Redis lists and trimmed to LOG_LINES (%d) every minute to reduce hammering.\r\n <br>In-memory logs are not meant to be persistent. All applications that log in-memory, also log to the Docker daemon and therefore to the default logging driver.\r\n <br>The in-memory log type should be used for debugging minor issues with containers.</p>\r\n <p><b>External logs</b> are collected via API of the given application.</p>\r\n <p><b>Static logs</b> are mostly activity logs, that are not logged to the Dockerd but still need to be persistent (except for API logs).</p>",
|
||||||
"login_time": "Time",
|
"login_time": "Time",
|
||||||
@@ -590,8 +589,6 @@
|
|||||||
"service": "Service",
|
"service": "Service",
|
||||||
"show_ip": "Show public IP",
|
"show_ip": "Show public IP",
|
||||||
"size": "Size",
|
"size": "Size",
|
||||||
"solr_dead": "Solr is starting, disabled or died.",
|
|
||||||
"solr_status": "Solr status",
|
|
||||||
"started_at": "Started at",
|
"started_at": "Started at",
|
||||||
"started_on": "Started on",
|
"started_on": "Started on",
|
||||||
"static_logs": "Static logs",
|
"static_logs": "Static logs",
|
||||||
@@ -1235,6 +1232,7 @@
|
|||||||
"created_on": "Created on",
|
"created_on": "Created on",
|
||||||
"daily": "Daily",
|
"daily": "Daily",
|
||||||
"day": "day",
|
"day": "day",
|
||||||
|
"description": "Description",
|
||||||
"delete_ays": "Please confirm the deletion process.",
|
"delete_ays": "Please confirm the deletion process.",
|
||||||
"direct_aliases": "Direct alias addresses",
|
"direct_aliases": "Direct alias addresses",
|
||||||
"direct_aliases_desc": "Direct alias addresses are affected by spam filter and TLS policy settings.",
|
"direct_aliases_desc": "Direct alias addresses are affected by spam filter and TLS policy settings.",
|
||||||
@@ -1384,4 +1382,4 @@
|
|||||||
"session_token": "Form token invalid: Token mismatch",
|
"session_token": "Form token invalid: Token mismatch",
|
||||||
"session_ua": "Form token invalid: User-Agent validation error"
|
"session_ua": "Form token invalid: User-Agent validation error"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -346,12 +346,10 @@
|
|||||||
"log_info": "<p>Los <b>logs en memoria</b> son recopilados en listas de Redis y recortados a LOG_LINES (%d) cada minuto para prevenir sobrecarga en el sistema.\r\n <br>Los logs en memoria no están destinados a ser persistentes. Todas las aplicaciones que logean a la memoria, también logean en el daemon de Docker y, por lo tanto, en el controlador de registro predeterminado.\r\n El log en memoria se debe utilizar para analizar problemas menores con los contenedores.</p>\r\n <p>Los <b>logs externos</b> se recopilan a través de la API de la aplicación dada.</p>\r\n <p>Los <b>logs estáticos</b> son principalmente registros de actividad, que no están registrados en Dockerd pero que aún deben ser persistentes (excepto los registros de API).</p>",
|
"log_info": "<p>Los <b>logs en memoria</b> son recopilados en listas de Redis y recortados a LOG_LINES (%d) cada minuto para prevenir sobrecarga en el sistema.\r\n <br>Los logs en memoria no están destinados a ser persistentes. Todas las aplicaciones que logean a la memoria, también logean en el daemon de Docker y, por lo tanto, en el controlador de registro predeterminado.\r\n El log en memoria se debe utilizar para analizar problemas menores con los contenedores.</p>\r\n <p>Los <b>logs externos</b> se recopilan a través de la API de la aplicación dada.</p>\r\n <p>Los <b>logs estáticos</b> son principalmente registros de actividad, que no están registrados en Dockerd pero que aún deben ser persistentes (excepto los registros de API).</p>",
|
||||||
"logs": "Logs",
|
"logs": "Logs",
|
||||||
"restart_container": "Reiniciar",
|
"restart_container": "Reiniciar",
|
||||||
"solr_dead": "Solr está empezando, deshabilitado o caído.",
|
|
||||||
"docs": "Docs",
|
"docs": "Docs",
|
||||||
"last_modified": "Última modificación",
|
"last_modified": "Última modificación",
|
||||||
"size": "Tamaño",
|
"size": "Tamaño",
|
||||||
"started_at": "Iniciado el",
|
"started_at": "Iniciado el",
|
||||||
"solr_status": "Solr status",
|
|
||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"static_logs": "Logs estáticos",
|
"static_logs": "Logs estáticos",
|
||||||
"system_containers": "Sistema y Contenedores"
|
"system_containers": "Sistema y Contenedores"
|
||||||
@@ -709,6 +707,7 @@
|
|||||||
"create_syncjob": "Crear nuevo trabajo de sincronización",
|
"create_syncjob": "Crear nuevo trabajo de sincronización",
|
||||||
"daily": "Cada día",
|
"daily": "Cada día",
|
||||||
"day": "Día",
|
"day": "Día",
|
||||||
|
"description": "Descripción",
|
||||||
"direct_aliases": "Alias directos",
|
"direct_aliases": "Alias directos",
|
||||||
"direct_aliases_desc": "Los alias directos se ven afectadas por el filtro de correo no deseado y la configuración de la política TLS del usuario.",
|
"direct_aliases_desc": "Los alias directos se ven afectadas por el filtro de correo no deseado y la configuración de la política TLS del usuario.",
|
||||||
"eas_reset": "Resetear el caché ActiveSync",
|
"eas_reset": "Resetear el caché ActiveSync",
|
||||||
@@ -778,4 +777,4 @@
|
|||||||
"fuzzy_learn_error": "Error aprendiendo hash: %s",
|
"fuzzy_learn_error": "Error aprendiendo hash: %s",
|
||||||
"ip_invalid": "IP inválida omitida: %s"
|
"ip_invalid": "IP inválida omitida: %s"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -380,16 +380,13 @@
|
|||||||
"disk_usage": "Levyn käyttö",
|
"disk_usage": "Levyn käyttö",
|
||||||
"external_logs": "Ulkoiset loki",
|
"external_logs": "Ulkoiset loki",
|
||||||
"in_memory_logs": "Muistissa olevat lokit",
|
"in_memory_logs": "Muistissa olevat lokit",
|
||||||
"jvm_memory_solr": "JVM-muistin käyttö",
|
|
||||||
"log_info": "<p>mailcow <b>muistissa olevat lokit</b> kerätään Redis-luetteloihin ja leikataan LOG_LINES (%d) joka minuutti lyömisen vähentämiseksi.\r\n <br>Muistissa olevien lokien ei ole tarkoitus olla pysyviä. Kaikki sovellukset, jotka kirjautuvat muistiin, kirjautuvat myös Docker-daemoniin ja siten oletusarvoiseen lokitiedostoon.\r\n <br>Muistin lokityyppiä olisi käytettävä virheiden virheenkorjaukseen säilöissä.</p>\r\n <p><b>Ulkoiset lokit</b> kerätään annetun sovelluksen API: n kautta.</p>\r\n <p><b>Staattiset lokit</b> ovat useimmiten toimintalokkeja, joita ei kirjata Dockerdiin, mutta joiden on silti oltava pysyviä (paitsi API-lokit).</p>",
|
"log_info": "<p>mailcow <b>muistissa olevat lokit</b> kerätään Redis-luetteloihin ja leikataan LOG_LINES (%d) joka minuutti lyömisen vähentämiseksi.\r\n <br>Muistissa olevien lokien ei ole tarkoitus olla pysyviä. Kaikki sovellukset, jotka kirjautuvat muistiin, kirjautuvat myös Docker-daemoniin ja siten oletusarvoiseen lokitiedostoon.\r\n <br>Muistin lokityyppiä olisi käytettävä virheiden virheenkorjaukseen säilöissä.</p>\r\n <p><b>Ulkoiset lokit</b> kerätään annetun sovelluksen API: n kautta.</p>\r\n <p><b>Staattiset lokit</b> ovat useimmiten toimintalokkeja, joita ei kirjata Dockerdiin, mutta joiden on silti oltava pysyviä (paitsi API-lokit).</p>",
|
||||||
"logs": "Logit tausta palveluista",
|
"logs": "Logit tausta palveluista",
|
||||||
"restart_container": "Uudelleen käynnistä",
|
"restart_container": "Uudelleen käynnistä",
|
||||||
"solr_dead": "Solr käynnistyy, on poissa käytöstä tai kuoli.",
|
|
||||||
"docs": "Docs",
|
"docs": "Docs",
|
||||||
"last_modified": "Viimeksi muokattu",
|
"last_modified": "Viimeksi muokattu",
|
||||||
"size": "Koko",
|
"size": "Koko",
|
||||||
"started_at": "Käynnistetty",
|
"started_at": "Käynnistetty",
|
||||||
"solr_status": "Solr-tila",
|
|
||||||
"uptime": "Päällä",
|
"uptime": "Päällä",
|
||||||
"started_on": "Aloitettiin",
|
"started_on": "Aloitettiin",
|
||||||
"static_logs": "Staattiset lokit",
|
"static_logs": "Staattiset lokit",
|
||||||
@@ -810,6 +807,7 @@
|
|||||||
"create_syncjob": "Luo uusi synkronointi työ",
|
"create_syncjob": "Luo uusi synkronointi työ",
|
||||||
"daily": "Päivittäin",
|
"daily": "Päivittäin",
|
||||||
"day": "Päivä",
|
"day": "Päivä",
|
||||||
|
"description": "Kuvaus",
|
||||||
"direct_aliases": "Suorat alias osoitteet",
|
"direct_aliases": "Suorat alias osoitteet",
|
||||||
"direct_aliases_desc": "Roska posti suodatus-ja TLS-käytäntö asetukset vaikuttavat suora aliaksen osoitteisiin.",
|
"direct_aliases_desc": "Roska posti suodatus-ja TLS-käytäntö asetukset vaikuttavat suora aliaksen osoitteisiin.",
|
||||||
"eas_reset": "Tyhjennä ActiveSync-laitteen väli muisti",
|
"eas_reset": "Tyhjennä ActiveSync-laitteen väli muisti",
|
||||||
@@ -908,4 +906,4 @@
|
|||||||
"last": "Edellinen"
|
"last": "Edellinen"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,13 +3,13 @@
|
|||||||
"alias_domains": "Ajouter un alias de domaine",
|
"alias_domains": "Ajouter un alias de domaine",
|
||||||
"app_passwds": "Gérer les mots de passe d'application",
|
"app_passwds": "Gérer les mots de passe d'application",
|
||||||
"bcc_maps": "Mapping BCC",
|
"bcc_maps": "Mapping BCC",
|
||||||
"delimiter_action": "Délimitation d'action",
|
"delimiter_action": "Action du délimiteur",
|
||||||
"eas_reset": "Réinitialiser les périphériques EA",
|
"eas_reset": "Réinitialiser les périphériques EAS",
|
||||||
"extend_sender_acl": "Autoriser l'extension des ACL par des adresses externes",
|
"extend_sender_acl": "Autoriser l'extension des ACL par des adresses externes",
|
||||||
"filters": "Filtres",
|
"filters": "Filtres",
|
||||||
"login_as": "S'identifier en tant qu'utilisateur",
|
"login_as": "S'identifier en tant qu'utilisateur",
|
||||||
"prohibited": "Interdit par les ACL",
|
"prohibited": "Interdit par les ACL",
|
||||||
"protocol_access": "Modifier le protocol d'acces",
|
"protocol_access": "Modifier le protocole d’accès",
|
||||||
"pushover": "Pushover",
|
"pushover": "Pushover",
|
||||||
"quarantine": "Actions de quarantaine",
|
"quarantine": "Actions de quarantaine",
|
||||||
"quarantine_attachments": "Pièces jointes en quarantaine",
|
"quarantine_attachments": "Pièces jointes en quarantaine",
|
||||||
@@ -20,7 +20,7 @@
|
|||||||
"smtp_ip_access": "Changer les hôtes autorisés pour SMTP",
|
"smtp_ip_access": "Changer les hôtes autorisés pour SMTP",
|
||||||
"sogo_access": "Autoriser la gestion des accès à SOGo",
|
"sogo_access": "Autoriser la gestion des accès à SOGo",
|
||||||
"sogo_profile_reset": "Réinitialiser le profil SOGo",
|
"sogo_profile_reset": "Réinitialiser le profil SOGo",
|
||||||
"spam_alias": "Alias temporaire",
|
"spam_alias": "Alias temporaires",
|
||||||
"spam_policy": "Liste Noire/Liste Blanche",
|
"spam_policy": "Liste Noire/Liste Blanche",
|
||||||
"spam_score": "Score SPAM",
|
"spam_score": "Score SPAM",
|
||||||
"syncjobs": "Tâches de synchronisation",
|
"syncjobs": "Tâches de synchronisation",
|
||||||
@@ -43,20 +43,20 @@
|
|||||||
"alias_domain_info": "<small>Seulement des noms de domaines valides (séparés par des virgules).</small>",
|
"alias_domain_info": "<small>Seulement des noms de domaines valides (séparés par des virgules).</small>",
|
||||||
"app_name": "Nom de l'application",
|
"app_name": "Nom de l'application",
|
||||||
"app_password": "Mot de passe de l'application",
|
"app_password": "Mot de passe de l'application",
|
||||||
"automap": "Tenter de cibler automatiquement les dossiers (\"Sent items\", \"Sent\" => \"Sent\" etc.)",
|
"automap": "Tenter de cibler automatiquement les dossiers (« Sent items », « Sent » => « Sent » etc.)",
|
||||||
"backup_mx_options": "Options de MX secondaire",
|
"backup_mx_options": "Options de MX secondaire",
|
||||||
"comment_info": "Un commentaire privé n'est pas visible pour l'utilisateur, tandis qu'un commentaire public est affiché sous forme d'info-bulle lorsqu'on le survole dans un aperçu des utilisateurs",
|
"comment_info": "Un commentaire privé n'est pas visible pour l'utilisateur, tandis qu'un commentaire public est affiché sous forme d'info-bulle lorsqu'on le survole dans un aperçu des utilisateurs",
|
||||||
"custom_params": "Paramètres personnalisés",
|
"custom_params": "Paramètres personnalisés",
|
||||||
"custom_params_hint": "Correct : --param=xy, Incorrect : --param xy",
|
"custom_params_hint": "Correct : --param=xy, incorrect : --param xy",
|
||||||
"delete1": "Supprimer à la source lorsque la synchronisation terminée",
|
"delete1": "Supprimer sur la source lorsque la synchronisation est terminée",
|
||||||
"delete2": "Supprimer les messages à destination qui ne sont pas présents à la source",
|
"delete2": "Supprimer les messages sur la destination qui ne sont pas présents sur la source",
|
||||||
"delete2duplicates": "Supprimer les doubles à destination",
|
"delete2duplicates": "Supprimer les doublons sur la destination",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"destination": "Destination",
|
"destination": "Destination",
|
||||||
"disable_login": "Désactiver l'authentification (les courriels entrants resteront acceptés)",
|
"disable_login": "Désactiver l'authentification (les courriels entrants resteront acceptés)",
|
||||||
"domain": "domaine",
|
"domain": "Domaine",
|
||||||
"domain_matches_hostname": "Le domaine %s correspond à la machine (hostname)",
|
"domain_matches_hostname": "Le domaine %s correspond à la machine (hostname)",
|
||||||
"domain_quota_m": "Quota total du domaine (Mo)",
|
"domain_quota_m": "Quota total du domaine (Mio)",
|
||||||
"enc_method": "Méthode de chiffrement",
|
"enc_method": "Méthode de chiffrement",
|
||||||
"exclude": "Exclure des objets (expression régulière - regex)",
|
"exclude": "Exclure des objets (expression régulière - regex)",
|
||||||
"full_name": "Nom complet",
|
"full_name": "Nom complet",
|
||||||
@@ -70,7 +70,7 @@
|
|||||||
"inactive": "Inactif",
|
"inactive": "Inactif",
|
||||||
"kind": "Type",
|
"kind": "Type",
|
||||||
"mailbox_quota_def": "Quota boîte de réception par défaut",
|
"mailbox_quota_def": "Quota boîte de réception par défaut",
|
||||||
"mailbox_quota_m": "Quota max par boîte de réception (Mo)",
|
"mailbox_quota_m": "Quota max par boîte de réception (Mio)",
|
||||||
"mailbox_username": "Identifiant (partie gauche d'une adresse de courriel)",
|
"mailbox_username": "Identifiant (partie gauche d'une adresse de courriel)",
|
||||||
"max_aliases": "Nombre maximal d'alias",
|
"max_aliases": "Nombre maximal d'alias",
|
||||||
"max_mailboxes": "Nombre maximal de boîtes de réception",
|
"max_mailboxes": "Nombre maximal de boîtes de réception",
|
||||||
@@ -80,16 +80,16 @@
|
|||||||
"password": "Mot de passe",
|
"password": "Mot de passe",
|
||||||
"password_repeat": "Confirmation du mot de passe (répéter)",
|
"password_repeat": "Confirmation du mot de passe (répéter)",
|
||||||
"port": "Port",
|
"port": "Port",
|
||||||
"post_domain_add": "le conteneur SOGo, \"sogo-mailcow\", doit être redémarré après l'ajout d'un nouveau domaine!<br><br>De plus, la configuration DNS doit être révisée. Lorsque la configuration DNS est approuvée, redémarrer \"acme-mailcow\" pour générer automatiquement les certificats pour votre nouveau domaine (autoconfig.<domain>, autodiscover.<domain>).<br>Cette étape est optionelle et sera réessayée toutes les 24 heures.",
|
"post_domain_add": "Le conteneur SOGo, « sogo-mailcow », doit être redémarré après l'ajout d'un nouveau domaine !<br><br>De plus, la configuration DNS doit être révisée. Lorsque la configuration DNS est approuvée, redémarrer « acme-mailcow » pour générer automatiquement les certificats pour votre nouveau domaine (autoconfig.<domain>, autodiscover.<domain>).<br>Cette étape est optionnelle et sera réessayée toutes les 24 heures.",
|
||||||
"private_comment": "Commentaire privé",
|
"private_comment": "Commentaire privé",
|
||||||
"public_comment": "Commentaire public",
|
"public_comment": "Commentaire public",
|
||||||
"quota_mb": "Quota (Mo)",
|
"quota_mb": "Quota (Mio)",
|
||||||
"relay_all": "Relayer tous les destinataires",
|
"relay_all": "Relayer tous les destinataires",
|
||||||
"relay_all_info": "↪ Si vous choissisez <b>de ne pas</b> relayer tous les destinataires, vous devez ajouter une boîte de réception (\"aveugle\") pour chaque destinataire simple qui doit être relayé.",
|
"relay_all_info": "↪ Si vous choisissez <b>de ne pas</b> relayer tous les destinataires, vous devez ajouter une boîte de réception (« aveugle ») pour chaque destinataire simple qui doit être relayé.",
|
||||||
"relay_domain": "Relayer ce domaine",
|
"relay_domain": "Relayer ce domaine",
|
||||||
"relay_transport_info": "<div class=\"badge fs-6 bg-info\">Info</div> Vous pouvez définir des cartes de transport vers une destination personnalisée pour ce domaine. sinon, une recherche MX sera effectuée.",
|
"relay_transport_info": "<div class=\"badge fs-6 bg-info\">Info</div> Vous pouvez définir des cartes de transport vers une destination personnalisée pour ce domaine. Sinon, une recherche MX sera effectuée.",
|
||||||
"relay_unknown_only": "Relayer uniquement les boîtes de réception inexistantes. Les boîtes de réception existantes seront livrées localement.",
|
"relay_unknown_only": "Relayer uniquement les boîtes de réception inexistantes. Les boîtes de réception existantes seront livrées localement.",
|
||||||
"relayhost_wrapped_tls_info": "Veuillez <b>ne pas</b> utiliser des ports TLS wrappés (généralement utilisés sur le port 465).<br>\r\nUtilisez n'importe quel port non encapsulé et lancez STARTTLS. Une politique TLS pour appliquer TLS peut être créée dans \"Cartes de politique TLS\".",
|
"relayhost_wrapped_tls_info": "Veuillez <b>ne pas</b> utiliser des ports TLS wrappés (généralement utilisés sur le port 465).<br>\nUtilisez n'importe quel port non encapsulé et lancez STARTTLS. Une politique TLS pour appliquer TLS peut être créée dans « Cartes de politique TLS ».",
|
||||||
"select": "Veuillez sélectionner…",
|
"select": "Veuillez sélectionner…",
|
||||||
"select_domain": "Sélectionner d'abord un domaine",
|
"select_domain": "Sélectionner d'abord un domaine",
|
||||||
"sieve_desc": "Description courte",
|
"sieve_desc": "Description courte",
|
||||||
@@ -139,15 +139,15 @@
|
|||||||
"api_skip_ip_check": "Passer la vérification d'IP pour l'API",
|
"api_skip_ip_check": "Passer la vérification d'IP pour l'API",
|
||||||
"app_links": "Liens des applications",
|
"app_links": "Liens des applications",
|
||||||
"app_name": "Nom de l'application",
|
"app_name": "Nom de l'application",
|
||||||
"apps_name": "\"mailcow Apps\" nom",
|
"apps_name": "Nom « mailcow Apps »",
|
||||||
"arrival_time": "Heure d'arrivée (heure du serveur)",
|
"arrival_time": "Heure d'arrivée (heure du serveur)",
|
||||||
"authed_user": "Utilisateur autorisé",
|
"authed_user": "Utilisateur autorisé",
|
||||||
"ays": "Voulez-vous vraiment le faire ?",
|
"ays": "Voulez-vous vraiment le faire ?",
|
||||||
"ban_list_info": "Consultez la liste des adresses IP bannies ci-dessous : <b>réseau (durée de bannissement restante) - [actions]</b>.<br />Les adresses IP mises en file d'attente pour être dé-bannies seront supprimées de la liste de bannissement dans quelques secondes.<br />Les étiquettes rouges indiquent les bannissement permanent par liste noire.",
|
"ban_list_info": "Consultez la liste des adresses IP bannies ci-dessous : <b>réseau (durée de bannissement restante) - [actions]</b>.<br />Les adresses IP mises en file d'attente pour être dé-bannies seront supprimées de la liste de bannissement dans quelques secondes.<br />Les étiquettes rouges indiquent les bannissements permanent par liste noire.",
|
||||||
"change_logo": "Changer de logo",
|
"change_logo": "Changer de logo",
|
||||||
"configuration": "Configuration",
|
"configuration": "Configuration",
|
||||||
"convert_html_to_text": "Convertir le code HTML en texte brut",
|
"convert_html_to_text": "Convertir le code HTML en texte brut",
|
||||||
"credentials_transport_warning": "<b>Attention</b> : L’ajout d’une nouvelle entrée de carte de transport mettra à jour les informations d’identification pour toutes les entrées avec une colonne nexthop.",
|
"credentials_transport_warning": "<b>Attention</b> : L’ajout d’une nouvelle entrée de carte de transport mettra à jour les informations d’identification pour toutes les entrées avec une colonne nexthop.",
|
||||||
"customer_id": "ID client",
|
"customer_id": "ID client",
|
||||||
"customize": "Personnaliser",
|
"customize": "Personnaliser",
|
||||||
"destination": "Destination",
|
"destination": "Destination",
|
||||||
@@ -184,7 +184,7 @@
|
|||||||
"f2b_netban_ipv4": "Taille du sous-réseau IPv4 pour l'application du bannissement (8-32)",
|
"f2b_netban_ipv4": "Taille du sous-réseau IPv4 pour l'application du bannissement (8-32)",
|
||||||
"f2b_netban_ipv6": "Taille du sous-réseau IPv6 pour l'application du bannissement (8-128)",
|
"f2b_netban_ipv6": "Taille du sous-réseau IPv6 pour l'application du bannissement (8-128)",
|
||||||
"f2b_parameters": "Paramètres Fail2ban",
|
"f2b_parameters": "Paramètres Fail2ban",
|
||||||
"f2b_regex_info": "Logs pris en compte : SOGo, Postfix, Dovecot, PHP-FPM.",
|
"f2b_regex_info": "Logs pris en compte : SOGo, Postfix, Dovecot, PHP-FPM.",
|
||||||
"f2b_retry_window": "Fenêtre de nouvel essai pour le nb max. de tentatives",
|
"f2b_retry_window": "Fenêtre de nouvel essai pour le nb max. de tentatives",
|
||||||
"f2b_whitelist": "Réseaux/hôtes en liste blanche",
|
"f2b_whitelist": "Réseaux/hôtes en liste blanche",
|
||||||
"filter_table": "Table de filtrage",
|
"filter_table": "Table de filtrage",
|
||||||
@@ -200,19 +200,19 @@
|
|||||||
"host": "Hôte",
|
"host": "Hôte",
|
||||||
"html": "HTML",
|
"html": "HTML",
|
||||||
"import": "Importer",
|
"import": "Importer",
|
||||||
"import_private_key": "Importer la clè privée",
|
"import_private_key": "Importer la clé privée",
|
||||||
"in_use_by": "Utilisé par",
|
"in_use_by": "Utilisé par",
|
||||||
"inactive": "Inactif",
|
"inactive": "Inactif",
|
||||||
"include_exclude": "Inclure/Exclure",
|
"include_exclude": "Inclure/Exclure",
|
||||||
"include_exclude_info": "Par défaut - sans sélection - <b>toutes les boîte de réception</b> sont adressées",
|
"include_exclude_info": "Par défaut - sans sélection - <b>toutes les boîte de réception</b> sont adressées",
|
||||||
"includes": "Inclure ces destinataires",
|
"includes": "Inclure ces destinataires",
|
||||||
"last_applied": "Dernière application",
|
"last_applied": "Dernière application",
|
||||||
"license_info": "Une licence n’est pas requise, mais contribue au développement.<br><a href=\"https://www.servercow.de/mailcow?lang=en#sal\" target=\"_blank\" alt=\"SAL order\">Enregistrer votre GUID ici</a> ou <a href=\"https://www.servercow.de/mailcow?lang=en#support\" target=\"_blank\" alt=\"Support order\">acheter le support pour votre installation Mailcow.</a>",
|
"license_info": "Une licence n’est pas requise, mais contribue au développement.<br><a href=\"https://www.servercow.de/mailcow?lang=en#sal\" target=\"_blank\" alt=\"SAL order\">Enregistrer votre GUID ici</a> ou <a href=\"https://www.servercow.de/mailcow?lang=en#support\" target=\"_blank\" alt=\"Support order\">acheter le support pour votre installation mailcow.</a>",
|
||||||
"link": "Lien",
|
"link": "Lien",
|
||||||
"loading": "Veuillez patienter…",
|
"loading": "Veuillez patienter…",
|
||||||
"logo_info": "Votre image sera redimensionnée à une hauteur de 40 pixels pour la barre de navigation du haut et à un maximum de 250 pixels en largeur pour la page d'accueil. Un graphique extensible est fortement recommandé.",
|
"logo_info": "Votre image sera redimensionnée à une hauteur de 40 pixels pour la barre de navigation du haut et à un maximum de 250 pixels en largeur pour la page d'accueil. Un graphique extensible est fortement recommandé.",
|
||||||
"lookup_mx": "Faire correspondre la destination à MX (<code>.*\\.google\\.com</code> pour acheminer tous les messages ciblés vers un MX se terminant par google.com sur ce tronçon)",
|
"lookup_mx": "Faire correspondre la destination à MX (<code>.*\\.google\\.com</code> pour acheminer tous les messages ciblés vers un MX se terminant par google.com sur ce tronçon)",
|
||||||
"main_name": "\"mailcow UI\" nom",
|
"main_name": "Nom « mailcow UI »",
|
||||||
"merged_vars_hint": "Les lignes grisées ont été importées depuis <code>vars.(local.)inc.php</code> et ne peuvent pas être modifiées.",
|
"merged_vars_hint": "Les lignes grisées ont été importées depuis <code>vars.(local.)inc.php</code> et ne peuvent pas être modifiées.",
|
||||||
"message": "Message",
|
"message": "Message",
|
||||||
"message_size": "Taille du message",
|
"message_size": "Taille du message",
|
||||||
@@ -223,7 +223,7 @@
|
|||||||
"no_record": "Aucun enregistrement",
|
"no_record": "Aucun enregistrement",
|
||||||
"oauth2_client_id": "Client ID",
|
"oauth2_client_id": "Client ID",
|
||||||
"oauth2_client_secret": "Secret client",
|
"oauth2_client_secret": "Secret client",
|
||||||
"oauth2_info": "L'implémentation OAuth2 prend en charge le type d'autorisation \"Authorization Code\" et émet des jetons d'actualisation.<br>\nLe serveur émet également automatiquement de nouveaux jetons d'actualisation, après qu'un jeton d'actualisation a été utilisé.<br><br>\n→ La portée par défaut est <i>profile</i>. Seuls les utilisateurs d'une boîte de réception peuvent être authentifiés par rapport à OAuth2. Si le paramètre scope est omis, il revient au <i>profile</i>.<br>\n→ Le paramètre <i>state</i> doit être envoyé par le client dans le cadre de la demande d'autorisation.<br><br>\nChemins d'accès aux requêtes vers l'API OAuth <br>\n<ul>\n <li>Point de terminaison d'autorisation : <code>/oauth/authorize</code></li>\n <li>Point de terminaison du jeton : <code>/oauth/token</code></li>\n <li>Page de ressource : <code>/oauth/profile</code></li>\n</ul>\nLa régénération du secret client ne fera pas expirer les codes d'autorisation existants, mais ils ne pourront pas renouveler leur jeton.<br><br>\nLa révocation des jetons clients entraînera la fin immédiate de toutes les sessions actives. Tous les clients doivent se ré-authentifier.",
|
"oauth2_info": "L'implémentation OAuth2 prend en charge le type d'autorisation « Authorization Code » et émet des jetons d'actualisation.<br>\nLe serveur émet également automatiquement de nouveaux jetons d'actualisation, après qu'un jeton d'actualisation a été utilisé.<br><br>\n→ La portée par défaut est <i>profile</i>. Seuls les utilisateurs d'une boîte de réception peuvent être authentifiés par rapport à OAuth2. Si le paramètre scope est omis, il revient au <i>profile</i>.<br>\n→ Le paramètre <i>state</i> doit être envoyé par le client dans le cadre de la demande d'autorisation.<br><br>\nChemins d'accès aux requêtes vers l'API OAuth <br>\n<ul>\n <li>Point de terminaison d'autorisation : <code>/oauth/authorize</code></li>\n <li>Point de terminaison du jeton : <code>/oauth/token</code></li>\n <li>Page de ressource : <code>/oauth/profile</code></li>\n</ul>\nLa régénération du secret client ne fera pas expirer les codes d'autorisation existants, mais ils ne pourront pas renouveler leur jeton.<br><br>\nLa révocation des jetons clients entraînera la fin immédiate de toutes les sessions actives. Tous les clients doivent se ré-authentifier.",
|
||||||
"oauth2_redirect_uri": "URI de redirection",
|
"oauth2_redirect_uri": "URI de redirection",
|
||||||
"oauth2_renew_secret": "Générer un nouveau secret client",
|
"oauth2_renew_secret": "Générer un nouveau secret client",
|
||||||
"oauth2_revoke_tokens": "Révoquer tous les jetons",
|
"oauth2_revoke_tokens": "Révoquer tous les jetons",
|
||||||
@@ -233,19 +233,19 @@
|
|||||||
"priority": "Priorité",
|
"priority": "Priorité",
|
||||||
"private_key": "Clé privée",
|
"private_key": "Clé privée",
|
||||||
"quarantine": "Quarantaine",
|
"quarantine": "Quarantaine",
|
||||||
"quarantine_bcc": "Envoyer une copie de toutes les notifications (BCC) à ce destinataire:<br><small>Laisser vide pour le désactiver. <b>Courrier non signé et non coché. Doit être livré en l’interne seulement.</b></small>",
|
"quarantine_bcc": "Envoyer une copie de toutes les notifications (BCC) à ce destinataire :<br><small>Laisser vide pour le désactiver. <b>Courrier non signé et non coché. Doit être livré en interne seulement.</b></small>",
|
||||||
"quarantine_exclude_domains": "Exclure les domaines et les alias de domaine",
|
"quarantine_exclude_domains": "Exclure les domaines et les alias de domaine",
|
||||||
"quarantine_max_age": "Âge maximun en jour(s)<br><small>La valeur doit être égale ou supérieure à 1 jour.</small>",
|
"quarantine_max_age": "Âge maximun en jour(s)<br><small>La valeur doit être égale ou supérieure à 1 jour.</small>",
|
||||||
"quarantine_max_size": "Taille maximum en Mo (les éléments plus grands sont mis au rebut):<br><small>0 ne signifie <b>pas</b> illimité.</small>",
|
"quarantine_max_size": "Taille maximum en Mio (les éléments plus grands sont mis au rebut) :<br><small>0 ne signifie <b>pas</b> illimité.</small>",
|
||||||
"quarantine_max_score": "Ignorer la notification si le score de spam est au dessus de cette valeur :<br><small>Par défaut : 9999.0</small>",
|
"quarantine_max_score": "Ignorer la notification si le score de spam est au dessus de cette valeur :<br><small>Par défaut : 9999.0</small>",
|
||||||
"quarantine_notification_html": "Modèle de courriel de notification :<br><small>Laisser vide pour restaurer le modèle par défaut.</small>",
|
"quarantine_notification_html": "Modèle de courriel de notification :<br><small>Laisser vide pour restaurer le modèle par défaut.</small>",
|
||||||
"quarantine_notification_sender": "Notification par courriel de l’expéditeur",
|
"quarantine_notification_sender": "Notification par courriel de l’expéditeur",
|
||||||
"quarantine_notification_subject": "Objet du courriel de notification",
|
"quarantine_notification_subject": "Objet du courriel de notification",
|
||||||
"quarantine_redirect": "<b>Rediriger toutes les notifications</b> vers ce destinataire:<br><small>Laisser vide pour désactiver. <b>Courrier non signé et non coché. Doit être livré en interne seulement.</b></small>",
|
"quarantine_redirect": "<b>Rediriger toutes les notifications</b> vers ce destinataire :<br><small>Laisser vide pour désactiver. <b>Courrier non signé et non coché. Doit être livré en interne seulement.</b></small>",
|
||||||
"quarantine_release_format": "Format des éléments diffusés",
|
"quarantine_release_format": "Format des éléments diffusés",
|
||||||
"quarantine_release_format_att": "En pièce jointe",
|
"quarantine_release_format_att": "En pièce jointe",
|
||||||
"quarantine_release_format_raw": "Original non modifié",
|
"quarantine_release_format_raw": "Original non modifié",
|
||||||
"quarantine_retention_size": "Rétentions par boîte de réception:<br><small>0 indique <b>inactive</b>.</small>",
|
"quarantine_retention_size": "Rétentions par boîte de réception :<br><small>0 indique <b>inactive</b>.</small>",
|
||||||
"quota_notification_html": "Modèle de courriel de notification :<br><small>Laisser vide pour restaurer le modèle par défaut.</small>",
|
"quota_notification_html": "Modèle de courriel de notification :<br><small>Laisser vide pour restaurer le modèle par défaut.</small>",
|
||||||
"quota_notification_sender": "Notification par courriel de l’expéditeur",
|
"quota_notification_sender": "Notification par courriel de l’expéditeur",
|
||||||
"quota_notification_subject": "Objet du courriel de notification",
|
"quota_notification_subject": "Objet du courriel de notification",
|
||||||
@@ -263,7 +263,7 @@
|
|||||||
"relay_from": "\"De:\" adresse",
|
"relay_from": "\"De:\" adresse",
|
||||||
"relay_run": "Lancer le test",
|
"relay_run": "Lancer le test",
|
||||||
"relayhosts": "Transports dépendant de l’expéditeur",
|
"relayhosts": "Transports dépendant de l’expéditeur",
|
||||||
"relayhosts_hint": "Définir les transports dépendant de l’expéditeur pour pouvoir les sélectionner dans un dialogue de configuration de domaines.<br>\n Le service de transport est toujours \"SMTP:\" et va donc essayer TLS lorsqu’il est proposé. Le TLS encapsulé (SMTPS) n’est pas pris en charge. Il est tenu compte de la définition de la politique TLS pour chaque utilisateur sortant.<br>\n Affecte les domaines sélectionnés, y compris les domaines alias.",
|
"relayhosts_hint": "Définir les transports dépendant de l’expéditeur pour pouvoir les sélectionner dans un dialogue de configuration de domaines.<br>\n Le service de transport est toujours « smtp: » et va donc essayer TLS lorsqu’il est proposé. Le TLS encapsulé (SMTPS) n’est pas pris en charge. Il est tenu compte de la définition de la politique TLS pour chaque utilisateur sortant.<br>\n Affecte les domaines sélectionnés, y compris les domaines alias.",
|
||||||
"remove": "Supprimer",
|
"remove": "Supprimer",
|
||||||
"remove_row": "Supprimer la ligne",
|
"remove_row": "Supprimer la ligne",
|
||||||
"reset_default": "Réinitialisation à la valeur par défaut",
|
"reset_default": "Réinitialisation à la valeur par défaut",
|
||||||
@@ -274,7 +274,7 @@
|
|||||||
"rsetting_desc": "Description courte",
|
"rsetting_desc": "Description courte",
|
||||||
"rsetting_no_selection": "Veuillez sélectionner une règle",
|
"rsetting_no_selection": "Veuillez sélectionner une règle",
|
||||||
"rsetting_none": "Pas de règles disponibles",
|
"rsetting_none": "Pas de règles disponibles",
|
||||||
"rsettings_insert_preset": "Insérer un exemple de préréglage \"%s\"",
|
"rsettings_insert_preset": "Insérer un exemple de préréglage « %s »",
|
||||||
"rsettings_preset_1": "Désactiver tout sauf DKIM et la limite d'envoi pour les utilisateurs authentifiés",
|
"rsettings_preset_1": "Désactiver tout sauf DKIM et la limite d'envoi pour les utilisateurs authentifiés",
|
||||||
"rsettings_preset_2": "Les postmasters veulent du spam",
|
"rsettings_preset_2": "Les postmasters veulent du spam",
|
||||||
"rsettings_preset_3": "Autoriser uniquement des expéditeurs particuliers pour une boîte de réception (c.-à-d. utilisation comme boîte de réception interne seulement)",
|
"rsettings_preset_3": "Autoriser uniquement des expéditeurs particuliers pour une boîte de réception (c.-à-d. utilisation comme boîte de réception interne seulement)",
|
||||||
@@ -286,7 +286,7 @@
|
|||||||
"rspamd_settings_map": "Carte des paramètres Rspamd",
|
"rspamd_settings_map": "Carte des paramètres Rspamd",
|
||||||
"sal_level": "Niveau Moo",
|
"sal_level": "Niveau Moo",
|
||||||
"save": "Enregistrer les modifications",
|
"save": "Enregistrer les modifications",
|
||||||
"search_domain_da": "Recherche domaines",
|
"search_domain_da": "Rechercher des domaines",
|
||||||
"send": "Envoyer",
|
"send": "Envoyer",
|
||||||
"sender": "Expéditeur",
|
"sender": "Expéditeur",
|
||||||
"service_id": "ID du service",
|
"service_id": "ID du service",
|
||||||
@@ -297,11 +297,11 @@
|
|||||||
"text": "Texte",
|
"text": "Texte",
|
||||||
"time": "Heure",
|
"time": "Heure",
|
||||||
"title": "Titre",
|
"title": "Titre",
|
||||||
"title_name": "\"mailcow UI\" titre du site web",
|
"title_name": "Titre du site web « mailcow UI »",
|
||||||
"to_top": "Retour en haut",
|
"to_top": "Retour en haut",
|
||||||
"transport_dest_format": "Syntaxe : example.org, .example.org, *, box@example.org (les valeurs multiples peuvent être séparées par des virgules)",
|
"transport_dest_format": "Syntaxe : example.org, .example.org, *, box@example.org (les valeurs multiples peuvent être séparées par des virgules)",
|
||||||
"transport_maps": "Plans de transport",
|
"transport_maps": "Plans de transport",
|
||||||
"transports_hint": "→ Une entrée de carte de transport <b>annule</b> une carte de transport dépendante de l’expéditeur</b>.<br>\n→ Les transports basés sur le MX sont préférables.<br>\n→ Les paramètres de politique TLS sortants par utilisateur sont ignorés et ne peuvent être appliqués que par les entrées de carte de politique TLS.<br>\n→ Pour chaque transports défini, le servie de transports sera \"smtp:\", TLS sera essayé lorsque disponible. Le Wrapped TLS (SMTPS) n’est pas pris en charge.<br>\n→ Les adresses qui correspondent à\"/localhost$/\" seront toujours transportées via \"local:\", donc une destination \"*\" ne s'applique pas à ces adresses.<br>\n→ Pour déterminer les informations d'identification dans l'exemple suivant \"[host]:25\", Postfix va <b>toujours</b> faire une requête pour \"host\" avant de chercher \"[host]:25\". Ce comportement rend impossible l’utilisation \"host\" et \"[host]:25\" en même temps.",
|
"transports_hint": "→ Une entrée de carte de transport <b>annule</b> une carte de transport dépendante de l’expéditeur</b>.<br>\n→ Les transports basés sur le MX sont préférables.<br>\n→ Les paramètres de politique TLS sortants par utilisateur sont ignorés et ne peuvent être appliqués que par les entrées de carte de politique TLS.<br>\n→ Pour chaque transports défini, le servie de transports sera « smtp: », TLS sera essayé lorsque disponible. Le Wrapped TLS (SMTPS) n’est pas pris en charge.<br>\n→ Les adresses qui correspondent à « /localhost$/ » seront toujours transportées via « local: », donc une destination « * » ne s'applique pas à ces adresses.<br>\n→ Pour déterminer les informations d'identification dans l'exemple suivant « [host]:25 », Postfix va <b>toujours</b> faire une requête pour « host » avant de chercher « [host]:25 ». Ce comportement rend impossible l’utilisation de « host » et « [host]:25 » en même temps.",
|
||||||
"ui_footer": "Pied de page (HTML autorisé)",
|
"ui_footer": "Pied de page (HTML autorisé)",
|
||||||
"ui_header_announcement": "Annonces",
|
"ui_header_announcement": "Annonces",
|
||||||
"ui_header_announcement_active": "Définir l’annonce active",
|
"ui_header_announcement_active": "Définir l’annonce active",
|
||||||
@@ -352,7 +352,14 @@
|
|||||||
"password_reset_tmpl_html": "Modèle HTML",
|
"password_reset_tmpl_html": "Modèle HTML",
|
||||||
"password_reset_tmpl_text": "Modèle en texte",
|
"password_reset_tmpl_text": "Modèle en texte",
|
||||||
"restore_template": "Laisser vide pour restaurer le modèle par défaut.",
|
"restore_template": "Laisser vide pour restaurer le modèle par défaut.",
|
||||||
"admins_ldap": "Si aucune adresse de messagerie de récupération n'est fournie, cette fonction ne peut pas être utilisée."
|
"admins_ldap": "Administrateurs LDAP",
|
||||||
|
"options": "Options",
|
||||||
|
"ip_check_opt_in": "Utiliser le service tiers <strong>ipv4.mailcow.email</strong> et <strong>ipv6.mailcow.email</strong> pour résoudre les adresses IP externes.",
|
||||||
|
"queue_unban": "débannir",
|
||||||
|
"service": "Service",
|
||||||
|
"success": "Succès",
|
||||||
|
"cors_settings": "Paramètres CORS",
|
||||||
|
"login_time": "Horodatage de connexion"
|
||||||
},
|
},
|
||||||
"danger": {
|
"danger": {
|
||||||
"access_denied": "Accès refusé ou données de formulaire non valides",
|
"access_denied": "Accès refusé ou données de formulaire non valides",
|
||||||
@@ -370,37 +377,37 @@
|
|||||||
"comment_too_long": "Le commentaire est trop long, 160 caractère max sont permis",
|
"comment_too_long": "Le commentaire est trop long, 160 caractère max sont permis",
|
||||||
"defquota_empty": "Le quota par défaut par boîte de réception doit pas être 0.",
|
"defquota_empty": "Le quota par défaut par boîte de réception doit pas être 0.",
|
||||||
"description_invalid": "La description des ressources pour %s est non valide",
|
"description_invalid": "La description des ressources pour %s est non valide",
|
||||||
"dkim_domain_or_sel_exists": "Une clé DKIM pour \"%s\" existe et ne sera pas écrasée",
|
"dkim_domain_or_sel_exists": "Une clé DKIM pour « %s » existe et ne sera pas écrasée",
|
||||||
"dkim_domain_or_sel_invalid": "Domaine ou sélection DKIM non valide : %s",
|
"dkim_domain_or_sel_invalid": "Domaine ou sélecteur DKIM non valide : %s",
|
||||||
"domain_cannot_match_hostname": "Le domaine ne correspond pas au nom d’hôte",
|
"domain_cannot_match_hostname": "Le domaine ne correspond pas au nom d’hôte",
|
||||||
"domain_exists": "Le domaine %s exite déjà",
|
"domain_exists": "Le domaine %s exite déjà",
|
||||||
"domain_invalid": "Le mom de domaine est vide ou non valide",
|
"domain_invalid": "Le nom de domaine est vide ou non valide",
|
||||||
"domain_not_empty": "Impossible de supprimer le domaine non vide %s",
|
"domain_not_empty": "Impossible de supprimer le domaine non vide %s",
|
||||||
"domain_not_found": "Le domaine %s est introuvable",
|
"domain_not_found": "Le domaine %s est introuvable",
|
||||||
"domain_quota_m_in_use": "Le quota de domaine doit être supérieur ou égal à %s Mo",
|
"domain_quota_m_in_use": "Le quota de domaine doit être supérieur ou égal à %s Mio",
|
||||||
"extra_acl_invalid": "L'adresse de l’expéditeur externe \"%s\" est non valide",
|
"extra_acl_invalid": "L'adresse de l’expéditeur externe « %s » est non valide",
|
||||||
"extra_acl_invalid_domain": "L'expéditeur externe \"%s\" utilise un domaine non valide",
|
"extra_acl_invalid_domain": "L'expéditeur externe « %s » utilise un domaine non valide",
|
||||||
"file_open_error": "Le fichier ne peut pas être ouvert pour l'écriture",
|
"file_open_error": "Le fichier ne peut pas être ouvert pour l'écriture",
|
||||||
"filter_type": "Type de fltre erroné",
|
"filter_type": "Type de fltre erroné",
|
||||||
"from_invalid": "Expéditeur ne peut pas être vide",
|
"from_invalid": "Expéditeur ne peut pas être vide",
|
||||||
"global_filter_write_error": "Impossible d’écrire le fichier de filtre : %s",
|
"global_filter_write_error": "Impossible d’écrire le fichier de filtre : %s",
|
||||||
"global_map_invalid": "ID de carte globale %s non valide",
|
"global_map_invalid": "ID de carte globale %s non valide",
|
||||||
"global_map_write_error": "Impossible d’écrire l’ID de la carte globale %s : %s",
|
"global_map_write_error": "Impossible d’écrire l’ID de la carte globale %s : %s",
|
||||||
"goto_empty": "Une adresse alias doit contenir au moins une adresse 'goto'valide",
|
"goto_empty": "Une adresse alias doit contenir au moins une adresse 'goto'valide",
|
||||||
"goto_invalid": "Adresse Goto %s non valide",
|
"goto_invalid": "Adresse Goto %s non valide",
|
||||||
"ham_learn_error": "Erreur d'apprentissage Ham : %s",
|
"ham_learn_error": "Erreur d'apprentissage Ham : %s",
|
||||||
"imagick_exception": "Erreur : Exception Imagick lors de la lecture de l’image",
|
"imagick_exception": "Erreur : Exception Imagick lors de la lecture de l’image",
|
||||||
"img_invalid": "Impossible de valider le fichier image",
|
"img_invalid": "Impossible de valider le fichier image",
|
||||||
"img_tmp_missing": "Impossible de valider le fichier image : Fichier temporaire introuvable",
|
"img_tmp_missing": "Impossible de valider le fichier image : Fichier temporaire introuvable",
|
||||||
"invalid_bcc_map_type": "Type de carte BCC non valide",
|
"invalid_bcc_map_type": "Type de carte BCC non valide",
|
||||||
"invalid_destination": "Le format de la destination \"%s\" est non valide",
|
"invalid_destination": "Le format de la destination « %s » est non valide",
|
||||||
"invalid_filter_type": "Type de filtre non valide",
|
"invalid_filter_type": "Type de filtre non valide",
|
||||||
"invalid_host": "Hôte non valide spécifié : %s",
|
"invalid_host": "Hôte non valide spécifié : %s",
|
||||||
"invalid_mime_type": "Type mime non valide",
|
"invalid_mime_type": "Type mime non valide",
|
||||||
"invalid_nexthop": "Le format de saut suivant est non valide",
|
"invalid_nexthop": "Le format de saut suivant est non valide",
|
||||||
"invalid_nexthop_authenticated": "Next hop existe avec différents identifiants, veuillez d’abord mettre à jour les identifiants existants pour ce prochain saut.",
|
"invalid_nexthop_authenticated": "Next hop existe avec différents identifiants, veuillez d’abord mettre à jour les identifiants existants pour ce prochain saut.",
|
||||||
"invalid_recipient_map_new": "Nouveau destinataire spécifié non valide : %s",
|
"invalid_recipient_map_new": "Nouveau destinataire spécifié non valide : %s",
|
||||||
"invalid_recipient_map_old": "Destinataire original spécifié non valide : %s",
|
"invalid_recipient_map_old": "Destinataire original spécifié non valide : %s",
|
||||||
"ip_list_empty": "La liste des adresses IP autorisées ne peut pas être vide",
|
"ip_list_empty": "La liste des adresses IP autorisées ne peut pas être vide",
|
||||||
"is_alias": "%s est déjà connu comme une adresse alias",
|
"is_alias": "%s est déjà connu comme une adresse alias",
|
||||||
"is_alias_or_mailbox": "%s est déjà connu comme un alias, une boîte de réception ou une adresse alias développée à partir d’un domaine alias.",
|
"is_alias_or_mailbox": "%s est déjà connu comme un alias, une boîte de réception ou une adresse alias développée à partir d’un domaine alias.",
|
||||||
@@ -409,19 +416,19 @@
|
|||||||
"login_failed": "La connexion a échoué",
|
"login_failed": "La connexion a échoué",
|
||||||
"mailbox_defquota_exceeds_mailbox_maxquota": "Le quota par défaut dépasse la limite maximale du quota",
|
"mailbox_defquota_exceeds_mailbox_maxquota": "Le quota par défaut dépasse la limite maximale du quota",
|
||||||
"mailbox_invalid": "Le nom de la boîte de réception n'est pas valide",
|
"mailbox_invalid": "Le nom de la boîte de réception n'est pas valide",
|
||||||
"mailbox_quota_exceeded": "Le quota dépasse la limite du domaine (max. %d Mo)",
|
"mailbox_quota_exceeded": "Le quota dépasse la limite du domaine (max. %d Mio)",
|
||||||
"mailbox_quota_exceeds_domain_quota": "Le quota maximal dépasse la limite du quota de domaine",
|
"mailbox_quota_exceeds_domain_quota": "Le quota maximal dépasse la limite du quota de domaine",
|
||||||
"mailbox_quota_left_exceeded": "Espace libre insuffisant (espace libre : %d Mio)",
|
"mailbox_quota_left_exceeded": "Espace libre insuffisant (espace libre : %d Mio)",
|
||||||
"mailboxes_in_use": "Le max. des boîtes de réception doit être supérieur ou égal à %d",
|
"mailboxes_in_use": "Le max. des boîtes de réception doit être supérieur ou égal à %d",
|
||||||
"malformed_username": "Nom d’utilisateur malformé",
|
"malformed_username": "Nom d’utilisateur malformé",
|
||||||
"map_content_empty": "Le contenu de la carte ne peut pas être vide",
|
"map_content_empty": "Le contenu de la carte ne peut pas être vide",
|
||||||
"max_alias_exceeded": "Le nombre max. d'aliases est dépassé",
|
"max_alias_exceeded": "Le nombre max. d'alias est dépassé",
|
||||||
"max_mailbox_exceeded": "Le nombre max. de boîte de réception est dépassé (%d of %d)",
|
"max_mailbox_exceeded": "Le nombre max. de boîte de réception est dépassé (%d of %d)",
|
||||||
"max_quota_in_use": "Le quota de la boîte de réception doit être supérieur ou égal à %d Mo",
|
"max_quota_in_use": "Le quota de la boîte de réception doit être supérieur ou égal à %d Mio",
|
||||||
"maxquota_empty": "Le quota maximum par boîte de réception ne doit pas être de 0.",
|
"maxquota_empty": "Le quota maximum par boîte de réception ne doit pas être de 0.",
|
||||||
"mysql_error": "Erreur MySQL : %s",
|
"mysql_error": "Erreur MySQL : %s",
|
||||||
"nginx_reload_failed": "Le rechargement de Nginx a échoué : %s",
|
"nginx_reload_failed": "Le rechargement de Nginx a échoué : %s",
|
||||||
"network_host_invalid": "Réseau ou hôte non valide : %s",
|
"network_host_invalid": "Réseau ou hôte non valide : %s",
|
||||||
"next_hop_interferes": "%s interfère avec le nexthop %s",
|
"next_hop_interferes": "%s interfère avec le nexthop %s",
|
||||||
"next_hop_interferes_any": "Un saut suivant existant interfère avec %s",
|
"next_hop_interferes_any": "Un saut suivant existant interfère avec %s",
|
||||||
"no_user_defined": "Aucun utilisateur défini",
|
"no_user_defined": "Aucun utilisateur défini",
|
||||||
@@ -432,15 +439,15 @@
|
|||||||
"password_mismatch": "Le mot de passe de confirmation ne correspond pas",
|
"password_mismatch": "Le mot de passe de confirmation ne correspond pas",
|
||||||
"policy_list_from_exists": "Un enregistrement avec ce nom existe déjà",
|
"policy_list_from_exists": "Un enregistrement avec ce nom existe déjà",
|
||||||
"policy_list_from_invalid": "Le format de l’enregistrement est invalide",
|
"policy_list_from_invalid": "Le format de l’enregistrement est invalide",
|
||||||
"private_key_error": "Erreur de clé privée : %s",
|
"private_key_error": "Erreur de clé privée : %s",
|
||||||
"pushover_credentials_missing": "Jeton Pushover ou clé manquante",
|
"pushover_credentials_missing": "Jeton Pushover ou clé manquante",
|
||||||
"pushover_key": "La clé Pushover a un mauvais format",
|
"pushover_key": "La clé Pushover a un mauvais format",
|
||||||
"pushover_token": "Le jeton Pushover a un mauvais format",
|
"pushover_token": "Le jeton Pushover a un mauvais format",
|
||||||
"quota_not_0_not_numeric": "Le quota doit être numerique et >= 0",
|
"quota_not_0_not_numeric": "Le quota doit être numerique et >= 0",
|
||||||
"recipient_map_entry_exists": "Une entrée dans la carte du bénéficiaire \"%s\" existe",
|
"recipient_map_entry_exists": "Une entrée dans la carte du destinataire « %s » existe",
|
||||||
"redis_error": "Erreur Redis : %s",
|
"redis_error": "Erreur Redis : %s",
|
||||||
"relayhost_invalid": "La saisie de la carte %s est invalide",
|
"relayhost_invalid": "La saisie de la carte %s est invalide",
|
||||||
"release_send_failed": "Le message n’a pas pu être diffusé : %s",
|
"release_send_failed": "Le message n’a pas pu être diffusé : %s",
|
||||||
"reset_f2b_regex": "Le filtre regex n'a pas pu être réinitialisé à temps, veuillez réessayer ou attendre quelques secondes de plus et recharger le site web.",
|
"reset_f2b_regex": "Le filtre regex n'a pas pu être réinitialisé à temps, veuillez réessayer ou attendre quelques secondes de plus et recharger le site web.",
|
||||||
"resource_invalid": "Le nom de la resource %s n'est pas valide",
|
"resource_invalid": "Le nom de la resource %s n'est pas valide",
|
||||||
"rl_timeframe": "Le délai de la limite d'envoi est incorrect",
|
"rl_timeframe": "Le délai de la limite d'envoi est incorrect",
|
||||||
@@ -449,8 +456,8 @@
|
|||||||
"sender_acl_invalid": "La valeur ACL de l’expéditeur %s est invalide",
|
"sender_acl_invalid": "La valeur ACL de l’expéditeur %s est invalide",
|
||||||
"set_acl_failed": "Impossible de définir l'ACL",
|
"set_acl_failed": "Impossible de définir l'ACL",
|
||||||
"settings_map_invalid": "La carte des paramètres %s est invalide",
|
"settings_map_invalid": "La carte des paramètres %s est invalide",
|
||||||
"sieve_error": "Erreur d'analyse syntaxique Sieve : %s",
|
"sieve_error": "Erreur d'analyse syntaxique Sieve : %s",
|
||||||
"spam_learn_error": "Erreur d'apprentissage du spam : %s",
|
"spam_learn_error": "Erreur d'apprentissage du spam : %s",
|
||||||
"subject_empty": "Le sujet ne peut pas être vide",
|
"subject_empty": "Le sujet ne peut pas être vide",
|
||||||
"target_domain_invalid": "Le domaine cible %s n'est pas valide",
|
"target_domain_invalid": "Le domaine cible %s n'est pas valide",
|
||||||
"targetd_not_found": "Le domaine cible %s est introuvable",
|
"targetd_not_found": "Le domaine cible %s est introuvable",
|
||||||
@@ -459,19 +466,19 @@
|
|||||||
"text_empty": "La zone texte ne peut pas être vide",
|
"text_empty": "La zone texte ne peut pas être vide",
|
||||||
"tfa_token_invalid": "Le token TFA est invalide",
|
"tfa_token_invalid": "Le token TFA est invalide",
|
||||||
"tls_policy_map_dest_invalid": "La politique de destination n'est pas valide",
|
"tls_policy_map_dest_invalid": "La politique de destination n'est pas valide",
|
||||||
"tls_policy_map_entry_exists": "Une entrée de carte de politique \"%s\" existe",
|
"tls_policy_map_entry_exists": "Une entrée de carte de politique « %s » existe",
|
||||||
"tls_policy_map_parameter_invalid": "Le paramètre Policy est invalide",
|
"tls_policy_map_parameter_invalid": "Le paramètre Policy est invalide",
|
||||||
"totp_verification_failed": "Echec de la vérification TOTP",
|
"totp_verification_failed": "Echec de la vérification TOTP",
|
||||||
"transport_dest_exists": "La destination de transport \"%s\" existe",
|
"transport_dest_exists": "La destination de transport « %s » existe",
|
||||||
"webauthn_verification_failed": "Échec de la vérification WebAuthn : %s",
|
"webauthn_verification_failed": "Échec de la vérification WebAuthn : %s",
|
||||||
"fido2_verification_failed": "La vérification FIDO2 a échoué : %s",
|
"fido2_verification_failed": "La vérification FIDO2 a échoué : %s",
|
||||||
"unknown": "Une erreur inconnue est survenue",
|
"unknown": "Une erreur inconnue est survenue",
|
||||||
"unknown_tfa_method": "Methode TFA inconnue",
|
"unknown_tfa_method": "Methode TFA inconnue",
|
||||||
"unlimited_quota_acl": "Quota illimité interdit par les ACL",
|
"unlimited_quota_acl": "Quota illimité interdit par les ACL",
|
||||||
"username_invalid": "Le nom d'utilisateur %s ne peut pas être utilisé",
|
"username_invalid": "Le nom d'utilisateur %s ne peut pas être utilisé",
|
||||||
"validity_missing": "Veuillez attribuer une période de validité",
|
"validity_missing": "Veuillez attribuer une période de validité",
|
||||||
"value_missing": "Veuillez fournir toutes les valeurs",
|
"value_missing": "Veuillez fournir toutes les valeurs",
|
||||||
"yotp_verification_failed": "La vérification Yubico OTP a échoué : %s",
|
"yotp_verification_failed": "La vérification Yubico OTP a échoué : %s",
|
||||||
"webauthn_authenticator_failed": "L'authentificateur sélectionné est introuvable",
|
"webauthn_authenticator_failed": "L'authentificateur sélectionné est introuvable",
|
||||||
"demo_mode_enabled": "Le mode de démonstration est activé",
|
"demo_mode_enabled": "Le mode de démonstration est activé",
|
||||||
"template_exists": "Le modèle %s existe déjà",
|
"template_exists": "Le modèle %s existe déjà",
|
||||||
@@ -479,7 +486,7 @@
|
|||||||
"template_name_invalid": "Le nom du modèle est invalide",
|
"template_name_invalid": "Le nom du modèle est invalide",
|
||||||
"img_dimensions_exceeded": "L'image dépasse les dimensions maximales",
|
"img_dimensions_exceeded": "L'image dépasse les dimensions maximales",
|
||||||
"img_size_exceeded": "L'image dépasse la taille maximale de fichier",
|
"img_size_exceeded": "L'image dépasse la taille maximale de fichier",
|
||||||
"webauthn_publickey_failed": "Aucune clé publique n'a été stockée pour l'authentificateur sélectionné.",
|
"webauthn_publickey_failed": "Aucune clé publique n'a été stockée pour l'authentificateur sélectionné",
|
||||||
"cors_invalid_method": "Allow-Method specifiée invalide",
|
"cors_invalid_method": "Allow-Method specifiée invalide",
|
||||||
"cors_invalid_origin": "Allow-Origin spécifiée invalide",
|
"cors_invalid_origin": "Allow-Origin spécifiée invalide",
|
||||||
"extended_sender_acl_denied": "ACL manquante pour définir les adresses des expéditeurs externes",
|
"extended_sender_acl_denied": "ACL manquante pour définir les adresses des expéditeurs externes",
|
||||||
@@ -495,20 +502,17 @@
|
|||||||
"chart_this_server": "Graphique (ce serveur)",
|
"chart_this_server": "Graphique (ce serveur)",
|
||||||
"containers_info": "Informations des conteneurs",
|
"containers_info": "Informations des conteneurs",
|
||||||
"disk_usage": "Utilisation du disque",
|
"disk_usage": "Utilisation du disque",
|
||||||
"external_logs": "Logs externe",
|
"external_logs": "Logs externes",
|
||||||
"history_all_servers": "Historique (tous les serveurs)",
|
"history_all_servers": "Historique (tous les serveurs)",
|
||||||
"in_memory_logs": "Logs En-mémoire",
|
"in_memory_logs": "Logs En-mémoire",
|
||||||
"jvm_memory_solr": "Utilisation mémoire JVM",
|
|
||||||
"log_info": "<p>Les logs <b>En-mémoire</b> Mailcow sont collectés dans des listes Redis et découpées en LOG_LINES (%d) chaque minute pour réduire la charge.\n <br>Les logs En-mémoire ne sont pas destinés à être persistants. Toutes les applications qui se connectent en mémoire, se connectent également au démon Docker, et donc au pilote de journalisation par défaut.\n <br>Le type de journal en mémoire doit être utilisé pour déboguer les problèmes mineurs avec les conteneurs.</p>\n <p><b>Les logs externes</b> sont collectés via l'API de l'application concernée.</p>\n <p>Les journaux <b>statiques</b> sont principalement des journaux d’activité, qui ne sont pas enregistrés dans Dockerd, mais qui doivent toujours être persistants (sauf pour les logs API).</p>",
|
"log_info": "<p>Les logs <b>En-mémoire</b> Mailcow sont collectés dans des listes Redis et découpées en LOG_LINES (%d) chaque minute pour réduire la charge.\n <br>Les logs En-mémoire ne sont pas destinés à être persistants. Toutes les applications qui se connectent en mémoire, se connectent également au démon Docker, et donc au pilote de journalisation par défaut.\n <br>Le type de journal en mémoire doit être utilisé pour déboguer les problèmes mineurs avec les conteneurs.</p>\n <p><b>Les logs externes</b> sont collectés via l'API de l'application concernée.</p>\n <p>Les journaux <b>statiques</b> sont principalement des journaux d’activité, qui ne sont pas enregistrés dans Dockerd, mais qui doivent toujours être persistants (sauf pour les logs API).</p>",
|
||||||
"logs": "Logs",
|
"logs": "Logs",
|
||||||
"restart_container": "Redémarrer",
|
"restart_container": "Redémarrer",
|
||||||
"solr_dead": "Solr est en cours de démarrage, désactivé ou mort.",
|
|
||||||
"docs": "Docs",
|
"docs": "Docs",
|
||||||
"last_modified": "Dernière modification",
|
"last_modified": "Dernière modification",
|
||||||
"online_users": "Utilisateurs en ligne",
|
"online_users": "Utilisateurs en ligne",
|
||||||
"size": "Taille",
|
"size": "Taille",
|
||||||
"started_at": "Démarré à",
|
"started_at": "Démarré à",
|
||||||
"solr_status": "Etat Solr",
|
|
||||||
"uptime": "Disponibilité",
|
"uptime": "Disponibilité",
|
||||||
"started_on": "Démarré à",
|
"started_on": "Démarré à",
|
||||||
"static_logs": "Logs statiques",
|
"static_logs": "Logs statiques",
|
||||||
@@ -518,7 +522,19 @@
|
|||||||
"wip": "En cours de réalisation",
|
"wip": "En cours de réalisation",
|
||||||
"architecture": "Architecture",
|
"architecture": "Architecture",
|
||||||
"cores": "Cœurs",
|
"cores": "Cœurs",
|
||||||
"current_time": "Heure du système"
|
"current_time": "Heure du système",
|
||||||
|
"container_disabled": "Conteneur arrêté ou désactivé",
|
||||||
|
"error_show_ip": "Impossible de résoudre les adresses IP publiques",
|
||||||
|
"no_update_available": "Le système utilise la version la plus récente",
|
||||||
|
"container_running": "En cours d'exécution",
|
||||||
|
"container_stopped": "Arrêté",
|
||||||
|
"memory": "Mémoire",
|
||||||
|
"login_time": "Horodatage",
|
||||||
|
"service": "Service",
|
||||||
|
"success": "Succès",
|
||||||
|
"update_available": "Une mise à jour est disponible",
|
||||||
|
"update_failed": "Impossible de vérifier la présence d'une mise à jour",
|
||||||
|
"show_ip": "Afficher l'IP publique"
|
||||||
},
|
},
|
||||||
"diagnostics": {
|
"diagnostics": {
|
||||||
"cname_from_a": "Valeur dérivée de l’enregistrement A/AAAA. Ceci est supporté tant que l’enregistrement indique la bonne ressource.",
|
"cname_from_a": "Valeur dérivée de l’enregistrement A/AAAA. Ceci est supporté tant que l’enregistrement indique la bonne ressource.",
|
||||||
@@ -529,7 +545,7 @@
|
|||||||
"dns_records_name": "Nom",
|
"dns_records_name": "Nom",
|
||||||
"dns_records_status": "État courant",
|
"dns_records_status": "État courant",
|
||||||
"dns_records_type": "Type",
|
"dns_records_type": "Type",
|
||||||
"optional": "Cet enregistrement est optionel."
|
"optional": "Cet enregistrement est optionnel."
|
||||||
},
|
},
|
||||||
"edit": {
|
"edit": {
|
||||||
"active": "Actif",
|
"active": "Actif",
|
||||||
@@ -540,7 +556,7 @@
|
|||||||
"allowed_protocols": "Protocoles autorisés",
|
"allowed_protocols": "Protocoles autorisés",
|
||||||
"app_name": "Nom de l'application",
|
"app_name": "Nom de l'application",
|
||||||
"app_passwd": "Mot de passe de l'application",
|
"app_passwd": "Mot de passe de l'application",
|
||||||
"automap": "Essayer d’automatiser les dossiers (\"Sent items\", \"Sent\" => \"Sent\" etc.)",
|
"automap": "Tenter de cibler automatiquement les dossiers (« Sent items », « Sent » => « Sent » etc.)",
|
||||||
"backup_mx_options": "Options Backup MX",
|
"backup_mx_options": "Options Backup MX",
|
||||||
"bcc_dest_format": "La destination BCC doit être une seule adresse de courriel valide.",
|
"bcc_dest_format": "La destination BCC doit être une seule adresse de courriel valide.",
|
||||||
"client_id": "ID client",
|
"client_id": "ID client",
|
||||||
@@ -548,7 +564,7 @@
|
|||||||
"comment_info": "Un commentaire privé n’est pas visible pour l’utilisateur, tandis qu’un commentaire public est affiché comme infobulle lorsque vous le placez dans un aperçu des utilisateurs",
|
"comment_info": "Un commentaire privé n’est pas visible pour l’utilisateur, tandis qu’un commentaire public est affiché comme infobulle lorsque vous le placez dans un aperçu des utilisateurs",
|
||||||
"delete1": "Supprimer de la source une fois terminé",
|
"delete1": "Supprimer de la source une fois terminé",
|
||||||
"delete2": "Supprimer les messages sur la destination qui ne sont pas sur la source",
|
"delete2": "Supprimer les messages sur la destination qui ne sont pas sur la source",
|
||||||
"delete2duplicates": "Supprimer les doublons à destination",
|
"delete2duplicates": "Supprimer les doublons sur la destination",
|
||||||
"delete_ays": "Veuillez confirmer le processus de suppression.",
|
"delete_ays": "Veuillez confirmer le processus de suppression.",
|
||||||
"description": "Description",
|
"description": "Description",
|
||||||
"disable_login": "Refuser l’ouverture de session (le courrier entrant est toujours accepté)",
|
"disable_login": "Refuser l’ouverture de session (le courrier entrant est toujours accepté)",
|
||||||
@@ -577,10 +593,10 @@
|
|||||||
"mailbox_quota_def": "Quota par défaut de la boîte de réception",
|
"mailbox_quota_def": "Quota par défaut de la boîte de réception",
|
||||||
"max_aliases": "Nombre max. d'alias",
|
"max_aliases": "Nombre max. d'alias",
|
||||||
"max_mailboxes": "Nombre max. de boîte de réception possibles",
|
"max_mailboxes": "Nombre max. de boîte de réception possibles",
|
||||||
"max_quota": "Quota max. par boîte de réception (Mo)",
|
"max_quota": "Quota max. par boîte de réception (Mio)",
|
||||||
"maxage": "Âge maximal en jours des messages qui seront consultés à distance<br><small>(0 = ignorer la durée)</small>",
|
"maxage": "Âge maximal en jours des messages qui seront consultés à distance<br><small>(0 = ignorer la durée)</small>",
|
||||||
"maxbytespersecond": "Octets max. par seconde <br><small>(0 = pas de limite)</small>",
|
"maxbytespersecond": "Octets max. par seconde <br><small>(0 = pas de limite)</small>",
|
||||||
"mbox_rl_info": "Cette limite d'envoi est appliquée au nom de connexion SASL, elle correspond à toute adresse \"from\" utilisée par l’utilisateur connecté. Une limite d'envoi pour les boîtes de réception remplace une limite d'envoi pour l’ensemble du domaine.",
|
"mbox_rl_info": "Cette limite d'envoi est appliquée au nom de connexion SASL, elle correspond à toute adresse « from » utilisée par l’utilisateur connecté. Une limite d'envoi pour les boîtes de réception remplace une limite d'envoi pour l’ensemble du domaine.",
|
||||||
"mins_interval": "Intervalle (min)",
|
"mins_interval": "Intervalle (min)",
|
||||||
"multiple_bookings": "Réservations multiples",
|
"multiple_bookings": "Réservations multiples",
|
||||||
"nexthop": "Saut suivant",
|
"nexthop": "Saut suivant",
|
||||||
@@ -598,11 +614,11 @@
|
|||||||
"pushover_title": "Titre de la notification",
|
"pushover_title": "Titre de la notification",
|
||||||
"pushover_vars": "Lorsque aucun filtre d’expéditeur n’est défini, tous les messages seront considérés.<br>Les filtres Regex ainsi que les vérifications exactes de l’expéditeur peuvent être définis individuellement et seront considérés de façon séquentielle. Ils ne dépendent pas les uns des autres.<br>Variables utilisables pour le texte et le titre (veuillez prendre note des politiques de protection des données)",
|
"pushover_vars": "Lorsque aucun filtre d’expéditeur n’est défini, tous les messages seront considérés.<br>Les filtres Regex ainsi que les vérifications exactes de l’expéditeur peuvent être définis individuellement et seront considérés de façon séquentielle. Ils ne dépendent pas les uns des autres.<br>Variables utilisables pour le texte et le titre (veuillez prendre note des politiques de protection des données)",
|
||||||
"pushover_verify": "Vérifier les informations d'identification",
|
"pushover_verify": "Vérifier les informations d'identification",
|
||||||
"quota_mb": "Quota (Mo)",
|
"quota_mb": "Quota (Mio)",
|
||||||
"ratelimit": "Limite d'envoi",
|
"ratelimit": "Limite d'envoi",
|
||||||
"redirect_uri": "URL de redirection/callback",
|
"redirect_uri": "URL de redirection/callback",
|
||||||
"relay_all": "Relayer tous les destinataires",
|
"relay_all": "Relayer tous les destinataires",
|
||||||
"relay_all_info": "↪ Si vous <b>ne choisissez pas</b> de relayer tous les destinataires, vous devrez ajouter une boîte de réception (\"aveugle\") pour chaque destinataire qui devrait être relayé.",
|
"relay_all_info": "↪ Si vous <b>ne choisissez pas</b> de relayer tous les destinataires, vous devrez ajouter une boîte de réception (« aveugle ») pour chaque destinataire qui devrait être relayé.",
|
||||||
"relay_domain": "Relayer ce domaine",
|
"relay_domain": "Relayer ce domaine",
|
||||||
"relay_transport_info": "<div class=\"badge fs-6 bg-info\">Info</div> Vous pouvez définir des cartes de transport vers une destination personnalisée pour ce domaine. Si elle n’est pas configurée, une recherche MX sera effectuée.",
|
"relay_transport_info": "<div class=\"badge fs-6 bg-info\">Info</div> Vous pouvez définir des cartes de transport vers une destination personnalisée pour ce domaine. Si elle n’est pas configurée, une recherche MX sera effectuée.",
|
||||||
"relay_unknown_only": "Relais des boîtes de réception non existantes seulement. Les boîtes de réception existantes seront livrées localement.",
|
"relay_unknown_only": "Relais des boîtes de réception non existantes seulement. Les boîtes de réception existantes seront livrées localement.",
|
||||||
@@ -613,7 +629,7 @@
|
|||||||
"scope": "Portée",
|
"scope": "Portée",
|
||||||
"sender_acl": "Permettre d’envoyer comme",
|
"sender_acl": "Permettre d’envoyer comme",
|
||||||
"sender_acl_disabled": "<span class=\"badge fs-6 bg-danger\">Le contrôle de l’expéditeur est désactivé</span>",
|
"sender_acl_disabled": "<span class=\"badge fs-6 bg-danger\">Le contrôle de l’expéditeur est désactivé</span>",
|
||||||
"sender_acl_info": "Si l’utilisateur de la boîte de réception A est autorisé à envoyer en tant qu’utilisateur de la boîte de réception B, l’adresse de l’expéditeur n’est pas automatiquement affichée comme sélectionnable du champ \"de\" dans SOGo.<br>\n L’utilisateur B de la boîte de réception doit créer une délégation dans Sogo pour permettre à l’utilisateur A de la boîte de réception de sélectionner son adresse comme expéditeur. Pour déléguer une boîte de réception dans Sogo, utilisez le menu (trois points) à droite du nom de votre boîte dans le coin supérieur gauche dans la vue de courrier. Ce comportement ne s’applique pas aux adresses alias.",
|
"sender_acl_info": "Si l’utilisateur de la boîte de réception A est autorisé à envoyer en tant qu’utilisateur de la boîte de réception B, l’adresse de l’expéditeur n’est pas automatiquement affichée comme sélectionnable du champ « de » dans SOGo.<br>\n L’utilisateur B de la boîte de réception doit créer une délégation dans SOGo pour permettre à l’utilisateur A de la boîte de réception de sélectionner son adresse comme expéditeur. Pour déléguer une boîte de réception dans SOGo, utilisez le menu (trois points) à droite du nom de votre boîte dans le coin supérieur gauche dans la vue de courrier. Ce comportement ne s’applique pas aux adresses alias.",
|
||||||
"sieve_desc": "Description courte",
|
"sieve_desc": "Description courte",
|
||||||
"sieve_type": "Type de filtre",
|
"sieve_type": "Type de filtre",
|
||||||
"skipcrossduplicates": "Ignorer les messages en double dans les dossiers (premier arrivé, premier servi)",
|
"skipcrossduplicates": "Ignorer les messages en double dans les dossiers (premier arrivé, premier servi)",
|
||||||
@@ -641,15 +657,15 @@
|
|||||||
"domain_footer_info_vars": {
|
"domain_footer_info_vars": {
|
||||||
"from_addr": "{= from_addr =} - Partie de l'enveloppe relative à l'adresse de provenance",
|
"from_addr": "{= from_addr =} - Partie de l'enveloppe relative à l'adresse de provenance",
|
||||||
"from_domain": "{= from_domain =} - Partie de l'enveloppe provenant du domaine",
|
"from_domain": "{= from_domain =} - Partie de l'enveloppe provenant du domaine",
|
||||||
"custom": "{= foo =} - Si la boîte de réception possède l'attribut personnalisé \"foo\" avec la valeur \"bar\", elle renvoie \"bar\"",
|
"custom": "{= foo =} - Si la boîte de réception possède l'attribut personnalisé « foo » avec la valeur « bar », elle renvoie « bar »",
|
||||||
"auth_user": "{= auth_user =} - Nom d'utilisateur authentifié spécifié par un MTA",
|
"auth_user": "{= auth_user =} - Nom d'utilisateur authentifié spécifié par un MTA",
|
||||||
"from_user": "{= from_user =} -La partie utilisateur de l'enveloppe, par exemple, pour \"moo@mailcow.tld\", renvoie \"moo\"",
|
"from_user": "{= from_user =} -La partie utilisateur de l'enveloppe, par exemple, pour « moo@mailcow.tld », renvoie « moo »",
|
||||||
"from_name": "{= from_name =} - À partir du nom de l'enveloppe, par exemple, pour \"Mailcow <moo@mailcow.tld> ;\" on obtient \"Mailcow\""
|
"from_name": "{= from_name =} - À partir du nom de l'enveloppe, par exemple, pour « Mailcow <moo@mailcow.tld> ; » on obtient « Mailcow »"
|
||||||
},
|
},
|
||||||
"domain_footer_skip_replies": "Ignorer le pied de page des courriels de réponse",
|
"domain_footer_skip_replies": "Ignorer le pied de page des courriels de réponse",
|
||||||
"domain_footer": "Pied de page du domaine",
|
"domain_footer": "Pied de page du domaine",
|
||||||
"domain_footer_html": "Pied de page HTML",
|
"domain_footer_html": "Pied de page HTML",
|
||||||
"domain_footer_info": "Les pieds de page du domaine sont ajoutés à tous les courriels sortants associés à une adresse au sein de ce domaine. <br> Les variables suivantes peuvent être utilisées pour le pied de page :",
|
"domain_footer_info": "Les pieds de page du domaine sont ajoutés à tous les courriels sortants associés à une adresse au sein de ce domaine. <br> Les variables suivantes peuvent être utilisées pour le pied de page :",
|
||||||
"domain_footer_plain": "Pied de page",
|
"domain_footer_plain": "Pied de page",
|
||||||
"app_passwd_protocols": "Protocoles autorisés pour le mot de passe d'application",
|
"app_passwd_protocols": "Protocoles autorisés pour le mot de passe d'application",
|
||||||
"created_on": "Créé le",
|
"created_on": "Créé le",
|
||||||
@@ -658,7 +674,15 @@
|
|||||||
"quota_warning_bcc_info": "Les avertissements seront envoyés en copies séparées aux destinataires suivants. Le sujet sera précédé du nom d'utilisateur correspondant entre parenthèses, par exemple : <code>Avertissement sur les quotas (user@example.com)</code>.",
|
"quota_warning_bcc_info": "Les avertissements seront envoyés en copies séparées aux destinataires suivants. Le sujet sera précédé du nom d'utilisateur correspondant entre parenthèses, par exemple : <code>Avertissement sur les quotas (user@example.com)</code>.",
|
||||||
"sogo_access_info": "L'authentification unique à partir de l'interface de messagerie reste opérationnelle. Ce paramètre n'affecte pas l'accès à tous les autres services et ne supprime ni, ne modifie le profil SOGo existant d'un utilisateur.",
|
"sogo_access_info": "L'authentification unique à partir de l'interface de messagerie reste opérationnelle. Ce paramètre n'affecte pas l'accès à tous les autres services et ne supprime ni, ne modifie le profil SOGo existant d'un utilisateur.",
|
||||||
"admin": "Modifier l'administrateur",
|
"admin": "Modifier l'administrateur",
|
||||||
"password_recovery_email": "Adresse email de récupération"
|
"password_recovery_email": "Adresse email de récupération",
|
||||||
|
"mailbox_rename_title": "Nouveau nom de la partie locale de la boîte de réception",
|
||||||
|
"mailbox_rename": "Renommer la boîte de réception",
|
||||||
|
"mailbox_rename_agree": "J'ai fait une sauvegarde.",
|
||||||
|
"mailbox_rename_warning": "IMPORTANT ! Faites une sauvegarde avant de renommer la boîte de réception.",
|
||||||
|
"mailbox_rename_alias": "Créer un alias automatiquement",
|
||||||
|
"sogo_access": "Autoriser la connexion directe à SOGo",
|
||||||
|
"pushover": "Pushover",
|
||||||
|
"pushover_sound": "Son"
|
||||||
},
|
},
|
||||||
"footer": {
|
"footer": {
|
||||||
"cancel": "Annuler",
|
"cancel": "Annuler",
|
||||||
@@ -672,7 +696,8 @@
|
|||||||
"restart_container_info": "<b>Important :</b> Un redémarrage en douceur peut prendre un certain temps, veuillez attendre qu’il soit terminé.",
|
"restart_container_info": "<b>Important :</b> Un redémarrage en douceur peut prendre un certain temps, veuillez attendre qu’il soit terminé.",
|
||||||
"restart_now": "Redémarrer maintenant",
|
"restart_now": "Redémarrer maintenant",
|
||||||
"restarting_container": "Redémarrage du conteneur, cela peut prendre un certain temps",
|
"restarting_container": "Redémarrage du conteneur, cela peut prendre un certain temps",
|
||||||
"nothing_selected": "Rien n'est sélectionné"
|
"nothing_selected": "Rien n'est sélectionné",
|
||||||
|
"hibp_check": "Vérifier avec haveibeenpwned.com"
|
||||||
},
|
},
|
||||||
"header": {
|
"header": {
|
||||||
"administration": "Configuration & détails",
|
"administration": "Configuration & détails",
|
||||||
@@ -683,7 +708,8 @@
|
|||||||
"quarantine": "Quarantaine",
|
"quarantine": "Quarantaine",
|
||||||
"restart_netfilter": "Redémarrer Netfilter",
|
"restart_netfilter": "Redémarrer Netfilter",
|
||||||
"restart_sogo": "Redémarrer SOGo",
|
"restart_sogo": "Redémarrer SOGo",
|
||||||
"user_settings": "Paramètres utilisateur"
|
"user_settings": "Paramètres utilisateur",
|
||||||
|
"mailcow_system": "Système"
|
||||||
},
|
},
|
||||||
"info": {
|
"info": {
|
||||||
"awaiting_tfa_confirmation": "En attente de la confirmation de TFA",
|
"awaiting_tfa_confirmation": "En attente de la confirmation de TFA",
|
||||||
@@ -723,9 +749,9 @@
|
|||||||
"add_tls_policy_map": "Ajouter la carte de la politique des TLS",
|
"add_tls_policy_map": "Ajouter la carte de la politique des TLS",
|
||||||
"address_rewriting": "Réécriture de l’adresse",
|
"address_rewriting": "Réécriture de l’adresse",
|
||||||
"alias": "Alias",
|
"alias": "Alias",
|
||||||
"alias_domain_alias_hint": "Les alias <b>ne sont pas</b> appliqués automatiquement sur les alias de domaine. Un alias d'adresse <code>my-alias@domain</code> <b>ne couvre pas</b> l'adresse <code>my-alias@alias-domain</code> (où \"alias-domain\" est un alias imaginaire pour \"domain\").<br>Veuillez utiliser un filtre à tamis pour rediriger le courrier vers une boîte de réception externe (voir l'onglet « Filtres » ou utilisez SOGo → Transférer).",
|
"alias_domain_alias_hint": "Les alias <b>ne sont pas</b> appliqués automatiquement sur les alias de domaine. Un alias d'adresse <code>my-alias@domain</code> <b>ne couvre pas</b> l'adresse <code>my-alias@alias-domain</code> (où « alias-domain » est un alias imaginaire pour « domain »).<br>Veuillez utiliser un filtre sieve pour rediriger le courrier vers une boîte de réception externe (voir l'onglet « Filtres » ou utilisez SOGo → Transférer). Utilisez « Étendre l'alias aux alias de domaine » pour ajouter automatiquement les alias manquants.",
|
||||||
"alias_domain_backupmx": "Alias de domaine inactif pour le domaine relais",
|
"alias_domain_backupmx": "Alias de domaine inactif pour le domaine relais",
|
||||||
"aliases": "Aliases",
|
"aliases": "Alias",
|
||||||
"allow_from_smtp": "Restreindre l'utilisation de <b>SMTP</b> à ces adresses IP",
|
"allow_from_smtp": "Restreindre l'utilisation de <b>SMTP</b> à ces adresses IP",
|
||||||
"allow_from_smtp_info": "Laissez vide pour autoriser tous les expéditeurs.<br>Adresses IPv4/IPv6 et réseaux.",
|
"allow_from_smtp_info": "Laissez vide pour autoriser tous les expéditeurs.<br>Adresses IPv4/IPv6 et réseaux.",
|
||||||
"allowed_protocols": "Protocoles autorisés",
|
"allowed_protocols": "Protocoles autorisés",
|
||||||
@@ -774,12 +800,12 @@
|
|||||||
"hourly": "Toutes les heures",
|
"hourly": "Toutes les heures",
|
||||||
"in_use": "Utilisé (%)",
|
"in_use": "Utilisé (%)",
|
||||||
"inactive": "Inactif",
|
"inactive": "Inactif",
|
||||||
"insert_preset": "Insérer un exemple de préréglage \"%s\"",
|
"insert_preset": "Insérer un exemple de préréglage « %s »",
|
||||||
"kind": "Type",
|
"kind": "Type",
|
||||||
"last_mail_login": "Dernière connexion mail",
|
"last_mail_login": "Dernière connexion mail",
|
||||||
"last_modified": "Dernière modification",
|
"last_modified": "Dernière modification",
|
||||||
"last_run": "Dernière exécution",
|
"last_run": "Dernière exécution",
|
||||||
"last_run_reset": "Calendrier suivant",
|
"last_run_reset": "Exécuter maintenant",
|
||||||
"mailbox": "Boîte de réception",
|
"mailbox": "Boîte de réception",
|
||||||
"mailbox_defquota": "Taille de boîte de réception par défaut",
|
"mailbox_defquota": "Taille de boîte de réception par défaut",
|
||||||
"mailbox_quota": "Taille max. d’une boîte de réception",
|
"mailbox_quota": "Taille max. d’une boîte de réception",
|
||||||
@@ -818,7 +844,7 @@
|
|||||||
"running": "En fonctionnement",
|
"running": "En fonctionnement",
|
||||||
"set_postfilter": "Marquer comme postfiltre",
|
"set_postfilter": "Marquer comme postfiltre",
|
||||||
"set_prefilter": "Marquer comme préfiltre",
|
"set_prefilter": "Marquer comme préfiltre",
|
||||||
"sieve_info": "Vous pouvez stocker plusieurs filtres par utilisateur, mais un seul préfiltre et un seul postfiltre peuvent être actifs simultanément.<br>\nChaque filtre sera traité dans l’ordre décrit. Ni un script « rejeter » ni un « garder » n’arrêtera le traitement des autres scripts. Les modifications apportées aux scripts de tamis globaux déclencheront un redémarrage de Dovecot.<br><br>Préfiltre de tamis global → Préfiltre → Scripts utilisateur → Postfiltre → Postfiltre du tamis global",
|
"sieve_info": "Vous pouvez stocker plusieurs filtres par utilisateur, mais un seul préfiltre et un seul postfiltre peuvent être actifs simultanément.<br>\nChaque filtre sera traité dans l’ordre décrit. Ni un script en échec ni un « keep; » n’arrêtera le traitement des autres scripts. Les modifications apportées aux scripts sieve globaux déclencheront un redémarrage de Dovecot.<br><br>Préfiltre sieve global → Préfiltre → Scripts utilisateur → Postfiltre → Postfiltre sieve global",
|
||||||
"sieve_preset_1": "Jeter le courrier avec les types de fichiers dangereux probables",
|
"sieve_preset_1": "Jeter le courrier avec les types de fichiers dangereux probables",
|
||||||
"sieve_preset_2": "Toujours marquer l'adresse de courriel d’un expéditeur spécifique comme vu",
|
"sieve_preset_2": "Toujours marquer l'adresse de courriel d’un expéditeur spécifique comme vu",
|
||||||
"sieve_preset_3": "Jeter en silence, arrêter tout traitement supplémentaire par filtre sieve",
|
"sieve_preset_3": "Jeter en silence, arrêter tout traitement supplémentaire par filtre sieve",
|
||||||
@@ -826,7 +852,7 @@
|
|||||||
"sieve_preset_5": "Répondeur auto (vacances)",
|
"sieve_preset_5": "Répondeur auto (vacances)",
|
||||||
"sieve_preset_6": "Rejeter le courrier avec réponse",
|
"sieve_preset_6": "Rejeter le courrier avec réponse",
|
||||||
"sieve_preset_7": "Rediriger et garder/déposer",
|
"sieve_preset_7": "Rediriger et garder/déposer",
|
||||||
"sieve_preset_8": "Rediriger les courriels d'un expéditeur spécifique, les marquer comme lus et les classer dans des sous-dossiers.",
|
"sieve_preset_8": "Rediriger les courriels d'un expéditeur spécifique, les marquer comme lus et les classer dans des sous-dossiers",
|
||||||
"sieve_preset_header": "Voir les exemples de préréglages ci-dessous. Pour plus de détails, voir <a href=\"https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language)\" target=\"_blank\">Wikipédia</a>.",
|
"sieve_preset_header": "Voir les exemples de préréglages ci-dessous. Pour plus de détails, voir <a href=\"https://en.wikipedia.org/wiki/Sieve_(mail_filtering_language)\" target=\"_blank\">Wikipédia</a>.",
|
||||||
"sogo_visible": "Alias visible dans SOGo",
|
"sogo_visible": "Alias visible dans SOGo",
|
||||||
"sogo_visible_n": "Masquer alias dans SOGo",
|
"sogo_visible_n": "Masquer alias dans SOGo",
|
||||||
@@ -864,7 +890,22 @@
|
|||||||
"mailbox_templates": "Modèle de boîte de réception",
|
"mailbox_templates": "Modèle de boîte de réception",
|
||||||
"relay_unknown": "Relayer les boîtes de réception inconnues",
|
"relay_unknown": "Relayer les boîtes de réception inconnues",
|
||||||
"all_domains": "Tous les domaines",
|
"all_domains": "Tous les domaines",
|
||||||
"syncjob_EXIT_OVERQUOTA": "Quota dépassé de la boîte de réception cible"
|
"syncjob_EXIT_OVERQUOTA": "Quota dépassé de la boîte de réception cible",
|
||||||
|
"domain_templates": "Modèles de domaine",
|
||||||
|
"syncjob_last_run_result": "Résultat de la dernière exécution",
|
||||||
|
"sender": "Expéditeur",
|
||||||
|
"add_template": "Ajouter un modèle",
|
||||||
|
"syncjob_EX_OK": "Succès",
|
||||||
|
"syncjob_EXIT_CONNECTION_FAILURE": "Problème de connexion",
|
||||||
|
"syncjob_EXIT_TLS_FAILURE": "Problème avec le chiffrement de la connexion",
|
||||||
|
"syncjob_EXIT_AUTHENTICATION_FAILURE": "Problème d'authentification",
|
||||||
|
"syncjob_EXIT_CONNECTION_FAILURE_HOST1": "Impossible de se connecter au serveur distant",
|
||||||
|
"syncjob_EXIT_AUTHENTICATION_FAILURE_USER1": "Utilisateur ou mot de passe erroné",
|
||||||
|
"templates": "Modèles",
|
||||||
|
"template": "Modèle",
|
||||||
|
"syncjob_check_log": "Vérifier le journal",
|
||||||
|
"recipient": "Destinataire",
|
||||||
|
"open_logs": "Afficher les journaux"
|
||||||
},
|
},
|
||||||
"oauth2": {
|
"oauth2": {
|
||||||
"access_denied": "Veuillez vous connecter en tant que propriétaire de la boîte de réception pour accorder l’accès via Oauth2.",
|
"access_denied": "Veuillez vous connecter en tant que propriétaire de la boîte de réception pour accorder l’accès via Oauth2.",
|
||||||
@@ -882,9 +923,9 @@
|
|||||||
"confirm": "Confirmer",
|
"confirm": "Confirmer",
|
||||||
"confirm_delete": "Confirmer la suppression de cet élément.",
|
"confirm_delete": "Confirmer la suppression de cet élément.",
|
||||||
"danger": "Danger",
|
"danger": "Danger",
|
||||||
"deliver_inbox": "Envoyer dans la boîte de reception",
|
"deliver_inbox": "Envoyer dans la boîte de réception",
|
||||||
"disabled_by_config": "La configuration actuelle du système désactive la fonctionnalité de quarantaine. Veuillez définir « retentions par boîte » et une « taille maximale » pour les éléments en quarantaine.",
|
"disabled_by_config": "La configuration actuelle du système désactive la fonctionnalité de quarantaine. Veuillez définir « retentions par boîte » et une « taille maximale » pour les éléments en quarantaine.",
|
||||||
"settings_info": "Quantité maximale d'éléments à mettre en quarantaine : %s<br>Taille maximale des courriels : %s MiB",
|
"settings_info": "Quantité maximale d'éléments à mettre en quarantaine : %s<br>Taille maximale des courriels : %s Mio",
|
||||||
"download_eml": "Télécharger (.eml)",
|
"download_eml": "Télécharger (.eml)",
|
||||||
"empty": "Pas de résultat",
|
"empty": "Pas de résultat",
|
||||||
"high_danger": "Haut",
|
"high_danger": "Haut",
|
||||||
@@ -897,7 +938,7 @@
|
|||||||
"notified": "Notifié",
|
"notified": "Notifié",
|
||||||
"qhandler_success": "Demande envoyée avec succès au système. Vous pouvez maintenant fermer la fenêtre.",
|
"qhandler_success": "Demande envoyée avec succès au système. Vous pouvez maintenant fermer la fenêtre.",
|
||||||
"qid": "Rspamd QID",
|
"qid": "Rspamd QID",
|
||||||
"qinfo": "Le système de quarantaine enregistrera le courrier rejeté dans la base de données (l'expéditeur n'aura <em> pas </em> l'impression d'un courrier remis) ainsi que le courrier, remis sous forme de copie dans le dossier indésirable d'une boîte de réception.\n <br>« Apprendre comme spam et supprimer » apprendra un message comme spam via le théorème Bayésien calculera également des hachages flous pour refuser des messages similaires à l'avenir.\n <br>Veuillez noter que l'apprentissage de plusieurs messages peut prendre du temps, selon votre système. <br> Les éléments figurant sur la liste noire sont exclus de la quarantaine.",
|
"qinfo": "Le système de quarantaine enregistrera le courrier rejeté dans la base de données (l'expéditeur n'aura <em>pas</em> l'impression d'un courrier remis) ainsi que le courrier, remis sous forme de copie dans le dossier indésirable d'une boîte de réception.\n <br>« Apprendre comme spam et supprimer » apprendra un message comme spam via le théorème Bayésien et calculera également des hachages flous pour refuser des messages similaires à l'avenir.\n <br>Veuillez noter que l'apprentissage de plusieurs messages peut prendre du temps, selon votre système.<br>Les éléments figurant sur la liste noire sont exclus de la quarantaine.",
|
||||||
"qitem": "Élément de quarantaine",
|
"qitem": "Élément de quarantaine",
|
||||||
"quarantine": "Quarantaine",
|
"quarantine": "Quarantaine",
|
||||||
"quick_actions": "Actions",
|
"quick_actions": "Actions",
|
||||||
@@ -913,7 +954,7 @@
|
|||||||
"rewrite_subject": "Réécrire le sujet",
|
"rewrite_subject": "Réécrire le sujet",
|
||||||
"rspamd_result": "Résultat Rspamd",
|
"rspamd_result": "Résultat Rspamd",
|
||||||
"sender": "Expéditeur (SMTP)",
|
"sender": "Expéditeur (SMTP)",
|
||||||
"sender_header": "Expéditeur (\"From\" header)",
|
"sender_header": "Expéditeur (« From » header)",
|
||||||
"type": "Type",
|
"type": "Type",
|
||||||
"quick_release_link": "Ouvrir le lien de dégagement rapide",
|
"quick_release_link": "Ouvrir le lien de dégagement rapide",
|
||||||
"quick_delete_link": "Ouvrir le lien de suppression rapide",
|
"quick_delete_link": "Ouvrir le lien de suppression rapide",
|
||||||
@@ -931,13 +972,18 @@
|
|||||||
"queue": {
|
"queue": {
|
||||||
"queue_manager": "Gestion de la file d'attente",
|
"queue_manager": "Gestion de la file d'attente",
|
||||||
"hold_mail": "Garder",
|
"hold_mail": "Garder",
|
||||||
"legend": "Fonctions d'action de la file d'attente du courrier :",
|
"legend": "Fonctions d'action de la file d'attente du courrier :",
|
||||||
"info": "La file d'attente contient tous les courriels en attente de livraison. Si un courriel reste longtemps dans la file d'attente, il est automatiquement supprimé par le système.<br>Le message d'erreur du courriel concerné indique pourquoi le courriel n'a pas pu être distribué.",
|
"info": "La file d'attente contient tous les courriels en attente de livraison. Si un courriel reste longtemps dans la file d'attente, il est automatiquement supprimé par le système.<br>Le message d'erreur du courriel concerné indique pourquoi le courriel n'a pas pu être distribué.",
|
||||||
"deliver_mail_legend": "Tentatives de réexpédition des courriers sélectionnés.",
|
"deliver_mail_legend": "Tentatives de réexpédition des courriers sélectionnés.",
|
||||||
"hold_mail_legend": "Met en attente les courriers sélectionnés. (Empêche les tentatives de distribution ultérieures)",
|
"hold_mail_legend": "Met en attente les courriers sélectionnés. (Empêche les tentatives de distribution ultérieures)",
|
||||||
"unban": "file d'attente d'unban",
|
"unban": "file d'attente d'unban",
|
||||||
"unhold_mail": "Libérer",
|
"unhold_mail": "Libérer",
|
||||||
"unhold_mail_legend": "Libère les courriers sélectionnés pour la distribution. (Nécessite une mise en attente préalable)"
|
"unhold_mail_legend": "Libère les courriers sélectionnés pour la distribution. (Nécessite une mise en attente préalable)",
|
||||||
|
"show_message": "Afficher le message",
|
||||||
|
"delete": "Tout supprimer",
|
||||||
|
"flush": "Vider la file d'attente",
|
||||||
|
"ays": "Veuillez confirmer que vous souhaitez supprimer tous les éléments de la file d'attente actuelle.",
|
||||||
|
"deliver_mail": "Délivrer"
|
||||||
},
|
},
|
||||||
"start": {
|
"start": {
|
||||||
"help": "Afficher/masquer le panneau d’aide",
|
"help": "Afficher/masquer le panneau d’aide",
|
||||||
@@ -960,14 +1006,14 @@
|
|||||||
"app_links": "Modifications enregistrées dans les liens d’application",
|
"app_links": "Modifications enregistrées dans les liens d’application",
|
||||||
"app_passwd_added": "Ajout d’un nouveau mot de passe d’application",
|
"app_passwd_added": "Ajout d’un nouveau mot de passe d’application",
|
||||||
"app_passwd_removed": "Suppression de l’identifiant du mot de passe de l’application %s",
|
"app_passwd_removed": "Suppression de l’identifiant du mot de passe de l’application %s",
|
||||||
"bcc_deleted": "Suppression des entrées de la carte BCC : %s",
|
"bcc_deleted": "Suppression des entrées de la carte BCC : %s",
|
||||||
"bcc_edited": "Entrée de la carte BCC %s modifiée",
|
"bcc_edited": "Entrée de la carte BCC %s modifiée",
|
||||||
"bcc_saved": "Saisie de carte BCC enregistrée",
|
"bcc_saved": "Saisie de carte BCC enregistrée",
|
||||||
"db_init_complete": "Initialisation de la base de données terminée",
|
"db_init_complete": "Initialisation de la base de données terminée",
|
||||||
"delete_filter": "ID des filtres supprimés %s",
|
"delete_filter": "ID des filtres supprimés %s",
|
||||||
"delete_filters": "Filtres supprimés : %s",
|
"delete_filters": "Filtres supprimés : %s",
|
||||||
"deleted_syncjob": "ID du travail de synchronisation supprimé : %s",
|
"deleted_syncjob": "ID de la tâche de synchronisation supprimée : %s",
|
||||||
"deleted_syncjobs": "Travail de synchronisation supprimé : %s",
|
"deleted_syncjobs": "Tâche de synchronisation supprimée : %s",
|
||||||
"dkim_added": "La clé DKIM %s a été enregistrée",
|
"dkim_added": "La clé DKIM %s a été enregistrée",
|
||||||
"dkim_duplicated": "La clé DKIM pour le domaine %s a été copiée vers %s",
|
"dkim_duplicated": "La clé DKIM pour le domaine %s a été copiée vers %s",
|
||||||
"dkim_removed": "La clé DKIM %s a été supprimée",
|
"dkim_removed": "La clé DKIM %s a été supprimée",
|
||||||
@@ -1000,7 +1046,7 @@
|
|||||||
"qlearn_spam": "Le message ID %s a été appris comme spam et supprimé",
|
"qlearn_spam": "Le message ID %s a été appris comme spam et supprimé",
|
||||||
"queue_command_success": "Queue de commande terminée avec succès",
|
"queue_command_success": "Queue de commande terminée avec succès",
|
||||||
"recipient_map_entry_deleted": "La carte du destinataire ID %s a été effacée",
|
"recipient_map_entry_deleted": "La carte du destinataire ID %s a été effacée",
|
||||||
"recipient_map_entry_saved": "L'entrée de la carte du bénéficiaire \"%s\" a été enregistrée",
|
"recipient_map_entry_saved": "L'entrée de la carte du destinataire « %s » a été enregistrée",
|
||||||
"relayhost_added": "L'entrée de la carte %s a été ajoutée",
|
"relayhost_added": "L'entrée de la carte %s a été ajoutée",
|
||||||
"relayhost_removed": "L'entrée de la carte %s a été supprimée",
|
"relayhost_removed": "L'entrée de la carte %s a été supprimée",
|
||||||
"reset_main_logo": "Réinitialisation du logo par défaut",
|
"reset_main_logo": "Réinitialisation du logo par défaut",
|
||||||
@@ -1014,7 +1060,7 @@
|
|||||||
"settings_map_removed": "Suppression de la carte des paramètres ID %s",
|
"settings_map_removed": "Suppression de la carte des paramètres ID %s",
|
||||||
"sogo_profile_reset": "Le profil SOGo profile pour l'utilisateur %s est remis à zéro",
|
"sogo_profile_reset": "Le profil SOGo profile pour l'utilisateur %s est remis à zéro",
|
||||||
"tls_policy_map_entry_deleted": "La carte de stratégie TLS ID %s a été supprimée",
|
"tls_policy_map_entry_deleted": "La carte de stratégie TLS ID %s a été supprimée",
|
||||||
"tls_policy_map_entry_saved": "La carte de stratégie TLS ID \"%s\" a été enregistrée",
|
"tls_policy_map_entry_saved": "La carte de stratégie TLS ID « %s » a été enregistrée",
|
||||||
"ui_texts": "Enregistrement des modifications apportées aux textes de l’interface utilisateur",
|
"ui_texts": "Enregistrement des modifications apportées aux textes de l’interface utilisateur",
|
||||||
"upload_success": "Fichier téléchargé avec succès",
|
"upload_success": "Fichier téléchargé avec succès",
|
||||||
"verified_totp_login": "Authentification TOTP vérifiée",
|
"verified_totp_login": "Authentification TOTP vérifiée",
|
||||||
@@ -1029,7 +1075,10 @@
|
|||||||
"domain_add_dkim_available": "A DKIM key did already exist",
|
"domain_add_dkim_available": "A DKIM key did already exist",
|
||||||
"ip_check_opt_in_modified": "Le contrôle de l'IP a été enregistré avec succès",
|
"ip_check_opt_in_modified": "Le contrôle de l'IP a été enregistré avec succès",
|
||||||
"password_changed_success": "Le mot de passe a été modifié avec succès",
|
"password_changed_success": "Le mot de passe a été modifié avec succès",
|
||||||
"recovery_email_sent": "Email de réinitialisation envoyé à %s"
|
"recovery_email_sent": "Email de réinitialisation envoyé à %s",
|
||||||
|
"mailbox_renamed": "La boîte de réception a été renommée de %s à %s",
|
||||||
|
"template_modified": "Les modifications au modèle %s ont été enregistrées",
|
||||||
|
"password_policy_saved": "La politique de mot de passe a été enregistrée avec succès"
|
||||||
},
|
},
|
||||||
"tfa": {
|
"tfa": {
|
||||||
"api_register": "%s utilise l'API Yubico Cloud. Veuillez obtenir une clé API pour votre clé <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">ici</a>",
|
"api_register": "%s utilise l'API Yubico Cloud. Veuillez obtenir une clé API pour votre clé <a href=\"https://upgrade.yubico.com/getapikey/\" target=\"_blank\">ici</a>",
|
||||||
@@ -1050,7 +1099,7 @@
|
|||||||
"start_webauthn_validation": "Début de la validation",
|
"start_webauthn_validation": "Début de la validation",
|
||||||
"tfa": "Authentification à deux facteurs",
|
"tfa": "Authentification à deux facteurs",
|
||||||
"tfa_token_invalid": "Token TFA invalide",
|
"tfa_token_invalid": "Token TFA invalide",
|
||||||
"totp": "OTP (One Time Password = Mot de passe à usage unique : Google Authenticator, Authy, etc.)",
|
"totp": "OTP (One Time Password = Mot de passe à usage unique : Google Authenticator, Authy, etc.)",
|
||||||
"webauthn": "Authentification WebAuthn",
|
"webauthn": "Authentification WebAuthn",
|
||||||
"waiting_usb_auth": "<i>En attente d’un périphérique USB…</i><br><br>S’il vous plaît appuyez maintenant sur le bouton de votre périphérique USB WebAuthn.",
|
"waiting_usb_auth": "<i>En attente d’un périphérique USB…</i><br><br>S’il vous plaît appuyez maintenant sur le bouton de votre périphérique USB WebAuthn.",
|
||||||
"waiting_usb_register": "<i>En attente d’un périphérique USB…</i><br><br>Veuillez entrer votre mot de passe ci-dessus et confirmer votre inscription WebAuthn en appuyant sur le bouton de votre périphérique USB WebAuthn.",
|
"waiting_usb_register": "<i>En attente d’un périphérique USB…</i><br><br>Veuillez entrer votre mot de passe ci-dessus et confirmer votre inscription WebAuthn en appuyant sur le bouton de votre périphérique USB WebAuthn.",
|
||||||
@@ -1089,7 +1138,7 @@
|
|||||||
"alias_valid_until": "Valide jusque",
|
"alias_valid_until": "Valide jusque",
|
||||||
"aliases_also_send_as": "Aussi autorisé à envoyer en tant qu’utilisateur",
|
"aliases_also_send_as": "Aussi autorisé à envoyer en tant qu’utilisateur",
|
||||||
"aliases_send_as_all": "Ne pas vérifier l’accès de l’expéditeur pour les domaines suivants et leurs alias",
|
"aliases_send_as_all": "Ne pas vérifier l’accès de l’expéditeur pour les domaines suivants et leurs alias",
|
||||||
"app_hint": "Les mots de passe d’application sont des mots de passe alternatifs pour votre connexion IMAP, SMTP, Caldav, Carddav et EAS. Le nom d’utilisateur reste inchangé.<br>SOGo n'est pas disponible au travers des mots de passe d'application.",
|
"app_hint": "Les mots de passe d’application sont des mots de passe alternatifs pour votre connexion IMAP, SMTP, CalDAV, CardDAV et EAS. Le nom d’utilisateur reste inchangé.<br>Le webmail SOGo n'est pas disponible au travers des mots de passe d'application.",
|
||||||
"app_name": "Nom d'application",
|
"app_name": "Nom d'application",
|
||||||
"app_passwds": "Mots de passe d'applications",
|
"app_passwds": "Mots de passe d'applications",
|
||||||
"apple_connection_profile": "Profil de connexion Apple",
|
"apple_connection_profile": "Profil de connexion Apple",
|
||||||
@@ -1101,11 +1150,12 @@
|
|||||||
"create_syncjob": "Créer une tâche de synchronisation",
|
"create_syncjob": "Créer une tâche de synchronisation",
|
||||||
"daily": "Quotidien",
|
"daily": "Quotidien",
|
||||||
"day": "jour",
|
"day": "jour",
|
||||||
|
"description": "Description",
|
||||||
"delete_ays": "Veuillez confirmer le processus de suppression.",
|
"delete_ays": "Veuillez confirmer le processus de suppression.",
|
||||||
"direct_aliases": "Adresses alias directes",
|
"direct_aliases": "Adresses d'alias directes",
|
||||||
"direct_aliases_desc": "Les adresses d’alias directes sont affectées par le filtre anti-spam et les paramètres de politique TLS.",
|
"direct_aliases_desc": "Les adresses d’alias directes sont affectées par le filtre anti-spam et les paramètres de politique TLS.",
|
||||||
"eas_reset": "Réinitialiser le cache de l’appareil ActiveSync",
|
"eas_reset": "Réinitialiser le cache de l’appareil ActiveSync",
|
||||||
"eas_reset_help": "Dans de nombreux cas, une réinitialisation du cache de l’appareil aidera à récupérer un profil ActiveSync cassé.<br><b>Attention :</b> Tous les éléments seront de nouveau téléchargés !",
|
"eas_reset_help": "Dans de nombreux cas, une réinitialisation du cache de l’appareil aidera à récupérer un profil ActiveSync cassé.<br><b>Attention :</b> Tous les éléments seront de nouveau téléchargés !",
|
||||||
"eas_reset_now": "Réinitialiser maintenant",
|
"eas_reset_now": "Réinitialiser maintenant",
|
||||||
"edit": "Éditer",
|
"edit": "Éditer",
|
||||||
"email": "Courriel",
|
"email": "Courriel",
|
||||||
@@ -1138,7 +1188,7 @@
|
|||||||
"pushover_evaluate_x_prio": "Acheminement du courrier hautement prioritaire [<code>X-Priority: 1</code>]",
|
"pushover_evaluate_x_prio": "Acheminement du courrier hautement prioritaire [<code>X-Priority: 1</code>]",
|
||||||
"pushover_info": "Les paramètres de notification push s’appliqueront à tout le courrier propre (non spam) livré à <b>%s</b> y compris les alias (partagés, non partagés, étiquetés).",
|
"pushover_info": "Les paramètres de notification push s’appliqueront à tout le courrier propre (non spam) livré à <b>%s</b> y compris les alias (partagés, non partagés, étiquetés).",
|
||||||
"pushover_only_x_prio": "Ne tenir compte que du courrier hautement prioritaire [<code>X-Priority: 1</code>]",
|
"pushover_only_x_prio": "Ne tenir compte que du courrier hautement prioritaire [<code>X-Priority: 1</code>]",
|
||||||
"pushover_sender_array": "Tenir compte des adresses de courriel suivantes de l’expéditeur : <small>(comma-separated)</small>",
|
"pushover_sender_array": "Tenir compte des adresses de courriel de l’expéditeur suivantes : <small>(séparées par des virgules)</small>",
|
||||||
"pushover_sender_regex": "Apparier les expéditeurs par le regex suivant",
|
"pushover_sender_regex": "Apparier les expéditeurs par le regex suivant",
|
||||||
"pushover_text": "Texte de notification",
|
"pushover_text": "Texte de notification",
|
||||||
"pushover_title": "Titre de la notification",
|
"pushover_title": "Titre de la notification",
|
||||||
@@ -1149,8 +1199,8 @@
|
|||||||
"q_reject": "Rejeté",
|
"q_reject": "Rejeté",
|
||||||
"quarantine_notification": "Avis de quarantaine",
|
"quarantine_notification": "Avis de quarantaine",
|
||||||
"quarantine_category": "Catégorie de la notification de quarantaine",
|
"quarantine_category": "Catégorie de la notification de quarantaine",
|
||||||
"quarantine_notification_info": "Une fois qu’un avis a été envoyé, les articles seront marqués comme « notifiés » et aucune autre notification ne sera envoyée pour ce point particulier.",
|
"quarantine_notification_info": "Une fois qu’un avis a été envoyé, les articles seront marqués comme « notifiés » et aucune autre notification ne sera envoyée pour ce point particulier.",
|
||||||
"quarantine_category_info": "La catégorie de notification « Rejeté » inclut le courrier rejeté, tandis que « Dossier indésirable » informera un utilisateur des courriels placés dans le dossier indésirable.",
|
"quarantine_category_info": "La catégorie de notification « Rejeté » inclut le courrier rejeté, tandis que « Dossier indésirable » informera un utilisateur des courriels placés dans le dossier indésirable.",
|
||||||
"remove": "Enlever",
|
"remove": "Enlever",
|
||||||
"running": "En fonctionnement",
|
"running": "En fonctionnement",
|
||||||
"save": "Enregistrer les changements",
|
"save": "Enregistrer les changements",
|
||||||
@@ -1167,11 +1217,11 @@
|
|||||||
"spamfilter": "Filtre de spam",
|
"spamfilter": "Filtre de spam",
|
||||||
"spamfilter_behavior": "Note",
|
"spamfilter_behavior": "Note",
|
||||||
"spamfilter_bl": "Liste noire (BlackList)",
|
"spamfilter_bl": "Liste noire (BlackList)",
|
||||||
"spamfilter_bl_desc": "Les adresses de courriel sur la liste noire de <b>toujours</b> peuvent être classées comme des pourriels et rejetées. Des caractères génériques peuvent être utilisés. Un filtre n’est appliqué qu’aux alias directs (alias avec une seule boîte de réception cible), à l’exclusion des alias tous azimuts et d’une boîte de réception elle-même.",
|
"spamfilter_bl_desc": "Les adresses de courriel sur liste noire qui doivent <b>toujours</b> être classées comme des pourriels et rejetées. Les messages rejetés ne seront <b>pas</b> copiés dans la quarantaine. Des caractères génériques peuvent être utilisés. Un filtre n’est appliqué qu’aux alias directs (alias avec une seule boîte de réception cible), à l’exclusion des alias attrape-tout et d’une boîte de réception elle-même.",
|
||||||
"spamfilter_default_score": "Valeurs par défaut",
|
"spamfilter_default_score": "Valeurs par défaut",
|
||||||
"spamfilter_green": "Vert : ce message n'est pas un spam",
|
"spamfilter_green": "Vert : ce message n'est pas un spam",
|
||||||
"spamfilter_hint": "La première valeur indique un « faible score de spam », la seconde représente un « haut score de spam ».",
|
"spamfilter_hint": "La première valeur indique un « faible score de spam », la seconde représente un « haut score de spam ».",
|
||||||
"spamfilter_red": "Rouge : Ce message est un spam et sera rejeté par le serveur",
|
"spamfilter_red": "Rouge : Ce message est un spam et sera rejeté par le serveur",
|
||||||
"spamfilter_table_action": "Action",
|
"spamfilter_table_action": "Action",
|
||||||
"spamfilter_table_add": "Ajouter un élément",
|
"spamfilter_table_add": "Ajouter un élément",
|
||||||
"spamfilter_table_domain_policy": "n/a (politique de domaine)",
|
"spamfilter_table_domain_policy": "n/a (politique de domaine)",
|
||||||
@@ -1179,13 +1229,13 @@
|
|||||||
"spamfilter_table_remove": "supprimer",
|
"spamfilter_table_remove": "supprimer",
|
||||||
"spamfilter_table_rule": "Règle",
|
"spamfilter_table_rule": "Règle",
|
||||||
"spamfilter_wl": "Liste blanche (WhiteList)",
|
"spamfilter_wl": "Liste blanche (WhiteList)",
|
||||||
"spamfilter_wl_desc": "La liste blanche est programmée pour <b> ne jamais</b> classer comme spam les adresses de courriel qu'elle contient. Des caractères génériques peuvent être utilisés. Un filtre n’est appliqué qu’aux alias directs (alias avec une seule boîte de réception cible), à l’exclusion des alias catch-all et d’une boîte de réception.",
|
"spamfilter_wl_desc": "La liste blanche est programmée pour <b> ne jamais</b> classer comme spam les adresses de courriel qu'elle contient. Des caractères génériques peuvent être utilisés. Un filtre n’est appliqué qu’aux alias directs (alias avec une seule boîte de réception cible), à l’exclusion des alias attrape-tout et d’une boîte de réception.",
|
||||||
"spamfilter_yellow": "Jaune : ce message est peut être un spam, il sera étiqueté comme spam et déplacé vers votre dossier Pourriel",
|
"spamfilter_yellow": "Jaune : ce message est peut-être un spam, il sera étiqueté comme spam et déplacé vers votre dossier Pourriel",
|
||||||
"status": "Statut",
|
"status": "Statut",
|
||||||
"sync_jobs": "Jobs de synchronisation",
|
"sync_jobs": "Tâches de synchronisation",
|
||||||
"tag_handling": "Régler la manipulation du courrier étiqueté",
|
"tag_handling": "Régler la manipulation du courrier étiqueté",
|
||||||
"tag_help_example": "Exemple pour une adresse de courriel étiquetée : me<b>+Facebook</b>@example.org",
|
"tag_help_example": "Exemple pour une adresse de courriel étiquetée : me<b>+Facebook</b>@example.org",
|
||||||
"tag_help_explain": "Dans un sous-dossier : un nouveau sous-dossier nommé selon l'étiquette sera créé sous INBOX (\"INBOX/Facebook\").<br>\nDans le sujet : le nom des balises sera ajouté au début du sujet de l'e-mail, exemple : \"[Facebook] My News\".",
|
"tag_help_explain": "Dans un sous-dossier : un nouveau sous-dossier nommé selon l'étiquette sera créé sous INBOX (« INBOX/Facebook »).<br>\nDans le sujet : le nom des balises sera ajouté au début du sujet de l'e-mail, exemple : « [Facebook] My News ».",
|
||||||
"tag_in_none": "Ne rien faire",
|
"tag_in_none": "Ne rien faire",
|
||||||
"tag_in_subfolder": "Dans un sous dossier",
|
"tag_in_subfolder": "Dans un sous dossier",
|
||||||
"tag_in_subject": "Dans le sujet",
|
"tag_in_subject": "Dans le sujet",
|
||||||
@@ -1208,7 +1258,7 @@
|
|||||||
"with_app_password": "avec le mot de passe de l'application",
|
"with_app_password": "avec le mot de passe de l'application",
|
||||||
"apple_connection_profile_with_app_password": "Un nouveau mot de passe est généré et ajouté au profil, de sorte qu'aucun mot de passe ne doit être saisi lors de la configuration de votre appareil. Ne partagez pas le fichier car il vous donne un accès complet à votre boîte de réception.",
|
"apple_connection_profile_with_app_password": "Un nouveau mot de passe est généré et ajouté au profil, de sorte qu'aucun mot de passe ne doit être saisi lors de la configuration de votre appareil. Ne partagez pas le fichier car il vous donne un accès complet à votre boîte de réception.",
|
||||||
"attribute": "Attribut",
|
"attribute": "Attribut",
|
||||||
"direct_protocol_access": "Cet utilisateur de la boîte aux lettres dispose d'un <b>accès externe direct</b> aux protocoles et applications suivants. Votre administrateur contrôle ce paramètre. Il est possible de créer des mots de passe d'application pour accorder l'accès à des protocoles et des applications individuels.<br>Le bouton « Connexion au webmail » permet une connexion unique à SOGo et est toujours disponible.",
|
"direct_protocol_access": "Cet utilisateur de la boîte aux lettres dispose d'un <b>accès externe direct</b> aux protocoles et applications suivants. Votre administrateur contrôle ce paramètre. Il est possible de créer des mots de passe d'application pour accorder l'accès à des protocoles et des applications individuels.<br>Le bouton « Connexion au webmail » permet une connexion unique à SOGo et est toujours disponible.",
|
||||||
"open_webmail_sso": "Connexion au webmail",
|
"open_webmail_sso": "Connexion au webmail",
|
||||||
"recent_successful_connections": "Voir les connexions réussies",
|
"recent_successful_connections": "Voir les connexions réussies",
|
||||||
"syncjob_EXIT_TLS_FAILURE": "Problème de connexion chiffrée",
|
"syncjob_EXIT_TLS_FAILURE": "Problème de connexion chiffrée",
|
||||||
@@ -1229,19 +1279,28 @@
|
|||||||
"allowed_protocols": "Protocoles autorisés",
|
"allowed_protocols": "Protocoles autorisés",
|
||||||
"mailbox": "Boîte de réception",
|
"mailbox": "Boîte de réception",
|
||||||
"password_reset_info": "Si aucun email pour la récupération du mot de passe n'est fourni, cette fonction ne peut pas être utilisée.",
|
"password_reset_info": "Si aucun email pour la récupération du mot de passe n'est fourni, cette fonction ne peut pas être utilisée.",
|
||||||
"pw_recovery_email": "Email de récupération pour son mot de passe"
|
"pw_recovery_email": "Email de récupération pour son mot de passe",
|
||||||
|
"month": "mois",
|
||||||
|
"from": "de",
|
||||||
|
"empty": "Aucun résultat",
|
||||||
|
"fido2_webauthn": "FIDO2/WebAuthn",
|
||||||
|
"last_pw_change": "Dernier changement de mot de passe",
|
||||||
|
"open_logs": "Afficher les journaux",
|
||||||
|
"pushover_sound": "Son",
|
||||||
|
"mailbox_general": "Général",
|
||||||
|
"mailbox_settings": "Paramètres"
|
||||||
},
|
},
|
||||||
"warning": {
|
"warning": {
|
||||||
"cannot_delete_self": "Impossible de supprimer l’utilisateur connecté",
|
"cannot_delete_self": "Impossible de supprimer l’utilisateur connecté",
|
||||||
"domain_added_sogo_failed": "Ajout d’un domaine mais échec du redémarrage de Sogo, veuillez vérifier les journaux de votre serveur.",
|
"domain_added_sogo_failed": "Ajout d’un domaine mais échec du redémarrage de Sogo, veuillez vérifier les journaux de votre serveur.",
|
||||||
"dovecot_restart_failed": "Dovecot n’a pas pu redémarrer, veuillez vérifier les journaux",
|
"dovecot_restart_failed": "Dovecot n’a pas pu redémarrer, veuillez vérifier les journaux",
|
||||||
"fuzzy_learn_error": "Erreur d’apprentissage du hachage flou: %s",
|
"fuzzy_learn_error": "Erreur d’apprentissage du hachage flou : %s",
|
||||||
"hash_not_found": "Hachage non trouvé ou déjà supprimé",
|
"hash_not_found": "Hachage non trouvé ou déjà supprimé",
|
||||||
"ip_invalid": "IP non valide ignorée : %s",
|
"ip_invalid": "IP non valide ignorée : %s",
|
||||||
"no_active_admin": "Impossible de désactiver le dernier administrateur actif",
|
"no_active_admin": "Impossible de désactiver le dernier administrateur actif",
|
||||||
"quota_exceeded_scope": "Dépassement du quota de domaine : Seules des boîtes de réception illimitées peuvent être créées dans ce domaine.",
|
"quota_exceeded_scope": "Dépassement du quota de domaine : Seules des boîtes de réception illimitées peuvent être créées dans ce domaine.",
|
||||||
"session_token": "Jeton de formulaire invalide : Jeton différent",
|
"session_token": "Jeton de formulaire invalide : Jeton différent",
|
||||||
"session_ua": "Jeton de formulaire invalide : erreur de validation User-Agent",
|
"session_ua": "Jeton de formulaire invalide : erreur de validation User-Agent",
|
||||||
"is_not_primary_alias": "Alias non primaire ignoré %s"
|
"is_not_primary_alias": "Alias non primaire ignoré %s"
|
||||||
},
|
},
|
||||||
"datatables": {
|
"datatables": {
|
||||||
@@ -1250,21 +1309,30 @@
|
|||||||
"thousands": ",",
|
"thousands": ",",
|
||||||
"paginate": {
|
"paginate": {
|
||||||
"first": "Premier",
|
"first": "Premier",
|
||||||
"last": "Dernier"
|
"last": "Dernier",
|
||||||
|
"next": "Suivant",
|
||||||
|
"previous": "Précédent"
|
||||||
},
|
},
|
||||||
"aria": {
|
"aria": {
|
||||||
"sortAscending": ": activer pour trier les colonnes en ordre croissant",
|
"sortAscending": ": activer pour trier les colonnes en ordre croissant",
|
||||||
"sortDescending": ": activer pour trier les colonnes en ordre décroissant"
|
"sortDescending": ": activer pour trier les colonnes en ordre décroissant"
|
||||||
},
|
},
|
||||||
"infoEmpty": "Affichage de 0 à 0 de 0 entrées",
|
"infoEmpty": "Affichage de 0 à 0 sur 0 entrée",
|
||||||
"infoFiltered": "(filtré à partir de _MAX_ entrées totales)",
|
"infoFiltered": "(filtré à partir de _MAX_ entrée(s) totale(s))",
|
||||||
"lengthMenu": "Afficher les entrées _MENU_",
|
"lengthMenu": "Afficher les entrées _MENU_",
|
||||||
"loadingRecords": "Chargement…",
|
"loadingRecords": "Chargement…",
|
||||||
"processing": "Veuillez patienter…",
|
"processing": "Veuillez patienter…",
|
||||||
"collapse_all": "Tout réduire",
|
"collapse_all": "Tout réduire",
|
||||||
"info": "Affichage de _START_ de _END_ sur _TOTAL_ entrées"
|
"info": "Affichage de _START_ à _END_ sur _TOTAL_ entrée(s)",
|
||||||
|
"search": "Rechercher :",
|
||||||
|
"emptyTable": "Aucune donnée présente dans la table",
|
||||||
|
"zeroRecords": "Aucun enregistrement correspondant trouvé"
|
||||||
},
|
},
|
||||||
"ratelimit": {
|
"ratelimit": {
|
||||||
"disabled": "Désactivé"
|
"disabled": "Désactivé",
|
||||||
|
"second": "msgs / seconde",
|
||||||
|
"minute": "msgs / minute",
|
||||||
|
"hour": "msgs / heure",
|
||||||
|
"day": "msgs / jour"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -406,6 +406,7 @@
|
|||||||
"create_syncjob": "Új szinkronizációs művelet létrehozása",
|
"create_syncjob": "Új szinkronizációs művelet létrehozása",
|
||||||
"daily": "Napi",
|
"daily": "Napi",
|
||||||
"day": "nap",
|
"day": "nap",
|
||||||
|
"description": "Leírás",
|
||||||
"delete_ays": "Erősítse meg a törlést.",
|
"delete_ays": "Erősítse meg a törlést.",
|
||||||
"direct_aliases": "Közvetlen alias címek",
|
"direct_aliases": "Közvetlen alias címek",
|
||||||
"eas_reset": "ActiveSync eszköz gyorsítótár ürítése",
|
"eas_reset": "ActiveSync eszköz gyorsítótár ürítése",
|
||||||
@@ -591,4 +592,4 @@
|
|||||||
"app_name": "Alkalmazás neve",
|
"app_name": "Alkalmazás neve",
|
||||||
"app_passwd_protocols": "Engedélyezett protokollok az alkalmazás jelszavához"
|
"app_passwd_protocols": "Engedélyezett protokollok az alkalmazás jelszavához"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -494,7 +494,6 @@
|
|||||||
"external_logs": "Log esterni",
|
"external_logs": "Log esterni",
|
||||||
"history_all_servers": "Cronologia (tutti i server)",
|
"history_all_servers": "Cronologia (tutti i server)",
|
||||||
"in_memory_logs": "In-memory logs",
|
"in_memory_logs": "In-memory logs",
|
||||||
"jvm_memory_solr": "JVM memory usage",
|
|
||||||
"last_modified": "Ultima modifica",
|
"last_modified": "Ultima modifica",
|
||||||
"log_info": "<p>mailcow <b>in-memory logs</b> are collected in Redis lists and trimmed to LOG_LINES (%d) every minute to reduce hammering.\r\n <br>In-memory logs are not meant to be persistent. All applications that log in-memory, also log to the Docker daemon and therefore to the default logging driver.\r\n <br>The in-memory log type should be used for debugging minor issues with containers.</p>\r\n <p><b>External logs</b> are collected via API of the given application.</p>\r\n <p><b>Static logs</b> are mostly activity logs, that are not logged to the Dockerd but still need to be persistent (except for API logs).</p>",
|
"log_info": "<p>mailcow <b>in-memory logs</b> are collected in Redis lists and trimmed to LOG_LINES (%d) every minute to reduce hammering.\r\n <br>In-memory logs are not meant to be persistent. All applications that log in-memory, also log to the Docker daemon and therefore to the default logging driver.\r\n <br>The in-memory log type should be used for debugging minor issues with containers.</p>\r\n <p><b>External logs</b> are collected via API of the given application.</p>\r\n <p><b>Static logs</b> are mostly activity logs, that are not logged to the Dockerd but still need to be persistent (except for API logs).</p>",
|
||||||
"login_time": "Orario",
|
"login_time": "Orario",
|
||||||
@@ -503,8 +502,6 @@
|
|||||||
"restart_container": "Riavvio",
|
"restart_container": "Riavvio",
|
||||||
"service": "Servizio",
|
"service": "Servizio",
|
||||||
"size": "Dimensione",
|
"size": "Dimensione",
|
||||||
"solr_dead": "Solr sta partendo, è disabilitato o morto.",
|
|
||||||
"solr_status": "Stato Solr",
|
|
||||||
"started_at": "Iniziato alle",
|
"started_at": "Iniziato alle",
|
||||||
"started_on": "Iniziato",
|
"started_on": "Iniziato",
|
||||||
"static_logs": "Log statici",
|
"static_logs": "Log statici",
|
||||||
@@ -1126,6 +1123,7 @@
|
|||||||
"created_on": "Creato il",
|
"created_on": "Creato il",
|
||||||
"daily": "Giornaliero",
|
"daily": "Giornaliero",
|
||||||
"day": "giorno",
|
"day": "giorno",
|
||||||
|
"description": "Descrizione",
|
||||||
"delete_ays": "Please confirm the deletion process.",
|
"delete_ays": "Please confirm the deletion process.",
|
||||||
"direct_aliases": "Direct alias addresses",
|
"direct_aliases": "Direct alias addresses",
|
||||||
"direct_aliases_desc": "Direct alias addresses are affected by spam filter and TLS policy settings.",
|
"direct_aliases_desc": "Direct alias addresses are affected by spam filter and TLS policy settings.",
|
||||||
@@ -1308,4 +1306,4 @@
|
|||||||
},
|
},
|
||||||
"decimal": "."
|
"decimal": "."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
1338
data/web/lang/lang.ja-jp.json
Normal file
1338
data/web/lang/lang.ja-jp.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -424,16 +424,13 @@
|
|||||||
"external_logs": "External logs",
|
"external_logs": "External logs",
|
||||||
"history_all_servers": "History (all servers)",
|
"history_all_servers": "History (all servers)",
|
||||||
"in_memory_logs": "In-memory logs",
|
"in_memory_logs": "In-memory logs",
|
||||||
"jvm_memory_solr": "JVM memory usage",
|
|
||||||
"log_info": "<p>mailcow <b>in-memory logs</b> are collected in Redis lists and trimmed to LOG_LINES (%d) every minute to reduce hammering.\r\n <br>In-memory logs are not meant to be persistent. All applications that log in-memory, also log to the Docker daemon and therefore to the default logging driver.\r\n <br>The in-memory log type should be used for debugging minor issues with containers.</p>\r\n <p><b>External logs</b> are collected via API of the given application.</p>\r\n <p><b>Static logs</b> are mostly activity logs, that are not logged to the Dockerd but still need to be persistent (except for API logs).</p>",
|
"log_info": "<p>mailcow <b>in-memory logs</b> are collected in Redis lists and trimmed to LOG_LINES (%d) every minute to reduce hammering.\r\n <br>In-memory logs are not meant to be persistent. All applications that log in-memory, also log to the Docker daemon and therefore to the default logging driver.\r\n <br>The in-memory log type should be used for debugging minor issues with containers.</p>\r\n <p><b>External logs</b> are collected via API of the given application.</p>\r\n <p><b>Static logs</b> are mostly activity logs, that are not logged to the Dockerd but still need to be persistent (except for API logs).</p>",
|
||||||
"logs": "Logs",
|
"logs": "Logs",
|
||||||
"restart_container": "Restart",
|
"restart_container": "Restart",
|
||||||
"solr_dead": "Solr is starting, disabled or died.",
|
|
||||||
"docs": "Docs",
|
"docs": "Docs",
|
||||||
"last_modified": "Last modified",
|
"last_modified": "Last modified",
|
||||||
"size": "Size",
|
"size": "Size",
|
||||||
"started_at": "Started at",
|
"started_at": "Started at",
|
||||||
"solr_status": "Solr status",
|
|
||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"started_on": "Started on",
|
"started_on": "Started on",
|
||||||
"static_logs": "Static logs",
|
"static_logs": "Static logs",
|
||||||
@@ -911,6 +908,7 @@
|
|||||||
"create_syncjob": "새 동기화 작업 생성",
|
"create_syncjob": "새 동기화 작업 생성",
|
||||||
"daily": "매일",
|
"daily": "매일",
|
||||||
"day": "일",
|
"day": "일",
|
||||||
|
"description": "Description",
|
||||||
"delete_ays": "진짜 삭제하겠습니까?",
|
"delete_ays": "진짜 삭제하겠습니까?",
|
||||||
"direct_aliases": "Direct alias addresses",
|
"direct_aliases": "Direct alias addresses",
|
||||||
"direct_aliases_desc": "Direct alias addresses are affected by spam filter and TLS policy settings.",
|
"direct_aliases_desc": "Direct alias addresses are affected by spam filter and TLS policy settings.",
|
||||||
@@ -1020,4 +1018,4 @@
|
|||||||
"session_token": "Form token invalid: Token mismatch",
|
"session_token": "Form token invalid: Token mismatch",
|
||||||
"session_ua": "Form token invalid: User-Agent validation error"
|
"session_ua": "Form token invalid: User-Agent validation error"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -551,6 +551,7 @@
|
|||||||
"client_configuration": "Parādīt konfigurācijas norādes e-pasta klientiem un tālruņiem",
|
"client_configuration": "Parādīt konfigurācijas norādes e-pasta klientiem un tālruņiem",
|
||||||
"create_syncjob": "Izveidot jaunu sinhronizācijas darbu",
|
"create_syncjob": "Izveidot jaunu sinhronizācijas darbu",
|
||||||
"day": "Dienas",
|
"day": "Dienas",
|
||||||
|
"description": "Apraksts",
|
||||||
"direct_aliases": "Tiešas aizstājadreses",
|
"direct_aliases": "Tiešas aizstājadreses",
|
||||||
"direct_aliases_desc": "Tiešās aizstājadreses ir surogātpasta atlasīšanas un TLS nosacījumu iestatījumu ietekmētas.",
|
"direct_aliases_desc": "Tiešās aizstājadreses ir surogātpasta atlasīšanas un TLS nosacījumu iestatījumu ietekmētas.",
|
||||||
"eas_reset": "Atiestatīt ActiveSync ierīces kešatmiņu",
|
"eas_reset": "Atiestatīt ActiveSync ierīces kešatmiņu",
|
||||||
@@ -643,7 +644,6 @@
|
|||||||
"logs": "Žurnāli",
|
"logs": "Žurnāli",
|
||||||
"architecture": "Arhitektūra",
|
"architecture": "Arhitektūra",
|
||||||
"disk_usage": "Diska lietojums",
|
"disk_usage": "Diska lietojums",
|
||||||
"jvm_memory_solr": "JVM atmiņas lietojums",
|
|
||||||
"memory": "Atmiņa",
|
"memory": "Atmiņa",
|
||||||
"timezone": "Laika josla",
|
"timezone": "Laika josla",
|
||||||
"uptime": "Darbošanās laiks"
|
"uptime": "Darbošanās laiks"
|
||||||
@@ -659,4 +659,4 @@
|
|||||||
"fido2": {
|
"fido2": {
|
||||||
"fido2_auth": "Pieteikties ar FIDO2"
|
"fido2_auth": "Pieteikties ar FIDO2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -328,12 +328,10 @@
|
|||||||
"update_available": "En oppdatering er tilgjengelig",
|
"update_available": "En oppdatering er tilgjengelig",
|
||||||
"service": "Tjeneste",
|
"service": "Tjeneste",
|
||||||
"show_ip": "Vis offentlig IP",
|
"show_ip": "Vis offentlig IP",
|
||||||
"solr_dead": "Solr starter, er deaktivert eller døde",
|
|
||||||
"memory": "Minne",
|
"memory": "Minne",
|
||||||
"online_users": "Tilkoblede brukere",
|
"online_users": "Tilkoblede brukere",
|
||||||
"restart_container": "Omstart",
|
"restart_container": "Omstart",
|
||||||
"size": "Størrelse",
|
"size": "Størrelse",
|
||||||
"solr_status": "Solr-status",
|
|
||||||
"started_at": "Startet ved",
|
"started_at": "Startet ved",
|
||||||
"started_on": "Startet den",
|
"started_on": "Startet den",
|
||||||
"static_logs": "Statiske logger",
|
"static_logs": "Statiske logger",
|
||||||
|
|||||||
@@ -472,17 +472,14 @@
|
|||||||
"external_logs": "Externe logs",
|
"external_logs": "Externe logs",
|
||||||
"history_all_servers": "Geschiedenis (alle servers)",
|
"history_all_servers": "Geschiedenis (alle servers)",
|
||||||
"in_memory_logs": "Geheugenlogs",
|
"in_memory_logs": "Geheugenlogs",
|
||||||
"jvm_memory_solr": "JVM-geheugengebruik",
|
|
||||||
"log_info": "<p>Mailcows <b>geheugenlogs</b> worden elke minuut afgesneden naar maximaal %d regels (LOG_LINES) om de stabiliteit te garanderen.<br>Geheugenlogs zijn niet bedoeld om bewaard te blijven. Alle applicaties die geheugenlogs schrijven worden ook naar het Docker-proces gelogd.<br>De geheugenlogs kunnen gebruikt worden voor het oplossen van problemen met bepaalde containers.</p><p><b>Externe logs</b> worden verzameld door middel van de API van deze applicaties.</p><p><b>Statische logs</b> zijn activiteitenlogs die niet naar het Docker-proces worden gelogd, maar wel bewaard moeten blijven (uitgezonderd API-logs).</p>",
|
"log_info": "<p>Mailcows <b>geheugenlogs</b> worden elke minuut afgesneden naar maximaal %d regels (LOG_LINES) om de stabiliteit te garanderen.<br>Geheugenlogs zijn niet bedoeld om bewaard te blijven. Alle applicaties die geheugenlogs schrijven worden ook naar het Docker-proces gelogd.<br>De geheugenlogs kunnen gebruikt worden voor het oplossen van problemen met bepaalde containers.</p><p><b>Externe logs</b> worden verzameld door middel van de API van deze applicaties.</p><p><b>Statische logs</b> zijn activiteitenlogs die niet naar het Docker-proces worden gelogd, maar wel bewaard moeten blijven (uitgezonderd API-logs).</p>",
|
||||||
"logs": "Logs",
|
"logs": "Logs",
|
||||||
"restart_container": "Herstart",
|
"restart_container": "Herstart",
|
||||||
"solr_dead": "Solr is uitgeschakeld, uitgevallen of nog bezig met opstarten.",
|
|
||||||
"docs": "Documenten",
|
"docs": "Documenten",
|
||||||
"last_modified": "Voor het laatst bijgewerkt op",
|
"last_modified": "Voor het laatst bijgewerkt op",
|
||||||
"online_users": "Gebruikers online",
|
"online_users": "Gebruikers online",
|
||||||
"size": "Grootte",
|
"size": "Grootte",
|
||||||
"started_at": "Opgestart op",
|
"started_at": "Opgestart op",
|
||||||
"solr_status": "Solr-status",
|
|
||||||
"uptime": "Uptime",
|
"uptime": "Uptime",
|
||||||
"started_on": "Gestart op",
|
"started_on": "Gestart op",
|
||||||
"static_logs": "Statische logs",
|
"static_logs": "Statische logs",
|
||||||
@@ -1028,6 +1025,7 @@
|
|||||||
"create_syncjob": "Voeg sync job toe",
|
"create_syncjob": "Voeg sync job toe",
|
||||||
"daily": "Dagelijks",
|
"daily": "Dagelijks",
|
||||||
"day": "dag",
|
"day": "dag",
|
||||||
|
"description": "Beschrijving",
|
||||||
"delete_ays": "Bevestig de verwijdering.",
|
"delete_ays": "Bevestig de verwijdering.",
|
||||||
"direct_aliases": "Directe aliasadressen",
|
"direct_aliases": "Directe aliasadressen",
|
||||||
"direct_aliases_desc": "Directe aliasadressen worden beïnvloed door spamfilters en het versleutelingsbeleid.",
|
"direct_aliases_desc": "Directe aliasadressen worden beïnvloed door spamfilters en het versleutelingsbeleid.",
|
||||||
@@ -1167,4 +1165,4 @@
|
|||||||
"search": "Zoeken:",
|
"search": "Zoeken:",
|
||||||
"zeroRecords": "Geen overeenkomsten gevonden"
|
"zeroRecords": "Geen overeenkomsten gevonden"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -363,6 +363,7 @@
|
|||||||
"create_syncjob": "Utwórz nowe polecenie synchronizacji",
|
"create_syncjob": "Utwórz nowe polecenie synchronizacji",
|
||||||
"daily": "Co dzień",
|
"daily": "Co dzień",
|
||||||
"day": "Dzień",
|
"day": "Dzień",
|
||||||
|
"description": "Opis",
|
||||||
"direct_aliases": "Aliasy bezpośrednie",
|
"direct_aliases": "Aliasy bezpośrednie",
|
||||||
"direct_aliases_desc": "Na aliasy bezpośrednie wpływają filtry spamu i ustawienia TLS.",
|
"direct_aliases_desc": "Na aliasy bezpośrednie wpływają filtry spamu i ustawienia TLS.",
|
||||||
"eas_reset": "Zresetuj pamięć podręczną urządzenia ActiveSync",
|
"eas_reset": "Zresetuj pamięć podręczną urządzenia ActiveSync",
|
||||||
@@ -431,4 +432,4 @@
|
|||||||
"weekly": "Co tydzień",
|
"weekly": "Co tydzień",
|
||||||
"weeks": "Tygodnie"
|
"weeks": "Tygodnie"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -539,7 +539,6 @@
|
|||||||
"external_logs": "Registros externos",
|
"external_logs": "Registros externos",
|
||||||
"history_all_servers": "Histórico (todos os servidores)",
|
"history_all_servers": "Histórico (todos os servidores)",
|
||||||
"in_memory_logs": "Registros na memória",
|
"in_memory_logs": "Registros na memória",
|
||||||
"jvm_memory_solr": "Uso de memória JVM",
|
|
||||||
"last_modified": "Última modificação",
|
"last_modified": "Última modificação",
|
||||||
"log_info": "<p>Os <b>registros na memória do</b> mailcow são coletados em listas do Redis e reduzidos para LOG_LINES (%d) a cada minuto para reduzir o martelamento.\r\n Os <br>registros na memória não devem ser persistentes. Todos os aplicativos que fazem login na memória também fazem login no daemon do Docker e, portanto, no driver de registro padrão.\r\n </p><br>O tipo de registro na memória deve ser usado para depurar pequenos problemas com contêineres.\r\n <p>Os <b>registros externos</b> são coletados por meio da API do aplicativo em questão.</p>\r\n <p>Os <b>registros estáticos</b> são principalmente registros de atividades, que não são registrados no Dockerd, mas ainda precisam ser persistentes (exceto os registros da API).</p>",
|
"log_info": "<p>Os <b>registros na memória do</b> mailcow são coletados em listas do Redis e reduzidos para LOG_LINES (%d) a cada minuto para reduzir o martelamento.\r\n Os <br>registros na memória não devem ser persistentes. Todos os aplicativos que fazem login na memória também fazem login no daemon do Docker e, portanto, no driver de registro padrão.\r\n </p><br>O tipo de registro na memória deve ser usado para depurar pequenos problemas com contêineres.\r\n <p>Os <b>registros externos</b> são coletados por meio da API do aplicativo em questão.</p>\r\n <p>Os <b>registros estáticos</b> são principalmente registros de atividades, que não são registrados no Dockerd, mas ainda precisam ser persistentes (exceto os registros da API).</p>",
|
||||||
"login_time": "Hora",
|
"login_time": "Hora",
|
||||||
@@ -550,8 +549,6 @@
|
|||||||
"service": "Serviço",
|
"service": "Serviço",
|
||||||
"show_ip": "Mostrar IP público",
|
"show_ip": "Mostrar IP público",
|
||||||
"size": "Tamanho",
|
"size": "Tamanho",
|
||||||
"solr_dead": "O Solr está iniciando, desativado ou morreu.",
|
|
||||||
"solr_status": "Status do solr",
|
|
||||||
"started_at": "Começou em",
|
"started_at": "Começou em",
|
||||||
"started_on": "Começou em",
|
"started_on": "Começou em",
|
||||||
"static_logs": "Registros estáticos",
|
"static_logs": "Registros estáticos",
|
||||||
@@ -1186,6 +1183,7 @@
|
|||||||
"created_on": "Criado em",
|
"created_on": "Criado em",
|
||||||
"daily": "Diariamente",
|
"daily": "Diariamente",
|
||||||
"day": "dia",
|
"day": "dia",
|
||||||
|
"description": "Descrição",
|
||||||
"delete_ays": "Confirme o processo de exclusão.",
|
"delete_ays": "Confirme o processo de exclusão.",
|
||||||
"direct_aliases": "Endereços de alias diretos",
|
"direct_aliases": "Endereços de alias diretos",
|
||||||
"direct_aliases_desc": "Os endereços de alias diretos são afetados pelo filtro de spam e pelas configurações da política TLS.",
|
"direct_aliases_desc": "Os endereços de alias diretos são afetados pelo filtro de spam e pelas configurações da política TLS.",
|
||||||
@@ -1332,4 +1330,4 @@
|
|||||||
"session_token": "Token de formulário inválido: incompatibilidade de token",
|
"session_token": "Token de formulário inválido: incompatibilidade de token",
|
||||||
"session_ua": "Token de formulário inválido: erro de validação do agente de usuário"
|
"session_ua": "Token de formulário inválido: erro de validação do agente de usuário"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -236,6 +236,7 @@
|
|||||||
"aliases_send_as_all": "Não verificar remetente para os domínios",
|
"aliases_send_as_all": "Não verificar remetente para os domínios",
|
||||||
"change_password": "Alterar senha",
|
"change_password": "Alterar senha",
|
||||||
"day": "Dia",
|
"day": "Dia",
|
||||||
|
"description": "Descrição",
|
||||||
"edit": "Editar",
|
"edit": "Editar",
|
||||||
"hour": "Hora",
|
"hour": "Hora",
|
||||||
"hours": "Horas",
|
"hours": "Horas",
|
||||||
@@ -272,4 +273,4 @@
|
|||||||
"week": "Semana",
|
"week": "Semana",
|
||||||
"weeks": "Semanas"
|
"weeks": "Semanas"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -481,7 +481,6 @@
|
|||||||
"external_logs": "Jurnale externe",
|
"external_logs": "Jurnale externe",
|
||||||
"history_all_servers": "Istoric (toate serverele)",
|
"history_all_servers": "Istoric (toate serverele)",
|
||||||
"in_memory_logs": "Jurnale din memorie",
|
"in_memory_logs": "Jurnale din memorie",
|
||||||
"jvm_memory_solr": "Memorie utilizată de JVM",
|
|
||||||
"last_modified": "Ultima modificare",
|
"last_modified": "Ultima modificare",
|
||||||
"log_info": "<p><b>jurnalele din memorie</b> pentru mailcow sunt colectate în listele Redis și trimise la LOG_LINES (%d) în fiecare minut pentru a reduce ciocnirea.\n <br>Jurnalele din memorie nu sunt menite a fi persistente. Toate aplicațiile care înregistrează jurnale în memorie, înregistrează de asemenea jurnale în daemonul Docker și, prin urmare, în driverul de jurnale implicit.\n <br>Tipul de jurnal din memorie trebuie utilizat pentru depanarea problemelor minore cu containerele.</p>\n <p><b>Jurnalele externe</b> sunt colectate prin API-ul aplicației respective.</p>\n <p><b>Jurnalele statice</b> sunt, în majoritate, jurnale de activitate care nu sunt înregistrate în Docker, dar trebuie să fie persistente (cu excepția jurnalelor API).</p>",
|
"log_info": "<p><b>jurnalele din memorie</b> pentru mailcow sunt colectate în listele Redis și trimise la LOG_LINES (%d) în fiecare minut pentru a reduce ciocnirea.\n <br>Jurnalele din memorie nu sunt menite a fi persistente. Toate aplicațiile care înregistrează jurnale în memorie, înregistrează de asemenea jurnale în daemonul Docker și, prin urmare, în driverul de jurnale implicit.\n <br>Tipul de jurnal din memorie trebuie utilizat pentru depanarea problemelor minore cu containerele.</p>\n <p><b>Jurnalele externe</b> sunt colectate prin API-ul aplicației respective.</p>\n <p><b>Jurnalele statice</b> sunt, în majoritate, jurnale de activitate care nu sunt înregistrate în Docker, dar trebuie să fie persistente (cu excepția jurnalelor API).</p>",
|
||||||
"login_time": "Moment",
|
"login_time": "Moment",
|
||||||
@@ -490,8 +489,6 @@
|
|||||||
"restart_container": "Repornire",
|
"restart_container": "Repornire",
|
||||||
"service": "Serviciu",
|
"service": "Serviciu",
|
||||||
"size": "Mărime",
|
"size": "Mărime",
|
||||||
"solr_dead": "Solr începe, este invalid sau s-a oprit.",
|
|
||||||
"solr_status": "Stare Solr",
|
|
||||||
"started_at": "Pornit la",
|
"started_at": "Pornit la",
|
||||||
"started_on": "Început pe",
|
"started_on": "Început pe",
|
||||||
"static_logs": "Jurnale statice",
|
"static_logs": "Jurnale statice",
|
||||||
@@ -1064,6 +1061,7 @@
|
|||||||
"created_on": "Creat în",
|
"created_on": "Creat în",
|
||||||
"daily": "Zilnic",
|
"daily": "Zilnic",
|
||||||
"day": "zi",
|
"day": "zi",
|
||||||
|
"description": "Descriere",
|
||||||
"delete_ays": "Vă rugăm să confirmați stergerea.",
|
"delete_ays": "Vă rugăm să confirmați stergerea.",
|
||||||
"direct_aliases": "Adrese alias directe",
|
"direct_aliases": "Adrese alias directe",
|
||||||
"direct_aliases_desc": "Adresele alias directe sunt afectate de setările filtrului de spam și ale politicii TLS.",
|
"direct_aliases_desc": "Adresele alias directe sunt afectate de setările filtrului de spam și ale politicii TLS.",
|
||||||
@@ -1210,4 +1208,4 @@
|
|||||||
"expand_all": "Expandează tot",
|
"expand_all": "Expandează tot",
|
||||||
"decimal": ","
|
"decimal": ","
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -539,7 +539,6 @@
|
|||||||
"external_logs": "Внешние журналы",
|
"external_logs": "Внешние журналы",
|
||||||
"history_all_servers": "История (все серверы)",
|
"history_all_servers": "История (все серверы)",
|
||||||
"in_memory_logs": "Журналы контейнеров",
|
"in_memory_logs": "Журналы контейнеров",
|
||||||
"jvm_memory_solr": "Использовано оперативной памяти JVM",
|
|
||||||
"last_modified": "Последние изменения",
|
"last_modified": "Последние изменения",
|
||||||
"log_info": "<p><b>Журналы контейнеров</b> mailcow сохраняются в Redis, и раз в минуту строки журнала за пределами <code>LOG_LINES (%d)</code> удаляются, чтобы уменьшить нагрузку на сервер.\r\n <br>Сами журналы контейнеров не сохраняются после перезагрузки контейнера. Все контейнеры дополнительно пишут логи в службу Docker, и, следовательно, используют драйвер логирования по умолчанию. Журналы контейнеров предусмотрены только для отладки мелких проблем. Для других задач, пожалуйста, настройте драйвер логирования Docker самостоятельно.</p>\r\n <p><b>Внешние журналы</b> собираются через API приложений.</p>\r\n <p><b>Статические журналы</b> – это, в основном, журналы активности, которые не записываются в Dockerd, но все равно должны быть постоянными (за исключением журналов API).</p>",
|
"log_info": "<p><b>Журналы контейнеров</b> mailcow сохраняются в Redis, и раз в минуту строки журнала за пределами <code>LOG_LINES (%d)</code> удаляются, чтобы уменьшить нагрузку на сервер.\r\n <br>Сами журналы контейнеров не сохраняются после перезагрузки контейнера. Все контейнеры дополнительно пишут логи в службу Docker, и, следовательно, используют драйвер логирования по умолчанию. Журналы контейнеров предусмотрены только для отладки мелких проблем. Для других задач, пожалуйста, настройте драйвер логирования Docker самостоятельно.</p>\r\n <p><b>Внешние журналы</b> собираются через API приложений.</p>\r\n <p><b>Статические журналы</b> – это, в основном, журналы активности, которые не записываются в Dockerd, но все равно должны быть постоянными (за исключением журналов API).</p>",
|
||||||
"login_time": "Время входа",
|
"login_time": "Время входа",
|
||||||
@@ -551,8 +550,6 @@
|
|||||||
"service": "Сервис",
|
"service": "Сервис",
|
||||||
"show_ip": "Показать публичные IP-адреса",
|
"show_ip": "Показать публичные IP-адреса",
|
||||||
"size": "Индексы занимают",
|
"size": "Индексы занимают",
|
||||||
"solr_dead": "Solr не запущен. Если вы включили Solf в файле настроек <code>mailcow.conf</code> и это сообщение отображается более получаса, скорее всего Solr сломан.",
|
|
||||||
"solr_status": "Состояние Solr",
|
|
||||||
"started_at": "Запущен",
|
"started_at": "Запущен",
|
||||||
"started_on": "Запущен в",
|
"started_on": "Запущен в",
|
||||||
"static_logs": "Статические журналы",
|
"static_logs": "Статические журналы",
|
||||||
@@ -1192,6 +1189,7 @@
|
|||||||
"created_on": "Дата создания",
|
"created_on": "Дата создания",
|
||||||
"daily": "Раз в день",
|
"daily": "Раз в день",
|
||||||
"day": "день",
|
"day": "день",
|
||||||
|
"description": "Описание",
|
||||||
"delete_ays": "Пожалуйста, подтвердите удаление",
|
"delete_ays": "Пожалуйста, подтвердите удаление",
|
||||||
"direct_aliases": "Личные псевдонимы",
|
"direct_aliases": "Личные псевдонимы",
|
||||||
"direct_aliases_desc": "На личные псевдонимы распространяются фильтры нежелательной почты и параметры политики TLS.",
|
"direct_aliases_desc": "На личные псевдонимы распространяются фильтры нежелательной почты и параметры политики TLS.",
|
||||||
@@ -1338,4 +1336,4 @@
|
|||||||
"session_token": "Неверный токен формы: несоответствие токена",
|
"session_token": "Неверный токен формы: несоответствие токена",
|
||||||
"session_ua": "Неверный токен формы: ошибка проверки User-Agent"
|
"session_ua": "Неверный токен формы: ошибка проверки User-Agent"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3,11 +3,11 @@
|
|||||||
"app_passwds": "Upravljaj gesla aplikacij",
|
"app_passwds": "Upravljaj gesla aplikacij",
|
||||||
"bcc_maps": "Preslikave SKP (BCC)",
|
"bcc_maps": "Preslikave SKP (BCC)",
|
||||||
"delimiter_action": "Dejanje ločila",
|
"delimiter_action": "Dejanje ločila",
|
||||||
"domain_relayhost": "Spremeni gostitelja relay za domeno",
|
"domain_relayhost": "Spremenite posrednika za domeno",
|
||||||
"eas_reset": "Ponastavi EAS naprave",
|
"eas_reset": "Ponastavi EAS naprave",
|
||||||
"filters": "Filtri",
|
"filters": "Filtri",
|
||||||
"login_as": "Prijavi se kot uporabnik poštnega predala",
|
"login_as": "Prijavi se kot uporabnik poštnega predala",
|
||||||
"mailbox_relayhost": "Spremeni gostitelja relay za poštni predal",
|
"mailbox_relayhost": "Spremenite posrednika za e-poštni nabiralnik",
|
||||||
"prohibited": "Prepovedano z ACL",
|
"prohibited": "Prepovedano z ACL",
|
||||||
"protocol_access": "Spremeni dostop do protokola",
|
"protocol_access": "Spremeni dostop do protokola",
|
||||||
"pushover": "Pushover",
|
"pushover": "Pushover",
|
||||||
@@ -17,33 +17,34 @@
|
|||||||
"ratelimit": "Omejitev pošiljanja",
|
"ratelimit": "Omejitev pošiljanja",
|
||||||
"recipient_maps": "Preslikave prejemnikov",
|
"recipient_maps": "Preslikave prejemnikov",
|
||||||
"smtp_ip_access": "Spremeni dovoljene gostitelje za SMTP",
|
"smtp_ip_access": "Spremeni dovoljene gostitelje za SMTP",
|
||||||
"sogo_access": "Dovoli upravljanje SOGo dostopov",
|
"sogo_access": "Dovoli upravljanje SOGo dostopa",
|
||||||
"sogo_profile_reset": "Ponastavi SOGo profil",
|
"sogo_profile_reset": "Ponastavi SOGo profil",
|
||||||
"spam_alias": "Začasni aliasi",
|
"spam_alias": "Začasni vzdevki",
|
||||||
"spam_policy": "Blacklist/Whitelist",
|
"spam_policy": "Črna lista/Bela lista",
|
||||||
"spam_score": "Ocena neželene pošte",
|
"spam_score": "Ocena neželene pošte",
|
||||||
"tls_policy": "Politika TLS",
|
"tls_policy": "Politika TLS",
|
||||||
"unlimited_quota": "Neomejena kvota za poštne predale",
|
"unlimited_quota": "Neomejena kvota za poštne predale",
|
||||||
"alias_domains": "Dodaj alias domene",
|
"alias_domains": "Dodaj vzdevke domen",
|
||||||
"domain_desc": "Spremeni opis domene",
|
"domain_desc": "Spremeni opis domene",
|
||||||
"extend_sender_acl": "Dovoli razširitev pošiljateljevega ACL z zunanjimi e-poštnimi naslovi",
|
"extend_sender_acl": "Dovoli razširitev pošiljateljevega ACL z zunanjimi e-poštnimi naslovi",
|
||||||
"quarantine_category": "Spremeni kategorijo obvestil o karanteni",
|
"quarantine_category": "Spremeni kategorijo obvestil o karanteni",
|
||||||
"syncjobs": "Opravila sinhronizacije"
|
"syncjobs": "Sinhronizacijska opravila",
|
||||||
|
"pw_reset": "Dovoli ponastavitev uporabniškega gesla mailcow"
|
||||||
},
|
},
|
||||||
"add": {
|
"add": {
|
||||||
"active": "Aktivno",
|
"active": "Aktivno",
|
||||||
"add": "Dodaj",
|
"add": "Dodaj",
|
||||||
"add_domain_only": "Dodaj samo domeno",
|
"add_domain_only": "Dodaj samo domeno",
|
||||||
"add_domain_restart": "Dodaj domeno in ponovno zaženi SOGo",
|
"add_domain_restart": "Dodaj domeno in ponovno zaženi SOGo",
|
||||||
"alias_address": "Alias naslov/i",
|
"alias_address": "Naslov/i vzdevk/a/ov",
|
||||||
"alias_domain": "Alias domena",
|
"alias_domain": "Vzdevek domene",
|
||||||
"alias_domain_info": "<small>Samo veljavne domene (ločene z vejico).</small>",
|
"alias_domain_info": "<small>Samo veljavne domene (ločene z vejico).</small>",
|
||||||
"app_name": "Ime aplikacije",
|
"app_name": "Ime aplikacije",
|
||||||
"app_password": "Dodaj geslo aplikacije",
|
"app_password": "Dodaj geslo aplikacije",
|
||||||
"app_passwd_protocols": "Dovoljeni protokoli za geslo aplikacije",
|
"app_passwd_protocols": "Dovoljeni protokoli za geslo aplikacije",
|
||||||
"automap": "Poskusi samodejno preslikati mape (\"Sent items\", \"Sent\" => \"Poslano\" ipd.)",
|
"automap": "Poskusi samodejno preslikati mape (\"Sent items\", \"Sent\" => \"Poslano\" ipd.)",
|
||||||
"backup_mx_options": "Možnosti posredovanja (relay)",
|
"backup_mx_options": "Možnosti posredovanja (relay)",
|
||||||
"comment_info": "Zasebni komentarji niso vidni uporabnikom, javni komentarji pa so prikazani kot tooltip, ko se z miško postavimo nad uporabnika v pregledu",
|
"comment_info": "Zasebni komentarji niso vidni uporabnikom, javni komentarji pa so prikazani kot opis, ko se z miško postavimo nad uporabnika v pregledu",
|
||||||
"custom_params": "Parametri po meri",
|
"custom_params": "Parametri po meri",
|
||||||
"custom_params_hint": "Pravilno: --param=xy, napačno: --param xy",
|
"custom_params_hint": "Pravilno: --param=xy, napačno: --param xy",
|
||||||
"delete1": "Izbriši na viru, ko je končano",
|
"delete1": "Izbriši na viru, ko je končano",
|
||||||
@@ -67,7 +68,7 @@
|
|||||||
"kind": "Tip",
|
"kind": "Tip",
|
||||||
"mailbox_quota_def": "Privzeta kvota za poštni predal",
|
"mailbox_quota_def": "Privzeta kvota za poštni predal",
|
||||||
"mailbox_username": "Uporabniško ime (levi del e-poštnega naslova)",
|
"mailbox_username": "Uporabniško ime (levi del e-poštnega naslova)",
|
||||||
"max_aliases": "Največje število dovoljenih aliasov",
|
"max_aliases": "Največje število dovoljenih vzdevkov",
|
||||||
"max_mailboxes": "Največje dovoljeno število poštnih predalov",
|
"max_mailboxes": "Največje dovoljeno število poštnih predalov",
|
||||||
"mins_interval": "Interval preverjanja (minute)",
|
"mins_interval": "Interval preverjanja (minute)",
|
||||||
"multiple_bookings": "Več rezervacij",
|
"multiple_bookings": "Več rezervacij",
|
||||||
@@ -88,25 +89,25 @@
|
|||||||
"sieve_type": "Vrsta filtra",
|
"sieve_type": "Vrsta filtra",
|
||||||
"skipcrossduplicates": "Preskoči podvojena sporočila po mapah (prvi pride, prvi melje)",
|
"skipcrossduplicates": "Preskoči podvojena sporočila po mapah (prvi pride, prvi melje)",
|
||||||
"subscribeall": "Prijavi vse mape",
|
"subscribeall": "Prijavi vse mape",
|
||||||
"syncjob": "Dodaj opravilo sinhronizacije",
|
"syncjob": "Dodaj sinhronizacijsko opravilo",
|
||||||
"tags": "Oznake",
|
"tags": "Oznake",
|
||||||
"target_address": "Goto naslov",
|
"target_address": "Pojdi na naslov",
|
||||||
"target_address_info": "<small>Polni e-poštni naslov/i (ločeni z vejico).</small>",
|
"target_address_info": "<small>Polni e-poštni naslov/i (ločeni z vejico).</small>",
|
||||||
"target_domain": "Ciljna domena",
|
"target_domain": "Ciljna domena",
|
||||||
"timeout1": "Časovna omejitev za povezavo do oddaljenega gostitelja",
|
"timeout1": "Časovna omejitev za povezavo do oddaljenega gostitelja",
|
||||||
"username": "Uporabniško ime",
|
"username": "Uporabniško ime",
|
||||||
"validate": "Preveri",
|
"validate": "Potrditev",
|
||||||
"validation_success": "Uspešno preverjeno",
|
"validation_success": "Uspešno potrjeno",
|
||||||
"activate_filter_warn": "Ko je aktivni izbran, bodo vsi ostali filtri deaktivirani.",
|
"activate_filter_warn": "Vsi drugi filtri bodo deaktivirani, če je označeno aktivno.",
|
||||||
"alias_address_info": "<small>Polni email naslov/i oziroma @example.com za zajem vseh sporočil domene (ločeno z vejico), <b>samo domene mailcow</b>.</small>",
|
"alias_address_info": "<small>Polni e-poštni naslov/i oziroma @example.com za zajem vseh sporočil domene (ločeno z vejico), <b>samo domene mailcow</b>.</small>",
|
||||||
"bcc_dest_format": "BCC naslov mora biti en veljaven e-poštni naslov.<br>Če morate poslati kopijo na več naslov, ustvarite alias in ga uporabite tukaj.",
|
"bcc_dest_format": "BCC naslov mora biti en veljaven e-poštni naslov.<br>Če morate poslati kopijo na več naslov, ustvarite vzdevek in ga uporabite tukaj.",
|
||||||
"disable_login": "Prepovej vpis (vhodna e-pošta je še vedno sprejeta)",
|
"disable_login": "Prepovej vpis (vhodna e-pošta je še vedno sprejeta)",
|
||||||
"gal_info": "GAL vsebuje vse objekte domene in ga uporabniki ne morejo urejati. Informacija o zasedenosti v SOGo ni na voljo, če je onemogočena! <b>Ponovno zaženi SOGo za uveljavitev sprememb.</b>",
|
"gal_info": "GAL vsebuje vse objekte domene in ga uporabniki ne morejo urejati. Informacija o zasedenosti v SOGo ni na voljo, če je onemogočena! <b>Ponovno zaženi SOGo za uveljavitev sprememb.</b>",
|
||||||
"mailbox_quota_m": "Najvišja kvota na poštni predal (MiB)",
|
"mailbox_quota_m": "Najvišja kvota na poštni predal (MiB)",
|
||||||
"password": "Geslo",
|
"password": "Geslo",
|
||||||
"post_domain_add": "SOGo container \"sogo-mailcow\" mora biti ponovno zagnan po dodajanju nove domene!<br><br>Dodatno se mora preveriti DNS konfiguracija domene. Ko je DNS konfiguracija domene odobrena, ponovno zaženite \"acme-mailcow\" za samodejno generiranje certifikatov za novo domeno (autoconfig.<domain>, autodiscover.<domain>).<br>Ta korak je opcijski in se ponovno poskuša vsakih 24 ur.",
|
"post_domain_add": "SOGo zabojnik\"sogo-mailcow\" mora biti ponovno zagnan po dodajanju nove domene!<br><br>Dodatno se mora preveriti DNS konfiguracija domene. Ko je DNS konfiguracija domene odobrena, ponovno zaženite \"acme-mailcow\" za samodejno generiranje certifikatov za novo domeno (autoconfig.<domain>, autodiscover.<domain>).<br>Ta korak je opcijski in se ponovno poskuša vsakih 24 ur.",
|
||||||
"relay_transport_info": "<div class=\"badge fs-6 bg-info\">Info</div> Definirate lahko preslikave transportov za cilj po meri za to domeno. Če ni nastavljena, se ustvari MX poizvedba.",
|
"relay_transport_info": "<div class=\"badge fs-6 bg-info\">Info</div> Definirate lahko preslikave transportov za cilj po meri za to domeno. Če ni nastavljena, se ustvari MX poizvedba.",
|
||||||
"syncjob_hint": "Pozor! Gesla se morajo shraniti v plain-text!",
|
"syncjob_hint": "Pozor! Gesla se morajo shraniti v golo besedilo!",
|
||||||
"timeout2": "Časovna omejitev za povezavo do lokalnega gostitelja",
|
"timeout2": "Časovna omejitev za povezavo do lokalnega gostitelja",
|
||||||
"dry": "Simuliraj sinhronizacijo"
|
"dry": "Simuliraj sinhronizacijo"
|
||||||
},
|
},
|
||||||
@@ -124,7 +125,7 @@
|
|||||||
"add_row": "Dodaj vrstico",
|
"add_row": "Dodaj vrstico",
|
||||||
"add_settings_rule": "Dodaj pravilo nastavitev",
|
"add_settings_rule": "Dodaj pravilo nastavitev",
|
||||||
"add_transport": "Dodaj transport",
|
"add_transport": "Dodaj transport",
|
||||||
"add_transports_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v plain text.",
|
"add_transports_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v golo besedilo.",
|
||||||
"additional_rows": " nove vrstice so bile dodane",
|
"additional_rows": " nove vrstice so bile dodane",
|
||||||
"admin_details": "Uredi podrobnosti skrbnika",
|
"admin_details": "Uredi podrobnosti skrbnika",
|
||||||
"admin_domains": "Dodeljene domene",
|
"admin_domains": "Dodeljene domene",
|
||||||
@@ -282,7 +283,7 @@
|
|||||||
"rspamd_global_filters_agree": "Previden bom!",
|
"rspamd_global_filters_agree": "Previden bom!",
|
||||||
"rspamd_global_filters_info": "Globalne preslikave filtrov vsebujejo različne vrste globalnih blacklist in whitelist.",
|
"rspamd_global_filters_info": "Globalne preslikave filtrov vsebujejo različne vrste globalnih blacklist in whitelist.",
|
||||||
"add_admin": "Dodaj skrbnika",
|
"add_admin": "Dodaj skrbnika",
|
||||||
"add_relayhost_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v plain text.",
|
"add_relayhost_hint": "Prosimo zavedajte se, da se podatki za avtentikacijo, če obstajajo, shranijo v golo besedilo.",
|
||||||
"admin": "Skrbnik",
|
"admin": "Skrbnik",
|
||||||
"api_allow_from": "Dovoli API dostop s teh IP naslovov / CIDR mrežnih zapisov",
|
"api_allow_from": "Dovoli API dostop s teh IP naslovov / CIDR mrežnih zapisov",
|
||||||
"apps_name": "Ime aplikacije v mailcow",
|
"apps_name": "Ime aplikacije v mailcow",
|
||||||
@@ -500,12 +501,9 @@
|
|||||||
"last_modified": "Nazadnje spremenjeno",
|
"last_modified": "Nazadnje spremenjeno",
|
||||||
"history_all_servers": "Zgodovina (vsi strežniki)",
|
"history_all_servers": "Zgodovina (vsi strežniki)",
|
||||||
"in_memory_logs": "In-memory dnevniki",
|
"in_memory_logs": "In-memory dnevniki",
|
||||||
"jvm_memory_solr": "JVM zasedenost spomina",
|
|
||||||
"service": "Servis",
|
"service": "Servis",
|
||||||
"show_ip": "Prikaži javni IP",
|
"show_ip": "Prikaži javni IP",
|
||||||
"size": "Velikost",
|
"size": "Velikost",
|
||||||
"solr_dead": "Solr se zaganja, je onemogočen ali se je ustavil.",
|
|
||||||
"solr_status": "Status Solr",
|
|
||||||
"started_at": "Zagnano ob",
|
"started_at": "Zagnano ob",
|
||||||
"started_on": "Zagnano na",
|
"started_on": "Zagnano na",
|
||||||
"static_logs": "Statični dnevniki",
|
"static_logs": "Statični dnevniki",
|
||||||
|
|||||||
@@ -499,7 +499,6 @@
|
|||||||
"external_logs": "Externé logy",
|
"external_logs": "Externé logy",
|
||||||
"history_all_servers": "História (všetky servery)",
|
"history_all_servers": "História (všetky servery)",
|
||||||
"in_memory_logs": "Logy uložené v pamäti",
|
"in_memory_logs": "Logy uložené v pamäti",
|
||||||
"jvm_memory_solr": "JVM spotreba pamäte",
|
|
||||||
"last_modified": "Naposledy upravené",
|
"last_modified": "Naposledy upravené",
|
||||||
"log_info": "<b>Logy v pamäti</b> sú zbierané do Redis listu s max. limitom LOG_LINES (%d) riadkov každú minútu, čo bráni nadmernej záťaži servera.\r\n <br>Logy v pamäti nemajú trvalý charakter. Všetky aplikácie ktoré vedú logy v pamäti, tiež logujú do Docker démona a súčasne do nastaveného logging drivera.\r\n <br>Logy v pamäti sa môžu použiť na ladenie menších problémov s kontajnermi.</p>\r\n <p><b>Externé logy</b> sú zbierané cez API danej aplikácie.</p>\r\n <p><b>Statické logy</b> sú väčšinou aktivity, ktoré nie sú logované do Docker démona, ale musia byť trvalo zaznamenané (s výnimkou API záznamov).</p>",
|
"log_info": "<b>Logy v pamäti</b> sú zbierané do Redis listu s max. limitom LOG_LINES (%d) riadkov každú minútu, čo bráni nadmernej záťaži servera.\r\n <br>Logy v pamäti nemajú trvalý charakter. Všetky aplikácie ktoré vedú logy v pamäti, tiež logujú do Docker démona a súčasne do nastaveného logging drivera.\r\n <br>Logy v pamäti sa môžu použiť na ladenie menších problémov s kontajnermi.</p>\r\n <p><b>Externé logy</b> sú zbierané cez API danej aplikácie.</p>\r\n <p><b>Statické logy</b> sú väčšinou aktivity, ktoré nie sú logované do Docker démona, ale musia byť trvalo zaznamenané (s výnimkou API záznamov).</p>",
|
||||||
"login_time": "Čas",
|
"login_time": "Čas",
|
||||||
@@ -508,8 +507,6 @@
|
|||||||
"restart_container": "Reštartovať",
|
"restart_container": "Reštartovať",
|
||||||
"service": "Služba",
|
"service": "Služba",
|
||||||
"size": "Veľkosť",
|
"size": "Veľkosť",
|
||||||
"solr_dead": "Solr štartuje, je vypnutý alebo nebeží.",
|
|
||||||
"solr_status": "Solr status",
|
|
||||||
"started_at": "Spustený",
|
"started_at": "Spustený",
|
||||||
"started_on": "Spustený",
|
"started_on": "Spustený",
|
||||||
"static_logs": "Statické logy",
|
"static_logs": "Statické logy",
|
||||||
@@ -1116,6 +1113,7 @@
|
|||||||
"created_on": "Vytvorené",
|
"created_on": "Vytvorené",
|
||||||
"daily": "Denne",
|
"daily": "Denne",
|
||||||
"day": "deň",
|
"day": "deň",
|
||||||
|
"description": "Popis",
|
||||||
"delete_ays": "Potvrďte zmazanie.",
|
"delete_ays": "Potvrďte zmazanie.",
|
||||||
"direct_aliases": "Priame alias adresy",
|
"direct_aliases": "Priame alias adresy",
|
||||||
"direct_aliases_desc": "Priame aliasy sú ovplyvnené spam filtrom a nastavením TLS pravidiel.",
|
"direct_aliases_desc": "Priame aliasy sú ovplyvnené spam filtrom a nastavením TLS pravidiel.",
|
||||||
@@ -1258,4 +1256,4 @@
|
|||||||
"session_token": "Formulárový token neplatný: Tokenová nezhoda",
|
"session_token": "Formulárový token neplatný: Tokenová nezhoda",
|
||||||
"session_ua": "Formulárový token neplatný: User-Agent validation error"
|
"session_ua": "Formulárový token neplatný: User-Agent validation error"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -453,17 +453,14 @@
|
|||||||
"external_logs": "Externa loggar",
|
"external_logs": "Externa loggar",
|
||||||
"history_all_servers": "Historik (alla servrar)",
|
"history_all_servers": "Historik (alla servrar)",
|
||||||
"in_memory_logs": "Loggar sparade i minnet",
|
"in_memory_logs": "Loggar sparade i minnet",
|
||||||
"jvm_memory_solr": "JVM minnesanvändning",
|
|
||||||
"log_info": "<p>mailcow <b>loggar sparade i minnet</b> samlas in i Redis-listor och trimmas till LOG_LINES (%d) varje minut för att minska lasten.\r\n <br>Loggar sparade i minnet är inte tänkta att vara beständiga. Alla applikationer som loggar i minnet loggar också till Docker-demonen och därefter till standardrutinen för loggning.\r\n <br>Loggar sparade i minnet bör användas för felsökning av mindre problem med olika behållare.</p>\r\n <p><b>Externa loggar</b> samlas in via ett API på den givna applikationen.</p>\r\n <p><b>Statiska loggar</b> är mestadels aktivitetsloggar som inte är loggas i Docker, men som fortfarande måste vara beständiga (utom API-loggar).</p>",
|
"log_info": "<p>mailcow <b>loggar sparade i minnet</b> samlas in i Redis-listor och trimmas till LOG_LINES (%d) varje minut för att minska lasten.\r\n <br>Loggar sparade i minnet är inte tänkta att vara beständiga. Alla applikationer som loggar i minnet loggar också till Docker-demonen och därefter till standardrutinen för loggning.\r\n <br>Loggar sparade i minnet bör användas för felsökning av mindre problem med olika behållare.</p>\r\n <p><b>Externa loggar</b> samlas in via ett API på den givna applikationen.</p>\r\n <p><b>Statiska loggar</b> är mestadels aktivitetsloggar som inte är loggas i Docker, men som fortfarande måste vara beständiga (utom API-loggar).</p>",
|
||||||
"logs": "Loggar",
|
"logs": "Loggar",
|
||||||
"restart_container": "Omstart",
|
"restart_container": "Omstart",
|
||||||
"solr_dead": "Solr är i uppstart, har inaktiveras eller är tillfälligt avstängd.",
|
|
||||||
"online_users": "Användare online",
|
"online_users": "Användare online",
|
||||||
"docs": "Dokumentation",
|
"docs": "Dokumentation",
|
||||||
"last_modified": "Senast ändrad",
|
"last_modified": "Senast ändrad",
|
||||||
"size": "Storlek",
|
"size": "Storlek",
|
||||||
"started_at": "Startades kl.",
|
"started_at": "Startades kl.",
|
||||||
"solr_status": "Solr status",
|
|
||||||
"uptime": "Upptid",
|
"uptime": "Upptid",
|
||||||
"started_on": "Startades",
|
"started_on": "Startades",
|
||||||
"static_logs": "Statiska loggar",
|
"static_logs": "Statiska loggar",
|
||||||
@@ -993,6 +990,7 @@
|
|||||||
"created_on": "Skapad vid",
|
"created_on": "Skapad vid",
|
||||||
"daily": "Dagligen",
|
"daily": "Dagligen",
|
||||||
"day": "dag",
|
"day": "dag",
|
||||||
|
"description": "Beskrivning",
|
||||||
"delete_ays": "Är du säker att du vill ta bort det här objektet?",
|
"delete_ays": "Är du säker att du vill ta bort det här objektet?",
|
||||||
"direct_aliases": "Direkta aliasadresser",
|
"direct_aliases": "Direkta aliasadresser",
|
||||||
"direct_aliases_desc": "Endast direkta aliasadresser påverkas av spamfilter och TLS-policyföreskrifter.",
|
"direct_aliases_desc": "Endast direkta aliasadresser påverkas av spamfilter och TLS-policyföreskrifter.",
|
||||||
@@ -1112,4 +1110,4 @@
|
|||||||
"session_token": "Formulär-nyckeln är ogiltig: Nyckeln matchar inte",
|
"session_token": "Formulär-nyckeln är ogiltig: Nyckeln matchar inte",
|
||||||
"session_ua": "Formulär-nyckeln är ogiltig: User-Agenten kunde inte valideras"
|
"session_ua": "Formulär-nyckeln är ogiltig: User-Agenten kunde inte valideras"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -694,15 +694,12 @@
|
|||||||
"external_logs": "Harici günlükler",
|
"external_logs": "Harici günlükler",
|
||||||
"history_all_servers": "Geçmiş (tüm sunucular)",
|
"history_all_servers": "Geçmiş (tüm sunucular)",
|
||||||
"in_memory_logs": "Bellek içi günlükler",
|
"in_memory_logs": "Bellek içi günlükler",
|
||||||
"jvm_memory_solr": "JVM bellek kullanımı",
|
|
||||||
"memory": "Hafıza",
|
"memory": "Hafıza",
|
||||||
"online_users": "Aktif kullanıcılar",
|
"online_users": "Aktif kullanıcılar",
|
||||||
"restart_container": "Yeniden başlat",
|
"restart_container": "Yeniden başlat",
|
||||||
"service": "Servis",
|
"service": "Servis",
|
||||||
"show_ip": "Genel IP'yi göster",
|
"show_ip": "Genel IP'yi göster",
|
||||||
"size": "Boyut",
|
"size": "Boyut",
|
||||||
"solr_dead": "Solr başlatılıyor, devre dışı bırakıldı veya öldü.",
|
|
||||||
"solr_status": "Solr durumu",
|
|
||||||
"started_at": "Başlangıç",
|
"started_at": "Başlangıç",
|
||||||
"system_containers": "Sistem ve Konteynerler",
|
"system_containers": "Sistem ve Konteynerler",
|
||||||
"timezone": "Zaman Dilimi",
|
"timezone": "Zaman Dilimi",
|
||||||
@@ -1207,6 +1204,7 @@
|
|||||||
"created_on": "Oluşturulma tarihi",
|
"created_on": "Oluşturulma tarihi",
|
||||||
"daily": "Günlük",
|
"daily": "Günlük",
|
||||||
"day": "Gün",
|
"day": "Gün",
|
||||||
|
"description": "Açıklama",
|
||||||
"delete_ays": "Lütfen silme işlemini onaylayın.",
|
"delete_ays": "Lütfen silme işlemini onaylayın.",
|
||||||
"direct_aliases": "Doğrudan takma ad adresleri",
|
"direct_aliases": "Doğrudan takma ad adresleri",
|
||||||
"eas_reset_help": "Birçok durumda cihaz önbelleğini sıfırlama, bozuk bir ActiveSync profilini kurtarmaya yardımcı olur.<br><b>Dikkat:</b> Tüm öğeler yeniden indirilecek!",
|
"eas_reset_help": "Birçok durumda cihaz önbelleğini sıfırlama, bozuk bir ActiveSync profilini kurtarmaya yardımcı olur.<br><b>Dikkat:</b> Tüm öğeler yeniden indirilecek!",
|
||||||
@@ -1313,4 +1311,4 @@
|
|||||||
"q_reject": "Reddedildi",
|
"q_reject": "Reddedildi",
|
||||||
"week": "Hafta"
|
"week": "Hafta"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -503,8 +503,6 @@
|
|||||||
"restart_container": "Перезапустити",
|
"restart_container": "Перезапустити",
|
||||||
"service": "Сервіс",
|
"service": "Сервіс",
|
||||||
"size": "Розмір індексів",
|
"size": "Розмір індексів",
|
||||||
"solr_dead": "Solr запускається, відключений або сламаний.",
|
|
||||||
"solr_status": "Стан Solr",
|
|
||||||
"started_at": "Запущений",
|
"started_at": "Запущений",
|
||||||
"started_on": "Запущений у",
|
"started_on": "Запущений у",
|
||||||
"static_logs": "Статичні журнали",
|
"static_logs": "Статичні журнали",
|
||||||
@@ -513,7 +511,6 @@
|
|||||||
"uptime": "Час роботи",
|
"uptime": "Час роботи",
|
||||||
"username": "Ім'я користувача",
|
"username": "Ім'я користувача",
|
||||||
"external_logs": "Зовнішні журнали",
|
"external_logs": "Зовнішні журнали",
|
||||||
"jvm_memory_solr": "Використання оперативної пам'яті JVM",
|
|
||||||
"log_info": "<p><b>Журнали контейнерів</b> mailcow зберігаються в Redis, і раз на хвилину рядки журналу за межами <code>LOG_LINES (%d)</code> видаляються, щоб зменшити навантаження на сервер.\n <br>Самі журнали контейнерів не зберігаються після перезавантаження контейнера. Усі контейнери додатково пишуть логи у службу Docker, і, отже, використовують драйвер логування за промовчанням. Журнали контейнерів призначені лише для налагодження дрібних проблем. Для інших завдань, будь ласка, настройте драйвер логування Docker самостійно.</p>\n <p><b>Зовнішні журнали</b> збираються через API програм.</p>\n <p><b>Статичні журнали</b> – це в основному журнали активності, які не записуються в Dockerd, але все одно повинні бути постійними (за винятком журналів API).</p>",
|
"log_info": "<p><b>Журнали контейнерів</b> mailcow зберігаються в Redis, і раз на хвилину рядки журналу за межами <code>LOG_LINES (%d)</code> видаляються, щоб зменшити навантаження на сервер.\n <br>Самі журнали контейнерів не зберігаються після перезавантаження контейнера. Усі контейнери додатково пишуть логи у службу Docker, і, отже, використовують драйвер логування за промовчанням. Журнали контейнерів призначені лише для налагодження дрібних проблем. Для інших завдань, будь ласка, настройте драйвер логування Docker самостійно.</p>\n <p><b>Зовнішні журнали</b> збираються через API програм.</p>\n <p><b>Статичні журнали</b> – це в основному журнали активності, які не записуються в Dockerd, але все одно повинні бути постійними (за винятком журналів API).</p>",
|
||||||
"error_show_ip": "Не вдалося розпізнати публічні IP-адреси",
|
"error_show_ip": "Не вдалося розпізнати публічні IP-адреси",
|
||||||
"no_update_available": "Система працює на останній версії",
|
"no_update_available": "Система працює на останній версії",
|
||||||
@@ -1135,6 +1132,7 @@
|
|||||||
"created_on": "Дата створення",
|
"created_on": "Дата створення",
|
||||||
"daily": "Раз на день",
|
"daily": "Раз на день",
|
||||||
"day": "день",
|
"day": "день",
|
||||||
|
"description": "Опис",
|
||||||
"delete_ays": "Будь ласка, підтвердіть видалення.",
|
"delete_ays": "Будь ласка, підтвердіть видалення.",
|
||||||
"eas_reset": "Скинути кеш ActiveSync пристроїв",
|
"eas_reset": "Скинути кеш ActiveSync пристроїв",
|
||||||
"eas_reset_help": "У багатьох випадках скидання кешу пристроїв допомагає відновити пошкоджений профіль ActiveSync.<br><b>Увага:</b> всі листи, календарі та контакти будуть завантажені заново на всі ваші пристрої!",
|
"eas_reset_help": "У багатьох випадках скидання кешу пристроїв допомагає відновити пошкоджений профіль ActiveSync.<br><b>Увага:</b> всі листи, календарі та контакти будуть завантажені заново на всі ваші пристрої!",
|
||||||
@@ -1311,4 +1309,4 @@
|
|||||||
},
|
},
|
||||||
"collapse_all": "Згорнути все"
|
"collapse_all": "Згорнути все"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -205,7 +205,7 @@
|
|||||||
"in_use_by": "使用者",
|
"in_use_by": "使用者",
|
||||||
"inactive": "禁用",
|
"inactive": "禁用",
|
||||||
"include_exclude": "包括/排除",
|
"include_exclude": "包括/排除",
|
||||||
"include_exclude_info": "默认 - 没有选择时默认包括所有邮箱",
|
"include_exclude_info": "默认 - 没有选择时默认包括<b>所有邮箱</b>",
|
||||||
"includes": "包括这些收件人",
|
"includes": "包括这些收件人",
|
||||||
"is_mx_based": "基于 MX 记录",
|
"is_mx_based": "基于 MX 记录",
|
||||||
"last_applied": "最后应用的条目",
|
"last_applied": "最后应用的条目",
|
||||||
@@ -339,7 +339,7 @@
|
|||||||
"yes": "✓",
|
"yes": "✓",
|
||||||
"options": "选项",
|
"options": "选项",
|
||||||
"f2b_max_ban_time": "最长封禁时间(秒)",
|
"f2b_max_ban_time": "最长封禁时间(秒)",
|
||||||
"copy_to_clipboard": "复制到粘贴板",
|
"copy_to_clipboard": "已复制到粘贴板!",
|
||||||
"reset_password_vars": "<code>{{link}}</code> 生成的密码重置链接<br><code>{{username}}</code> 要求重置密码的使用者的邮箱名称<br><code>{{username2}}</code> 复原邮箱名称<br><code>{{date}}</code> 要求重置密码之日期<br><code>{{token_lifetime}}</code> 令牌(token)过期时间(以分钟计)<br><code>{{hostname}}</code> mailcow 主机名",
|
"reset_password_vars": "<code>{{link}}</code> 生成的密码重置链接<br><code>{{username}}</code> 要求重置密码的使用者的邮箱名称<br><code>{{username2}}</code> 复原邮箱名称<br><code>{{date}}</code> 要求重置密码之日期<br><code>{{token_lifetime}}</code> 令牌(token)过期时间(以分钟计)<br><code>{{hostname}}</code> mailcow 主机名",
|
||||||
"logo_normal_label": "正常",
|
"logo_normal_label": "正常",
|
||||||
"f2b_manage_external_info": "Fail2Ban 还会持续维护封禁列表,但不会主动设置规则阻挡流量。请使用以下生成的封禁列表在外部阻止流量。",
|
"f2b_manage_external_info": "Fail2Ban 还会持续维护封禁列表,但不会主动设置规则阻挡流量。请使用以下生成的封禁列表在外部阻止流量。",
|
||||||
@@ -505,7 +505,6 @@
|
|||||||
"external_logs": "外部日志",
|
"external_logs": "外部日志",
|
||||||
"history_all_servers": "历史 (所有服务器)",
|
"history_all_servers": "历史 (所有服务器)",
|
||||||
"in_memory_logs": "内存日志",
|
"in_memory_logs": "内存日志",
|
||||||
"jvm_memory_solr": "JVM 内存使用",
|
|
||||||
"last_modified": "最后修改",
|
"last_modified": "最后修改",
|
||||||
"log_info": "<p>Mailcow 的<b>内存日志</b>储存于 Redis 列表中,并且每分钟自动降低到 LOG_LINES (%d) 以减少错误。\r\n <br>内存日志不是为了持久化储存的,所有使用内存日志的应用同时也会写入日志到 Docker 的守护进程的默认日志驱动中。\r\n <br>内存日志应该用于分析 (Debug) 容器中不明显的问题。</p>\r\n <p><b>外部日志</b>通过相应应用提供的 API 收集。</p>\r\n <p><b>静态日志</b>大多数为不写入日志到 Docker ,但仍然需要被持久化的活动日志 (API 日志外的)。</p>",
|
"log_info": "<p>Mailcow 的<b>内存日志</b>储存于 Redis 列表中,并且每分钟自动降低到 LOG_LINES (%d) 以减少错误。\r\n <br>内存日志不是为了持久化储存的,所有使用内存日志的应用同时也会写入日志到 Docker 的守护进程的默认日志驱动中。\r\n <br>内存日志应该用于分析 (Debug) 容器中不明显的问题。</p>\r\n <p><b>外部日志</b>通过相应应用提供的 API 收集。</p>\r\n <p><b>静态日志</b>大多数为不写入日志到 Docker ,但仍然需要被持久化的活动日志 (API 日志外的)。</p>",
|
||||||
"login_time": "时间",
|
"login_time": "时间",
|
||||||
@@ -514,8 +513,6 @@
|
|||||||
"restart_container": "重启",
|
"restart_container": "重启",
|
||||||
"service": "服务",
|
"service": "服务",
|
||||||
"size": "大小",
|
"size": "大小",
|
||||||
"solr_dead": "Solr 在启动中、已关闭或已停止。",
|
|
||||||
"solr_status": "Solr 状态",
|
|
||||||
"started_at": "开始于",
|
"started_at": "开始于",
|
||||||
"started_on": "启动于",
|
"started_on": "启动于",
|
||||||
"static_logs": "静态日志",
|
"static_logs": "静态日志",
|
||||||
@@ -587,7 +584,7 @@
|
|||||||
"force_pw_update_info": "此用户只能登录到 %s。",
|
"force_pw_update_info": "此用户只能登录到 %s。",
|
||||||
"full_name": "全名",
|
"full_name": "全名",
|
||||||
"gal": "全球地址簿",
|
"gal": "全球地址簿",
|
||||||
"gal_info": "<b>全球地址簿</b>包含了域名下的所有对象,并且此行为不能被用户更改。如果关闭,用户的 \"空闲/繁忙\" 的信息将不能在 SOGo 中显示。 <b>重启 SOGo 服务以应用更改。</b>",
|
"gal_info": "全球地址簿(GAL)包含了域名下的所有对象,并且此行为不能被用户更改。如果关闭,用户的 \"空闲/繁忙\" 的信息将不能在 SOGo 中显示。 <b>重启 SOGo 服务以应用更改。</b>",
|
||||||
"generate": "生成",
|
"generate": "生成",
|
||||||
"grant_types": "授权类型",
|
"grant_types": "授权类型",
|
||||||
"hostname": "主机名",
|
"hostname": "主机名",
|
||||||
@@ -1164,6 +1161,7 @@
|
|||||||
"created_on": "添加于",
|
"created_on": "添加于",
|
||||||
"daily": "每日",
|
"daily": "每日",
|
||||||
"day": "日",
|
"day": "日",
|
||||||
|
"description": "描述",
|
||||||
"delete_ays": "请确认删除。",
|
"delete_ays": "请确认删除。",
|
||||||
"direct_aliases": "直接别名",
|
"direct_aliases": "直接别名",
|
||||||
"direct_aliases_desc": "垃圾邮件过滤和 TLS 策略会作用于直接别名。",
|
"direct_aliases_desc": "垃圾邮件过滤和 TLS 策略会作用于直接别名。",
|
||||||
@@ -1336,4 +1334,4 @@
|
|||||||
"loadingRecords": "加载中...",
|
"loadingRecords": "加载中...",
|
||||||
"zeroRecords": "未找到符合条件的记录"
|
"zeroRecords": "未找到符合条件的记录"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -505,7 +505,6 @@
|
|||||||
"external_logs": "外部紀錄",
|
"external_logs": "外部紀錄",
|
||||||
"history_all_servers": "歷史 (所有伺服器)",
|
"history_all_servers": "歷史 (所有伺服器)",
|
||||||
"in_memory_logs": "記憶體紀錄",
|
"in_memory_logs": "記憶體紀錄",
|
||||||
"jvm_memory_solr": "JVM 記憶體使用量",
|
|
||||||
"last_modified": "上次修改時間",
|
"last_modified": "上次修改時間",
|
||||||
"log_info": "<p>mailcow 的<b>記憶體紀錄</b>會被收集到 Redis 清單中並且每分鐘自動縮減到 LOG_LINES (%d) 以避免重複撞擊 (hammering) 造成的大量記錄。\r\n<br>記憶體紀錄並不會永久保存。所有記錄到記憶體的應用程式也會同時透過預設紀錄的驅動程式寫入紀錄到 Docker 常駐程式中。\r\n<br>記憶體紀錄是設計用來為容器中的小問題除錯的。</p>\r\n<p><b>外部紀錄</b>透過應用程式提供的 API 收集。</p>\r\n<p><b>靜態紀錄</b>大多為不寫入到 Dockerd,但仍然需要被保存的活動紀錄 (API 紀錄除外)。</p>",
|
"log_info": "<p>mailcow 的<b>記憶體紀錄</b>會被收集到 Redis 清單中並且每分鐘自動縮減到 LOG_LINES (%d) 以避免重複撞擊 (hammering) 造成的大量記錄。\r\n<br>記憶體紀錄並不會永久保存。所有記錄到記憶體的應用程式也會同時透過預設紀錄的驅動程式寫入紀錄到 Docker 常駐程式中。\r\n<br>記憶體紀錄是設計用來為容器中的小問題除錯的。</p>\r\n<p><b>外部紀錄</b>透過應用程式提供的 API 收集。</p>\r\n<p><b>靜態紀錄</b>大多為不寫入到 Dockerd,但仍然需要被保存的活動紀錄 (API 紀錄除外)。</p>",
|
||||||
"login_time": "時間",
|
"login_time": "時間",
|
||||||
@@ -514,8 +513,6 @@
|
|||||||
"restart_container": "重新啟動",
|
"restart_container": "重新啟動",
|
||||||
"service": "服務",
|
"service": "服務",
|
||||||
"size": "大小",
|
"size": "大小",
|
||||||
"solr_dead": "Solr 正在啟動,停用或已停止運行.",
|
|
||||||
"solr_status": "Solr 狀態",
|
|
||||||
"started_at": "啟動於",
|
"started_at": "啟動於",
|
||||||
"started_on": "啟動於",
|
"started_on": "啟動於",
|
||||||
"static_logs": "靜態紀錄",
|
"static_logs": "靜態紀錄",
|
||||||
@@ -1140,6 +1137,7 @@
|
|||||||
"created_on": "建立於",
|
"created_on": "建立於",
|
||||||
"daily": "每日",
|
"daily": "每日",
|
||||||
"day": "日",
|
"day": "日",
|
||||||
|
"description": "描述",
|
||||||
"delete_ays": "請確認刪除。",
|
"delete_ays": "請確認刪除。",
|
||||||
"direct_aliases": "直接別名",
|
"direct_aliases": "直接別名",
|
||||||
"direct_aliases_desc": "直接別名會受到垃圾郵件過濾器和 TLS 規則限制。",
|
"direct_aliases_desc": "直接別名會受到垃圾郵件過濾器和 TLS 規則限制。",
|
||||||
@@ -1328,4 +1326,4 @@
|
|||||||
"hold_mail": "保留",
|
"hold_mail": "保留",
|
||||||
"unhold_mail": "取消保留"
|
"unhold_mail": "取消保留"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
File diff suppressed because one or more lines are too long
@@ -340,31 +340,22 @@
|
|||||||
<div class="modal fade" id="tempAliasModal" tabindex="-1" role="dialog" aria-labelledby="tempAliasModalLabel">
|
<div class="modal fade" id="tempAliasModal" tabindex="-1" role="dialog" aria-labelledby="tempAliasModalLabel">
|
||||||
<div class="modal-dialog modal-lg" role="document">
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
<div class="modal-content">
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h3 class="modal-title">{{ lang.user.alias_create_random }}</h3>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
||||||
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<form class="form-horizontal" data-cached-form="false" data-id="pwchange" role="form" method="post" autocomplete="off">
|
<form class="form-horizontal" data-cached-form="false" data-id="tempaliascreate" role="form" method="post" autocomplete="off">
|
||||||
<div class="row">
|
<div class="row mb-4">
|
||||||
<label class="control-label col-sm-3" for="user_new_pass">{{ lang.user.new_password }} (<a href="#" class="generate_password">{{ lang.user.generate }}</a>)</label>
|
<label class="control-label col-sm-3" for="description">{{ lang.user.description }}</label>
|
||||||
<div class="col-sm-5">
|
<div class="col-sm-5">
|
||||||
<input type="password" data-pwgen-field="true" data-hibp="true" class="form-control" name="user_new_pass" autocomplete="new-password" required>
|
<input type="hidden" id="temp_alias_domain" name="domain">
|
||||||
</div>
|
<input type="description" id="temp_alias_description" class="form-control" name="description" autocomplete="off">
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<label class="control-label col-sm-3" for="user_new_pass2">{{ lang.user.new_password_repeat }}</label>
|
|
||||||
<div class="col-sm-5">
|
|
||||||
<input type="password" data-pwgen-field="true" class="form-control" name="user_new_pass2" autocomplete="new-password" required>
|
|
||||||
<p class="text-muted">{{ lang.user.new_password_description }}</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="row">
|
|
||||||
<label class="control-label col-sm-3" for="user_old_pass">{{ lang.user.password_now }}</label>
|
|
||||||
<div class="col-sm-5">
|
|
||||||
<input type="password" class="form-control" name="user_old_pass" autocomplete="off" required>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="offset-sm-3 col-sm-9">
|
<div class="offset-sm-3 col-sm-9">
|
||||||
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="edit_selected" data-id="pwchange" data-item="null" data-api-url='edit/self' data-api-attr='{}' href="#">{{ lang.user.change_password }}</button>
|
<button class="btn btn-xs-lg d-block d-sm-inline btn-success" data-action="add_item" data-id="tempaliascreate" data-item="null" data-api-url='add/time_limited_alias' data-api-attr='' href="#">{{ lang.admin.add }}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
{% if acl.spam_alias == 1 %}
|
{% if acl.spam_alias == 1 %}
|
||||||
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="SpamAliases" role="tab" data-bs-toggle="tab" data-bs-target="#SpamAliases">{{ lang.user.spam_aliases }}</button></li>
|
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="SpamAliases" role="tab" data-bs-toggle="tab" data-bs-target="#SpamAliases">{{ lang.user.spam_aliases }}</button></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if acl.spam_score == 1 %}
|
{% if acl.spam_score == 1 or acl.spam_policy == 1 %}
|
||||||
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="Spamfilter" role="tab" data-bs-toggle="tab" data-bs-target="#Spamfilter">{{ lang.user.spamfilter }}</button></li>
|
<li class="nav-item" role="presentation"><button class="nav-link" role="tab" aria-selected="false" aria-controls="Spamfilter" role="tab" data-bs-toggle="tab" data-bs-target="#Spamfilter">{{ lang.user.spamfilter }}</button></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if acl.syncjobs == 1 %}
|
{% if acl.syncjobs == 1 %}
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
{% include 'user/tab-user-details.twig' %}
|
{% include 'user/tab-user-details.twig' %}
|
||||||
{% include 'user/tab-user-settings.twig' %}
|
{% include 'user/tab-user-settings.twig' %}
|
||||||
{% if acl.spam_alias == 1 %}{% include 'user/SpamAliases.twig' %}{% endif %}
|
{% if acl.spam_alias == 1 %}{% include 'user/SpamAliases.twig' %}{% endif %}
|
||||||
{% if acl.spam_score == 1 %}{% include 'user/Spamfilter.twig' %}{% endif %}
|
{% if acl.spam_score == 1 or acl.spam_policy == 1 %}{% include 'user/Spamfilter.twig' %}{% endif %}
|
||||||
{% if acl.syncjobs == 1 %}{% include 'user/Syncjobs.twig' %}{% endif %}
|
{% if acl.syncjobs == 1 %}{% include 'user/Syncjobs.twig' %}{% endif %}
|
||||||
{% if acl.app_passwds == 1 %}{% include 'user/AppPasswds.twig' %}{% endif %}
|
{% if acl.app_passwds == 1 %}{% include 'user/AppPasswds.twig' %}{% endif %}
|
||||||
{% if acl.pushover == 1 %}{% include 'user/Pushover.twig' %}{% endif %}
|
{% if acl.pushover == 1 %}{% include 'user/Pushover.twig' %}{% endif %}
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
{% for domain in user_domains %}
|
{% for domain in user_domains %}
|
||||||
<li>
|
<li>
|
||||||
<a class="dropdown-item" data-action="add_item" data-api-url='add/time_limited_alias' data-api-attr='{"domain":"{{ domain }}"}' href="#">
|
<a class="dropdown-item" data-bs-toggle="modal" data-bs-target="#tempAliasModal" onclick='$("#tempAliasModal #temp_alias_domain").val("{{ domain }}")' href="#">
|
||||||
@ {{ domain }}
|
@ {{ domain }}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ services:
|
|||||||
- API_KEY_READ_ONLY=${API_KEY_READ_ONLY:-invalid}
|
- API_KEY_READ_ONLY=${API_KEY_READ_ONLY:-invalid}
|
||||||
- API_ALLOW_FROM=${API_ALLOW_FROM:-invalid}
|
- API_ALLOW_FROM=${API_ALLOW_FROM:-invalid}
|
||||||
- COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
|
- COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
|
||||||
- SKIP_SOLR=${SKIP_SOLR:-y}
|
- SKIP_FTS=${SKIP_FTS:-y}
|
||||||
- SKIP_CLAMD=${SKIP_CLAMD:-n}
|
- SKIP_CLAMD=${SKIP_CLAMD:-n}
|
||||||
- SKIP_SOGO=${SKIP_SOGO:-n}
|
- SKIP_SOGO=${SKIP_SOGO:-n}
|
||||||
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
|
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
|
||||||
@@ -182,7 +182,6 @@ 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"
|
||||||
@@ -246,10 +245,11 @@ services:
|
|||||||
- sogo
|
- sogo
|
||||||
|
|
||||||
dovecot-mailcow:
|
dovecot-mailcow:
|
||||||
image: mailcow/dovecot:nightly-20241205
|
image: mailcow/dovecot:nightly-20250123
|
||||||
depends_on:
|
depends_on:
|
||||||
- mysql-mailcow
|
- mysql-mailcow
|
||||||
- netfilter-mailcow
|
- netfilter-mailcow
|
||||||
|
- redis-mailcow
|
||||||
dns:
|
dns:
|
||||||
- ${IPV4_NETWORK:-172.22.1}.254
|
- ${IPV4_NETWORK:-172.22.1}.254
|
||||||
cap_add:
|
cap_add:
|
||||||
@@ -283,14 +283,15 @@ services:
|
|||||||
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
|
- ALLOW_ADMIN_EMAIL_LOGIN=${ALLOW_ADMIN_EMAIL_LOGIN:-n}
|
||||||
- MAILDIR_GC_TIME=${MAILDIR_GC_TIME:-7200}
|
- MAILDIR_GC_TIME=${MAILDIR_GC_TIME:-7200}
|
||||||
- ACL_ANYONE=${ACL_ANYONE:-disallow}
|
- ACL_ANYONE=${ACL_ANYONE:-disallow}
|
||||||
- SKIP_SOLR=${SKIP_SOLR:-y}
|
- SKIP_FTS=${SKIP_FTS:-y}
|
||||||
|
- FTS_HEAP=${FTS_HEAP:-512}
|
||||||
|
- FTS_PROCS=${FTS_PROCS:-3}
|
||||||
- MAILDIR_SUB=${MAILDIR_SUB:-}
|
- MAILDIR_SUB=${MAILDIR_SUB:-}
|
||||||
- MASTER=${MASTER:-y}
|
- MASTER=${MASTER:-y}
|
||||||
- REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-}
|
- REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-}
|
||||||
- REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-}
|
- REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-}
|
||||||
- REDISPASS=${REDISPASS}
|
- REDISPASS=${REDISPASS}
|
||||||
- COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
|
- COMPOSE_PROJECT_NAME=${COMPOSE_PROJECT_NAME:-mailcow-dockerized}
|
||||||
- FLATCURVE_EXPERIMENTAL=${FLATCURVE_EXPERIMENTAL:-n}
|
|
||||||
ports:
|
ports:
|
||||||
- "${DOVEADM_PORT:-127.0.0.1:19991}:12345"
|
- "${DOVEADM_PORT:-127.0.0.1:19991}:12345"
|
||||||
- "${IMAP_PORT:-143}:143"
|
- "${IMAP_PORT:-143}:143"
|
||||||
@@ -387,7 +388,7 @@ services:
|
|||||||
- php-fpm-mailcow
|
- php-fpm-mailcow
|
||||||
- sogo-mailcow
|
- sogo-mailcow
|
||||||
- rspamd-mailcow
|
- rspamd-mailcow
|
||||||
image: mailcow/nginx:1.00
|
image: mailcow/nginx:1.01
|
||||||
dns:
|
dns:
|
||||||
- ${IPV4_NETWORK:-172.22.1}.254
|
- ${IPV4_NETWORK:-172.22.1}.254
|
||||||
environment:
|
environment:
|
||||||
@@ -398,10 +399,11 @@ services:
|
|||||||
- TZ=${TZ}
|
- TZ=${TZ}
|
||||||
- SKIP_SOGO=${SKIP_SOGO:-n}
|
- SKIP_SOGO=${SKIP_SOGO:-n}
|
||||||
- SKIP_RSPAMD=${SKIP_RSPAMD:-n}
|
- SKIP_RSPAMD=${SKIP_RSPAMD:-n}
|
||||||
- PHPFPMHOST=${PHPFPMHOST:-php-fpm-mailcow}
|
- DISABLE_IPv6=${DISABLE_IPv6:-n}
|
||||||
- SOGOHOST=${SOGOHOST:-sogo-mailcow}
|
- PHPFPMHOST=${PHPFPMHOST:-}
|
||||||
- RSPAMDHOST=${RSPAMDHOST:-rspamd-mailcow}
|
- SOGOHOST=${SOGOHOST:-}
|
||||||
- REDISHOST=${REDISHOST:-redis-mailcow}
|
- RSPAMDHOST=${RSPAMDHOST:-}
|
||||||
|
- REDISHOST=${REDISHOST:-}
|
||||||
- IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
|
- IPV4_NETWORK=${IPV4_NETWORK:-172.22.1}
|
||||||
volumes:
|
volumes:
|
||||||
- ./data/web:/web:ro,z
|
- ./data/web:/web:ro,z
|
||||||
@@ -578,28 +580,6 @@ services:
|
|||||||
aliases:
|
aliases:
|
||||||
- dockerapi
|
- dockerapi
|
||||||
|
|
||||||
|
|
||||||
##### Will be removed soon #####
|
|
||||||
solr-mailcow:
|
|
||||||
image: mailcow/solr:1.8.3
|
|
||||||
restart: always
|
|
||||||
depends_on:
|
|
||||||
- netfilter-mailcow
|
|
||||||
volumes:
|
|
||||||
- solr-vol-1:/opt/solr/server/solr/dovecot-fts/data
|
|
||||||
ports:
|
|
||||||
- "${SOLR_PORT:-127.0.0.1:18983}:8983"
|
|
||||||
environment:
|
|
||||||
- TZ=${TZ}
|
|
||||||
- SOLR_HEAP=${SOLR_HEAP:-1024}
|
|
||||||
- SKIP_SOLR=${SKIP_SOLR:-y}
|
|
||||||
- FLATCURVE_EXPERIMENTAL=${FLATCURVE_EXPERIMENTAL:-n}
|
|
||||||
networks:
|
|
||||||
mailcow-network:
|
|
||||||
aliases:
|
|
||||||
- solr
|
|
||||||
################################
|
|
||||||
|
|
||||||
olefy-mailcow:
|
olefy-mailcow:
|
||||||
image: mailcow/olefy:1.13
|
image: mailcow/olefy:1.13
|
||||||
restart: always
|
restart: always
|
||||||
@@ -656,7 +636,6 @@ services:
|
|||||||
- netfilter-mailcow
|
- netfilter-mailcow
|
||||||
- watchdog-mailcow
|
- watchdog-mailcow
|
||||||
- dockerapi-mailcow
|
- dockerapi-mailcow
|
||||||
- solr-mailcow
|
|
||||||
environment:
|
environment:
|
||||||
- TZ=${TZ}
|
- TZ=${TZ}
|
||||||
image: robbertkl/ipv6nat
|
image: robbertkl/ipv6nat
|
||||||
@@ -688,7 +667,6 @@ volumes:
|
|||||||
mysql-socket-vol-1:
|
mysql-socket-vol-1:
|
||||||
redis-vol-1:
|
redis-vol-1:
|
||||||
rspamd-vol-1:
|
rspamd-vol-1:
|
||||||
solr-vol-1:
|
|
||||||
postfix-vol-1:
|
postfix-vol-1:
|
||||||
crypt-vol-1:
|
crypt-vol-1:
|
||||||
sogo-web-vol-1:
|
sogo-web-vol-1:
|
||||||
|
|||||||
@@ -175,28 +175,6 @@ if [ -z "${SKIP_CLAMD}" ]; then
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -z "${SKIP_SOLR}" ]; then
|
|
||||||
if [ "${MEM_TOTAL}" -le "2097152" ]; then
|
|
||||||
echo "Disabling Solr on low-memory system."
|
|
||||||
SKIP_SOLR=y
|
|
||||||
elif [ "${MEM_TOTAL}" -le "3670016" ]; then
|
|
||||||
echo "Installed memory is <= 3.5 GiB. It is recommended to disable Solr to prevent out-of-memory situations."
|
|
||||||
echo "Solr is a prone to run OOM and should be monitored. The default Solr heap size is 1024 MiB and should be set in mailcow.conf according to your expected load."
|
|
||||||
echo "Solr can be re-enabled by setting SKIP_SOLR=n in mailcow.conf but will refuse to start with less than 2 GB total memory."
|
|
||||||
read -r -p "Do you want to disable Solr now? [Y/n] " response
|
|
||||||
case $response in
|
|
||||||
[nN][oO]|[nN])
|
|
||||||
SKIP_SOLR=n
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
SKIP_SOLR=y
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
else
|
|
||||||
SKIP_SOLR=n
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ ${SKIP_BRANCH} != y ]]; then
|
if [[ ${SKIP_BRANCH} != y ]]; then
|
||||||
echo "Which branch of mailcow do you want to use?"
|
echo "Which branch of mailcow do you want to use?"
|
||||||
echo ""
|
echo ""
|
||||||
@@ -305,7 +283,6 @@ POPS_PORT=995
|
|||||||
SIEVE_PORT=4190
|
SIEVE_PORT=4190
|
||||||
DOVEADM_PORT=127.0.0.1:19991
|
DOVEADM_PORT=127.0.0.1:19991
|
||||||
SQL_PORT=127.0.0.1:13306
|
SQL_PORT=127.0.0.1:13306
|
||||||
SOLR_PORT=127.0.0.1:18983
|
|
||||||
REDIS_PORT=127.0.0.1:7654
|
REDIS_PORT=127.0.0.1:7654
|
||||||
|
|
||||||
# Your timezone
|
# Your timezone
|
||||||
@@ -402,14 +379,22 @@ SKIP_CLAMD=${SKIP_CLAMD}
|
|||||||
|
|
||||||
SKIP_SOGO=n
|
SKIP_SOGO=n
|
||||||
|
|
||||||
# Skip Solr on low-memory systems or if you do not want to store a readable index of your mails in solr-vol-1.
|
# Skip FTS (Fulltext Search) for Dovecot on low-memory systems or if you simply want to disable it.
|
||||||
|
# Dovecot inside mailcow use Flatcurve as FTS Backend.
|
||||||
|
|
||||||
SKIP_SOLR=${SKIP_SOLR}
|
SKIP_FTS=n
|
||||||
|
|
||||||
# Solr heap size in MB, there is no recommendation, please see Solr docs.
|
# Dovecot Indexing (FTS) Process maximum heap size in MB, there is no recommendation, please see Dovecot docs.
|
||||||
# Solr is a prone to run OOM and should be monitored. Unmonitored Solr setups are not recommended.
|
# Flatcurve (Xapian backend) is used as the FTS Indexer. It is supposed to be efficient in CPU and RAM consumption.
|
||||||
|
# However: Please always monitor your Resource consumption!
|
||||||
|
|
||||||
SOLR_HEAP=1024
|
FTS_HEAP=128
|
||||||
|
|
||||||
|
# Controls how many processes the Dovecot indexing process can spawn at max.
|
||||||
|
# Too many indexing processes can use a lot of CPU and Disk I/O.
|
||||||
|
# Please visit: https://doc.dovecot.org/configuration_manual/service_configuration/#indexer-worker for more informations
|
||||||
|
|
||||||
|
FTS_PROCS=1
|
||||||
|
|
||||||
# Allow admins to log into SOGo as email user (without any password)
|
# Allow admins to log into SOGo as email user (without any password)
|
||||||
|
|
||||||
|
|||||||
@@ -202,6 +202,17 @@ if [ ${ec} -ne 0 ] && [ ${ec} -ne 24 ]; then
|
|||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Let the remote side create all network, volumes and containers to prevent need for external:true #
|
||||||
|
echo -e "\e[33mCreating networks, volumes and containers on remote...\e[0m"
|
||||||
|
|
||||||
|
if ! ssh -o StrictHostKeyChecking=no \
|
||||||
|
-i "${REMOTE_SSH_KEY}" \
|
||||||
|
${REMOTE_SSH_HOST} \
|
||||||
|
-p ${REMOTE_SSH_PORT} \
|
||||||
|
${COMPOSE_COMMAND} -f "${SCRIPT_DIR}/../docker-compose.yml" create 2>&1 ; then
|
||||||
|
>&2 echo -e "\e[31m[ERR]\e[0m - Could not create networks, volumes and containers on remote"
|
||||||
|
fi
|
||||||
|
|
||||||
# Trigger a Redis save for a consistent Redis copy
|
# Trigger a Redis save for a consistent Redis copy
|
||||||
echo -ne "\033[1mRunning redis-cli save... \033[0m"
|
echo -ne "\033[1mRunning redis-cli save... \033[0m"
|
||||||
docker exec $(docker ps -qf name=redis-mailcow) redis-cli -a ${REDISPASS} --no-auth-warning save
|
docker exec $(docker ps -qf name=redis-mailcow) redis-cli -a ${REDISPASS} --no-auth-warning save
|
||||||
@@ -326,4 +337,4 @@ if ! ssh -o StrictHostKeyChecking=no \
|
|||||||
>&2 echo -e "\e[31m[ERR]\e[0m - Could not cleanup old images on remote"
|
>&2 echo -e "\e[31m[ERR]\e[0m - Could not cleanup old images on remote"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "\e[32mDone\e[0m"
|
echo -e "\e[32mDone\e[0m"
|
||||||
|
|||||||
@@ -34,8 +34,5 @@ services:
|
|||||||
dockerapi-mailcow:
|
dockerapi-mailcow:
|
||||||
build: ./data/Dockerfiles/dockerapi
|
build: ./data/Dockerfiles/dockerapi
|
||||||
|
|
||||||
solr-mailcow:
|
|
||||||
build: ./data/Dockerfiles/solr
|
|
||||||
|
|
||||||
olefy-mailcow:
|
olefy-mailcow:
|
||||||
build: ./data/Dockerfiles/olefy
|
build: ./data/Dockerfiles/olefy
|
||||||
|
|||||||
@@ -1,264 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
# renovate: datasource=github-releases depName=nextcloud/server versioning=semver extractVersion=^v(?<version>.*)$
|
|
||||||
NEXTCLOUD_VERSION=28.0.11
|
|
||||||
|
|
||||||
display_warning() {
|
|
||||||
local message=("$@")
|
|
||||||
local max_length=0
|
|
||||||
|
|
||||||
for line in "${message[@]}"; do
|
|
||||||
if (( ${#line} > max_length )); then
|
|
||||||
max_length=${#line}
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
local border=$(printf '%*s' "$((max_length + 4))" '' | tr ' ' '#')
|
|
||||||
|
|
||||||
echo -e "\e[31m${border}"
|
|
||||||
for line in "${message[@]}"; do
|
|
||||||
printf "\e[31m# %-*s #\n" "$max_length" "$line"
|
|
||||||
done
|
|
||||||
echo -e "\e[31m${border}"
|
|
||||||
echo -e "\e[0m"
|
|
||||||
}
|
|
||||||
|
|
||||||
display_warning "WARNING: This Script is deprecated and will be removed in December 2024!" \
|
|
||||||
"mailcow will drop this installation/maintenance script within December 2024..." \
|
|
||||||
"To ensure you can still use your Nextcloud Datas, please migrate to a standalone" \
|
|
||||||
"Nextcloud instance either on a new Host or this host." \
|
|
||||||
"You can either use Nextcloud in Docker or install it manually." \
|
|
||||||
" "\
|
|
||||||
"mailcow will NOT DELETE any Nextcloud Data, even when this script was removed!!"
|
|
||||||
|
|
||||||
echo -e "Waiting 5 seconds before continuing..."
|
|
||||||
|
|
||||||
|
|
||||||
sleep 5
|
|
||||||
|
|
||||||
echo -ne "Checking prerequisites..."
|
|
||||||
sleep 1
|
|
||||||
for bin in curl dirmngr tar bzip2; do
|
|
||||||
if [[ -z $(which ${bin}) ]]; then echo -ne "\r\033[31mCannot find ${bin}, exiting...\033[0m\n"; exit 1; fi
|
|
||||||
done
|
|
||||||
echo -ne "\r\033[32mFound all prerequisites! Continuing...\033[0m\n"
|
|
||||||
|
|
||||||
[[ -z ${1} ]] && NC_HELP=y
|
|
||||||
|
|
||||||
while [ "$1" != '' ]; do
|
|
||||||
if [[ $# -ne 1 ]]; then
|
|
||||||
echo -e "\033[31mPlease use only one parameter at the same time!\033[0m" >&2
|
|
||||||
exit 2
|
|
||||||
fi
|
|
||||||
case "${1}" in
|
|
||||||
-p|--purge) NC_PURGE=y && shift;;
|
|
||||||
-i|--install) NC_INSTALL=y && shift;;
|
|
||||||
-u|--update) NC_UPDATE=y && shift;;
|
|
||||||
-r|--resetpw) NC_RESETPW=y && shift;;
|
|
||||||
-h|--help) NC_HELP=y && shift;;
|
|
||||||
*) echo "Unknown parameter: ${1}" && shift;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
if [[ ${NC_HELP} == "y" ]]; then
|
|
||||||
printf 'Usage:\n\n'
|
|
||||||
printf ' -p|--purge\n Purge Nextcloud\n'
|
|
||||||
printf ' -i|--install\n Install Nextcloud\n'
|
|
||||||
printf ' -u|--update\n Update Nextcloud\n'
|
|
||||||
printf ' -r|--resetpw\n Reset password\n\n'
|
|
||||||
exit 0
|
|
||||||
fi
|
|
||||||
|
|
||||||
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
|
|
||||||
cd ${SCRIPT_DIR}/../
|
|
||||||
source mailcow.conf
|
|
||||||
|
|
||||||
if [[ ${NC_PURGE} == "y" ]]; then
|
|
||||||
read -r -p "Are you sure you want to purge Nextcloud? [y/N] " response
|
|
||||||
response=${response,,}
|
|
||||||
if [[ ! "$response" =~ ^(yes|y)$ ]]; then
|
|
||||||
echo "OK, aborting."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "\033[33mDetecting Database information...\033[0m"
|
|
||||||
if [[ $(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "Show databases" | grep "nextcloud") ]]; then
|
|
||||||
echo -e "\033[32mFound seperate Nextcloud database (newer scheme)!\033[0m"
|
|
||||||
echo -e "\033[31mPurging...\033[0m"
|
|
||||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "DROP DATABASE nextcloud;" > /dev/null
|
|
||||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "DROP USER 'nextcloud'@'%';" > /dev/null
|
|
||||||
elif [[ $(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} mailcow -e "SHOW TABLES LIKE 'oc_%'") && $? -eq 0 ]]; then
|
|
||||||
echo -e "\033[32mFound Nextcloud (oc) tables inside of mailcow database (old scheme)!\033[0m"
|
|
||||||
echo -e "\033[31mPurging...\033[0m"
|
|
||||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e \
|
|
||||||
"$(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "SELECT IFNULL(GROUP_CONCAT('DROP TABLE ', TABLE_SCHEMA, '.', TABLE_NAME SEPARATOR ';'),'SELECT NULL;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'oc_%' AND TABLE_SCHEMA = '${DBNAME}';" -BN)" > /dev/null
|
|
||||||
elif [[ $(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} mailcow -e "SHOW TABLES LIKE 'nc_%'") && $? -eq 0 ]]; then
|
|
||||||
echo -e "\033[32mFound Nextcloud (nc) tables inside of mailcow database (old scheme)!\033[0m"
|
|
||||||
echo -e "\033[31mPurging...\033[0m"
|
|
||||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e \
|
|
||||||
"$(docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "SELECT IFNULL(GROUP_CONCAT('DROP TABLE ', TABLE_SCHEMA, '.', TABLE_NAME SEPARATOR ';'),'SELECT NULL;') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'nc_%' AND TABLE_SCHEMA = '${DBNAME}';" -BN)" > /dev/null
|
|
||||||
else
|
|
||||||
echo -e "\033[31mError: No Nextcloud databases/tables found!"
|
|
||||||
echo -e "\033[33mNot purging anything...\033[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
docker exec -it $(docker ps -f name=redis-mailcow -q) /bin/sh -c "cat <<EOF | redis-cli -a ${REDISPASS} --no-auth-warning
|
|
||||||
SELECT 10
|
|
||||||
FLUSHDB
|
|
||||||
EOF
|
|
||||||
"
|
|
||||||
if [ -d ./data/web/nextcloud/config ]; then
|
|
||||||
mv ./data/web/nextcloud/config/ ./data/conf/nextcloud-config-folder-$(date +%s).bak
|
|
||||||
fi
|
|
||||||
[[ -d ./data/web/nextcloud ]] && rm -rf ./data/web/nextcloud
|
|
||||||
|
|
||||||
[[ -f ./data/conf/nginx/site.nextcloud.custom ]] && mv ./data/conf/nginx/site.nextcloud.custom ./data/conf/nginx/site.nextcloud.custom-$(date +%s).bak
|
|
||||||
[[ -f ./data/conf/nginx/nextcloud.conf ]] && mv ./data/conf/nginx/nextcloud.conf ./data/conf/nginx/nextcloud.conf-$(date +%s).bak
|
|
||||||
|
|
||||||
docker restart $(docker ps -aqf name=nginx-mailcow)
|
|
||||||
|
|
||||||
echo -e "\033[32mNextcloud has been uninstalled sucessfully!\033[0m"
|
|
||||||
|
|
||||||
elif [[ ${NC_UPDATE} == "y" ]]; then
|
|
||||||
read -r -p "Are you sure you want to update Nextcloud (with Nextclouds own updater)? [y/N] " response
|
|
||||||
response=${response,,}
|
|
||||||
if [[ ! "$response" =~ ^(yes|y)$ ]]; then
|
|
||||||
echo "OK, aborting."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f data/web/nextcloud/occ ]; then
|
|
||||||
echo -e "\033[31mError: Nextcloud occ not found. Is Nextcloud installed?\033[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
if grep -Pq 'This version of Nextcloud is not compatible with (?:PHP)?(?>=?)(?:PHP)?(?>.+)' <<<$(docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "/web/nextcloud/occ --no-warnings status"); then
|
|
||||||
echo -e "\033[31mError: This version of Nextcloud is not compatible with the current PHP version of php-fpm-mailcow, we'll fix it\033[0m"
|
|
||||||
wget -q https://raw.githubusercontent.com/nextcloud/server/v26.0.0/lib/versioncheck.php -O ./data/web/nextcloud/lib/versioncheck.php
|
|
||||||
echo -e "\e[33mPlease restart the update again.\e[0m"
|
|
||||||
elif ! grep -q 'installed: true' <<<$(docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "/web/nextcloud/occ --no-warnings status"); then
|
|
||||||
echo -e "\033[31mError: Nextcloud seems not to be installed.\033[0m"
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "php /web/nextcloud/updater/updater.phar"
|
|
||||||
NC_SUBD=$(docker exec -i -u www-data $(docker ps -f name=php-fpm-mailcow -q) /web/nextcloud/occ config:system:get overwritehost)
|
|
||||||
mv ./data/conf/nginx/nextcloud.conf ./data/conf/nginx/nextcloud.conf-$(date +%s).bak
|
|
||||||
cp ./data/assets/nextcloud/nextcloud.conf ./data/conf/nginx/
|
|
||||||
sed -i "s/NC_SUBD/${NC_SUBD}/g" ./data/conf/nginx/nextcloud.conf
|
|
||||||
fi
|
|
||||||
|
|
||||||
elif [[ ${NC_INSTALL} == "y" ]]; then
|
|
||||||
NC_SUBD=
|
|
||||||
while [[ -z ${NC_SUBD} ]]; do
|
|
||||||
read -p "Subdomain to run Nextcloud from [format: nextcloud.domain.tld]: " NC_SUBD
|
|
||||||
done
|
|
||||||
if ! ping -q -c2 ${NC_SUBD} > /dev/null 2>&1 ; then
|
|
||||||
read -p "Cannot ping subdomain, continue anyway? [y|N] " NC_CONT_FAIL
|
|
||||||
[[ ! ${NC_CONT_FAIL,,} =~ ^(yes|y)$ ]] && { echo "Ok, exiting..."; exit 1; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "\033[33mDownloading \033[34mNextcloud ${NEXTCLOUD_VERSION}\033[33m...\033[0m"
|
|
||||||
curl -L# -o nextcloud.tar.bz2 "https://download.nextcloud.com/server/releases/nextcloud-$NEXTCLOUD_VERSION.tar.bz2" || { echo "Failed to download Nextcloud archive."; exit 1; } \
|
|
||||||
&& tar -xjf nextcloud.tar.bz2 -C ./data/web/ \
|
|
||||||
&& rm nextcloud.tar.bz2 \
|
|
||||||
&& mkdir -p ./data/web/nextcloud/data \
|
|
||||||
&& chmod +x ./data/web/nextcloud/occ
|
|
||||||
|
|
||||||
echo -e "\033[33mCreating 'nextcloud' database...\033[0m"
|
|
||||||
NC_DBPASS=$(</dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
|
|
||||||
NC_DBUSER=nextcloud
|
|
||||||
NC_DBNAME=nextcloud
|
|
||||||
|
|
||||||
echo -ne "[1/3] Creating 'nextcloud' database"
|
|
||||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "CREATE DATABASE ${NC_DBNAME};"
|
|
||||||
sleep 2
|
|
||||||
echo -ne "\r[2/3] Creating 'nextcloud' database user"
|
|
||||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "CREATE USER '${NC_DBUSER}'@'%' IDENTIFIED BY '${NC_DBPASS}';"
|
|
||||||
sleep 2
|
|
||||||
echo -ne "\r[3/3] Granting 'nextcloud' user all permissions on database 'nextcloud'"
|
|
||||||
docker exec -it $(docker ps -f name=mysql-mailcow -q) mysql -uroot -p${DBROOT} -e "GRANT ALL PRIVILEGES ON ${NC_DBNAME}.* TO '${NC_DBUSER}'@'%';"
|
|
||||||
sleep 2
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo -e "\033[33mInstalling Nextcloud...\033[0m"
|
|
||||||
ADMIN_NC_PASS=$(</dev/urandom tr -dc A-Za-z0-9 2> /dev/null | head -c 28)
|
|
||||||
|
|
||||||
echo -ne "[1/4] Setting correct permissions for www-data"
|
|
||||||
docker exec -it $(docker ps -f name=php-fpm-mailcow -q) /bin/bash -c "chown -R www-data:www-data /web/nextcloud"
|
|
||||||
sleep 2
|
|
||||||
echo -ne "\r[2/4] Running occ maintenance:install to install Nextcloud"
|
|
||||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) /web/nextcloud/occ --no-warnings maintenance:install \
|
|
||||||
--database mysql \
|
|
||||||
--database-host mysql \
|
|
||||||
--database-name ${NC_DBNAME} \
|
|
||||||
--database-user ${NC_DBUSER} \
|
|
||||||
--database-pass ${NC_DBPASS} \
|
|
||||||
--admin-user admin \
|
|
||||||
--admin-pass ${ADMIN_NC_PASS} \
|
|
||||||
--data-dir /web/nextcloud/data > /dev/null 2>&1
|
|
||||||
|
|
||||||
echo -ne "\r[3/4] Setting custom parameters inside the Nextcloud config file"
|
|
||||||
echo ""
|
|
||||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) bash -c "/web/nextcloud/occ --no-warnings config:system:set redis host --value=redis --type=string; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set redis port --value=6379 --type=integer; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set redis timeout --value=0.0 --type=integer; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set redis dbindex --value=10 --type=integer; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set memcache.locking --value='\OC\Memcache\Redis' --type=string; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set memcache.local --value='\OC\Memcache\Redis' --type=string; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set trusted_domains 1 --value=${NC_SUBD}; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set trusted_proxies 0 --value=${IPV6_NETWORK}; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set trusted_proxies 1 --value=${IPV4_NETWORK}.0/24; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set overwritehost --value=${NC_SUBD}; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set overwriteprotocol --value=https; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set overwritewebroot --value=/; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set mail_smtpmode --value=smtp; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set mail_smtpauthtype --value=LOGIN; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set mail_from_address --value=nextcloud; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set mail_domain --value=${MAILCOW_HOSTNAME}; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set mail_smtphost --value=postfix; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set mail_smtpport --value=588; \
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set mail_smtpstreamoptions ssl verify_peer --value=false --type=boolean
|
|
||||||
/web/nextcloud/occ --no-warnings config:system:set mail_smtpstreamoptions ssl verify_peer_name --value=false --type=boolean
|
|
||||||
/web/nextcloud/occ --no-warnings db:convert-filecache-bigint -n"
|
|
||||||
|
|
||||||
# Not installing by default, broke too often
|
|
||||||
#/web/nextcloud/occ --no-warnings app:install user_external; \
|
|
||||||
#/web/nextcloud/occ --no-warnings config:system:set user_backends 0 arguments 0 --value={dovecot:143/imap/tls/novalidate-cert}; \
|
|
||||||
#/web/nextcloud/occ --no-warnings config:system:set user_backends 0 class --value=OC_User_IMAP; \
|
|
||||||
|
|
||||||
echo -e "\r[4/4] Enabling Nginx Configuration"
|
|
||||||
cp ./data/assets/nextcloud/nextcloud.conf ./data/conf/nginx/
|
|
||||||
sed -i "s/NC_SUBD/${NC_SUBD}/g" ./data/conf/nginx/nextcloud.conf
|
|
||||||
sleep 2
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo -e "\033[33mFinalizing installation...\033[0m"
|
|
||||||
docker restart $(docker ps -aqf name=nginx-mailcow)
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "******************************************"
|
|
||||||
echo "* SAVE THESE CREDENTIALS *"
|
|
||||||
echo "* INSTALL DATE: $(date +%Y-%m-%d_%H-%M-%S) *"
|
|
||||||
echo "******************************************"
|
|
||||||
echo ""
|
|
||||||
echo -e "\033[36mDatabase name: ${NC_DBNAME}\033[0m"
|
|
||||||
echo -e "\033[36mDatabase user: ${NC_DBUSER}\033[0m"
|
|
||||||
echo -e "\033[36mDatabase password: ${NC_DBPASS}\033[0m"
|
|
||||||
echo ""
|
|
||||||
echo -e "\033[31mUI admin password: ${ADMIN_NC_PASS}\033[0m"
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
|
|
||||||
elif [[ ${NC_RESETPW} == "y" ]]; then
|
|
||||||
printf 'You are about to set a new password for a Nextcloud user.\n\nDo not use this option if your Nextcloud is configured to use mailcow for authentication.\nSet a new password for the corresponding mailbox in mailcow, instead.\n\n'
|
|
||||||
read -r -p "Continue? [y/N] " response
|
|
||||||
response=${response,,}
|
|
||||||
if [[ ! "$response" =~ ^(yes|y)$ ]]; then
|
|
||||||
echo "OK, aborting."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
NC_USER=
|
|
||||||
while [[ -z ${NC_USER} ]]; do
|
|
||||||
read -p "Enter the username: " NC_USER
|
|
||||||
done
|
|
||||||
docker exec -it -u www-data $(docker ps -f name=php-fpm-mailcow -q) /web/nextcloud/occ user:resetpassword ${NC_USER}
|
|
||||||
fi
|
|
||||||
422
update.sh
422
update.sh
@@ -303,6 +303,408 @@ fix_broken_dnslist_conf() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
adapt_new_options() {
|
||||||
|
|
||||||
|
CONFIG_ARRAY=(
|
||||||
|
"SKIP_LETS_ENCRYPT"
|
||||||
|
"SKIP_SOGO"
|
||||||
|
"USE_WATCHDOG"
|
||||||
|
"WATCHDOG_NOTIFY_EMAIL"
|
||||||
|
"WATCHDOG_NOTIFY_WEBHOOK"
|
||||||
|
"WATCHDOG_NOTIFY_WEBHOOK_BODY"
|
||||||
|
"WATCHDOG_NOTIFY_BAN"
|
||||||
|
"WATCHDOG_NOTIFY_START"
|
||||||
|
"WATCHDOG_EXTERNAL_CHECKS"
|
||||||
|
"WATCHDOG_SUBJECT"
|
||||||
|
"SKIP_CLAMD"
|
||||||
|
"SKIP_IP_CHECK"
|
||||||
|
"ADDITIONAL_SAN"
|
||||||
|
"DOVEADM_PORT"
|
||||||
|
"IPV4_NETWORK"
|
||||||
|
"IPV6_NETWORK"
|
||||||
|
"LOG_LINES"
|
||||||
|
"SNAT_TO_SOURCE"
|
||||||
|
"SNAT6_TO_SOURCE"
|
||||||
|
"COMPOSE_PROJECT_NAME"
|
||||||
|
"DOCKER_COMPOSE_VERSION"
|
||||||
|
"SQL_PORT"
|
||||||
|
"API_KEY"
|
||||||
|
"API_KEY_READ_ONLY"
|
||||||
|
"API_ALLOW_FROM"
|
||||||
|
"MAILDIR_GC_TIME"
|
||||||
|
"MAILDIR_SUB"
|
||||||
|
"ACL_ANYONE"
|
||||||
|
"FTS_HEAP"
|
||||||
|
"FTS_PROCS"
|
||||||
|
"SKIP_FTS"
|
||||||
|
"ENABLE_SSL_SNI"
|
||||||
|
"ALLOW_ADMIN_EMAIL_LOGIN"
|
||||||
|
"SKIP_HTTP_VERIFICATION"
|
||||||
|
"SOGO_EXPIRE_SESSION"
|
||||||
|
"REDIS_PORT"
|
||||||
|
"DOVECOT_MASTER_USER"
|
||||||
|
"DOVECOT_MASTER_PASS"
|
||||||
|
"MAILCOW_PASS_SCHEME"
|
||||||
|
"ADDITIONAL_SERVER_NAMES"
|
||||||
|
"ACME_CONTACT"
|
||||||
|
"WATCHDOG_VERBOSE"
|
||||||
|
"WEBAUTHN_ONLY_TRUSTED_VENDORS"
|
||||||
|
"SPAMHAUS_DQS_KEY"
|
||||||
|
"SKIP_UNBOUND_HEALTHCHECK"
|
||||||
|
"DISABLE_NETFILTER_ISOLATION_RULE"
|
||||||
|
)
|
||||||
|
|
||||||
|
sed -i --follow-symlinks '$a\' mailcow.conf
|
||||||
|
for option in ${CONFIG_ARRAY[@]}; do
|
||||||
|
if [[ ${option} == "ADDITIONAL_SAN" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "${option}=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "COMPOSE_PROJECT_NAME" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "COMPOSE_PROJECT_NAME=mailcowdockerized" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "DOCKER_COMPOSE_VERSION" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "# Used Docker Compose version" >> mailcow.conf
|
||||||
|
echo "# Switch here between native (compose plugin) and standalone" >> mailcow.conf
|
||||||
|
echo "# For more informations take a look at the mailcow docs regarding the configuration options." >> mailcow.conf
|
||||||
|
echo "# Normally this should be untouched but if you decided to use either of those you can switch it manually here." >> mailcow.conf
|
||||||
|
echo "# Please be aware that at least one of those variants should be installed on your maschine or mailcow will fail." >> mailcow.conf
|
||||||
|
echo "" >> mailcow.conf
|
||||||
|
echo "DOCKER_COMPOSE_VERSION=${DOCKER_COMPOSE_VERSION}" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "DOVEADM_PORT" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "DOVEADM_PORT=127.0.0.1:19991" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WATCHDOG_NOTIFY_EMAIL" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "WATCHDOG_NOTIFY_EMAIL=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "LOG_LINES" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Max log lines per service to keep in Redis logs' >> mailcow.conf
|
||||||
|
echo "LOG_LINES=9999" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "IPV4_NETWORK" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Internal IPv4 /24 subnet, format n.n.n. (expands to n.n.n.0/24)' >> mailcow.conf
|
||||||
|
echo "IPV4_NETWORK=172.22.1" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "IPV6_NETWORK" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Internal IPv6 subnet in fc00::/7' >> mailcow.conf
|
||||||
|
echo "IPV6_NETWORK=fd4d:6169:6c63:6f77::/64" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "SQL_PORT" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Bind SQL to 127.0.0.1 on port 13306' >> mailcow.conf
|
||||||
|
echo "SQL_PORT=127.0.0.1:13306" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "API_KEY" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Create or override API key for web UI' >> mailcow.conf
|
||||||
|
echo "#API_KEY=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "API_KEY_READ_ONLY" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Create or override read-only API key for web UI' >> mailcow.conf
|
||||||
|
echo "#API_KEY_READ_ONLY=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "API_ALLOW_FROM" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Must be set for API_KEY to be active' >> mailcow.conf
|
||||||
|
echo '# IPs only, no networks (networks can be set via UI)' >> mailcow.conf
|
||||||
|
echo "#API_ALLOW_FROM=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "SNAT_TO_SOURCE" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Use this IPv4 for outgoing connections (SNAT)' >> mailcow.conf
|
||||||
|
echo "#SNAT_TO_SOURCE=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "SNAT6_TO_SOURCE" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Use this IPv6 for outgoing connections (SNAT)' >> mailcow.conf
|
||||||
|
echo "#SNAT6_TO_SOURCE=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "MAILDIR_GC_TIME" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Garbage collector cleanup' >> mailcow.conf
|
||||||
|
echo '# Deleted domains and mailboxes are moved to /var/vmail/_garbage/timestamp_sanitizedstring' >> mailcow.conf
|
||||||
|
echo '# How long should objects remain in the garbage until they are being deleted? (value in minutes)' >> mailcow.conf
|
||||||
|
echo '# Check interval is hourly' >> mailcow.conf
|
||||||
|
echo 'MAILDIR_GC_TIME=1440' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "ACL_ANYONE" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Set this to "allow" to enable the anyone pseudo user. Disabled by default.' >> mailcow.conf
|
||||||
|
echo '# When enabled, ACL can be created, that apply to "All authenticated users"' >> mailcow.conf
|
||||||
|
echo '# This should probably only be activated on mail hosts, that are used exclusivly by one organisation.' >> mailcow.conf
|
||||||
|
echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf
|
||||||
|
echo 'ACL_ANYONE=disallow' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "FTS_HEAP" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Dovecot Indexing (FTS) Process maximum heap size in MB, there is no recommendation, please see Dovecot docs.' >> mailcow.conf
|
||||||
|
echo '# Flatcurve is used as FTS Engine. It is supposed to be pretty efficient in CPU and RAM consumption.' >> mailcow.conf
|
||||||
|
echo '# Please always monitor your Resource consumption!' >> mailcow.conf
|
||||||
|
echo "FTS_HEAP=128" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "SKIP_FTS" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Skip FTS (Fulltext Search) for Dovecot on low-memory systems or if you simply want to disable it.' >> mailcow.conf
|
||||||
|
echo "# Dovecot inside mailcow use Flatcurve as FTS Backend." >> mailcow.conf
|
||||||
|
echo "SKIP_FTS=n" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "FTS_PROCS" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Controls how many processes the Dovecot indexing process can spawn at max.' >> mailcow.conf
|
||||||
|
echo '# Too many indexing processes can use a lot of CPU and Disk I/O' >> mailcow.conf
|
||||||
|
echo '# Please visit: https://doc.dovecot.org/configuration_manual/service_configuration/#indexer-worker for more informations' >> mailcow.conf
|
||||||
|
echo "FTS_PROCS=1" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "ENABLE_SSL_SNI" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Create seperate certificates for all domains - y/n' >> mailcow.conf
|
||||||
|
echo '# this will allow adding more than 100 domains, but some email clients will not be able to connect with alternative hostnames' >> mailcow.conf
|
||||||
|
echo '# see https://wiki.dovecot.org/SSL/SNIClientSupport' >> mailcow.conf
|
||||||
|
echo "ENABLE_SSL_SNI=n" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "SKIP_SOGO" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Skip SOGo: Will disable SOGo integration and therefore webmail, DAV protocols and ActiveSync support (experimental, unsupported, not fully implemented) - y/n' >> mailcow.conf
|
||||||
|
echo "SKIP_SOGO=n" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "MAILDIR_SUB" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# MAILDIR_SUB defines a path in a users virtual home to keep the maildir in. Leave empty for updated setups.' >> mailcow.conf
|
||||||
|
echo "#MAILDIR_SUB=Maildir" >> mailcow.conf
|
||||||
|
echo "MAILDIR_SUB=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WATCHDOG_NOTIFY_WEBHOOK" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Send notifications to a webhook URL that receives a POST request with the content type "application/json".' >> mailcow.conf
|
||||||
|
echo '# You can use this to send notifications to services like Discord, Slack and others.' >> mailcow.conf
|
||||||
|
echo '#WATCHDOG_NOTIFY_WEBHOOK=https://discord.com/api/webhooks/XXXXXXXXXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WATCHDOG_NOTIFY_WEBHOOK_BODY" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# JSON body included in the webhook POST request. Needs to be in single quotes.' >> mailcow.conf
|
||||||
|
echo '# Following variables are available: SUBJECT, BODY' >> mailcow.conf
|
||||||
|
WEBHOOK_BODY='{"username": "mailcow Watchdog", "content": "**${SUBJECT}**\n${BODY}"}'
|
||||||
|
echo "#WATCHDOG_NOTIFY_WEBHOOK_BODY='${WEBHOOK_BODY}'" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WATCHDOG_NOTIFY_BAN" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Notify about banned IP. Includes whois lookup.' >> mailcow.conf
|
||||||
|
echo "WATCHDOG_NOTIFY_BAN=y" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WATCHDOG_NOTIFY_START" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Send a notification when the watchdog is started.' >> mailcow.conf
|
||||||
|
echo "WATCHDOG_NOTIFY_START=y" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WATCHDOG_SUBJECT" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Subject for watchdog mails. Defaults to "Watchdog ALERT" followed by the error message.' >> mailcow.conf
|
||||||
|
echo "#WATCHDOG_SUBJECT=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WATCHDOG_EXTERNAL_CHECKS" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Checks if mailcow is an open relay. Requires a SAL. More checks will follow.' >> mailcow.conf
|
||||||
|
echo '# No data is collected. Opt-in and anonymous.' >> mailcow.conf
|
||||||
|
echo '# Will only work with unmodified mailcow setups.' >> mailcow.conf
|
||||||
|
echo "WATCHDOG_EXTERNAL_CHECKS=n" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "SOGO_EXPIRE_SESSION" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# SOGo session timeout in minutes' >> mailcow.conf
|
||||||
|
echo "SOGO_EXPIRE_SESSION=480" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "REDIS_PORT" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "REDIS_PORT=127.0.0.1:7654" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "DOVECOT_MASTER_USER" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# DOVECOT_MASTER_USER and _PASS must _both_ be provided. No special chars.' >> mailcow.conf
|
||||||
|
echo '# Empty by default to auto-generate master user and password on start.' >> mailcow.conf
|
||||||
|
echo '# User expands to DOVECOT_MASTER_USER@mailcow.local' >> mailcow.conf
|
||||||
|
echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf
|
||||||
|
echo "DOVECOT_MASTER_USER=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "DOVECOT_MASTER_PASS" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# LEAVE EMPTY IF UNSURE' >> mailcow.conf
|
||||||
|
echo "DOVECOT_MASTER_PASS=" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "MAILCOW_PASS_SCHEME" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Password hash algorithm' >> mailcow.conf
|
||||||
|
echo '# Only certain password hash algorithm are supported. For a fully list of supported schemes,' >> mailcow.conf
|
||||||
|
echo '# see https://docs.mailcow.email/models/model-passwd/' >> mailcow.conf
|
||||||
|
echo "MAILCOW_PASS_SCHEME=BLF-CRYPT" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "ADDITIONAL_SERVER_NAMES" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Additional server names for mailcow UI' >> mailcow.conf
|
||||||
|
echo '#' >> mailcow.conf
|
||||||
|
echo '# Specify alternative addresses for the mailcow UI to respond to' >> mailcow.conf
|
||||||
|
echo '# This is useful when you set mail.* as ADDITIONAL_SAN and want to make sure mail.maildomain.com will always point to the mailcow UI.' >> mailcow.conf
|
||||||
|
echo '# If the server name does not match a known site, Nginx decides by best-guess and may redirect users to the wrong web root.' >> mailcow.conf
|
||||||
|
echo '# You can understand this as server_name directive in Nginx.' >> mailcow.conf
|
||||||
|
echo '# Comma separated list without spaces! Example: ADDITIONAL_SERVER_NAMES=a.b.c,d.e.f' >> mailcow.conf
|
||||||
|
echo 'ADDITIONAL_SERVER_NAMES=' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "ACME_CONTACT" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Lets Encrypt registration contact information' >> mailcow.conf
|
||||||
|
echo '# Optional: Leave empty for none' >> mailcow.conf
|
||||||
|
echo '# This value is only used on first order!' >> mailcow.conf
|
||||||
|
echo '# Setting it at a later point will require the following steps:' >> mailcow.conf
|
||||||
|
echo '# https://docs.mailcow.email/troubleshooting/debug-reset_tls/' >> mailcow.conf
|
||||||
|
echo 'ACME_CONTACT=' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WEBAUTHN_ONLY_TRUSTED_VENDORS" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "# WebAuthn device manufacturer verification" >> mailcow.conf
|
||||||
|
echo '# After setting WEBAUTHN_ONLY_TRUSTED_VENDORS=y only devices from trusted manufacturers are allowed' >> mailcow.conf
|
||||||
|
echo '# root certificates can be placed for validation under mailcow-dockerized/data/web/inc/lib/WebAuthn/rootCertificates' >> mailcow.conf
|
||||||
|
echo 'WEBAUTHN_ONLY_TRUSTED_VENDORS=n' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "SPAMHAUS_DQS_KEY" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "# Spamhaus Data Query Service Key" >> mailcow.conf
|
||||||
|
echo '# Optional: Leave empty for none' >> mailcow.conf
|
||||||
|
echo '# Enter your key here if you are using a blocked ASN (OVH, AWS, Cloudflare e.g) for the unregistered Spamhaus Blocklist.' >> mailcow.conf
|
||||||
|
echo '# If empty, it will completely disable Spamhaus blocklists if it detects that you are running on a server using a blocked AS.' >> mailcow.conf
|
||||||
|
echo '# Otherwise it will work as usual.' >> mailcow.conf
|
||||||
|
echo 'SPAMHAUS_DQS_KEY=' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "WATCHDOG_VERBOSE" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Enable watchdog verbose logging' >> mailcow.conf
|
||||||
|
echo 'WATCHDOG_VERBOSE=n' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "SKIP_UNBOUND_HEALTHCHECK" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Skip Unbound (DNS Resolver) Healthchecks (NOT Recommended!) - y/n' >> mailcow.conf
|
||||||
|
echo 'SKIP_UNBOUND_HEALTHCHECK=n' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif [[ ${option} == "DISABLE_NETFILTER_ISOLATION_RULE" ]]; then
|
||||||
|
if ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo '# Prevent netfilter from setting an iptables/nftables rule to isolate the mailcow docker network - y/n' >> mailcow.conf
|
||||||
|
echo '# CAUTION: Disabling this may expose container ports to other neighbors on the same subnet, even if the ports are bound to localhost' >> mailcow.conf
|
||||||
|
echo 'DISABLE_NETFILTER_ISOLATION_RULE=n' >> mailcow.conf
|
||||||
|
fi
|
||||||
|
elif ! grep -q ${option} mailcow.conf; then
|
||||||
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
|
echo "${option}=n" >> mailcow.conf
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
migrate_solr_config_options() {
|
||||||
|
|
||||||
|
sed -i --follow-symlinks '$a\' mailcow.conf
|
||||||
|
|
||||||
|
if grep -q "SOLR_HEAP" mailcow.conf; then
|
||||||
|
echo "Removing SOLR_HEAP in mailcow.conf"
|
||||||
|
sed -i '/# Solr heap size in MB\b/d' mailcow.conf
|
||||||
|
sed -i '/# Solr is a prone to run\b/d' mailcow.conf
|
||||||
|
sed -i '/SOLR_HEAP\b/d' mailcow.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -q "SKIP_SOLR" mailcow.conf; then
|
||||||
|
echo "Removing SKIP_SOLR in mailcow.conf"
|
||||||
|
sed -i '/\bSkip Solr on low-memory\b/d' mailcow.conf
|
||||||
|
sed -i '/\bSolr is disabled by default\b/d' mailcow.conf
|
||||||
|
sed -i '/\bDisable Solr or\b/d' mailcow.conf
|
||||||
|
sed -i '/\bSKIP_SOLR\b/d' mailcow.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -q "SOLR_PORT" mailcow.conf; then
|
||||||
|
echo "Removing SOLR_PORT in mailcow.conf"
|
||||||
|
sed -i '/\bSOLR_PORT\b/d' mailcow.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
if grep -q "FLATCURVE_EXPERIMENTAL" mailcow.conf; then
|
||||||
|
echo "Removing FLATCURVE_EXPERIMENTAL in mailcow.conf"
|
||||||
|
sed -i '/\bFLATCURVE_EXPERIMENTAL\b/d' mailcow.conf
|
||||||
|
fi
|
||||||
|
|
||||||
|
solr_volume=$(docker volume ls -qf name=^${COMPOSE_PROJECT_NAME}_solr-vol-1)
|
||||||
|
if [[ -n $solr_volume ]]; then
|
||||||
|
echo -e "\e[34mSolr has been replaced within mailcow since 2025-01.\e[0m"
|
||||||
|
sleep 1
|
||||||
|
echo -e "\e[34mTherefore the volume $solr_volume is unused.\e[0m"
|
||||||
|
sleep 1
|
||||||
|
read -r -p "Would you like to remove the $solr_volume? " response
|
||||||
|
if [[ "$response" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
||||||
|
echo -e "\e[33mRemoving $solr_volume...\e[0m"
|
||||||
|
docker volume rm $solr_volume
|
||||||
|
if [[ $? != 0 ]]; then
|
||||||
|
echo -e "\e[31mCould not remove the volume... Please remove it manually!\e[0m"
|
||||||
|
else
|
||||||
|
echo -e "\e[32mSucessfully removed $solr_volume!\e[0m"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Ok! Not removing $solr_volume then."
|
||||||
|
echo "Once you decided on removing the volume simply run docker volume rm $solr_volume to remove it manually."
|
||||||
|
echo "This can be done anytime. mailcow does not use this volume anymore."
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Delete old fts.conf before forced switch to flatcurve to ensure update is working properly
|
||||||
|
FTS_CONF_PATH="${SCRIPT_DIR}/data/conf/dovecot/conf.d/fts.conf"
|
||||||
|
if [[ -f "$FTS_CONF_PATH" ]]; then
|
||||||
|
if grep -q "Autogenerated by mailcow" "$FTS_CONF_PATH"; then
|
||||||
|
rm -rf $FTS_CONF_PATH
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
############## End Function Section ##############
|
############## End Function Section ##############
|
||||||
|
|
||||||
# Check permissions
|
# Check permissions
|
||||||
@@ -523,8 +925,6 @@ CONFIG_ARRAY=(
|
|||||||
"MAILDIR_GC_TIME"
|
"MAILDIR_GC_TIME"
|
||||||
"MAILDIR_SUB"
|
"MAILDIR_SUB"
|
||||||
"ACL_ANYONE"
|
"ACL_ANYONE"
|
||||||
"SOLR_HEAP"
|
|
||||||
"SKIP_SOLR"
|
|
||||||
"ENABLE_SSL_SNI"
|
"ENABLE_SSL_SNI"
|
||||||
"ALLOW_ADMIN_EMAIL_LOGIN"
|
"ALLOW_ADMIN_EMAIL_LOGIN"
|
||||||
"SKIP_HTTP_VERIFICATION"
|
"SKIP_HTTP_VERIFICATION"
|
||||||
@@ -651,21 +1051,6 @@ for option in "${CONFIG_ARRAY[@]}"; do
|
|||||||
echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf
|
echo '# Otherwise a user might share data with too many other users.' >> mailcow.conf
|
||||||
echo 'ACL_ANYONE=disallow' >> mailcow.conf
|
echo 'ACL_ANYONE=disallow' >> mailcow.conf
|
||||||
fi
|
fi
|
||||||
elif [[ "${option}" == "SOLR_HEAP" ]]; then
|
|
||||||
if ! grep -q "${option}" mailcow.conf; then
|
|
||||||
echo "Adding new option \"${option}\" to mailcow.conf"
|
|
||||||
echo '# Solr heap size, there is no recommendation, please see Solr docs.' >> mailcow.conf
|
|
||||||
echo '# Solr is a prone to run OOM on large systems and should be monitored. Unmonitored Solr setups are not recommended.' >> mailcow.conf
|
|
||||||
echo '# Solr will refuse to start with total system memory below or equal to 2 GB.' >> mailcow.conf
|
|
||||||
echo "SOLR_HEAP=1024" >> mailcow.conf
|
|
||||||
fi
|
|
||||||
elif [[ "${option}" == "SKIP_SOLR" ]]; then
|
|
||||||
if ! grep -q "${option}" mailcow.conf; then
|
|
||||||
echo "Adding new option \"${option}\" to mailcow.conf"
|
|
||||||
echo '# Solr is disabled by default after upgrading from non-Solr to Solr-enabled mailcows.' >> mailcow.conf
|
|
||||||
echo '# Disable Solr or if you do not want to store a readable index of your mails in solr-vol-1.' >> mailcow.conf
|
|
||||||
echo "SKIP_SOLR=y" >> mailcow.conf
|
|
||||||
fi
|
|
||||||
elif [[ "${option}" == "ENABLE_SSL_SNI" ]]; then
|
elif [[ "${option}" == "ENABLE_SSL_SNI" ]]; then
|
||||||
if ! grep -q "${option}" mailcow.conf; then
|
if ! grep -q "${option}" mailcow.conf; then
|
||||||
echo "Adding new option \"${option}\" to mailcow.conf"
|
echo "Adding new option \"${option}\" to mailcow.conf"
|
||||||
@@ -998,7 +1383,8 @@ for container in "${MAILCOW_CONTAINERS[@]}"; do
|
|||||||
done
|
done
|
||||||
|
|
||||||
[[ -f data/conf/nginx/ZZZ-ejabberd.conf ]] && rm data/conf/nginx/ZZZ-ejabberd.conf
|
[[ -f data/conf/nginx/ZZZ-ejabberd.conf ]] && rm data/conf/nginx/ZZZ-ejabberd.conf
|
||||||
|
migrate_solr_config_options
|
||||||
|
adapt_new_options
|
||||||
|
|
||||||
# Silently fixing remote url from andryyy to mailcow
|
# Silently fixing remote url from andryyy to mailcow
|
||||||
# git remote set-url origin https://github.com/mailcow/mailcow-dockerized
|
# git remote set-url origin https://github.com/mailcow/mailcow-dockerized
|
||||||
|
|||||||
Reference in New Issue
Block a user