Compare commits
14 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
b51a659515 | ||
|
44a6f09a09 | ||
|
4c10525078 | ||
|
c9ab8b2eff | ||
|
4bf38bf00f | ||
|
7c7c67948e | ||
|
263cb96786 | ||
|
b6e3e7a658 | ||
|
ceaf1423f4 | ||
|
9598b503ec | ||
|
94f4ec8b96 | ||
|
7aab2c55ff | ||
|
6abb4d34c1 | ||
|
c8ccf080f3 |
@@ -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@v5.0.0
|
uses: actions/stale@v5.1.0
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.STALE_ACTION_PAT }}
|
repo-token: ${{ secrets.STALE_ACTION_PAT }}
|
||||||
days-before-stale: 60
|
days-before-stale: 60
|
||||||
@@ -30,6 +30,7 @@ jobs:
|
|||||||
stale-issue-label: "stale"
|
stale-issue-label: "stale"
|
||||||
stale-pr-label: "stale"
|
stale-pr-label: "stale"
|
||||||
exempt-draft-pr: "true"
|
exempt-draft-pr: "true"
|
||||||
|
close-issue-reason: "not_planned"
|
||||||
operations-per-run: "250"
|
operations-per-run: "250"
|
||||||
ascending: "true"
|
ascending: "true"
|
||||||
#DRY-RUN
|
#DRY-RUN
|
||||||
|
29
.github/workflows/image_builds.yml
vendored
29
.github/workflows/image_builds.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Build Mailcow Docker Images
|
name: Build mailcow Docker Images
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
@@ -9,19 +9,20 @@ jobs:
|
|||||||
docker_image_builds:
|
docker_image_builds:
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
images: ["acme-mailcow",
|
images:
|
||||||
"clamd-mailcow",
|
- "acme-mailcow"
|
||||||
"dockerapi-mailcow",
|
- "clamd-mailcow"
|
||||||
"dovecot-mailcow",
|
- "dockerapi-mailcow"
|
||||||
"netfilter-mailcow",
|
- "dovecot-mailcow"
|
||||||
"olefy-mailcow",
|
- "netfilter-mailcow"
|
||||||
"php-fpm-mailcow",
|
- "olefy-mailcow"
|
||||||
"postfix-mailcow",
|
- "php-fpm-mailcow"
|
||||||
"rspamd-mailcow",
|
- "postfix-mailcow"
|
||||||
"sogo-mailcow",
|
- "rspamd-mailcow"
|
||||||
"solr-mailcow",
|
- "sogo-mailcow"
|
||||||
"unbound-mailcow",
|
- "solr-mailcow"
|
||||||
"watchdog-mailcow"]
|
- "unbound-mailcow"
|
||||||
|
- "watchdog-mailcow"
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
|
2
.github/workflows/integration_tests.yml
vendored
2
.github/workflows/integration_tests.yml
vendored
@@ -1,4 +1,4 @@
|
|||||||
name: Mailcow Integration Tests
|
name: mailcow Integration Tests
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
|
@@ -10,8 +10,8 @@ jobs:
|
|||||||
- name: Tweet-trigger-publish-release
|
- name: Tweet-trigger-publish-release
|
||||||
uses: mugi111/tweet-trigger-release@v1.1
|
uses: mugi111/tweet-trigger-release@v1.1
|
||||||
with:
|
with:
|
||||||
consumer_key: ${{ secrets.TWITTER_CONSUMER_KEY }}
|
consumer_key: ${{ secrets.CONSUMER_KEY }}
|
||||||
consumer_secret: ${{ secrets.TWITTER_CONSUMER_SECRET }}
|
consumer_secret: ${{ secrets.CONSUMER_SECRET }}
|
||||||
access_token_key: ${{ secrets.TWITTER_ACCESS_TOKEN_KEY }}
|
access_token_key: ${{ secrets.ACCESS_TOKEN_KEY }}
|
||||||
access_token_secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }}
|
access_token_secret: ${{ secrets.ACCESS_TOKEN_SECRET }}
|
||||||
tweet_body: 'A new mailcow-dockerized Release has been Released on GitHub! Checkout our GitHub Page for the latest Release: github.com/mailcow/mailcow-dockerized/releases/latest'
|
tweet_body: 'A new mailcow-dockerized Release has been Released on GitHub! Checkout our GitHub Page for the latest Release: github.com/mailcow/mailcow-dockerized/releases/latest'
|
||||||
|
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
## We stand with 🇺🇦
|
## We stand with 🇺🇦
|
||||||
|
|
||||||
|
[](https://github.com/mailcow/mailcow-dockerized/actions/workflows/integration_tests.yml)
|
||||||
[](https://translate.mailcow.email/engage/mailcow-dockerized/)
|
[](https://translate.mailcow.email/engage/mailcow-dockerized/)
|
||||||
[](https://twitter.com/mailcow_email)
|
[](https://twitter.com/mailcow_email)
|
||||||
|
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
FROM clamav/clamav:0.105.0_base
|
FROM clamav/clamav:0.105.1_base
|
||||||
|
|
||||||
LABEL maintainer "André Peters <andre.peters@servercow.de>"
|
LABEL maintainer "André Peters <andre.peters@servercow.de>"
|
||||||
|
|
||||||
|
@@ -518,21 +518,23 @@ paths:
|
|||||||
- domain.tld
|
- domain.tld
|
||||||
type: success
|
type: success
|
||||||
schema:
|
schema:
|
||||||
properties:
|
type: array
|
||||||
log:
|
items:
|
||||||
description: contains request object
|
type: object
|
||||||
items: {}
|
properties:
|
||||||
type: array
|
log:
|
||||||
msg:
|
description: contains request object
|
||||||
items: {}
|
items: {}
|
||||||
type: array
|
type: array
|
||||||
type:
|
msg:
|
||||||
enum:
|
items: {}
|
||||||
- success
|
type: array
|
||||||
- danger
|
type:
|
||||||
- error
|
enum:
|
||||||
type: string
|
- success
|
||||||
type: object
|
- danger
|
||||||
|
- error
|
||||||
|
type: string
|
||||||
description: OK
|
description: OK
|
||||||
headers: {}
|
headers: {}
|
||||||
tags:
|
tags:
|
||||||
@@ -579,6 +581,11 @@ paths:
|
|||||||
domain:
|
domain:
|
||||||
description: Fully qualified domain name
|
description: Fully qualified domain name
|
||||||
type: string
|
type: string
|
||||||
|
gal:
|
||||||
|
description: >-
|
||||||
|
is domain global address list active or not, it enables
|
||||||
|
shared contacts accross domain in SOGo webmail
|
||||||
|
type: boolean
|
||||||
mailboxes:
|
mailboxes:
|
||||||
description: limit count of mailboxes associated with this domain
|
description: limit count of mailboxes associated with this domain
|
||||||
type: number
|
type: number
|
||||||
@@ -596,6 +603,9 @@ paths:
|
|||||||
if not, them you have to create "dummy" mailbox for each
|
if not, them you have to create "dummy" mailbox for each
|
||||||
address to relay
|
address to relay
|
||||||
type: boolean
|
type: boolean
|
||||||
|
relay_unknown_only:
|
||||||
|
description: Relay non-existing mailboxes only. Existing mailboxes will be delivered locally.
|
||||||
|
type: boolean
|
||||||
rl_frame:
|
rl_frame:
|
||||||
enum:
|
enum:
|
||||||
- s
|
- s
|
||||||
@@ -606,6 +616,11 @@ paths:
|
|||||||
rl_value:
|
rl_value:
|
||||||
description: rate limit value
|
description: rate limit value
|
||||||
type: number
|
type: number
|
||||||
|
tags:
|
||||||
|
description: tags for this Domain
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
type: object
|
type: object
|
||||||
summary: Create domain
|
summary: Create domain
|
||||||
/api/v1/add/domain-admin:
|
/api/v1/add/domain-admin:
|
||||||
@@ -1952,21 +1967,23 @@ paths:
|
|||||||
- domain2.tld
|
- domain2.tld
|
||||||
type: success
|
type: success
|
||||||
schema:
|
schema:
|
||||||
properties:
|
type: array
|
||||||
log:
|
items:
|
||||||
description: contains request object
|
type: object
|
||||||
items: {}
|
properties:
|
||||||
type: array
|
log:
|
||||||
msg:
|
description: contains request object
|
||||||
items: {}
|
items: {}
|
||||||
type: array
|
type: array
|
||||||
type:
|
msg:
|
||||||
enum:
|
items: {}
|
||||||
- success
|
type: array
|
||||||
- danger
|
type:
|
||||||
- error
|
enum:
|
||||||
type: string
|
- success
|
||||||
type: object
|
- danger
|
||||||
|
- error
|
||||||
|
type: string
|
||||||
description: OK
|
description: OK
|
||||||
headers: {}
|
headers: {}
|
||||||
tags:
|
tags:
|
||||||
@@ -1977,14 +1994,15 @@ paths:
|
|||||||
content:
|
content:
|
||||||
application/json:
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
|
type: object
|
||||||
example:
|
example:
|
||||||
- domain.tld
|
- domain.tld
|
||||||
- domain2.tld
|
- domain2.tld
|
||||||
properties:
|
properties:
|
||||||
items:
|
items:
|
||||||
description: contains list of domains you want to delete
|
type: array
|
||||||
type: object
|
items:
|
||||||
type: object
|
type: string
|
||||||
summary: Delete domain
|
summary: Delete domain
|
||||||
/api/v1/delete/domain-admin:
|
/api/v1/delete/domain-admin:
|
||||||
post:
|
post:
|
||||||
@@ -2972,23 +2990,25 @@ paths:
|
|||||||
$ref: "#/components/responses/Unauthorized"
|
$ref: "#/components/responses/Unauthorized"
|
||||||
"200":
|
"200":
|
||||||
content:
|
content:
|
||||||
"*/*":
|
application/json:
|
||||||
schema:
|
schema:
|
||||||
properties:
|
type: array
|
||||||
log:
|
items:
|
||||||
description: contains request object
|
type: object
|
||||||
items: {}
|
properties:
|
||||||
type: array
|
log:
|
||||||
msg:
|
type: array
|
||||||
items: {}
|
description: contains request object
|
||||||
type: array
|
items: {}
|
||||||
type:
|
msg:
|
||||||
enum:
|
type: array
|
||||||
- success
|
items: {}
|
||||||
- danger
|
type:
|
||||||
- error
|
enum:
|
||||||
type: string
|
- success
|
||||||
type: object
|
- danger
|
||||||
|
- error
|
||||||
|
type: string
|
||||||
description: OK
|
description: OK
|
||||||
headers: {}
|
headers: {}
|
||||||
tags:
|
tags:
|
||||||
@@ -3056,13 +3076,33 @@ paths:
|
|||||||
if not, them you have to create "dummy" mailbox for each
|
if not, them you have to create "dummy" mailbox for each
|
||||||
address to relay
|
address to relay
|
||||||
type: boolean
|
type: boolean
|
||||||
|
relay_unknown_only:
|
||||||
|
description: Relay non-existing mailboxes only. Existing mailboxes will be delivered locally.
|
||||||
|
type: boolean
|
||||||
relayhost:
|
relayhost:
|
||||||
description: id of relayhost
|
description: id of relayhost
|
||||||
type: number
|
type: number
|
||||||
|
rl_frame:
|
||||||
|
enum:
|
||||||
|
- s
|
||||||
|
- m
|
||||||
|
- h
|
||||||
|
- d
|
||||||
|
type: string
|
||||||
|
rl_value:
|
||||||
|
description: rate limit value
|
||||||
|
type: number
|
||||||
|
tags:
|
||||||
|
description: tags for this Domain
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
type: object
|
type: object
|
||||||
items:
|
items:
|
||||||
description: contains list of domain names you want update
|
description: contains list of domain names you want update
|
||||||
type: object
|
type: array
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
type: object
|
type: object
|
||||||
summary: Update domain
|
summary: Update domain
|
||||||
/api/v1/edit/fail2ban:
|
/api/v1/edit/fail2ban:
|
||||||
|
@@ -3,7 +3,7 @@ function init_db_schema() {
|
|||||||
try {
|
try {
|
||||||
global $pdo;
|
global $pdo;
|
||||||
|
|
||||||
$db_version = "13072022_1700";
|
$db_version = "25072022_2300";
|
||||||
|
|
||||||
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
|
$stmt = $pdo->query("SHOW TABLES LIKE 'versions'");
|
||||||
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
$num_results = count($stmt->fetchAll(PDO::FETCH_ASSOC));
|
||||||
@@ -738,7 +738,7 @@ function init_db_schema() {
|
|||||||
"username" => "VARCHAR(255) NOT NULL",
|
"username" => "VARCHAR(255) NOT NULL",
|
||||||
"authmech" => "ENUM('yubi_otp', 'u2f', 'hotp', 'totp', 'webauthn')",
|
"authmech" => "ENUM('yubi_otp', 'u2f', 'hotp', 'totp', 'webauthn')",
|
||||||
"secret" => "VARCHAR(255) DEFAULT NULL",
|
"secret" => "VARCHAR(255) DEFAULT NULL",
|
||||||
"keyHandle" => "VARCHAR(255) DEFAULT NULL",
|
"keyHandle" => "VARCHAR(1023) DEFAULT NULL",
|
||||||
"publicKey" => "VARCHAR(4096) DEFAULT NULL",
|
"publicKey" => "VARCHAR(4096) DEFAULT NULL",
|
||||||
"counter" => "INT NOT NULL DEFAULT '0'",
|
"counter" => "INT NOT NULL DEFAULT '0'",
|
||||||
"certificate" => "TEXT",
|
"certificate" => "TEXT",
|
||||||
|
@@ -58,7 +58,7 @@ services:
|
|||||||
- redis
|
- redis
|
||||||
|
|
||||||
clamd-mailcow:
|
clamd-mailcow:
|
||||||
image: mailcow/clamd:1.53
|
image: mailcow/clamd:1.54
|
||||||
restart: always
|
restart: always
|
||||||
depends_on:
|
depends_on:
|
||||||
- unbound-mailcow
|
- unbound-mailcow
|
||||||
|
42
update.sh
42
update.sh
@@ -203,7 +203,7 @@ else
|
|||||||
DC_DL_SUFFIX=legacy
|
DC_DL_SUFFIX=legacy
|
||||||
fi
|
fi
|
||||||
sleep 1
|
sleep 1
|
||||||
if [[ $(which pip 2>&1) && $(pip list --local 2>&1 | grep -v DEPRECATION | grep -c docker-compose) == 1 || $(which pip3 2>&1) && $(pip3 list --local 2>&1 | grep -v DEPRECATION | grep -c docker-compose) == 1 ]]; then
|
if [[ $(command -v pip 2>&1) && $(pip list --local 2>&1 | grep -v DEPRECATION | grep -c docker-compose) == 1 || $(command -v pip3 2>&1) && $(pip3 list --local 2>&1 | grep -v DEPRECATION | grep -c docker-compose) == 1 ]]; then
|
||||||
echo -e "\e[33mFound a docker-compose Version installed with pip!\e[0m"
|
echo -e "\e[33mFound a docker-compose Version installed with pip!\e[0m"
|
||||||
echo -e "\e[31mPlease uninstall the pip Version of docker-compose since it doesn´t support Versions higher than 1.29.2.\e[0m"
|
echo -e "\e[31mPlease uninstall the pip Version of docker-compose since it doesn´t support Versions higher than 1.29.2.\e[0m"
|
||||||
sleep 2
|
sleep 2
|
||||||
@@ -214,7 +214,7 @@ else
|
|||||||
LATEST_COMPOSE=$(curl -#L https://www.servercow.de/docker-compose/latest.php)
|
LATEST_COMPOSE=$(curl -#L https://www.servercow.de/docker-compose/latest.php)
|
||||||
COMPOSE_VERSION=$(docker-compose version --short)
|
COMPOSE_VERSION=$(docker-compose version --short)
|
||||||
if [[ "$LATEST_COMPOSE" != "$COMPOSE_VERSION" ]]; then
|
if [[ "$LATEST_COMPOSE" != "$COMPOSE_VERSION" ]]; then
|
||||||
COMPOSE_PATH=$(which docker-compose)
|
COMPOSE_PATH=$(command -v docker-compose)
|
||||||
if [[ -w ${COMPOSE_PATH} ]]; then
|
if [[ -w ${COMPOSE_PATH} ]]; then
|
||||||
curl -#L https://github.com/docker/compose/releases/download/v${LATEST_COMPOSE}/docker-compose-$(uname -s)-$(uname -m) > $COMPOSE_PATH
|
curl -#L https://github.com/docker/compose/releases/download/v${LATEST_COMPOSE}/docker-compose-$(uname -s)-$(uname -m) > $COMPOSE_PATH
|
||||||
chmod +x $COMPOSE_PATH
|
chmod +x $COMPOSE_PATH
|
||||||
@@ -273,30 +273,17 @@ PATH=$PATH:/opt/bin
|
|||||||
umask 0022
|
umask 0022
|
||||||
|
|
||||||
for bin in curl docker git awk sha1sum; do
|
for bin in curl docker git awk sha1sum; do
|
||||||
if [[ -z $(which ${bin}) ]]; then
|
if [[ -z $(command -v ${bin}) ]]; then
|
||||||
echo "Cannot find ${bin}, exiting..."
|
echo "Cannot find ${bin}, exiting..."
|
||||||
exit 1;
|
exit 1;
|
||||||
elif [[ -z $(which docker-compose) ]]; then
|
|
||||||
echo -e "\e[31mCannot find docker-compose Standalone.\e[0m"
|
|
||||||
echo -e "\e[31mPlease install it manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
|
||||||
sleep 3
|
|
||||||
exit 1;
|
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
## Check if docker-compose >= v2
|
if [[ -z $(command -v docker-compose) ]]; then
|
||||||
if ! docker-compose version --short | grep "^2." > /dev/null 2>&1; then
|
echo -e "\e[31mCannot find docker-compose Standalone.\e[0m"
|
||||||
echo -e "\e[33mYour docker-compose Version is not up to date!\e[0m"
|
echo -e "\e[31mPlease install it manually regarding to this doc site: https://mailcow.github.io/mailcow-dockerized-docs/i_u_m/i_u_m_install/\e[0m"
|
||||||
echo -e "\e[33mmailcow needs docker-compose > 2.X.X!\e[0m"
|
|
||||||
echo -e "\e[33mYour current installed Version: $(docker-compose version --short)\e[0m"
|
|
||||||
sleep 3
|
sleep 3
|
||||||
update_compose
|
exit 1;
|
||||||
if [[ ! "${updatecomposeresponse}" =~ ^([yY][eE][sS]|[yY])+$ ]]; then
|
|
||||||
echo -e "\e[31mmailcow does not work with docker-compose < 2.X.X anymore!\e[0m"
|
|
||||||
echo -e "\e[31mPlease update your docker-compose manually, to run mailcow.\e[0m"
|
|
||||||
echo -e "\e[31mExiting...\e[0m"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export LC_ALL=C
|
export LC_ALL=C
|
||||||
@@ -378,6 +365,21 @@ while (($#)); do
|
|||||||
shift
|
shift
|
||||||
done
|
done
|
||||||
|
|
||||||
|
# Check if Docker-Compose is older then v2 before continuing
|
||||||
|
if ! docker-compose version --short | grep "^2." > /dev/null 2>&1; then
|
||||||
|
echo -e "\e[33mYour docker-compose Version is not up to date!\e[0m"
|
||||||
|
echo -e "\e[33mmailcow needs docker-compose > 2.X.X!\e[0m"
|
||||||
|
echo -e "\e[33mYour current installed Version: $(docker-compose version --short)\e[0m"
|
||||||
|
sleep 3
|
||||||
|
update_compose
|
||||||
|
if [[ ! "${updatecomposeresponse}" =~ ^([yY][eE][sS]|[yY])+$ ]] && [[ ! ${FORCE} ]]; then
|
||||||
|
echo -e "\e[31mmailcow does not work with docker-compose < 2.X.X anymore!\e[0m"
|
||||||
|
echo -e "\e[31mPlease update your docker-compose manually, to run mailcow.\e[0m"
|
||||||
|
echo -e "\e[31mExiting...\e[0m"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
[[ ! -f mailcow.conf ]] && { echo "mailcow.conf is missing"; exit 1;}
|
[[ ! -f mailcow.conf ]] && { echo "mailcow.conf is missing"; exit 1;}
|
||||||
chmod 600 mailcow.conf
|
chmod 600 mailcow.conf
|
||||||
source mailcow.conf
|
source mailcow.conf
|
||||||
|
Reference in New Issue
Block a user