diff options
Diffstat (limited to 'services/docker')
-rw-r--r-- | services/docker/auto-backup/Dockerfile | 5 | ||||
-rwxr-xr-x | services/docker/auto-backup/daemon.bash | 24 | ||||
-rw-r--r-- | services/docker/auto-backup/rclone.conf | 4 | ||||
-rw-r--r-- | services/docker/mail-server/Dockerfile | 11 | ||||
-rwxr-xr-x | services/docker/mail-server/app/main.bash | 11 | ||||
-rw-r--r-- | services/docker/mail-server/aws-lambda.js | 23 | ||||
-rw-r--r-- | services/docker/mail-server/dovecot.conf | 197 | ||||
-rw-r--r-- | services/docker/nginx/configs/templates/mail.conf.template | 8 |
8 files changed, 262 insertions, 21 deletions
diff --git a/services/docker/auto-backup/Dockerfile b/services/docker/auto-backup/Dockerfile index e376174..147be21 100644 --- a/services/docker/auto-backup/Dockerfile +++ b/services/docker/auto-backup/Dockerfile @@ -1,13 +1,12 @@ FROM debian RUN apt-get update && apt-get install -y \ - tini ca-certificates coreutils tar zstd \ + tini ca-certificates coreutils tar zstd rclone \ && rm -rf /var/lib/apt/lists/* ENV CRUPEST_AUTO_BACKUP_INIT_DELAY= ENV CRUPEST_AUTO_BACKUP_INTERVAL=1d -ADD --chmod=755 https://github.com/tencentyun/coscli/releases/download/v1.0.3/coscli-v1.0.3-linux-amd64 /app/coscli -ADD daemon.bash /app/ +ADD daemon.bash rclone.conf /app/ VOLUME [ "/data" ] diff --git a/services/docker/auto-backup/daemon.bash b/services/docker/auto-backup/daemon.bash index ff670e3..c82e2d0 100755 --- a/services/docker/auto-backup/daemon.bash +++ b/services/docker/auto-backup/daemon.bash @@ -15,21 +15,20 @@ success() { echo -e "\033[32mSuccess: " "$@" "\033[0m" } -if [[ -z "$CRUPEST_AUTO_BACKUP_INTERVAL" ]]; then - die "Backup interval not set, please set it!" -fi +[[ -n "$CRUPEST_AUTO_BACKUP_INTERVAL" ]] || die "Backup interval not set, please set it!" note "Checking secrets..." -[[ -n "$CRUPEST_AUTO_BACKUP_COS_ENDPOINT" ]] || die "COS endpoint not set!" -[[ -n "$CRUPEST_AUTO_BACKUP_COS_BUCKET" ]] || die "COS bucket not set!" -[[ -n "$CRUPEST_AUTO_BACKUP_COS_SECRET_ID" ]] || die "COS secret ID not set!" -[[ -n "$CRUPEST_AUTO_BACKUP_COS_SECRET_KEY" ]] || die "COS secret key not set!" +[[ -n "$RCLONE_S3_PROVIDER" ]] || die "S3 provider not set!" +[[ -n "$RCLONE_S3_ENDPOINT" ]] || die "S3 endpoint not set!" +[[ -n "$RCLONE_S3_ACCESS_KEY_ID" ]] || die "S3 AccessKey ID not set!" +[[ -n "$RCLONE_S3_SECRET_ACCESS_KEY" ]] || die "S3 AccessKey Secret not set!" +[[ -n "$CRUPEST_AUTO_BACKUP_S3_BUCKET" ]] || die "S3 bucket not set!" success "Secrets check passed." note "Checking tools..." tar --version zstd --version -/app/coscli --version +rclone --version success "Tools check passed." echo "Backup interval set to $CRUPEST_AUTO_BACKUP_INTERVAL..." @@ -57,13 +56,10 @@ function backup { du -h "$tmp_file" | cut -f1 | xargs echo "Size of $tmp_file:" des_file_name="$current_time.$backup_file_ext" - echo "Upload $des_file_name to COS..." + echo "Upload $des_file_name to S3..." - /app/coscli --init-skip \ - --secret-id "${CRUPEST_AUTO_BACKUP_COS_SECRET_ID}" \ - --secret-key "${CRUPEST_AUTO_BACKUP_COS_SECRET_KEY}" \ - --endpoint "${CRUPEST_AUTO_BACKUP_COS_ENDPOINT}" \ - cp "$tmp_file" "cos://${CRUPEST_AUTO_BACKUP_COS_BUCKET}/$des_file_name" + rclone --config=/app/rclone.conf copyto \ + "$tmp_file" "remote://${CRUPEST_AUTO_BACKUP_S3_BUCKET}/$des_file_name" echo "Remove tmp file..." rm "$tmp_file" diff --git a/services/docker/auto-backup/rclone.conf b/services/docker/auto-backup/rclone.conf new file mode 100644 index 0000000..0cf3b64 --- /dev/null +++ b/services/docker/auto-backup/rclone.conf @@ -0,0 +1,4 @@ +[remote] +type = s3 +env_auth = true +no_check_bucket = true diff --git a/services/docker/mail-server/Dockerfile b/services/docker/mail-server/Dockerfile new file mode 100644 index 0000000..7a3be9a --- /dev/null +++ b/services/docker/mail-server/Dockerfile @@ -0,0 +1,11 @@ +FROM denoland/deno AS deno-build +COPY --from=deno . /workdir/ +WORKDIR /workdir +RUN deno install +RUN deno task compile:mail-relay + +FROM dovecot/dovecot:latest-root +COPY --from=deno-build /workdir/mail-relay/out/crupest-relay /app/ +ADD dovecot.conf /etc/dovecot/dovecot.conf +ADD app/* /app/ +CMD ["/app/main.bash"] diff --git a/services/docker/mail-server/app/main.bash b/services/docker/mail-server/app/main.bash new file mode 100755 index 0000000..70c9b75 --- /dev/null +++ b/services/docker/mail-server/app/main.bash @@ -0,0 +1,11 @@ +#!/usr/bin/bash + +set -e -o pipefail + +die() { + echo "$@" >&2 + exit 1 +} + +/app/crupest-relay serve --real & +/dovecot/sbin/dovecot -F diff --git a/services/docker/mail-server/aws-lambda.js b/services/docker/mail-server/aws-lambda.js new file mode 100644 index 0000000..d240c1a --- /dev/null +++ b/services/docker/mail-server/aws-lambda.js @@ -0,0 +1,23 @@ +export const handler = async (event, context, callback) => { + const sesNotification = event.Records[0].ses; + console.log("SES Notification:\n", JSON.stringify(sesNotification, null, 2)); + + const res = await fetch( + `https://mail.crupest.life/${process.env.CRUPEST_MAIL_SERVER_AWS_INBOUND_PATH}`, + { + method: "POST", + headers: { + "content-type": "application/json", + "Authorization": process.env.CRUPEST_MAIL_SERVER_AWS_INBOUND_KEY, + }, + body: JSON.stringify({ + key: sesNotification.mail.messageId, + recipients: sesNotification.receipt.recipients, + }), + }, + ); + console.log(res); + console.log(res.text()); + + callback(null, { "disposition": "CONTINUE" }); +}; diff --git a/services/docker/mail-server/dovecot.conf b/services/docker/mail-server/dovecot.conf new file mode 100644 index 0000000..5d2eaf4 --- /dev/null +++ b/services/docker/mail-server/dovecot.conf @@ -0,0 +1,197 @@ +dovecot_config_version = 2.4.1 +dovecot_storage_version = 2.4.0 + +base_dir = /run/dovecot +state_dir = /run/dovecot +log_path = /dev/stdout + +protocols = imap submission lmtp sieve +sendmail_path = /app/out/crupest-relay sendmail +submission_relay_host = 127.0.0.1 +submission_relay_port = 2346 +submission_relay_trusted = yes + +mail_driver = maildir +mail_home = /data/vmail/%{user | domain}/%{user | username} +mail_path = ~/mail +mail_log_events = delete undelete expunge save copy mailbox_create mailbox_delete mailbox_rename flag_change + +# Setup default mailboxes for inbox namespace +@mailbox_defaults = english + +namespace inbox { + mailbox Archive { + special_use = "\\Archive" + } +} + +mail_plugins { + fts = yes + fts_flatcurve = yes + mail_log = yes + notify = yes +} + +fts_autoindex = yes +fts_autoindex_max_recent_msgs = 999 +fts_search_add_missing = yes +language_filters = normalizer-icu snowball stopwords + +language_tokenizers = generic email-address +language_tokenizer_generic_algorithm = simple + +language en { + default = yes + filters = lowercase snowball english-possessive stopwords +} + +fts flatcurve { + substring_search = yes +} + +auth_mechanisms = plain login + +passdb passwd-file { + passwd_file_path = /data/userdb + default_password_scheme = SHA512-CRYPT +} + +userdb passwd-file { + passwd_file_path = /data/userdb + fields { + uid:default = vmail + gid:default = vmail + home:default = /data/vmail/%{user | domain}/%{user | username} + } +} + +ssl = yes +ssl_server { + cert_file = /etc/dovecot/ssl/tls.crt + key_file = /etc/dovecot/ssl/tls.key +} + +protocol imap { + mail_plugins { + imap_sieve = yes + imap_filter_sieve = yes + } +} + +protocol lmtp { + mail_plugins { + sieve = yes + } +} + +protocol lda { + mail_plugins { + sieve = yes + } +} + +service imap-login { + process_min_avail = 1 + client_limit = 100 +} + +service pop3-login { + process_min_avail = 1 + client_limit = 100 +} + +service submission-login { + process_min_avail = 1 + client_limit = 100 + + inet_listener submissions { + port = 465 + ssl = yes + } +} + +service managesieve-login { + process_min_avail = 1 + client_limit = 100 +} + +sieve_plugins = sieve_imapsieve sieve_extprograms + +event_exporter log { + format = json + time_format = rfc3339 +} + +# Add default backend metrics +@metric_defaults = backend + +# Log auth failures +metric auth_failures { + filter = event=auth_request_finished AND NOT success=yes + exporter = log +} + +metric imap_command { + filter = event=imap_command_finished + group_by cmd_name { + method discrete { + } + } + group_by tagged_reply_state { + method discrete { + } + } +} + +metric smtp_command { + filter = event=smtp_server_command_finished and protocol=submission + group_by cmd_name { + method discrete { + } + } + group_by status_code { + method discrete { + } + } + group_by duration { + method exponential { + base = 10 + min_magnitude = 1 + max_magnitude = 5 + } + } +} + +metric lmtp_command { + filter = event=smtp_server_command_finished and protocol=lmtp + group_by cmd_name { + method discrete { + } + } + group_by status_code { + method discrete { + } + } + group_by duration { + method exponential { + base = 10 + min_magnitude = 1 + max_magnitude = 5 + } + } +} + +# Add duration metrics for deliveries +metric mail_deliveries { + filter = event=mail_delivery_finished + group_by duration { + method exponential { + base = 10 + min_magnitude = 1 + max_magnitude = 5 + } + } +} + +!include_try vendor.d/*.conf +!include_try conf.d/*.conf diff --git a/services/docker/nginx/configs/templates/mail.conf.template b/services/docker/nginx/configs/templates/mail.conf.template index 7f5f215..c47630f 100644 --- a/services/docker/nginx/configs/templates/mail.conf.template +++ b/services/docker/nginx/configs/templates/mail.conf.template @@ -6,14 +6,14 @@ server { root /srv/mail; } - location / { + location = /${CRUPEST_MAIL_SERVER_AWS_INBOUND_PATH} { include common/proxy-common; - proxy_pass http://roundcubemail:80/; + proxy_pass http://mail-server:2345/${CRUPEST_MAIL_SERVER_AWS_INBOUND_PATH}; } - location /rspamd/ { + location / { include common/proxy-common; - proxy_pass http://mailserver:11334/; + proxy_pass http://roundcubemail:80/; } client_max_body_size 5G; |