1
0
mirror of https://github.com/mailcow/mailcow-dockerized.git synced 2026-06-17 03:50:30 +00:00

Compare commits

..

9 Commits

Author SHA1 Message Date
copilot-swe-agent[bot] 0fcbd33ee1 Add CLAMD_STARTUP_TIMEOUT to docker-compose.yml environment
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-11 13:19:07 +00:00
copilot-swe-agent[bot] c8acacb5b1 Use wall clock time for accurate elapsed time reporting
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-11 12:44:20 +00:00
copilot-swe-agent[bot] 322841cbeb Use localhost for consistency and fix timing to report 0 seconds when ready immediately
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-11 12:43:03 +00:00
copilot-swe-agent[bot] de3d617840 Fix timing accuracy and simplify final status reporting
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-11 12:41:19 +00:00
copilot-swe-agent[bot] a98a5b298d Refactor clamd readiness check with helper function and improve timing logic
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-11 12:39:49 +00:00
copilot-swe-agent[bot] 4d55d037c0 Fix timing accuracy and improve status messaging in clamd startup
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-11 12:38:14 +00:00
copilot-swe-agent[bot] bdc02ce882 Make clamd startup timeout configurable and add readiness check
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-11 12:36:52 +00:00
copilot-swe-agent[bot] d73223cd93 Add 10-minute startup grace period for clamd to fix memory limiting issue
Co-authored-by: DerLinkman <62480600+DerLinkman@users.noreply.github.com>
2025-12-11 12:35:21 +00:00
copilot-swe-agent[bot] 376ba57f35 Initial plan 2025-12-11 12:32:29 +00:00
3 changed files with 94 additions and 78 deletions
+45
View File
@@ -95,6 +95,51 @@ echo "$(clamd -V) is starting... please wait a moment."
nice -n10 clamd & nice -n10 clamd &
BACKGROUND_TASKS+=($!) BACKGROUND_TASKS+=($!)
# Give clamd time to start up, especially with limited resources
# This grace period allows clamd to initialize fully before health checks begin
# Can be configured via CLAMD_STARTUP_TIMEOUT environment variable
STARTUP_GRACE_PERIOD=${CLAMD_STARTUP_TIMEOUT:-600} # Default: 10 minutes in seconds
echo "Waiting up to ${STARTUP_GRACE_PERIOD} seconds for clamd to start up..."
# Helper function to check if clamd is ready
clamd_is_ready() {
[ "$(echo "PING" | nc -w 1 localhost 3310 2>/dev/null)" = "PONG" ]
}
# Wait for clamd to be ready or until timeout
START_TIME=$(date +%s)
POLL_INTERVAL=10
CLAMD_READY=0
while true; do
CURRENT_TIME=$(date +%s)
ELAPSED=$((CURRENT_TIME - START_TIME))
# Check if clamd is responsive by attempting to connect on localhost
# clamd listens on 0.0.0.0:3310 (configured in Dockerfile)
if clamd_is_ready; then
echo "clamd is ready after ${ELAPSED} seconds"
CLAMD_READY=1
break
fi
# Check if we've exceeded the timeout
if [ ${ELAPSED} -ge ${STARTUP_GRACE_PERIOD} ]; then
break
fi
sleep ${POLL_INTERVAL}
done
# Report final status only if not already reported as ready
if [ ${CLAMD_READY} -eq 0 ]; then
if clamd_is_ready; then
echo "clamd is now ready (started during final check)"
else
echo "Warning: clamd did not respond to PING within ${STARTUP_GRACE_PERIOD} seconds - it may still be starting up"
fi
fi
while true; do while true; do
for bg_task in ${BACKGROUND_TASKS[*]}; do for bg_task in ${BACKGROUND_TASKS[*]}; do
if ! kill -0 ${bg_task} 1>&2; then if ! kill -0 ${bg_task} 1>&2; then
+5 -35
View File
@@ -2732,11 +2732,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$gal = (isset($_data['gal'])) ? intval($_data['gal']) : $is_now['gal']; $gal = (isset($_data['gal'])) ? intval($_data['gal']) : $is_now['gal'];
$description = (!empty($_data['description']) && isset($_SESSION['acl']['domain_desc']) && $_SESSION['acl']['domain_desc'] == "1") ? $_data['description'] : $is_now['description']; $description = (!empty($_data['description']) && isset($_SESSION['acl']['domain_desc']) && $_SESSION['acl']['domain_desc'] == "1") ? $_data['description'] : $is_now['description'];
(int)$relayhost = (isset($_data['relayhost']) && isset($_SESSION['acl']['domain_relayhost']) && $_SESSION['acl']['domain_relayhost'] == "1") ? intval($_data['relayhost']) : intval($is_now['relayhost']); (int)$relayhost = (isset($_data['relayhost']) && isset($_SESSION['acl']['domain_relayhost']) && $_SESSION['acl']['domain_relayhost'] == "1") ? intval($_data['relayhost']) : intval($is_now['relayhost']);
$tags_raw = isset($_data['tags']) ? $_data['tags'] : array(); $tags = (is_array($_data['tags']) ? $_data['tags'] : array());
$tags = is_array($tags_raw) ? $tags_raw : json_decode($tags_raw, true);
if (!is_array($tags)) {
$tags = array();
}
} }
else { else {
$_SESSION['return'][] = array( $_SESSION['return'][] = array(
@@ -2773,8 +2769,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
':tag_name' => $tag, ':tag_name' => $tag,
)); ));
} }
$stmt = $pdo->prepare("UPDATE `domain` SET `modified` = NOW() WHERE `domain` = :domain");
$stmt->execute(array(':domain' => $domain));
$_SESSION['return'][] = array( $_SESSION['return'][] = array(
'type' => 'success', 'type' => 'success',
@@ -2797,11 +2791,7 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
$maxquota = (!empty($_data['maxquota'])) ? $_data['maxquota'] : ($is_now['max_quota_for_mbox'] / 1048576); $maxquota = (!empty($_data['maxquota'])) ? $_data['maxquota'] : ($is_now['max_quota_for_mbox'] / 1048576);
$quota = (!empty($_data['quota'])) ? $_data['quota'] : ($is_now['max_quota_for_domain'] / 1048576); $quota = (!empty($_data['quota'])) ? $_data['quota'] : ($is_now['max_quota_for_domain'] / 1048576);
$description = (!empty($_data['description'])) ? $_data['description'] : $is_now['description']; $description = (!empty($_data['description'])) ? $_data['description'] : $is_now['description'];
$tags_raw = isset($_data['tags']) ? $_data['tags'] : array(); $tags = (is_array($_data['tags']) ? $_data['tags'] : array());
$tags = is_array($tags_raw) ? $tags_raw : json_decode($tags_raw, true);
if (!is_array($tags)) {
$tags = array();
}
if ($relay_all_recipients == '1') { if ($relay_all_recipients == '1') {
$backupmx = '1'; $backupmx = '1';
} }
@@ -2947,8 +2937,6 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
':tag_name' => $tag, ':tag_name' => $tag,
)); ));
} }
$stmt = $pdo->prepare("UPDATE `domain` SET `modified` = NOW() WHERE `domain` = :domain");
$stmt->execute(array(':domain' => $domain));
$_SESSION['return'][] = array( $_SESSION['return'][] = array(
'type' => 'success', 'type' => 'success',
@@ -6120,11 +6108,10 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
else { else {
$domains = $_data['domain']; $domains = $_data['domain'];
} }
$tags_raw = isset($_data['tags']) ? $_data['tags'] : array(); $tags = $_data['tags'];
$tags = is_array($tags_raw) ? $tags_raw : json_decode($tags_raw, true);
if (!is_array($tags)) $tags = array(); if (!is_array($tags)) $tags = array();
$modifiedDomains = array();
$wasModified = false; $wasModified = false;
foreach ($domains as $domain) { foreach ($domains as $domain) {
if (!is_valid_domain_name($domain)) { if (!is_valid_domain_name($domain)) {
@@ -6144,10 +6131,8 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
return false; return false;
} }
$domainModified = false;
foreach($tags as $tag){ foreach($tags as $tag){
// delete tag // delete tag
$domainModified = true;
$wasModified = true; $wasModified = true;
$stmt = $pdo->prepare("DELETE FROM `tags_domain` WHERE `domain` = :domain AND `tag_name` = :tag_name"); $stmt = $pdo->prepare("DELETE FROM `tags_domain` WHERE `domain` = :domain AND `tag_name` = :tag_name");
$stmt->execute(array( $stmt->execute(array(
@@ -6155,28 +6140,13 @@ function mailbox($_action, $_type, $_data = null, $_extra = null) {
':tag_name' => $tag, ':tag_name' => $tag,
)); ));
} }
if ($domainModified) {
$modifiedDomains[] = $domain;
}
} }
if (!$wasModified) return false; if (!$wasModified) return false;
if (!empty($modifiedDomains)) {
$placeholders = array();
$params = array();
foreach ($modifiedDomains as $idx => $modifiedDomain) {
$placeholders[] = ":domain".$idx;
$params[":domain".$idx] = $modifiedDomain;
}
$stmt = $pdo->prepare("UPDATE `domain` SET `modified` = NOW() WHERE `domain` IN (".implode(',', $placeholders).")");
$stmt->execute($params);
$modifiedDomains = array_map('htmlspecialchars', $modifiedDomains);
}
$modifiedDomains = (empty($modifiedDomains)) ? array('-') : $modifiedDomains;
$_SESSION['return'][] = array( $_SESSION['return'][] = array(
'type' => 'success', 'type' => 'success',
'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr), 'log' => array(__FUNCTION__, $_action, $_type, $_data_log, $_attr),
'msg' => array('domain_modified', implode(', ', $modifiedDomains)) 'msg' => array('domain_modified', $domain)
); );
break; break;
case 'tags_mailbox': case 'tags_mailbox':
+1
View File
@@ -75,6 +75,7 @@ services:
environment: environment:
- TZ=${TZ} - TZ=${TZ}
- SKIP_CLAMD=${SKIP_CLAMD:-n} - SKIP_CLAMD=${SKIP_CLAMD:-n}
- CLAMD_STARTUP_TIMEOUT=${CLAMD_STARTUP_TIMEOUT:-600}
volumes: volumes:
- ./data/conf/clamav/:/etc/clamav/:Z - ./data/conf/clamav/:/etc/clamav/:Z
- clamd-db-vol-1:/var/lib/clamav - clamd-db-vol-1:/var/lib/clamav