Compare commits

..

10 Commits

Author SHA1 Message Date
nico 93d5f592cb compose changed
Close stale issues and PRs / stale (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (acme-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (clamd-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (dockerapi-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (dovecot-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (netfilter-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (olefy-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (php-fpm-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (postfix-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (rspamd-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (sogo-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (unbound-mailcow) (push) Has been cancelled
Build mailcow Docker Images / docker_image_builds (watchdog-mailcow) (push) Has been cancelled
2026-04-22 22:55:13 +02:00
Ashitaka e8d9315d4a Merge pull request #6905 from Ashitaka57/6646-pbkdf2-sha512-verify-hash
Support for PBKDF2-SHA512 hash algorithm in verify_hash() (FreeIPA compatibility) (issue 6646)
2025-12-12 14:08:21 +01:00
DerLinkman d977ddb501 backup: add image prefetch function to verify latest image is used 2025-12-12 14:07:57 +01:00
DerLinkman e76f5237ed ofelia: revert fixed cron syntax for sa-rules download 2025-12-12 14:07:47 +01:00
Copilot c11ed5dd1e Prevent duplicate/plaintext login announcement rendering (#6963)
* Initial plan

* Fix duplicate login announcement display

Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-12 14:07:36 +01:00
DerLinkman 4ef65fc382 Merge pull request #6948 from mailcow/staging
2025-12
2025-12-09 13:29:15 +01:00
DerLinkman dbb9e474b0 pf-tlspol: upgrade to 1.8.22 (#6951)
* postfix-tlspol: upgrade to 1.8.20

* pf-tlspol: update to 1.8.22
2025-12-09 13:25:50 +01:00
Khurram Malik f8eed8c786 fix(api): add missing break in CORS switch block causing save to hang (#6926) 2025-12-09 11:54:20 +01:00
DerLinkman ef010aa39c Update CONTRIBUTING.md
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
2025-12-08 15:08:25 +01:00
milkmaker 79171ea6f5 [Web] Updated lang.fr-fr.json (#6943)
Co-authored-by: Neuronnexion <support@nnx.com>
2025-12-05 14:40:45 +01:00
11 changed files with 257 additions and 62 deletions
+1 -1
View File
@@ -5,7 +5,7 @@ First of all, thank you for wanting to provide a bugfix or a new feature for the
As we want to keep mailcow's development structured we setup these Guidelines which helps you to create your issue/pull request accordingly. As we want to keep mailcow's development structured we setup these Guidelines which helps you to create your issue/pull request accordingly.
**PLEASE NOTE, THAT WE WILL CLOSE ISSUES/PULL REQUESTS IF THEY DON'T FULLFIL OUR WRITTEN GUIDELINES WRITTEN INSIDE THIS DOCUMENT**. So please check this guidelines before you propose a Issue/Pull Request. **PLEASE NOTE, THAT WE WILL CLOSE ISSUES/PULL REQUESTS IF THEY DON'T FULFILL OUR WRITTEN GUIDELINES WRITTEN INSIDE THIS DOCUMENT**. So please check this guidelines before you propose a Issue/Pull Request.
## Topics ## Topics
+1 -1
View File
@@ -4,7 +4,7 @@ WORKDIR /src
ENV CGO_ENABLED=0 \ ENV CGO_ENABLED=0 \
GO111MODULE=on \ GO111MODULE=on \
NOOPT=1 \ NOOPT=1 \
VERSION=1.8.14 VERSION=1.8.22
RUN git clone --branch v${VERSION} https://github.com/Zuplu/postfix-tlspol && \ RUN git clone --branch v${VERSION} https://github.com/Zuplu/postfix-tlspol && \
cd /src/postfix-tlspol && \ cd /src/postfix-tlspol && \
+31 -17
View File
@@ -1,19 +1,33 @@
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----
MIIDBDCCAe6gAwIBAgIQeJMoL/3dxhxhT9EwuRTL/DALBgkqhkiG9w0BAQswEjEQ MIIFuzCCA6OgAwIBAgIUKHIENbIlha9HgCSBg5LdDBWYGqowDQYJKoZIhvcNAQEL
MA4GA1UEChMHbWFpbGNvdzAeFw0xNjEyMTMxMDExMDBaFw0xOTExMjgxMDExMDBa BQAwbTELMAkGA1UEBhMCREUxDDAKBgNVBAgMA05SVzEQMA4GA1UEBwwHV2lsbGlj
MC0xEDAOBgNVBAoTB21haWxjb3cxGTAXBgNVBAMTEG1haWwuZXhhbXBsZS5vcmcw aDEQMA4GA1UECgwHbWFpbGNvdzEQMA4GA1UECwwHbWFpbGNvdzEaMBgGA1UEAwwR
ggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDRg0xT3At9DSb3H5OMp3K1 bWFpbC5ieWhhaWRlci5kZXYwHhcNMjYwMTA2MTczMDUxWhcNMjcwMTA2MTczMDUx
MpXAgYyotSK6TS61fC0QEHy2fMXiws7Agcye6Ln7CG63Fe1eN2jkdlefy9xJivS8 WjBtMQswCQYDVQQGEwJERTEMMAoGA1UECAwDTlJXMRAwDgYDVQQHDAdXaWxsaWNo
y5w0M8i168v5znzC8fnylL2iOiSYfK/B/oEqfU7YH4RcegO53oDDIUZmi4Frgnu7 MRAwDgYDVQQKDAdtYWlsY293MRAwDgYDVQQLDAdtYWlsY293MRowGAYDVQQDDBFt
39VVOU1ZyHEVqGJ2H2aAIkoZRjGzumD9Ym4LWGidtKJzBgFt/qmhUeWXipM8w281 YWlsLmJ5aGFpZGVyLmRldjCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIB
XkQnJU79+x2ywnJSvEZ3r/ZVJC7kbjiVw+/k15k9Cxk6Ik8wmJ0X/+xWxoZomHQI AL7fr9RFCXCjpL3VV9f7ZEOHiO+9V7EHsWfr5T+WJY8oPnNNFmXgBH0X+g/dJZFn
1LM0VKAS/iaU95dn2bplvL6jTiiyWAbrMjSKs4XbPt/fIbOicNkj6+CFy0MVfyyH C2cXfF7oHyirXQeceQOLjFWgiAM2WmkMk+avIxs5p6UcY9d6utchTDzb4tSj91B8
AgMBAAGjPzA9MA4GA1UdDwEB/wQEAwIAqDAdBgNVHSUEFjAUBggrBgEFBQcDAgYI ZFlErPkZujOxNDdsNhlll+iqce5l3WsJY/lI5HaRDCYWANNK0Zv2dZ2d+9STCILx
KwYBBQUHAwEwDAYDVR0TAQH/BAIwADALBgkqhkiG9w0BAQsDggEBAI/jBJa1P8nB y/FqEHKoUTsEC9UHXCcT4RehbUynYEv8QZNLlz1n55tx+Q4A12Vx+ymVc6J0xH+m
eHUN5muQmjBVDVOYyWAAEapOe2HYsBcpjaB2H8Iw3DQzJtz6peYeYSCmHRVqFLCm VCwuywn3Ji46+27jT1aHtKrA+2DRhzBskPTPxjowJHmOoem1zQXzBIaSZ2QI2yxV
VPrq36l9mPUotyPDPlQQAxCj9R2+WbGaJO+N/E1F8FQ94dr3jqwUyfjVPoqEjmIH vhAA1f+La7+VlyoS7JlS3mSvl5f/8EYCHa03tppotVuH5OEchO54z/RE7ThtoitL
NFkvbA0RJOeBm9oYGdhM0wjOBV9c9MTHFG82nQ/zQeTuPb7GXuKIOXYCxoLNOZMw djGNGYk8giq/PGgCma3ZTpZDJhQY0mTTS49KQkSnwmzWjW4ATfxe9uTpbnJ09hU6
UJ02Cqjv5ImrgOhcstAKX3Ip0urSvZUGvtPla4CGh+M6yDFJ08GzX6OiMIH207RW WSxe8E6mUe409wkXMdJzuvtXfacsQBVst1WdjRFJtsvVq7pU2J0B1yNmsCU1hxwP
jAbUXXERSUv/7hysdDjGo5HZjCeMzVu9KAxoZXqnmvkk8g2swKWtWBRcoeU1VGx0 kD3WEB/bGiRdxOtZKgTAnHid2R964s0kk5oxpNl4qqiTxYXmvjRS63iy8iD/D43h
Bx4Q4KMjuYQ= V/M0Pz9k7moEGyxiHc0NiHbJRQW201FhIAoZEmiFJOOnpjMMCbUhXU3kdSXCE+AC
PCqqv6kXUWxSGS2AZuvvDtR6/Fzd9XlcNHFNXfmWTpZDAgMBAAGjUzBRMB0GA1Ud
DgQWBBSD4wzq+HvtYbOe31NBJQhhWknvyzAfBgNVHSMEGDAWgBSD4wzq+HvtYbOe
31NBJQhhWknvyzAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4ICAQBW
zg3lvh4bC/SaNQ5nvhiRMP4CAG7+FjAVdvk7iJbOyW+EZ6957ygvuulG0LllgZCc
o9IpCw8+ZeaEVylEmgnvZOT6vr+JFdzvjHfNXGh/sJaSD258DmiJGKH1mJ6BE6wV
I77kbBZvATUF2Hyurzmcj4B/a1MawwWmWfQmI4AfKiSQxSn2tIXyQ57L4UTw+TG6
e6kcg1G6O9us7RE1s7N5ykGLXOHVhv0XizaQV24jS97U1Isb/DFcNgtgm2NmU4pP
ru87ZxeLWH3xYxaXxVjO8p7p7EPaDekSW9lxDlsxCcz3c4foLWzWTyzd2dmV9Vx3
cbAsKDLDN+OzYPCc8W5qFMP8jctPx6KW1z9Sb2s5ig8X56Z5vTH3Xwoiom5czg5S
Cs1BKIpvns3QAwGZT1DvajjtWZ1tiuvC1YY1kgcwyzt951JRXP4MNsxU4JZ8UMtQ
Ml0tQHMnVfs+LosELnxZl0kzqdeU/nc4yfpTfxsrISz/20UxHBb0EvQdXGMdfff5
KjjpolMnPgBsjazlH9RR51Qa+j1LqWcnCmjbWkm3UH/XJHuMM0XU6kjLAfeoIUMd
tgJlUABWl8mP6UfY6SpocEHaEvD/JH5PVezTJvx2hZ1RvK1/H0X6QhgBO/J7BMhm
cDyUnIzUriwEixUVY9B31y0iKcI5u18s3DQcJ28J0w==
-----END CERTIFICATE----- -----END CERTIFICATE-----
+52 -27
View File
@@ -1,27 +1,52 @@
-----BEGIN RSA PRIVATE KEY----- -----BEGIN PRIVATE KEY-----
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
-----END RSA PRIVATE KEY----- +0xEeqQz9wkE4I1q1D+5LzCfrpYNt4xYYUv1PFzs+rVsplOIdI8g9aRPsZVU1Wee
m7TeVs1hCQLAkF0fsAXGvGojcrl0NFquWxX0uaP+vqLdNAiccoRaIbkWjNtahUis
Q+6O/qxjRI0gIz4Dj00EcBm4aNEiZ4Dt7J5OH0wshD2iGl/1AoIBAQDLbS7jHyrl
l+6G/v/LAz3+Xo0THSqILfCB4r/lolwqnxWgIf86tPLKj2t5kv3GVPcK29e7k1me
1NkjuVGZQnRLBE9bSA2ii6C7LOEVod37jjAHP7irAlKTKMTwAsXGhqLKledZZ50j
I1vYJKyvhBt9+hdx8OnHmWofLvF7Qso7yeCjhc48k3bhL8qDQnIZ91itKId2xyaH
OwiLgCSPts5weeC295e47SK/siKgFiMElTkQNXF+P1bjuIsbTl3saOT57M3vQB/S
SBlj7jKQieopahmT6gSNPbsB0bP7Mz3lfzV23GHz1TmyxeNpe/YqnyAGeVtLZo16
5El2h4G6fdJXAoIBAQChQmlEGxRlRuQpJea6rPtjea5e0a+VlLw3rNlfENBFwM1A
GoRxaLQriM3MqB0uRoadLEWWkXJfGWBRJiYsPtQeQTZhYFurQuCV3S7/j1R3BDG1
r+YYet2ayFeZKcs/CV5mPxPUWQyRiPewVAEYmMjtGJObYyLM3VJATyluMD+toaBn
eqvFaHPIiqIVUwcTzQPURaulEf0KsPG57z6pqKhf7dDBUehz0Ebu4y5jnyk4M5JC
WOhOGx1JzsSx/YBMOBMlXpiagXAmEhN1TMrOMsatMXyFfipiZ0JEbUKy1BBuU6+s
HTOZpc9WWHheSFwcH9J3hIFcOgS1cfGT2Vv/XjGZAoIBAQCdVqBaOKQUGlP6A8bS
PXq4gGb67qcT1vxbaYbk1JQWvx6Z0VG4FXZoJ0+II6G2wcallm4gfZJmn9gmolIz
iMurrfS29F7fZsF1o/ufoKexxkLtiGKLmetGONVBkdNofn/w0sqyQsqt/84sugj6
Y+JjqIhzr1MR9122KrfJj1odrkHaGEbwYVokR7OJnF3mKYJjw6Iqw1PQal9sjjs5
ELpREmM1AQFPndIvlFblnNmO1N/i4oMak2DgFr846n8IuATKLVcGgoFaQjupJ/Xi
B1memJqZ5fmJSMKYYJqlYvevxpkSitgUIMpUtGv1DVTTmGnLuBddlT8+Ws1bKOm0
1VZXAoIBAQDLy0s9u1XpfPncBe3rjJdTJ9QgzCi6kn2LUbCDsZ/hW3EKuruEc/7U
aSxZSV9Qlm/nYp+m+A0Z1Y9T/k81iepnPMMxCM8Ks5oaip+fghyCdqWrJWVaecRY
ZCCakyZJCNon9EuTY83C6R7TR0MakH9BUhHjjDZbuTKxjKQdv4sI7aphdogruMd1
I3VyEDw90HJWcC4X9ya5n/Wxthmi4PetBMWLsck0XC8/wMzJxZOY5mCe6rypkYRY
RN8We8ELCvJIB0SmRPrCUrDg1jbJCk0cn7YN6RGjujKHW/wId0HdvTfUzLp59uyW
2MdNtnj3qRxFTim0Q9nr5L+oC5Me/QxZ
-----END PRIVATE KEY-----
+26
View File
@@ -174,3 +174,29 @@ lmtp_destination_recipient_limit=1
# DO NOT EDIT ANYTHING BELOW # # DO NOT EDIT ANYTHING BELOW #
# Overrides # # Overrides #
postscreen_dnsbl_sites = wl.mailspike.net=127.0.0.[18;19;20]*-2
hostkarma.junkemailfilter.com=127.0.0.1*-2
list.dnswl.org=127.0.[0..255].0*-2
list.dnswl.org=127.0.[0..255].1*-4
list.dnswl.org=127.0.[0..255].2*-6
list.dnswl.org=127.0.[0..255].3*-8
bl.spamcop.net*2
bl.suomispam.net*2
hostkarma.junkemailfilter.com=127.0.0.2*3
hostkarma.junkemailfilter.com=127.0.0.4*2
hostkarma.junkemailfilter.com=127.0.1.2*1
backscatter.spameatingmonkey.net*2
bl.ipv6.spameatingmonkey.net*2
bl.spameatingmonkey.net*2
b.barracudacentral.org=127.0.0.2*7
bl.mailspike.net=127.0.0.2*5
bl.mailspike.net=127.0.0.[10;11;12]*4
zen.spamhaus.org=127.0.0.[10;11]*8
zen.spamhaus.org=127.0.0.[4..7]*6
zen.spamhaus.org=127.0.0.3*4
zen.spamhaus.org=127.0.0.2*3
# User Overrides
myhostname = mail.byhaider.dev
+26
View File
@@ -814,6 +814,32 @@ function verify_hash($hash, $password) {
$hash = $components[4]; $hash = $components[4];
return hash_equals(hash_pbkdf2('sha1', $password, $salt, $rounds), $hash); return hash_equals(hash_pbkdf2('sha1', $password, $salt, $rounds), $hash);
case "PBKDF2-SHA512":
// Handle FreeIPA-style hash: {PBKDF2-SHA512}10000$<base64_salt>$<base64_hash>
$components = explode('$', $hash);
if (count($components) !== 3) return false;
// 1st part: iteration count (integer)
$iterations = intval($components[0]);
if ($iterations <= 0) return false;
// 2nd part: salt (base64-encoded)
$salt = $components[1];
// 3rd part: hash (base64-encoded)
$stored_hash_b64 = $components[2];
// Decode salt and hash from base64
$salt_bin = base64_decode($salt, true);
$hash_bin = base64_decode($stored_hash_b64, true);
if ($salt_bin === false || $hash_bin === false) return false;
// Get length of hash in bytes
$hash_len = strlen($hash_bin);
if ($hash_len === 0) return false;
// Calculate PBKDF2-SHA512 hash for provided password
$test_hash = hash_pbkdf2('sha512', $password, $salt_bin, $iterations, $hash_len, true);
return hash_equals($hash_bin, $test_hash);
case "PLAIN-MD4": case "PLAIN-MD4":
return hash_equals(hash('md4', $password), $hash); return hash_equals(hash('md4', $password), $hash);
+1
View File
@@ -1992,6 +1992,7 @@ if (isset($_GET['query'])) {
break; break;
case "cors": case "cors":
process_edit_return(cors('edit', $attr)); process_edit_return(cors('edit', $attr));
break;
case "identity-provider": case "identity-provider":
process_edit_return(identity_provider('edit', $attr)); process_edit_return(identity_provider('edit', $attr));
break; break;
+5 -2
View File
@@ -410,7 +410,8 @@
"iam_host_info": "Saisissez un ou plusieurs hôtes LDAP, séparés par des virgules.", "iam_host_info": "Saisissez un ou plusieurs hôtes LDAP, séparés par des virgules.",
"iam_import_users": "Importer des utilisateurs", "iam_import_users": "Importer des utilisateurs",
"filter": "Filtrer", "filter": "Filtrer",
"needs_restart": "nécessite un redémarrage" "needs_restart": "nécessite un redémarrage",
"iam": "Fournisseur d'identité"
}, },
"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",
@@ -1375,7 +1376,9 @@
"overview": "Vue d'ensemble", "overview": "Vue d'ensemble",
"expire_never": "Ne jamais expirer", "expire_never": "Ne jamais expirer",
"forever": "Pour toujours", "forever": "Pour toujours",
"spam_aliases_info": "Un alias de spam est une adresse de courriel temporaire qui peut être utilisée pour protéger les véritables adresses de courriel. <br> De manière optionnelle, une durée d'expiration peut être définie afin que l'alias soit automatiquement désactivé après la période définie, éliminant ainsi les adresses étant abusées ou ayant fuité." "spam_aliases_info": "Un alias de spam est une adresse de courriel temporaire qui peut être utilisée pour protéger les véritables adresses de courriel. <br> De manière optionnelle, une durée d'expiration peut être définie afin que l'alias soit automatiquement désactivé après la période définie, éliminant ainsi les adresses étant abusées ou ayant fuité.",
"authentication": "Authentification",
"protocols": "Protocoles"
}, },
"warning": { "warning": {
"cannot_delete_self": "Impossible de supprimer lutilisateur connecté", "cannot_delete_self": "Impossible de supprimer lutilisateur connecté",
+1 -1
View File
@@ -144,7 +144,7 @@
<form action="/" method="post" id="logout"><input type="hidden" name="logout"></form> <form action="/" method="post" id="logout"><input type="hidden" name="logout"></form>
{% if ui_texts.ui_announcement_text and ui_texts.ui_announcement_active and not is_root_uri %} {% if ui_texts.ui_announcement_text and ui_texts.ui_announcement_active and not is_root_uri and mailcow_cc_username %}
<div class="container mt-4"> <div class="container mt-4">
<div class="alert alert-{{ ui_texts.ui_announcement_type }}">{{ ui_texts.ui_announcement_text }}</div> <div class="alert alert-{{ ui_texts.ui_announcement_type }}">{{ ui_texts.ui_announcement_text }}</div>
</div> </div>
+75 -13
View File
@@ -1,5 +1,20 @@
services: services:
certdumper:
image: ghcr.io/kereis/traefik-certs-dumper:latest
container_name: traefik_certdumper
restart: unless-stopped
network_mode: none
command: --restart-containers mailcow_postfix-mailcow_1,mailcow_dovecot-mailcow_1
volumes:
- ../traefik/certs/:/traefik/certs/:ro
# - traefik_certs:/traefik:ro # Traefik Zertifikate einhängen
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./data/assets/ssl:/output:rw
environment:
- DOMAIN=domain.com
- ACME_FILE_PATH=/traefik/certs/cloudflare-acme.json # Dateipfad zur acme Datei
unbound-mailcow: unbound-mailcow:
image: ghcr.io/mailcow/unbound:1.24 image: ghcr.io/mailcow/unbound:1.24
environment: environment:
@@ -71,7 +86,9 @@ services:
unbound-mailcow: unbound-mailcow:
condition: service_healthy condition: service_healthy
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
environment: environment:
- TZ=${TZ} - TZ=${TZ}
- SKIP_CLAMD=${SKIP_CLAMD:-n} - SKIP_CLAMD=${SKIP_CLAMD:-n}
@@ -110,7 +127,9 @@ services:
restart: always restart: always
hostname: rspamd hostname: rspamd
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
networks: networks:
mailcow-network: mailcow-network:
aliases: aliases:
@@ -148,7 +167,9 @@ services:
- ./data/assets/templates:/tpls:z - ./data/assets/templates:/tpls:z
- ./data/conf/nginx/:/etc/nginx/conf.d/:z - ./data/conf/nginx/:/etc/nginx/conf.d/:z
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
environment: environment:
- REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-} - REDIS_SLAVEOF_IP=${REDIS_SLAVEOF_IP:-}
- REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-}
@@ -220,7 +241,9 @@ services:
- REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-} - REDIS_SLAVEOF_PORT=${REDIS_SLAVEOF_PORT:-}
- REDISPASS=${REDISPASS} - REDISPASS=${REDISPASS}
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
volumes: volumes:
- ./data/hooks/sogo:/hooks:Z - ./data/hooks/sogo:/hooks:Z
- ./data/conf/sogo/:/etc/sogo/:z - ./data/conf/sogo/:/etc/sogo/:z
@@ -258,7 +281,9 @@ services:
- netfilter-mailcow - netfilter-mailcow
- redis-mailcow - redis-mailcow
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
cap_add: cap_add:
- NET_BIND_SERVICE - NET_BIND_SERVICE
volumes: volumes:
@@ -321,7 +346,7 @@ services:
ofelia.job-exec.dovecot_clean_q_aged.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu vmail /usr/local/bin/clean_q_aged.sh || exit 0\"" ofelia.job-exec.dovecot_clean_q_aged.command: "/bin/bash -c \"[[ $${MASTER} == y ]] && /usr/local/bin/gosu vmail /usr/local/bin/clean_q_aged.sh || exit 0\""
ofelia.job-exec.dovecot_maildir_gc.schedule: "0 */30 * * * *" ofelia.job-exec.dovecot_maildir_gc.schedule: "0 */30 * * * *"
ofelia.job-exec.dovecot_maildir_gc.command: "/bin/bash -c \"source /source_env.sh ; /usr/local/bin/gosu vmail /usr/local/bin/maildir_gc.sh\"" ofelia.job-exec.dovecot_maildir_gc.command: "/bin/bash -c \"source /source_env.sh ; /usr/local/bin/gosu vmail /usr/local/bin/maildir_gc.sh\""
ofelia.job-exec.dovecot_sarules.schedule: "0 0 0 * * *" ofelia.job-exec.dovecot_sarules.schedule: "@every 24h"
ofelia.job-exec.dovecot_sarules.command: "/bin/bash -c \"/usr/local/bin/sa-rules.sh\"" ofelia.job-exec.dovecot_sarules.command: "/bin/bash -c \"/usr/local/bin/sa-rules.sh\""
ofelia.job-exec.dovecot_fts.schedule: "0 0 0 * * *" ofelia.job-exec.dovecot_fts.schedule: "0 0 0 * * *"
ofelia.job-exec.dovecot_fts.command: "/bin/bash -c \"/usr/local/bin/gosu vmail /usr/local/bin/optimize-fts.sh\"" ofelia.job-exec.dovecot_fts.command: "/bin/bash -c \"/usr/local/bin/gosu vmail /usr/local/bin/optimize-fts.sh\""
@@ -374,7 +399,9 @@ services:
- "${SUBMISSION_PORT:-587}:587" - "${SUBMISSION_PORT:-587}:587"
restart: always restart: always
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
networks: networks:
mailcow-network: mailcow-network:
ipv4_address: ${IPV4_NETWORK:-172.22.1}.253 ipv4_address: ${IPV4_NETWORK:-172.22.1}.253
@@ -382,7 +409,7 @@ services:
- postfix - postfix
postfix-tlspol-mailcow: postfix-tlspol-mailcow:
image: ghcr.io/mailcow/postfix-tlspol:1.0 image: ghcr.io/mailcow/postfix-tlspol:1.8.22
depends_on: depends_on:
unbound-mailcow: unbound-mailcow:
condition: service_healthy condition: service_healthy
@@ -397,7 +424,9 @@ services:
- DEV_MODE=${DEV_MODE:-n} - DEV_MODE=${DEV_MODE:-n}
restart: always restart: always
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
networks: networks:
mailcow-network: mailcow-network:
aliases: aliases:
@@ -421,7 +450,9 @@ services:
- rspamd-mailcow - rspamd-mailcow
image: ghcr.io/mailcow/nginx:1.05 image: ghcr.io/mailcow/nginx:1.05
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
environment: environment:
- HTTPS_PORT=${HTTPS_PORT:-443} - HTTPS_PORT=${HTTPS_PORT:-443}
- HTTP_PORT=${HTTP_PORT:-80} - HTTP_PORT=${HTTP_PORT:-80}
@@ -453,11 +484,34 @@ services:
ports: ports:
- "${HTTPS_BIND:-}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}" - "${HTTPS_BIND:-}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}"
- "${HTTP_BIND:-}:${HTTP_PORT:-80}:${HTTP_PORT:-80}" - "${HTTP_BIND:-}:${HTTP_PORT:-80}:${HTTP_PORT:-80}"
expose:
- 8080
labels:
- traefik.enable=true
- traefik.http.routers.mailcow-autodiscover.entrypoints=websecure
- traefik.http.routers.mailcow-autodiscover.rule=Host(`autodiscover.byhaider.dev`) && Path(`/autodiscover/autodiscover.xml`)
- traefik.http.routers.mailcow-autodiscover.tls.certresolver=cloudflare
- traefik.http.routers.mailcow-autodiscover.service=mailcow-svc
- traefik.http.routers.mailcow-autoconfig.entrypoints=websecure
- traefik.http.routers.mailcow-autoconfig.rule=Host(`autoconfig.byhaider.dev`)&& Path(`/mail/config-v1.1.xml`)
- traefik.http.routers.mailcow-autoconfig.tls.certresolver=cloudflare
- traefik.http.routers.mailcow-autoconfig.service=mailcow-svc
- traefik.http.routers.mailcow.entrypoints=websecure
- traefik.http.routers.mailcow.rule=Host(`mail.byhaider.dev`)
- traefik.http.routers.mailcow.tls=true
- traefik.http.routers.mailcow.tls.certresolver=cloudflare
- traefik.http.routers.mailcow.service=mailcow-svc
- traefik.http.services.mailcow-svc.loadbalancer.server.port=8080
- traefik.docker.network=traefik-network
restart: always restart: always
networks: networks:
mailcow-network: mailcow-network:
aliases: aliases:
- nginx - nginx
traefik-network:
acme-mailcow: acme-mailcow:
depends_on: depends_on:
@@ -467,7 +521,9 @@ services:
condition: service_healthy condition: service_healthy
image: ghcr.io/mailcow/acme:1.94 image: ghcr.io/mailcow/acme:1.94
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
environment: environment:
- LOG_LINES=${LOG_LINES:-9999} - LOG_LINES=${LOG_LINES:-9999}
- ADDITIONAL_SAN=${ADDITIONAL_SAN} - ADDITIONAL_SAN=${ADDITIONAL_SAN}
@@ -524,7 +580,9 @@ services:
watchdog-mailcow: watchdog-mailcow:
image: ghcr.io/mailcow/watchdog:2.09 image: ghcr.io/mailcow/watchdog:2.09
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
tmpfs: tmpfs:
- /tmp - /tmp
volumes: volumes:
@@ -602,7 +660,9 @@ services:
- label=disable - label=disable
restart: always restart: always
dns: dns:
- ${IPV4_NETWORK:-172.22.1}.254 # - ${IPV4_NETWORK:-172.22.1}.254
- 1.1.1.1
- 8.8.8.8
environment: environment:
- DBROOT=${DBROOT} - DBROOT=${DBROOT}
- TZ=${TZ} - TZ=${TZ}
@@ -667,6 +727,8 @@ networks:
config: config:
- subnet: ${IPV4_NETWORK:-172.22.1}.0/24 - subnet: ${IPV4_NETWORK:-172.22.1}.0/24
- subnet: ${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64} - subnet: ${IPV6_NETWORK:-fd4d:6169:6c63:6f77::/64}
traefik-network:
external: true
volumes: volumes:
vmail-vol-1: vmail-vol-1:
+38
View File
@@ -91,6 +91,44 @@ if grep --help 2>&1 | head -n 1 | grep -q -i "busybox"; then
exit 1 exit 1
fi fi
# Add image prefetch function
function prefetch_image() {
echo "Checking Docker image: ${DEBIAN_DOCKER_IMAGE}"
# Get local image digest if it exists
local local_digest=$(docker image inspect ${DEBIAN_DOCKER_IMAGE} --format='{{index .RepoDigests 0}}' 2>/dev/null | cut -d'@' -f2)
# Get remote image digest without pulling
local remote_digest=$(docker manifest inspect ${DEBIAN_DOCKER_IMAGE} 2>/dev/null | grep -oP '"digest":\s*"\K[^"]+' | head -1)
if [[ -z "${remote_digest}" ]]; then
echo "Warning: Unable to check remote image"
if [[ -n "${local_digest}" ]]; then
echo "Using cached version"
echo
return 0
else
echo "Error: Image ${DEBIAN_DOCKER_IMAGE} not found locally or remotely"
exit 1
fi
fi
if [[ "${local_digest}" != "${remote_digest}" ]]; then
echo "Image update available, pulling ${DEBIAN_DOCKER_IMAGE}"
if docker pull ${DEBIAN_DOCKER_IMAGE} 2>/dev/null; then
echo "Successfully pulled ${DEBIAN_DOCKER_IMAGE}"
else
echo "Error: Failed to pull ${DEBIAN_DOCKER_IMAGE}"
exit 1
fi
else
echo "Image is up to date (${remote_digest:0:12}...)"
fi
echo
}
# Prefetch the image early in the script
prefetch_image
function backup() { function backup() {
DATE=$(date +"%Y-%m-%d-%H-%M-%S") DATE=$(date +"%Y-%m-%d-%H-%M-%S")