2021-04-01 12:20:45 +02:00
<!doctype html>
< html lang = "en" class = "no-js" >
< head >
< meta charset = "utf-8" >
< meta name = "viewport" content = "width=device-width,initial-scale=1" >
< link rel = "canonical" href = "https://mailcow.github.io/mailcow-dockerized-docs/firststeps-rp/" >
< link rel = "icon" href = "../assets/images/favicon.png" >
2021-06-25 18:04:21 +02:00
< meta name = "generator" content = "mkdocs-1.2.1, mkdocs-material-7.1.9" >
2021-04-01 12:20:45 +02:00
< title > Reverse Proxy - mailcow: dockerized documentation< / title >
2021-06-06 16:14:47 +02:00
< link rel = "stylesheet" href = "../assets/stylesheets/main.ca7ac06f.min.css" >
2021-04-01 12:20:45 +02:00
2021-05-30 17:38:10 +02:00
< link rel = "stylesheet" href = "../assets/stylesheets/palette.f1a3b89f.min.css" >
2021-04-01 12:20:45 +02:00
< link rel = "preconnect" href = "https://fonts.gstatic.com" crossorigin >
< link rel = "stylesheet" href = "https://fonts.googleapis.com/css?family=Roboto:300,400,400i,700%7CRoboto+Mono&display=fallback" >
< style > : root { --md-text-font-family : "Roboto" ; --md-code-font-family : "Roboto Mono" } < / style >
< link rel = "stylesheet" href = "../extra.css" >
2021-06-12 21:21:14 +02:00
2021-04-01 12:20:45 +02:00
< / head >
< body dir = "ltr" data-md-color-scheme = "" data-md-color-primary = "none" data-md-color-accent = "none" >
< script > function _ _prefix ( e ) { return new URL ( ".." , location ) . pathname + "." + e } function _ _get ( e , t = localStorage ) { return JSON . parse ( t . getItem ( _ _prefix ( e ) ) ) } < / script >
< input class = "md-toggle" data-md-toggle = "drawer" type = "checkbox" id = "__drawer" autocomplete = "off" >
< input class = "md-toggle" data-md-toggle = "search" type = "checkbox" id = "__search" autocomplete = "off" >
< label class = "md-overlay" for = "__drawer" > < / label >
< div data-md-component = "skip" >
< a href = "#apache-24" class = "md-skip" >
Skip to content
< / a >
< / div >
< div data-md-component = "announce" >
< / div >
< header class = "md-header" data-md-component = "header" >
< nav class = "md-header__inner md-grid" aria-label = "Header" >
< a href = ".." title = "mailcow: dockerized documentation" class = "md-header__button md-logo" aria-label = "mailcow: dockerized documentation" data-md-component = "logo" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z" / > < / svg >
< / a >
< label class = "md-header__button md-icon" for = "__drawer" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2z" / > < / svg >
< / label >
< div class = "md-header__title" data-md-component = "header-title" >
< div class = "md-header__ellipsis" >
< div class = "md-header__topic" >
< span class = "md-ellipsis" >
mailcow: dockerized documentation
< / span >
< / div >
< div class = "md-header__topic" data-md-component = "header-topic" >
< span class = "md-ellipsis" >
Reverse Proxy
< / span >
< / div >
< / div >
< / div >
< label class = "md-header__button md-icon" for = "__search" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z" / > < / svg >
< / label >
< div class = "md-search" data-md-component = "search" role = "dialog" >
< label class = "md-search__overlay" for = "__search" > < / label >
< div class = "md-search__inner" role = "search" >
< form class = "md-search__form" name = "search" >
< input type = "text" class = "md-search__input" name = "query" aria-label = "Search" placeholder = "Search" autocapitalize = "off" autocorrect = "off" autocomplete = "off" spellcheck = "false" data-md-component = "search-query" data-md-state = "active" required >
< label class = "md-search__icon md-icon" for = "__search" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5z" / > < / svg >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z" / > < / svg >
< / label >
< button type = "reset" class = "md-search__icon md-icon" aria-label = "Clear" tabindex = "-1" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41z" / > < / svg >
< / button >
< / form >
< div class = "md-search__output" >
< div class = "md-search__scrollwrap" data-md-scrollfix >
< div class = "md-search-result" data-md-component = "search-result" >
< div class = "md-search-result__meta" >
Initializing search
< / div >
< ol class = "md-search-result__list" > < / ol >
< / div >
< / div >
< / div >
< / div >
< / div >
< div class = "md-header__source" >
< a href = "https://github.com/mailcow/mailcow-dockerized/" title = "Go to repository" class = "md-source" data-md-component = "source" >
< div class = "md-source__icon md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 448 512" > < path d = "M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z" / > < / svg >
< / div >
< div class = "md-source__repository" >
mailcow/mailcow-dockerized
< / div >
< / a >
< / div >
< / nav >
< / header >
< div class = "md-container" data-md-component = "container" >
< main class = "md-main" data-md-component = "main" >
< div class = "md-main__inner md-grid" >
< div class = "md-sidebar md-sidebar--primary" data-md-component = "sidebar" data-md-type = "navigation" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav class = "md-nav md-nav--primary" aria-label = "Navigation" data-md-level = "0" >
< label class = "md-nav__title" for = "__drawer" >
< a href = ".." title = "mailcow: dockerized documentation" class = "md-nav__button md-logo" aria-label = "mailcow: dockerized documentation" data-md-component = "logo" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54z" / > < / svg >
< / a >
mailcow: dockerized documentation
< / label >
< div class = "md-nav__source" >
< a href = "https://github.com/mailcow/mailcow-dockerized/" title = "Go to repository" class = "md-source" data-md-component = "source" >
< div class = "md-source__icon md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 448 512" > < path d = "M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z" / > < / svg >
< / div >
< div class = "md-source__repository" >
mailcow/mailcow-dockerized
< / div >
< / a >
< / div >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = ".." class = "md-nav__link" >
Information & Support
< / a >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_2" type = "checkbox" id = "__nav_2" >
< label class = "md-nav__link" for = "__nav_2" >
Prerequisites
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Prerequisites" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_2" >
< span class = "md-nav__icon md-icon" > < / span >
Prerequisites
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../prerequisite-system/" class = "md-nav__link" >
Prepare your system
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../prerequisite-dns/" class = "md-nav__link" >
DNS setup
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_3" type = "checkbox" id = "__nav_3" >
< label class = "md-nav__link" for = "__nav_3" >
Installation, Update & Migration
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Installation, Update & Migration" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_3" >
< span class = "md-nav__icon md-icon" > < / span >
Installation, Update & Migration
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../i_u_m_install/" class = "md-nav__link" >
Installation
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../i_u_m_update/" class = "md-nav__link" >
Update
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../i_u_m_migration/" class = "md-nav__link" >
Migration
< / a >
< / li >
2021-04-29 22:19:51 +02:00
< li class = "md-nav__item" >
< a href = "../i_u_m_deinstall/" class = "md-nav__link" >
Deinstallation
< / a >
< / li >
2021-04-01 12:20:45 +02:00
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--active md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_4" type = "checkbox" id = "__nav_4" checked >
< label class = "md-nav__link" for = "__nav_4" >
Post Installation Tasks
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Post Installation Tasks" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_4" >
< span class = "md-nav__icon md-icon" > < / span >
Post Installation Tasks
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../firststeps-ssl/" class = "md-nav__link" >
Advanced SSL
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../firststeps-disable_ipv6/" class = "md-nav__link" >
Disable IPv6
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../firststeps-ip_bindings/" class = "md-nav__link" >
IP bindings
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../firststeps-local_mta/" class = "md-nav__link" >
Local MTA on Docker host
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../firststeps-logging/" class = "md-nav__link" >
Logging
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../firststeps-relayhost/" class = "md-nav__link" >
Relayhosts
< / a >
< / li >
< li class = "md-nav__item md-nav__item--active" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "toc" type = "checkbox" id = "__toc" >
2021-04-20 22:16:43 +02:00
2021-04-01 12:20:45 +02:00
< label class = "md-nav__link md-nav__link--active" for = "__toc" >
Reverse Proxy
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< a href = "./" class = "md-nav__link md-nav__link--active" >
Reverse Proxy
< / a >
< nav class = "md-nav md-nav--secondary" aria-label = "Table of contents" >
2021-04-20 22:16:43 +02:00
2021-04-01 12:20:45 +02:00
< label class = "md-nav__title" for = "__toc" >
< span class = "md-nav__icon md-icon" > < / span >
Table of contents
< / label >
< ul class = "md-nav__list" data-md-component = "toc" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "#apache-24" class = "md-nav__link" >
Apache 2.4
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#nginx" class = "md-nav__link" >
Nginx
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#haproxy-community-supported" class = "md-nav__link" >
HAProxy (community supported)
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#traefik-v2-community-supported" class = "md-nav__link" >
Traefik v2 (community supported)
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#optional-post-hook-script-for-non-mailcow-acme-clients" class = "md-nav__link" >
Optional: Post-hook script for non-mailcow ACME clients
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#adding-additional-server-names-for-mailcow-ui" class = "md-nav__link" >
Adding additional server names for mailcow UI
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "../firststeps-rspamd_ui/" class = "md-nav__link" >
Rspamd UI
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../firststeps-snat/" class = "md-nav__link" >
SNAT
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../firststeps-sync_jobs_migration/" class = "md-nav__link" >
Sync job migration
< / a >
< / li >
< li class = "md-nav__item" >
2021-04-20 22:16:43 +02:00
< a href = "../firststeps-trust_networks/" class = "md-nav__link" >
Add trusted networks
2021-04-01 12:20:45 +02:00
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_5" type = "checkbox" id = "__nav_5" >
< label class = "md-nav__link" for = "__nav_5" >
Models
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Models" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_5" >
< span class = "md-nav__icon md-icon" > < / span >
Models
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../model-acl/" class = "md-nav__link" >
ACL
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../model-passwd/" class = "md-nav__link" >
Password hashing
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../model-sender_rcv/" class = "md-nav__link" >
Sender and receiver model
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_6" type = "checkbox" id = "__nav_6" >
< label class = "md-nav__link" for = "__nav_6" >
General Troubleshooting
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "General Troubleshooting" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_6" >
< span class = "md-nav__icon md-icon" > < / span >
General Troubleshooting
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../debug/" class = "md-nav__link" >
Introduction
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../debug-logs/" class = "md-nav__link" >
Logs
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../debug-attach_service/" class = "md-nav__link" >
Attach a Container
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../debug-reset_pw/" class = "md-nav__link" >
Reset Passwords (incl. SQL)
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../debug-mysql_upgrade/" class = "md-nav__link" >
Manual MySQL upgrade
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../debug-rm_volumes/" class = "md-nav__link" >
Remove Persistent Data
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../debug-common_problems/" class = "md-nav__link" >
Common Problems
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../debug-admin_login_sogo/" class = "md-nav__link" >
Admin login to SOGo
< / a >
< / li >
2021-04-29 22:40:22 +02:00
< li class = "md-nav__item" >
< a href = "../debug-reset-tls/" class = "md-nav__link" >
Reset TLS certificates
< / a >
< / li >
2021-04-01 12:20:45 +02:00
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_7" type = "checkbox" id = "__nav_7" >
< label class = "md-nav__link" for = "__nav_7" >
Backup & Restore
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Backup & Restore" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_7" >
< span class = "md-nav__icon md-icon" > < / span >
Backup & Restore
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_7_1" type = "checkbox" id = "__nav_7_1" >
< label class = "md-nav__link" for = "__nav_7_1" >
Helper script
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Helper script" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_7_1" >
< span class = "md-nav__icon md-icon" > < / span >
Helper script
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../b_n_r_backup/" class = "md-nav__link" >
Backup
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../b_n_r_restore/" class = "md-nav__link" >
Restore
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_7_2" type = "checkbox" id = "__nav_7_2" >
< label class = "md-nav__link" for = "__nav_7_2" >
Manually
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Manually" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_7_2" >
< span class = "md-nav__icon md-icon" > < / span >
Manually
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../u_e-backup_restore-maildir/" class = "md-nav__link" >
Maildir
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-backup_restore-mysql/" class = "md-nav__link" >
MySQL
< / a >
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_8" type = "checkbox" id = "__nav_8" >
< label class = "md-nav__link" for = "__nav_8" >
Manual/Guides/Examples
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Manual/Guides/Examples" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_8" >
< span class = "md-nav__icon md-icon" > < / span >
Manual/Guides/Examples
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_8_1" type = "checkbox" id = "__nav_8_1" >
< label class = "md-nav__link" for = "__nav_8_1" >
mailcow UI
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "mailcow UI" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_8_1" >
< span class = "md-nav__icon md-icon" > < / span >
mailcow UI
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../u_e-mailcow_ui-config/" class = "md-nav__link" >
Configuration
< / a >
< / li >
2021-05-28 11:12:28 +02:00
< li class = "md-nav__item" >
< a href = "../u_e-mailcow_ui-css/" class = "md-nav__link" >
CSS overrides
< / a >
< / li >
2021-04-01 12:20:45 +02:00
< li class = "md-nav__item" >
< a href = "../u_e-mailcow_ui-bl_wl/" class = "md-nav__link" >
Blacklist / Whitelist
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-mailcow_ui-pushover/" class = "md-nav__link" >
Pushover
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-mailcow_ui-spamfilter/" class = "md-nav__link" >
Spamfilter
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-mailcow_ui-spamalias/" class = "md-nav__link" >
Temporary email aliases
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-mailcow_ui-tagging/" class = "md-nav__link" >
Tagging
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-mailcow_ui-tfa/" class = "md-nav__link" >
Two-Factor Authentication
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-fido2/" class = "md-nav__link" >
WebAuthn / FIDO2
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_8_2" type = "checkbox" id = "__nav_8_2" >
< label class = "md-nav__link" for = "__nav_8_2" >
Postfix
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Postfix" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_8_2" >
< span class = "md-nav__icon md-icon" > < / span >
Postfix
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../u_e-postfix-custom_transport/" class = "md-nav__link" >
Custom transport maps
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-postfix-postscreen_whitelist/" class = "md-nav__link" >
Whitelist IP in Postscreen
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-postfix-extra_cf/" class = "md-nav__link" >
Customize/Expand main.cf
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-postfix-disable_sender_verification/" class = "md-nav__link" >
Disable Sender Addresses Verification
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-postfix-attachment_size/" class = "md-nav__link" >
Max. message size (attachment size)
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-postfix-pflogsumm/" class = "md-nav__link" >
Statistics with pflogsumm
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_8_3" type = "checkbox" id = "__nav_8_3" >
< label class = "md-nav__link" for = "__nav_8_3" >
Unbound
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Unbound" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_8_3" >
< span class = "md-nav__icon md-icon" > < / span >
Unbound
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../u_e-unbound-fwd/" class = "md-nav__link" >
Using an external DNS service
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_8_4" type = "checkbox" id = "__nav_8_4" >
< label class = "md-nav__link" for = "__nav_8_4" >
Dovecot
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Dovecot" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_8_4" >
< span class = "md-nav__icon md-icon" > < / span >
Dovecot
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-any_acl/" class = "md-nav__link" >
Enable "any" ACL settings
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-expunge/" class = "md-nav__link" >
Expunge a Users mails
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-extra_conf/" class = "md-nav__link" >
Customize/Expand dovecot.conf
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-fts/" class = "md-nav__link" >
FTS (Solr)
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-idle_interval/" class = "md-nav__link" >
IMAP IDLE interval
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-mail-crypt/" class = "md-nav__link" >
Mail crypt
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-more/" class = "md-nav__link" >
More Examples with DOVEADM
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-vmail-volume/" class = "md-nav__link" >
Move Maildir (vmail)
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-public_folder/" class = "md-nav__link" >
Public folders
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-dovecot-static_master/" class = "md-nav__link" >
Static master user
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_8_5" type = "checkbox" id = "__nav_8_5" >
< label class = "md-nav__link" for = "__nav_8_5" >
Nginx
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Nginx" data-md-level = "2" >
< label class = "md-nav__title" for = "__nav_8_5" >
< span class = "md-nav__icon md-icon" > < / span >
Nginx
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../u_e-nginx/" class = "md-nav__link" >
Custom sites
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-webmail-site/" class = "md-nav__link" >
Create subdomain webmail.example.org
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-redis/" class = "md-nav__link" >
Redis
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-rspamd/" class = "md-nav__link" >
Rspamd
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-sogo/" class = "md-nav__link" >
SOGo
< / a >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_8_9" type = "checkbox" id = "__nav_8_9" >
< label class = "md-nav__link" for = "__nav_8_9" >
Docker
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Docker" data-md-level = "2" >
2021-06-30 18:01:06 +02:00
< label class = "md-nav__title" for = "__nav_8_9" >
2021-04-01 12:20:45 +02:00
< span class = "md-nav__icon md-icon" > < / span >
Docker
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../u_e-docker-cust_dockerfiles/" class = "md-nav__link" >
Customize Dockerfiles
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-docker-dc_bash_compl/" class = "md-nav__link" >
Docker Compose Bash Completion
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-why_unbound/" class = "md-nav__link" >
Why unbound?
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-autodiscover_config/" class = "md-nav__link" >
Autodiscover / Autoconfig
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-80_to_443/" class = "md-nav__link" >
Redirect HTTP to HTTPS
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../u_e-reeanble-weak-protocols/" class = "md-nav__link" >
Re-enable TLS 1.0 and TLS 1.1
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_9" type = "checkbox" id = "__nav_9" >
< label class = "md-nav__link" for = "__nav_9" >
Client Configuration
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Client Configuration" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_9" >
< span class = "md-nav__icon md-icon" > < / span >
Client Configuration
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "../client/" class = "md-nav__link" >
Overview
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-android/" class = "md-nav__link" >
Android
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-apple/" class = "md-nav__link" >
Apple macOS / iOS
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-emclient/" class = "md-nav__link" >
eM Client
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-kontact/" class = "md-nav__link" >
KDE Kontact
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-outlook/" class = "md-nav__link" >
Microsoft Outlook
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-thunderbird/" class = "md-nav__link" >
Mozilla Thunderbird
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-windows/" class = "md-nav__link" >
Windows Mail
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-windowsphone/" class = "md-nav__link" >
Windows Phone
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../client/client-manual/" class = "md-nav__link" >
Manual configuration
< / a >
< / li >
< / ul >
< / nav >
< / li >
< li class = "md-nav__item md-nav__item--nested" >
< input class = "md-nav__toggle md-toggle" data-md-toggle = "__nav_10" type = "checkbox" id = "__nav_10" >
< label class = "md-nav__link" for = "__nav_10" >
Third party apps
< span class = "md-nav__icon md-icon" > < / span >
< / label >
< nav class = "md-nav" aria-label = "Third party apps" data-md-level = "1" >
< label class = "md-nav__title" for = "__nav_10" >
< span class = "md-nav__icon md-icon" > < / span >
Third party apps
< / label >
< ul class = "md-nav__list" data-md-scrollfix >
2021-04-25 09:08:57 +02:00
< li class = "md-nav__item" >
< a href = "../third_party-borgmatic/" class = "md-nav__link" >
Borgmatic Backup
< / a >
< / li >
2021-04-01 12:20:45 +02:00
< li class = "md-nav__item" >
< a href = "../third_party-exchange_onprem/" class = "md-nav__link" >
Exchange Hybrid Setup
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../third_party-gitea/" class = "md-nav__link" >
Gitea
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../third_party-gogs/" class = "md-nav__link" >
Gogs
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../third_party-mailpiler_integration/" class = "md-nav__link" >
Mailpiler Integration
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../third_party-nextcloud/" class = "md-nav__link" >
Nextcloud
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../third_party-portainer/" class = "md-nav__link" >
Portainer
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../third_party-roundcube/" class = "md-nav__link" >
Roundcube
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "../third_party-thunderbird/" class = "md-nav__link" >
SOGo Connector for Thunderbird
< / a >
< / li >
< / ul >
< / nav >
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-sidebar md-sidebar--secondary" data-md-component = "sidebar" data-md-type = "toc" >
< div class = "md-sidebar__scrollwrap" >
< div class = "md-sidebar__inner" >
< nav class = "md-nav md-nav--secondary" aria-label = "Table of contents" >
2021-04-20 22:16:43 +02:00
2021-04-01 12:20:45 +02:00
< label class = "md-nav__title" for = "__toc" >
< span class = "md-nav__icon md-icon" > < / span >
Table of contents
< / label >
< ul class = "md-nav__list" data-md-component = "toc" data-md-scrollfix >
< li class = "md-nav__item" >
< a href = "#apache-24" class = "md-nav__link" >
Apache 2.4
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#nginx" class = "md-nav__link" >
Nginx
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#haproxy-community-supported" class = "md-nav__link" >
HAProxy (community supported)
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#traefik-v2-community-supported" class = "md-nav__link" >
Traefik v2 (community supported)
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#optional-post-hook-script-for-non-mailcow-acme-clients" class = "md-nav__link" >
Optional: Post-hook script for non-mailcow ACME clients
< / a >
< / li >
< li class = "md-nav__item" >
< a href = "#adding-additional-server-names-for-mailcow-ui" class = "md-nav__link" >
Adding additional server names for mailcow UI
< / a >
< / li >
< / ul >
< / nav >
< / div >
< / div >
< / div >
< div class = "md-content" data-md-component = "content" >
< article class = "md-content__inner md-typeset" >
< a href = "https://github.com/mailcow/mailcow-dockerized-docs/edit/master/docs/firststeps-rp.md" title = "Edit this page" class = "md-content__button md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M20.71 7.04c.39-.39.39-1.04 0-1.41l-2.34-2.34c-.37-.39-1.02-.39-1.41 0l-1.84 1.83 3.75 3.75M3 17.25V21h3.75L17.81 9.93l-3.75-3.75L3 17.25z" / > < / svg >
< / a >
< h1 > Reverse Proxy< / h1 >
< p > You don't need to change the Nginx site that comes with mailcow: dockerized.
mailcow: dockerized trusts the default gateway IP 172.22.1.1 as proxy.< / p >
< p > 1. Make sure you change HTTP_BIND and HTTPS_BIND in < code > mailcow.conf< / code > to a local address and set the ports accordingly, for example:
< div class = "highlight" > < pre > < span > < / span > < code > < span class = "nv" > HTTP_BIND< / span > < span class = "o" > =< / span > < span class = "m" > 127< / span > .0.0.1
< span class = "nv" > HTTP_PORT< / span > < span class = "o" > =< / span > < span class = "m" > 8080< / span >
< span class = "nv" > HTTPS_BIND< / span > < span class = "o" > =< / span > < span class = "m" > 127< / span > .0.0.1
< span class = "nv" > HTTPS_PORT< / span > < span class = "o" > =< / span > < span class = "m" > 8443< / span >
< / code > < / pre > < / div > < / p >
< p > This will also change the bindings inside the Nginx container! This is important, if you decide to use a proxy within Docker.< / p >
< p > < strong > IMPORTANT:< / strong > Do not use port 8081, 9081 or 65510!< / p >
< p > Recreate affected containers by running < code > docker-compose up -d< / code > .< / p >
2021-04-28 20:56:33 +02:00
< p > < strong > Important information, please read them carefully!< / strong > < / p >
< div class = "admonition info" >
< p class = "admonition-title" > Info< / p >
< p > If you plan to use a reverse proxy and want to use another server name that is < strong > not< / strong > MAILCOW_HOSTNAME, you need to read < strong > Adding additional server names for mailcow UI< / strong > at the bottom of this page.< / p >
< / div >
2021-04-01 12:20:45 +02:00
< div class = "admonition warning" >
< p class = "admonition-title" > Warning< / p >
< p > Make sure you run < code > generate_config.sh< / code > before you enable any site configuration examples below.
The script < code > generate_config.sh< / code > copies snake-oil certificates to the correct location, so the services will not fail to start due to missing files.< / p >
< / div >
< div class = "admonition warning" >
< p class = "admonition-title" > Warning< / p >
< p > If you enable TLS SNI (< code > ENABLE_TLS_SNI< / code > in mailcow.conf), the certificate paths in your reverse proxy < strong > must< / strong > match the correct paths in data/assets/ssl/{hostname}. The certificates will be split into < code > data/assets/ssl/{hostname1,hostname2,etc}< / code > and therefore will not work when you copy the examples from below pointing to < code > data/assets/ssl/cert.pem< / code > etc.< / p >
< / div >
< div class = "admonition info" >
< p class = "admonition-title" > Info< / p >
< p > Using the site configs below will < strong > forward ACME requests to mailcow< / strong > and let it handle certificates itself.
The downside of using mailcow as ACME client behind a reverse proxy is, that you will need to reload your webserver after acme-mailcow changed/renewed/created the certificate. You can either reload your webserver daily or write a script to watch the file for changes.
On many servers logrotate will reload the webserver daily anyway.< / p >
< p > If you want to use a local certbot installation, you will need to change the SSL certificate parameters accordingly.
< strong > Make sure you run a post-hook script< / strong > when you decide to use external ACME clients. You will find an example at the bottom of this page.< / p >
< / div >
< p > 2. Configure your local webserver as reverse proxy:< / p >
< h3 id = "apache-24" > Apache 2.4< a class = "headerlink" href = "#apache-24" title = "Permanent link" > ¶ < / a > < / h3 >
< p > Required modules:
< div class = "highlight" > < pre > < span > < / span > < code > a2enmod rewrite proxy proxy_http headers ssl
< / code > < / pre > < / div > < / p >
< p > Let's Encrypt will follow our rewrite, certificate requests in mailcow will work fine.< / p >
< p > < strong > Take care of highlighted lines.< / strong > < / p >
< div class = "highlight" > < pre > < span > < / span > < code > < span class = "nt" > < VirtualHost< / span > < span class = "s" > *:80< / span > < span class = "nt" > > < / span >
< span class = "hll" > < span class = "nb" > ServerName< / span > CHANGE_TO_MAILCOW_HOSTNAME
< / span > < span class = "nb" > ServerAlias< / span > autodiscover.*
< span class = "nb" > ServerAlias< / span > autoconfig.*
2021-06-30 18:01:06 +02:00
< span class = "nb" > RewriteEngine< / span > < span class = "k" > on< / span >
2021-04-01 12:20:45 +02:00
< span class = "nb" > RewriteCond< / span > %{HTTPS} < span class = "k" > off< / span >
< span class = "nb" > RewriteRule< / span > ^/?(.*) https://%{HTTP_HOST}/$1 [R=301,L]
< span class = "hll" > < span class = "nb" > ProxyPass< / span > / http://127.0.0.1:8080/
< / span > < span class = "hll" > < span class = "nb" > ProxyPassReverse< / span > / http://127.0.0.1:8080/
< / span > < span class = "nb" > ProxyPreserveHost< / span > < span class = "k" > On< / span >
< span class = "nb" > ProxyAddHeaders< / span > < span class = "k" > On< / span >
< span class = "nb" > RequestHeader< / span > set X-Forwarded-Proto < span class = "s2" > " http" < / span >
< span class = "nt" > < /VirtualHost> < / span >
< span class = "nt" > < VirtualHost< / span > < span class = "s" > *:443< / span > < span class = "nt" > > < / span >
< span class = "hll" > < span class = "nb" > ServerName< / span > CHANGE_TO_MAILCOW_HOSTNAME
< / span > < span class = "nb" > ServerAlias< / span > autodiscover.*
< span class = "nb" > ServerAlias< / span > autoconfig.*
2021-06-30 18:01:06 +02:00
2021-04-01 12:20:45 +02:00
< span class = "c" > # You should proxy to a plain HTTP session to offload SSL processing< / span >
< span class = "hll" > < span class = "nb" > ProxyPass< / span > < span class = "sx" > /Microsoft-Server-ActiveSync< / span > http://127.0.0.1:8080/Microsoft-Server-ActiveSync connectiontimeout=4000
< / span > < span class = "hll" > < span class = "nb" > ProxyPassReverse< / span > < span class = "sx" > /Microsoft-Server-ActiveSync< / span > http://127.0.0.1:8080/Microsoft-Server-ActiveSync
< / span > < span class = "hll" > < span class = "nb" > ProxyPass< / span > / http://127.0.0.1:8080/
< / span > < span class = "hll" > < span class = "nb" > ProxyPassReverse< / span > / http://127.0.0.1:8080/
< / span > < span class = "nb" > ProxyPreserveHost< / span > < span class = "k" > On< / span >
< span class = "nb" > ProxyAddHeaders< / span > < span class = "k" > On< / span >
< span class = "nb" > RequestHeader< / span > set X-Forwarded-Proto < span class = "s2" > " https" < / span >
< span class = "hll" > < span class = "nb" > SSLCertificateFile< / span > MAILCOW_PATH/data/assets/ssl/cert.pem
< / span > < span class = "hll" > < span class = "nb" > SSLCertificateKeyFile< / span > MAILCOW_PATH/data/assets/ssl/key.pem
< / span >
< span class = "c" > # If you plan to proxy to a HTTPS host:< / span >
< span class = "c" > #SSLProxyEngine On< / span >
< span class = "c" > # If you plan to proxy to an untrusted HTTPS host:< / span >
< span class = "c" > #SSLProxyVerify none< / span >
< span class = "c" > #SSLProxyCheckPeerCN off< / span >
< span class = "c" > #SSLProxyCheckPeerName off< / span >
< span class = "c" > #SSLProxyCheckPeerExpire off< / span >
< span class = "nt" > < /VirtualHost> < / span >
< / code > < / pre > < / div >
< h3 id = "nginx" > Nginx< a class = "headerlink" href = "#nginx" title = "Permanent link" > ¶ < / a > < / h3 >
< p > Let's Encrypt will follow our rewrite, certificate requests will work fine.< / p >
< p > < strong > Take care of highlighted lines.< / strong > < / p >
< div class = "highlight" > < pre > < span > < / span > < code > server {
listen 80 default_server;
listen [::]:80 default_server;
2021-06-30 18:01:06 +02:00
< span class = "hll" > server_name CHANGE_TO_MAILCOW_HOSTNAME autodiscover.* autoconfig.*;
2021-04-01 12:20:45 +02:00
< / span > return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
2021-06-30 18:01:06 +02:00
< span class = "hll" > server_name CHANGE_TO_MAILCOW_HOSTNAME autodiscover.* autoconfig.*;
2021-04-01 12:20:45 +02:00
< / span >
< span class = "hll" > ssl_certificate MAILCOW_PATH/data/assets/ssl/cert.pem;
< / span > < span class = "hll" > ssl_certificate_key MAILCOW_PATH/data/assets/ssl/key.pem;
< / span > ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# See https://ssl-config.mozilla.org/#server=nginx for the latest ssl settings recommendations
# An example config is given below
ssl_protocols TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5:!SHA1:!kRSA;
ssl_prefer_server_ciphers off;
location /Microsoft-Server-ActiveSync {
< span class = "hll" > proxy_pass http://127.0.0.1:8080/Microsoft-Server-ActiveSync;
< / span > proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 75;
proxy_send_timeout 3650;
proxy_read_timeout 3650;
proxy_buffers 64 256k;
client_body_buffer_size 512k;
client_max_body_size 0;
}
location / {
< span class = "hll" > proxy_pass http://127.0.0.1:8080/;
< / span > proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
client_max_body_size 0;
}
}
< / code > < / pre > < / div >
< h3 id = "haproxy-community-supported" > HAProxy (community supported)< a class = "headerlink" href = "#haproxy-community-supported" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "admonition warning" >
< p class = "admonition-title" > Warning< / p >
< p > This is an unsupported community contribution. Feel free to provide fixes.< / p >
< / div >
< p > < strong > Important/Fixme< / strong > : This example only forwards HTTPS traffic and does not use mailcows built-in ACME client.< / p >
< div class = "highlight" > < pre > < span > < / span > < code > frontend https-in
bind :::443 v4v6 ssl crt mailcow.pem
default_backend mailcow
backend mailcow
option forwardfor
http-request set-header X-Forwarded-Proto https if { ssl_fc }
http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
server mailcow 127.0.0.1:8080 check
< / code > < / pre > < / div >
< h3 id = "traefik-v2-community-supported" > Traefik v2 (community supported)< a class = "headerlink" href = "#traefik-v2-community-supported" title = "Permanent link" > ¶ < / a > < / h3 >
< div class = "admonition warning" >
< p class = "admonition-title" > Warning< / p >
< p > This is an unsupported community contribution. Feel free to provide fixes.< / p >
< / div >
< p > < strong > Important< / strong > : This config only covers the "reverseproxing" of the webpannel (nginx-mailcow) using Traefik v2, if you also want to reverseproxy the mail services such as dovecot, postfix... you'll just need to adapt the following config to each container and create an < a href = "https://docs.traefik.io/routing/entrypoints/" > EntryPoint< / a > on your < code > traefik.toml< / code > or < code > traefik.yml< / code > (depending which config you use) for each port. < / p >
< p > For this section we'll assume you have your Traefik 2 < code > [certificatesresolvers]< / code > properly configured on your traefik configuration file, and also using acme, also, the following example uses Lets Encrypt, but feel free to change it to your own cert resolver. You can find a basic Traefik 2 toml config file with all the above implemented which can be used for this example here < a href = "https://github.com/Frenzoid/TraefikBasicConfig/blob/master/traefik.toml" > traefik.toml< / a > if you need one, or a hint on how to adapt your config.< / p >
< p > So, first of all, we are going to disable the acme-mailcow container since we'll use the certs that traefik will provide us.
For this we'll have to set < code > SKIP_LETS_ENCRYPT=y< / code > on our < code > mailcow.conf< / code > , and run < code > docker-compose up -d< / code > to apply the changes.< / p >
< p > Then we'll create a < code > docker-compose.override.yml< / code > file in order to override the main < code > docker-compose.yml< / code > found in your mailcow root folder. < / p >
< div class = "highlight" > < pre > < span > < / span > < code > version: ' 2.1'
services:
nginx-mailcow:
networks:
# add Traefik' s network
web:
labels:
- traefik.enable=true
# Creates a router called " moo" for the container, and sets up a rule to link the container to certain rule,
# in this case, a Host rule with our MAILCOW_HOSTNAME var.
- traefik.http.routers.moo.rule=Host(`${MAILCOW_HOSTNAME}`)
# Enables tls over the router we created before.
- traefik.http.routers.moo.tls=true
# Specifies which kind of cert resolver we' ll use, in this case le (Lets Encrypt).
- traefik.http.routers.moo.tls.certresolver=le
# Creates a service called " moo" for the container, and specifies which internal port of the container
# should traefik route the incoming data to.
- traefik.http.services.moo.loadbalancer.server.port=80
# Specifies which entrypoint (external port) should traefik listen to, for this container.
# websecure being port 443, check the traefik.toml file liked above.
- traefik.http.routers.moo.entrypoints=secure
# Make sure traefik uses the web network, not the mailcowdockerized_mailcow-network
- traefik.docker.network=web
certdumper:
image: humenius/traefik-certs-dumper
container_name: traefik_certdumper
network_mode: none
volumes:
# mount the folder which contains Traefik' s `acme.json' file
# in this case Traefik is started from its own docker-compose in ../traefik
- ../traefik/data:/traefik:ro
# mount mailcow' s SSL folder
- ./data/assets/ssl/:/output:rw
environment:
# only change this, if you' re using another domain for mailcow' s web frontend compared to the standard config
- DOMAIN=${MAILCOW_HOSTNAME}
networks:
web:
external: true
< / code > < / pre > < / div >
< p > Start the new containers with < code > docker-compose up -d< / code > .< / p >
< p > Now, there's only one thing left to do, which is setup the certs so that the mail services can use them as well, since Traefik 2 uses an acme v2 format to save ALL the license from all the domains we have, we'll need to find a way to dump the certs, lucky we have < a href = "https://hub.docker.com/r/humenius/traefik-certs-dumper" > this tiny container< / a > which grabs the < code > acme.json< / code > file trough a volume, and a variable < code > DOMAIN=example.org< / code > , and with these, the container will output the < code > cert.pem< / code > and < code > key.pem< / code > files, for this we'll simply run the < code > traefik-certs-dumper< / code > container binding the < code > /traefik< / code > volume to the folder where our < code > acme.json< / code > is saved, bind the < code > /output< / code > volume to our mailcow < code > data/assets/ssl/< / code > folder, and set up the < code > DOMAIN=example.org< / code > variable to the domain we want the certs dumped from. < / p >
< p > This container will watch over the < code > acme.json< / code > file for any changes, and regenerate the < code > cert.pem< / code > and < code > key.pem< / code > files directly into < code > data/assets/ssl/< / code > being the path binded to the container's < code > /output< / code > path.< / p >
< p > You can use the command line to run it, or use the docker-compose shown < a href = "https://hub.docker.com/r/humenius/traefik-certs-dumper" > here< / a > .< / p >
< p > After we have the certs dumped, we'll have to reload the configs from our postfix and dovecot containers, and check the certs, you can see how < a href = "https://mailcow.github.io/mailcow-dockerized-docs/firststeps-ssl/#how-to-use-your-own-certificate" > here< / a > .< / p >
< p > Aaand that should be it 😊, you can check if the Traefik router works fine trough Traefik's dashboard / traefik logs / accessing the setted domain trough https, or / and check HTTPS, SMTP and IMAP trough the commands shown on the page linked before.< / p >
< h3 id = "optional-post-hook-script-for-non-mailcow-acme-clients" > Optional: Post-hook script for non-mailcow ACME clients< a class = "headerlink" href = "#optional-post-hook-script-for-non-mailcow-acme-clients" title = "Permanent link" > ¶ < / a > < / h3 >
< p > Using a local certbot (or any other ACME client) requires to restart some containers, you can do this with a post-hook script.
Make sure you change the paths accordingly:
< div class = "highlight" > < pre > < span > < / span > < code > #!/bin/bash
cp /etc/letsencrypt/live/my.domain.tld/fullchain.pem /opt/mailcow-dockerized/data/assets/ssl/cert.pem
cp /etc/letsencrypt/live/my.domain.tld/privkey.pem /opt/mailcow-dockerized/data/assets/ssl/key.pem
postfix_c=$(docker ps -qaf name=postfix-mailcow)
dovecot_c=$(docker ps -qaf name=dovecot-mailcow)
nginx_c=$(docker ps -qaf name=nginx-mailcow)
docker restart ${postfix_c} ${dovecot_c} ${nginx_c}
< / code > < / pre > < / div > < / p >
< h3 id = "adding-additional-server-names-for-mailcow-ui" > Adding additional server names for mailcow UI< a class = "headerlink" href = "#adding-additional-server-names-for-mailcow-ui" title = "Permanent link" > ¶ < / a > < / h3 >
< p > If you plan to use a server name that is not < code > MAILCOW_HOSTNAME< / code > in your reverse proxy, make sure to populate that name in mailcow.conf via < code > ADDITIONAL_SERVER_NAMES< / code > first. Names must be separated by commas and < strong > must not< / strong > contain spaces. If you skip this step, mailcow may respond to your reverse proxy with an incorrect site.< / p >
< div class = "highlight" > < pre > < span > < / span > < code > ADDITIONAL_SERVER_NAMES=webmail.domain.tld,other.example.tld
< / code > < / pre > < / div >
< p > Run < code > docker-compose up -d< / code > to apply.< / p >
< / article >
< / div >
< / div >
< / main >
< footer class = "md-footer" >
< nav class = "md-footer__inner md-grid" aria-label = "Footer" >
2021-06-06 16:14:47 +02:00
< a href = "../firststeps-relayhost/" class = "md-footer__link md-footer__link--prev" aria-label = "Previous: Relayhosts" rel = "prev" >
2021-04-01 12:20:45 +02:00
< div class = "md-footer__button md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12z" / > < / svg >
< / div >
< div class = "md-footer__title" >
< div class = "md-ellipsis" >
< span class = "md-footer__direction" >
Previous
< / span >
Relayhosts
< / div >
< / div >
< / a >
2021-06-06 16:14:47 +02:00
< a href = "../firststeps-rspamd_ui/" class = "md-footer__link md-footer__link--next" aria-label = "Next: Rspamd UI" rel = "next" >
2021-04-01 12:20:45 +02:00
< div class = "md-footer__title" >
< div class = "md-ellipsis" >
< span class = "md-footer__direction" >
Next
< / span >
Rspamd UI
< / div >
< / div >
< div class = "md-footer__button md-icon" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 24 24" > < path d = "M4 11v2h12l-5.5 5.5 1.42 1.42L19.84 12l-7.92-7.92L10.5 5.5 16 11H4z" / > < / svg >
< / div >
< / a >
< / nav >
< div class = "md-footer-meta md-typeset" >
< div class = "md-footer-meta__inner md-grid" >
< div class = "md-footer-copyright" >
< div class = "md-footer-copyright__highlight" >
Copyright © 2021 André Peters
< / div >
Made with
< a href = "https://squidfunk.github.io/mkdocs-material/" target = "_blank" rel = "noopener" >
Material for MkDocs
< / a >
< / div >
< div class = "md-footer-social" >
< a href = "https://mailcow.email" target = "_blank" rel = "noopener" title = "mailcow.email" class = "md-footer-social__link" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 496 512" > < path d = "M248 8C111.03 8 0 119.03 0 256s111.03 248 248 248 248-111.03 248-248S384.97 8 248 8zm82.29 357.6c-3.9 3.88-7.99 7.95-11.31 11.28-2.99 3-5.1 6.7-6.17 10.71-1.51 5.66-2.73 11.38-4.77 16.87l-17.39 46.85c-13.76 3-28 4.69-42.65 4.69v-27.38c1.69-12.62-7.64-36.26-22.63-51.25-6-6-9.37-14.14-9.37-22.63v-32.01c0-11.64-6.27-22.34-16.46-27.97-14.37-7.95-34.81-19.06-48.81-26.11-11.48-5.78-22.1-13.14-31.65-21.75l-.8-.72a114.792 114.792 0 0 1-18.06-20.74c-9.38-13.77-24.66-36.42-34.59-51.14 20.47-45.5 57.36-82.04 103.2-101.89l24.01 12.01C203.48 89.74 216 82.01 216 70.11v-11.3c7.99-1.29 16.12-2.11 24.39-2.42l28.3 28.3c6.25 6.25 6.25 16.38 0 22.63L264 112l-10.34 10.34c-3.12 3.12-3.12 8.19 0 11.31l4.69 4.69c3.12 3.12 3.12 8.19 0 11.31l-8 8a8.008 8.008 0 0 1-5.66 2.34h-8.99c-2.08 0-4.08.81-5.58 2.27l-9.92 9.65a8.008 8.008 0 0 0-1.58 9.31l15.59 31.19c2.66 5.32-1.21 11.58-7.15 11.58h-5.64c-1.93 0-3.79-.7-5.24-1.96l-9.28-8.06a16.017 16.017 0 0 0-15.55-3.1l-31.17 10.39a11.95 11.95 0 0 0-8.17 11.34c0 4.53 2.56 8.66 6.61 10.69l11.08 5.54c9.41 4.71 19.79 7.16 30.31 7.16s22.59 27.29 32 32h66.75c8.49 0 16.62 3.37 22.63 9.37l13.69 13.69a30.503 30.503 0 0 1 8.93 21.57 46.536 46.536 0 0 1-13.72 32.98zM417 274.25c-5.79-1.45-10.84-5-14.15-9.97l-17.98-26.97a23.97 23.97 0 0 1 0-26.62l19.59-29.38c2.32-3.47 5.5-6.29 9.24-8.15l12.98-6.49C440.2 193.59 448 223.87 448 256c0 8.67-.74 17.16-1.82 25.54L417 274.25z" / > < / svg >
< / a >
< a href = "https://github.com/mailcow" target = "_blank" rel = "noopener" title = "github.com" class = "md-footer-social__link" >
< svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 480 512" > < path d = "M186.1 328.7c0 20.9-10.9 55.1-36.7 55.1s-36.7-34.2-36.7-55.1 10.9-55.1 36.7-55.1 36.7 34.2 36.7 55.1zM480 278.2c0 31.9-3.2 65.7-17.5 95-37.9 76.6-142.1 74.8-216.7 74.8-75.8 0-186.2 2.7-225.6-74.8-14.6-29-20.2-63.1-20.2-95 0-41.9 13.9-81.5 41.5-113.6-5.2-15.8-7.7-32.4-7.7-48.8 0-21.5 4.9-32.3 14.6-51.8 45.3 0 74.3 9 108.8 36 29-6.9 58.8-10 88.7-10 27 0 54.2 2.9 80.4 9.2 34-26.7 63-35.2 107.8-35.2 9.8 19.5 14.6 30.3 14.6 51.8 0 16.4-2.6 32.7-7.7 48.2 27.5 32.4 39 72.3 39 114.2zm-64.3 50.5c0-43.9-26.7-82.6-73.5-82.6-18.9 0-37 3.4-56 6-14.9 2.3-29.8 3.2-45.1 3.2-15.2 0-30.1-.9-45.1-3.2-18.7-2.6-37-6-56-6-46.8 0-73.5 38.7-73.5 82.6 0 87.8 80.4 101.3 150.4 101.3h48.2c70.3 0 150.6-13.4 150.6-101.3zm-82.6-55.1c-25.8 0-36.7 34.2-36.7 55.1s10.9 55.1 36.7 55.1 36.7-34.2 36.7-55.1-10.9-55.1-36.7-55.1z" / > < / svg >
< / a >
< / div >
< / div >
< / div >
< / footer >
< / div >
< div class = "md-dialog" data-md-component = "dialog" >
< div class = "md-dialog__inner md-typeset" > < / div >
< / div >
2021-06-25 18:04:21 +02:00
< script id = "__config" type = "application/json" > { "base" : ".." , "features" : [ ] , "translations" : { "clipboard.copy" : "Copy to clipboard" , "clipboard.copied" : "Copied to clipboard" , "search.config.lang" : "en" , "search.config.pipeline" : "trimmer, stopWordFilter" , "search.config.separator" : "[\\s\\-]+" , "search.placeholder" : "Search" , "search.result.placeholder" : "Type to start searching" , "search.result.none" : "No matching documents" , "search.result.one" : "1 matching document" , "search.result.other" : "# matching documents" , "search.result.more.one" : "1 more on this page" , "search.result.more.other" : "# more on this page" , "search.result.term.missing" : "Missing" , "select.version.title" : "Select version" } , "search" : "../assets/javascripts/workers/search.477d984a.min.js" , "version" : null } < / script >
2021-04-01 12:20:45 +02:00
2021-06-25 18:04:21 +02:00
< script src = "../assets/javascripts/bundle.82b56eb2.min.js" > < / script >
2021-04-01 12:20:45 +02:00
< script src = "../clients.js" > < / script >
< / body >
< / html >