[TOC] # 簡介 Sretw IT 架構包含主要6部分. 1.NAS公司內部自我運行的伺服器 2.Domain 網域 3.公司網站 4.網路保護 5.VPN伺服器 6.郵件系統 # 注意事先閱讀 如需要工程部分進行架或設定設請先了解: - [路由器IP指定](#內部機器-IP-和指定) - [網域](#網域) - [Cloudflare](#Cloudflare-雲端) - [VPN伺服器](#VPN伺服器) - [SSH安全連線](SSH安全連線到公司內部機器) 如果只需要使用服務部分: - [NAS服務](#NAS-伺服器-amp-DDNS-amp-服務) - [郵件信箱](#使用者) **目前郵件系統已轉至Mailcow, Synology Mail Server plus目前已暫停使用** # 內部機器 IP 和指定 指定 IP 給特定機器. 下面有2台機器需要被指定IP, 以便於日後做通信埠轉發. - **Synology NAS**: 192.168.50.228 - **Ubuntu-Server(Mailcow郵件伺服器虛擬機器)**: 192.168.50.46 請登入公司路由器並依照下面圖示設定. ![Screenshot 2025-05-16 084137](https://hackmd.io/_uploads/SkKXiWVZxg.png) ![Screenshot 2025-05-16 084224](https://hackmd.io/_uploads/ByG4i-EWeg.png) # NAS 伺服器 & DDNS & 服務 公司內部運行的伺服器, 主要提供各種伺服器服務給員工.  **NAS的ddns為 sretw1822.i234.me** 提供的服務包含以下: - https://nas.sretw.com 可登入 DSM NAS 機器 - https://nas.sretw.com/mail 郵件 - https://nas.sretw.com/calendar 日曆 - https://nas.sretw.com/chat 聊天 - https://nas.sretw.com/contacts 通訊名單 - https://nas.sretw.com/file 資料夾檔案 - https://nas.sretw.com/drive 個人的硬碟空間 - https://dav.sretw.com 可用 WebDAV 軟體(類似於 SMB)來連入做檔案管理 - https://mailcow.sretw.com 郵件信箱使用者登入 - https://mailcow.sretw.com/admin 郵件信箱管理員登入 **注意郵件伺服器已改用Mailcow因此以下敘述是之前使用的為了保留資訊以下敘述不刪除**: **Synology MailPlus Server** 是公司正在用的郵件伺服器. 可透過FQDN: mail.sretw.com 用任何客戶端App連接. 接收郵件協定有 SMTP, IMAP, POP3, 寄送郵件限定 SMTP. 該郵件伺服器啟用 Relay(中繼伺服器), 中繼伺服器目前用 [Mailjet ](https://www.mailjet.com/) 因此傳送郵件與接收郵件都會透過中繼伺服器. # 網域 公司網域名子是 **sretw.com** 該網域目前從提供商 [Namecheap](https://www.namecheap.com/?gad_source=1) 購賣並提供該網域名子. ## Domain 網域提供商 [Namecheap](https://www.namecheap.com/?gad_source=1) 是網域提供商因此任何網域問題請洽 [Namecheap](https://www.namecheap.com/?gad_source=1) 技術支援部門. ## EasyWP wordpress 網站 sretw.com 是公司網站網址也可透過該網址 www.sretw.com 進入網站. 網站伺服器是由 [Namecheap](https://www.namecheap.com/?gad_source=1) 的 EeasyWP服務提供. 任何網站相關設定都須到EasyWP管理介面做設定. ## Cloudflare 是附加在網域上額外的功能. 網域必須要做轉移提供商到Cloudflare才能用Cloudflare功能. **在這由於不想更換網域提供商並且要有Cloudflare功能所以在轉換的時候把它卡在等待授權的狀態. 在這之下可以不做轉移並且能用到Cloudflare功能.** 所有相關DNS紀錄設定都必須在Cloudflare上完成. # 公司網站 sretw.com 是公司網站網址也可透過該網址 www.sretw.com 進入網站. 相關網站伺服器參考 [EasyWP wordpress 網站](#EasyWP-wordpress-網站). # 網路保護 網路保護除了 NAS 本身自己以外又加一層由 Cloudflare 提供的保護. 保護有分2種: - [DNS proxy](https://www.cloudflare.com/zh-tw/cloudflare-vs-google-dns/) - [Zero Trust](https://www.cloudflare.com/zh-tw/lp/ppc/zero-trust-network-access-x/?campaignid=71700000118902876&adgroupid=58700008723179172&creativeid=701003562429&gad_source=1) **注意: Synology MailPlus server 並沒有使用 Cloudflare 保護只有 Synology MailPlus server 和 [Mailjet ](https://www.mailjet.com/) 的保護而已.** ## Cloudflare 雲端 [Cloudflare](https://www.cloudflare.com/) 是一層外加得網路防護. 也帶作為 sretw.com 代理伺服器. 目前 sretw.com 網域由 Namecheap 提供, 但因為要使用 [Cloudflare](https://www.cloudflare.com/) 服務因此需要轉換網域到 [Cloudflare](https://www.cloudflare.com/) 底下. **注意:目前是在轉換階段但沒授權換所以是在轉換中的狀態(但扔可使用 Cloudflare服務)**. ### DNS 紀錄設定 由於 [Cloudflare](https://www.cloudflare.com/) 為代理伺服器因此 sretw.com 網域和 Synology mailPlus server 的 DNS記錄設定都需要設定. 此外 sretw.com 網站是用 [Cloudflare](https://www.cloudflare.com/) 來當網域代理因此也需要設定. [Mailjet ](https://www.mailjet.com/) 是 Synology mailPlus server 中繼伺服器因此也需設定. 以下為相關設定的教學: - [Synology MailPlus server DNS紀錄設定](https://kb.synology.com/en-global/DSM/tutorial/How_to_configure_DNS_for_MailPlus) - [EasyWP 網站 DNS紀錄設定](https://www.namecheap.com/support/knowledgebase/article.aspx/10315/2286/how-to-use-easywp-with-a-cloudflare-domain/) - [Mailjet SPF & DKIM DNS紀錄設定](https://documentation.mailjet.com/hc/en-us/articles/360049641733-Authenticating-Domains-with-SPF-and-DKIM-A-Complete-Guide) ### Zero Trust 通道 [Zero Trust](https://www.cloudflare.com/zh-tw/lp/ppc/zero-trust-network-access-x/?campaignid=71700000118902876&adgroupid=58700008723179172&creativeid=701003562429&gad_source=1)(零信任)主要用來保護 NAS 提供的服務. 在 NAS 伺服器上有個 Cloudflare Docker 容器正在運行並連接到 Cloudflare 雲端上設定的通道, 因此所有連入到 NAS 提供服務的連線都會經過 Cloudflare 雲端. 該方式可是作為 proxy(代理), 這樣可在 NAS 不開啟對外的連接附與暴露 NAS 本身對外的 ip 下進行服務, 來降低網路攻擊. 另外 Cloudflare 雲端上也設定一條私有通道, 可透過 [Warp Client](https://developers.cloudflare.com/warp-client/get-started/) 客戶端進行裝置連線, 該方式類似於 VPN. 在裝置成功連線後可用 NAS 內部 ip 從客戶端裝置連入例如用smb連到 NAS伺服器. ### 建立 Zero Trust 通道 [Synology NAS 影片教學](https://www.youtube.com/watch?v=CfjGCI6bQz4). ### SSL/TLS設定 請登入到Cloudflare並依照以下圖示設定. ![Screenshot 2025-05-16 095722](https://hackmd.io/_uploads/B1ccsMV-lx.png) ![Screenshot 2025-05-16 095758](https://hackmd.io/_uploads/rJ0TjMVbex.png) ![Screenshot 2025-05-16 095852](https://hackmd.io/_uploads/SJ6enz4Zlg.png) 這樣做可以避免因為自己架設的伺服器沒有SSL憑證而造成無限循環的導向導致連不上伺服器. # VPN伺服器 公司內部透過路由器提供的VPN功能來架設自己的VPN伺服器. 該方式是針對員工或工程人員方便透過VPN安全連入公司來存取特定機器上的資料或調整機器設定. 目前VPN伺服器提供Open VPN和IPSec VPN連線. ## OpenVPN **注意: 如需連線到公司OpenVPN伺服器,請先告知路由器管理人員建立帳號.** ### 客戶端連線 1. 請路由器管理人匯出並下載OpenVPN設定檔並傳給客戶使用者. ![Screenshot 2025-05-13 201853](https://hackmd.io/_uploads/B1deAdZZgl.png) 2. 客戶端下載Open VPN連線軟體並安裝 * [下載](https://openvpn.net/client/) 選擇適合平台下載安裝. 3. 開啟Open VPN客戶端並使用設定檔 ![Screenshot 2025-05-13 202209](https://hackmd.io/_uploads/ry0vkFZ-xe.png) 4. 輸入帳號密碼並連線 ![Screenshot 2025-05-13 202301](https://hackmd.io/_uploads/BJjqJY-Wlx.png) ### 使用IP連線解決不穩定連線或斷線問題 如遇到不穩定連線或斷線.請用IP方式連線. **該方式請先詢問工程人員客戶端需要連線到VPN伺服器的IP**. 然後用筆記本或文字編輯軟體開啟設定檔並修改 `remote` 的欄位, 將DNS名字換成IP. 如果不清楚如何操作則請工程人員幫忙. ![Screenshot 2025-05-13 202603](https://hackmd.io/_uploads/rkh1ZKZbgg.png) ## IPSec VPN 注意在Windows使用者此設定較為複雜因此Windows使用者可用[Open VPN方式連線](#OpenVPN). 在此用MacOSX來示範設定. ### 客戶端連線 1. 選擇系統偏好設定![b90a8856-c43d-480b-807d-5ec49bc64faf](https://hackmd.io/_uploads/HkMTEK-bex.png) 2. 點選網路![ce56c68b-d15b-46a6-9959-57710d0dca2e](https://hackmd.io/_uploads/Bk1JrtbWeg.png) 3. 於左側點選+來建立新網路並填入VPN相關資訊. ![4042ec85-c362-46f9-94a7-f52d73edf2b7](https://hackmd.io/_uploads/BkcBrYbZex.jpg) 4. 填入伺服器資訊和帳號密碼. **如不知道伺服器位置請詢問路由器管理員**. ![d416fb47-8af0-4c57-92cc-061d6408202e](https://hackmd.io/_uploads/Bk73SYWbxe.jpg) 5. 點選認證設定並填入共享金鑰欄位. **請詢問路由器管理員共享金鑰**. ![1a8285cd-65b6-4451-9d33-3667151a1cd9](https://hackmd.io/_uploads/HJg2IFb-el.jpg) ### 使用IP連線解決不穩定連線或斷線問題 如遇到不穩定連線或斷線.請用IP方式連線. **該方式請先詢問工程人員客戶端需要連線到VPN伺服器的IP**. 然後在填入伺服器位址的欄位輸入IP. # SSH安全連線到公司內部機器 **請先用VPN[連到公司的VPN伺服器](#VPN伺服器)否則會無法連上機器** 用SSH連到公司內部任何的機器或虛擬機器, 在這是使用MacOSX操作. 如果是用Windows請[下載安裝PuTTY](https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html)然後[依照指示連上機器](https://www.ssh.com/academy/ssh/putty/windows#running-putty-and-connecting-to-a-server). 在目前電腦上開啟終端機並下指令 `ssh {帳號名稱}@{機器IP}` - {帳號名稱}: 安裝Ubuntu Server時所用的帳號名稱 - {機器IP}: 內部網路裡機器的IP 接下來輸入登入帳號的密碼登入. 並會看到類似畫面. ![Screenshot 2025-05-15 113047](https://hackmd.io/_uploads/BJoZlJ7-lg.png) 如要進入到root最高權限下指令`sudo -i`. # Sretw 公司郵件系統 目前公司有兩套郵件伺服器系統分別為 [Synology Mail Plus Server](https://www.synology.com/zh-tw/dsm/feature/mailplus) 和 [Mailcow](https://mailcow.email/). 目前已經從 Synology Mail Plus Server 轉入使用 Mailcow. 但之後也可以換回 Synology Mail Plus Server. 比較 Synology Mail Plus Server 和 Mailcow: - **Synology Mail Plus Server** * 特色: * 已經內建在Synology NAS裡面並且跟NAS整合 * 設定簡單 * 憑證跟隨NAS一同更新 * 缺點: * 免費只給5個郵件帳號需更多郵件帳號必須購買授權並且不能一個個帳號購買必須一次買斷5組或20組帳號. 購買授權價格不便宜. * 非開源軟體 * 功能不多 - **Mailcow** * 特色: * 開源軟體可依照自行需求更動 * 提供更多功能 * 許多第三方軟體插件支援 * 無帳號組數限制 * 缺點: * 需要工程背景人員做伺服器架設 * 可能跟NAS互相衝突導致無法運作 * 憑證需要手動更新 建議在沒有工程人員下Synology Mail Plus Server為首要推薦,但如不想購買授權或有更多功能需求且有工程人員條件下Mailcow為首要推薦. [Mailcow郵件系統使用](#Mailcow-郵件系統) # Mailcow 郵件系統 這裡將分別解說使用者和管理員以及工程架設相關的細節. 詳細請參考[Mailcow官方文件](https://docs.mailcow.email/). Mailcow郵件系統使用Borg備份, 以下是目前的備份伺服器: - [Borgbase](https://www.borgbase.com/): 10GB免費雲端. - [Borgwarehouse](https://borgwarehouse.com/): 開源伺服器自行架設在NAS上. ## 使用者 **請先告知管理人員開啟新的郵件信箱** ### 網頁郵件信箱 使用者可從這裡進入網頁[郵件信箱](https://mailcow.sretw.com/). ### 使用裝置設定郵件信箱 如要使用行動裝置或電腦來設定連線到郵件信箱, 需要填入收件和寄件伺服器位置. - SMTP寄件伺服器位置: mail.sretw.com - IMAP/POP3收件伺服器位置: mail.sretw.com **注意: 收件/寄件伺服器都需要相對應的帳號密碼才能正常運作** ### 郵件推播 如需要在裝置上接收郵件送達通知則需要去下載客戶端的郵件軟體並支援ActiveSync. 網路上有許多客戶端的郵件軟體可使用可自行下載測試, 但在這裡推薦 [BlueMail](https://bluemail.me/)依照自己的平台去下載對應的軟體. 透過軟體內的設定導引精靈完成設定. **如要接受推播則在設定過程裡必須確認否則無法收到推播**. ## 管理員 管理員可進入後台郵件系統進行調整操作如建立新郵件信箱, 改變網域設定, 寄送系統郵件給所有人, 發公告信息等等. ### 後台管理登入 管理員可從這裡登入[後台管理介面](https://mailcow.sretw.com/admin/) ### 建立並起用新郵件信箱 請參照圖下來開啟信箱建立畫面. ![Screenshot 2025-05-14 115931](https://hackmd.io/_uploads/BklvScWZgl.png) ![Screenshot 2025-05-14 120205](https://hackmd.io/_uploads/S1uHTjZZxe.png) ## 郵件伺服器架設 **自行架設Mailcow伺服器或者郵件備份伺服器有一定難度且需要有工程背景. 對以下幾點的基本或深入了解有助於架設伺服器的問題排除.** - 看得懂英文文件, 聽得懂英文教學 - 能自行上網尋找或自行排除工程相關問題 - 路由器和網路的基本了解, 如內部網路ip指定和通信埠導向 - 了解[Cloudflare Zero Trust Tunnel](https://www.cloudflare.com/zh-tw/zero-trust/products/access/)的運作以及使用 - Cloudflare上的網域和DNS紀錄設定 - 虛擬機器的基本建立, 設定和作業系統安裝 - Linux作業系統的基本了解 - Docker軟體的基本與深入了解, 容器, 映像檔, 網路的基本使用與管理. 進階使用包含如何更改或建立腳本如docker-compose.yml和Dockerfile檔案並透過腳本建立客製化的容器等等. - 需要了解熟悉如何下Linux指令 - 需要瞭 [Git](https://git-scm.com/) 和 [GitHub](https://github.com/) 版本控制的使用 - 能用 [SSH](https://www.cloudflare.com/zh-tw/learning/access-management/what-is-ssh/) 通信協定做遠端連線到機器並操作 - 撰寫基本Linux腳本 - 了解Linux cronjob 或 crontab 的基本知識 **郵件備份**: 郵件系統使用第三方插件[Borgmatic](https://docs.mailcow.email/third_party/borgmatic/third_party-borgmatic/)來備份到[Borgbase](https://www.borgbase.com/). 同時也備份到在NAS機器上運行的[Borgwarehouse](https://borgwarehouse.com/)伺服器. 備份到在NAS上的[Borgwarehouse](https://borgwarehouse.com/)伺服器是需要自行架設伺服器. 使用Borg備份特色: - 版本備份和還原 - 降低備份的容量 ### 相容性問題 根據[官方說明](https://docs.mailcow.email/getstarted/prerequisite-system/) > Do not try to install mailcow on a Synology/QNAP device (any NAS), OpenVZ, LXC or other container platforms. KVM, ESX, Hyper-V and other full virtualization platforms are supported. > 意思是不要在 Synology/QNAP (NAS), OpenVZ, LXC 或其他容器平台上安裝 Mailcow. KVM, ESX, Hyper-V 和其他虛擬平台上則被支援. Mailcow基本上是**無法**在 Synology NAS上運行的. [實際不成功的案例](https://community.mailcow.email/d/3738-help-is-needed-mailcow-on-synology-nas-doesnt-show-real-ip). Mailcow 目前只能在被支援的Linux版本環境下運行. **解決方案**: 根據研究與尋找後[這篇貼文](https://community.mailcow.email/d/46-mailcow-on-synology/4)有解決方案. 簡單說就是在Synology NAS上的[Virtual Machine Manager](https://www.synology.com/zh-tw/dsm/7.2/software_spec/vmm)上建立一個Linux的虛擬機器並在裡面安裝Mailcow郵件伺服器. ### 1. 建立虛擬機器並安裝Linux作業系統 [官方Mailcow伺服器最低配備需求](https://docs.mailcow.email/getstarted/prerequisite-system/#minimum-system-resources). 經過計算後我們使用以下配備: - CPU核心: 2 - 記憶體: 6BG - 儲存容量: 28GB(不夠再增加) [官方支援的Linux作業系統版本](https://docs.mailcow.email/getstarted/prerequisite-system/#supported-os). 這裡我們用[Ubuntu Server](https://ubuntu.com/download/server). **Ubuntu Server** 包含Server功能並**沒有**介面操作(只能透過下指令的方式), 原因是為了減少降低系統資源使用並提升效率. 由於步驟繁雜且網路有教學在這裡連到[實際操作影片](https://www.youtube.com/watch?v=LZ62gFzIRZA). 跟著影片一步步做並完成虛擬機器建立和Linux作業系統安裝. **必須要注意虛擬機器設定非常重要**: - 虛擬機器的設定裡 `Video Card` 必須要設定成 **vga** 否則安裝時會卡住 - 虛擬機器的網路必須要是 **[外部虛擬交換器(external)](https://kb.synology.com/zh-tw/DSM/help/Virtualization/network?version=7)** 這是NAS預設的. 這樣虛擬機器會有自己的內部IP. ![Screenshot 2025-05-14 134149](https://hackmd.io/_uploads/SJl46jZZxe.png) - 安裝時候會詢問要不要使用SSH請勾選要 ### 2. 網域DNS **必須要有一個網域才能運作, 如果沒有請先購買申請一個** **必須要有個固定IP, 如果沒有請先跟網路提供商申請一個** 這裡是使用[Cloudlfare](https://www.cloudflare.com/application-services/products/dns/), 因此所有設定DNS紀錄都需要在[Cloudlfare](https://www.cloudflare.com/application-services/products/dns/)上完成. [什麼是DNS?](https://www.cloudflare.com/zh-tw/learning/dns/what-is-dns/) 首先要知道有哪些DNS紀錄要設定. 根據[官方文件](https://docs.mailcow.email/getstarted/prerequisite-dns/#the-minimal-dns-configuration), 我們得知最少有4個DNS紀錄要設定. ![Screenshot 2025-05-15 100649](https://hackmd.io/_uploads/SyfUnazZel.png) `mail`的值必須是IP. 在這裡公司對外網的溝通是經過路由器所以必須填路由器對外的固定IP. `autodiscover`, `autoconfig`, `@` 則都填上 `mail.sretw.com`. [參考公司網域名子](#網域). [MX紀錄是什麼?](https://www.cloudflare.com/zh-tw/learning/dns/dns-records/dns-mx-record/) 另外還有3個 [DKIM, SPF 和 DMARC](https://docs.mailcow.email/getstarted/prerequisite-dns/#dkim-spf-and-dmarc): - [SPF](https://www.cloudflare.com/zh-tw/learning/dns/dns-records/dns-spf-record/): 記錄列出了允許從該網域傳送電子郵件的所有伺服器的所有 IP 位址,就像員工目錄列出了一個組織的所有員工的姓名一樣。接收電子郵件的郵件伺服器可以在將其傳遞到收件者的收件匣之前根據 SPF 記錄對其進行檢查。 在這裡我們可以用 `v=spf1 mx a -all` 作為初始設定並後續進行修改. - [DKIM](https://www.cloudflare.com/zh-tw/learning/dns/dns-records/dns-dkim-record/): 網域金鑰識別郵件 (DKIM) 使網域擁有者能夠自動「簽署」來自其網域的電子郵件,就像支票上的簽名有助於確認誰寫了支票一樣。DKIM「簽名」是一種數位簽名,它使用密碼學從數學上驗證電子郵件是否來自該網域。 可以之後進行設定. - [DMARC](https://www.cloudflare.com/zh-tw/learning/dns/dns-records/dns-dmarc-record/): DMARC 原則會告知接收電子郵件伺服器在檢查網域的寄件者原則架構 (SPF) 和網域金鑰識別郵件 (DKIM) 記錄(這些記錄是額外的電子郵件驗證方法。)後該怎麼做。 在這裡我們可以用 `v=DMARC1; p=reject; rua=mailto:mailauth-reports@example.org` 作為初始設定並後續進行修改. 如要測試紀錄是否設定完成可以利用官方的幾個[推薦網站](https://docs.mailcow.email/getstarted/prerequisite-dns/#testing). ### 3. 安裝 Docker Docker 是一種容器管理軟體, 每個容器裡包含一種虛擬機器並提供不同的服務. 使用Docker可以讓執行效更高並且使用更少資源相對於一般的虛擬機器. ![vm-docker5](https://hackmd.io/_uploads/Byf_dRMZxl.png) ***左邊使用Docker右邊使用一般虛擬機器*** 如要了解詳細安裝請看[官方文件](https://docs.mailcow.email/getstarted/install/#on-debianubuntu-systems). [官方文件](https://docs.mailcow.email/getstarted/install/#docker-and-docker-compose-installation)說明Docker版本必須要最少是並包含`24.0.0` 而Docker Compose最少並包含`2.0`. >Always use the latest available Docker Engine from Docker Inc. — do not use the version provided by your distribution's default repository. >意思是請使用Docker官方版本不要使用作業系統預設提供的版本. 利用SSH連線到Ubuntu Server虛擬機器. [參照這裡如何SSH連線](#SSH安全連線到公司內部機器). (https://www.ssh.com/academy/ssh/putty/windows#running-putty-and-connecting-to-a-server). 請到NAS機器裡的Virtual Machine Manager查看IP ![Screenshot 2025-05-15 112530](https://hackmd.io/_uploads/Bkhp00MZxe.png) 更新和升級. `apt-get update && apt-get upgrade` 檢查是否有安裝curl. `curl --version` ![Screenshot 2025-05-15 113537](https://hackmd.io/_uploads/rJCf-kmbll.png) 如果沒有的話我們要安裝curl `sudo apt install curl` 接下來安裝 Docker `sudo curl -sSL https://get.docker.com/ | CHANNEL=stable sh` 設定讓Docker系統啟動時順便啟動 `sudo systemctl enable --now docker` **[注意](https://docs.mailcow.email/getstarted/install/#docker-compose)** 如果你用舊版mailcow或沒用上面方式或者用Docker獨立版本請另外安裝Docker Compose. `apt install docker-compose-plugin` ### 4. 安裝Mailcow 首先要在root權限底下 `sudo -i` 接下來確保umask是0022 `umask` ![Screenshot 2025-05-15 120153](https://hackmd.io/_uploads/B1LSvJm-el.png) 進入opt目錄之下 `cd /opt` 複製Mailcow `git clone https://github.com/mailcow/mailcow-dockerized` 如果你沒安裝git請先安裝git `sudo apt install git` 進入mailcow-dockerized目錄下 `cd mailcow-dockerized` 產生設定檔 `./generate_config.sh` **當被問要輸入FQDN時候請輸入**`mail.sretw.com` 完成後在mailcow-dockerized目錄下會有一個**mailcow.conf**的設定檔, 如果日後要修改設定可用vim編輯器修改 `vim mailcow.conf` 最後啟動Mailcow `docker compose pull` 來下載映像檔 `docker compose up -d` 來啟動. 如果要重新啟動 `docker compose down && docker compose up -d` 這通常會用在修改設定檔或相關檔案後要讓修改的數值生效 ### 5. 路由器導向 & 通信埠轉發 **你必須是路由器管理員並且可以登入到路由器裡做設定** 請先登入路由器. 先[指定Ubuntu Server 虛擬機器 IP](#內部機器-IP-和指定). 根據[官方文件](https://docs.mailcow.email/getstarted/prerequisite-system/#incoming-ports)我們並須在路由器上打開幾個通信埠並轉發. | 服務 | 協定 | 通信埠 | | ------------------- | ------- | ------- | | Postfix SMTP | TCP | 25 | | Postfix SMTPS | TCP | 465 | | Postfix Submission | TCP | 587 | | Dovecot IMAP | TCP | 143 | | Dovecot IMAPS | TCP | 993 | | Dovecot POP3 | TCP | 110 | | Dovecot POP3S | TCP | 995 | | Dovecot ManageSieve | TCP | 4190 | | HTTP | TCP | 80 | | HTTPS | TCP | 443 | 接著在路由器裡面設定通信埠. **`HTTP` 和 `HTTPS`是進入Mailcow網頁介面的通信埠而`HTTP`同時也用於獲得SSL憑證的通信埠但是`HTTP`跟NAS機器獲得憑證的通信埠相同因此後續完成憑證後會需要更動** ![Screenshot 2025-05-16 090746](https://hackmd.io/_uploads/Byjzlz4blg.png) 現在可透過NAS的DDNS與通信埠進入Mailcow網頁. 請參照[NAS的DDNS](#NAS-伺服器-amp-DDNS-amp-服務). - http://sretw1822.i234.me:80 - https://sretw1822.i234.me:443 **如遇到問題同如下圖, 請直接略過因為Mailcow尚未取得NAS DDNS的憑證. 但我們將會用Cloudflare方法做替代.** ![Screenshot 2025-05-16 093007](https://hackmd.io/_uploads/SyTTHzNWgx.png) ### 6. Cloudflare 通道 首先參考[這裡](#建立-Zero-Trust-通道)在Synology NAS上建立通道. 登入到Cloudflare並進入到Zero Trust. ![Screenshot 2025-05-16 094223](https://hackmd.io/_uploads/H1bmOGV-xg.png) 進入通道設定. ![Screenshot 2025-05-16 094345](https://hackmd.io/_uploads/HyKOdfNWxx.png) 選擇加入外部通道. ![Screenshot 2025-05-16 094521](https://hackmd.io/_uploads/SkdSYMN-xg.png) 設定通道並儲存. ![Screenshot 2025-05-16 094708](https://hackmd.io/_uploads/SyGPFzE-gx.png) - 子網域名字(Subdomain): 自訂 - 網域(Domain): 選擇註冊的網域 - 通信種類(Type): HTTP 因為是NAS內跟Ubuntu Server通信可直接用HTTP - 位置(URL): 指定到Ubuntu Server虛擬機器IP [參照這裡](#內部機器-IP-和指定). **[參照這裡](#SSLTLS設定)確保正確設定Cloudflare SSL/TLS**. 現在在網頁瀏覽器上打入子網域和網域就會導引到Mailcow的郵件網頁. `https://{子網域名字}.{網域}` 例如子網域是mailcow, 網域是sretw.com `https://mailcow.sretw.com` **Mailcow網頁郵件信箱**. `https://{子網域名字}.{網域}` 例如`https://mailcow.sretw.com` **Mailcow管理登入**. `https://{子網域名字}.{網域}/admin` 例如`https://mailcow.sretw.com/admin` ### 7. Mailcow加入網域 登入Mailcow管理介面. 如果是第一次使用預設帳號`admin`密碼`moohoo`. 點選新增域名. ![Screenshot 2025-05-16 101436](https://hackmd.io/_uploads/SkgT1QEZlx.png) 輸入註冊的域名並點選`新增域名並重新啟動`. ![Screenshot 2025-05-16 101607](https://hackmd.io/_uploads/ByXHxmVbex.png) 設定DNS紀錄. 依照指示在Cloudflare上設定DNS紀錄. ![Screenshot 2025-05-16 101829](https://hackmd.io/_uploads/HJTKxQEWlx.png) ### 8. 獲取SSL憑證 [官方文件](https://docs.mailcow.email/post_installation/firststeps-ssl/). > mailcow must be available on port 80 for the acme-client to work. Our reverse proxy example configurations do cover that. You can also use any external ACME client (certbot for example) to obtain certificates, but you will need to make sure, that they are copied to the correct location and a post-hook reloads affected containers. See more in the Reverse Proxy documentation. > mailcow 是透過acme-client來獲取憑證且必須要開啟通信埠80 **請確保路由器通信埠80指定到Ubuntu Server虛擬機器IP**. 利用SSH遠端安全連入到Ubuntu Server. [如何SSH連線](#SSH安全連線到公司內部機器). 進入到mailcow的目錄下. `cd /opt/mailcow-dockerized` 建立force_renew檔案 `sudo touch data/assets/ssl/force_renew` 重新啟動acme服務 `sudo docker compose restart acme-mailcow` 查看紀錄 `sudo docker compose logs --tail=200 -f acme-mailcow` ## 設定使用 Borgmatic 備份 Mailcow 提供 [Borgmatic Backup](https://docs.mailcow.email/third_party/borgmatic/third_party-borgmatic/) 備份或用 Mailcow 本身已有的[備份腳本](https://docs.mailcow.email/backup_restore/b_n_r-backup/#backup-strategy-with-rsync-and-mailcow-backup-script)做備份. 這裡使用 [Borgmatic Backup](https://docs.mailcow.email/third_party/borgmatic/third_party-borgmatic/) 做備份, 原因是它可以做多版本備份且利用漸進式備份達到降低儲存容量. [連到公司VPN伺服器](#VPN伺服器). 利用[SSH連到伺服器](#SSH安全連線到公司內部機器). 進入最高權限 `sudo -i`. 進到 Mailcow 資料目錄下 `cd /opt/mailcow-dockerized`. 接下來要建立 docker compose 檔案並編輯. 檔案須包含以下內容. 或參考[這裡](https://docs.mailcow.email/third_party/borgmatic/third_party-borgmatic/#create-or-amend-docker-composeoverrideyml). ``` services: borgmatic-mailcow: image: ghcr.io/borgmatic-collective/borgmatic hostname: mailcow restart: always dns: ${IPV4_NETWORK:-172.22.1}.254 volumes: - vmail-vol-1:/mnt/source/vmail:ro - crypt-vol-1:/mnt/source/crypt:ro - redis-vol-1:/mnt/source/redis:ro - rspamd-vol-1:/mnt/source/rspamd:ro - postfix-vol-1:/mnt/source/postfix:ro - mysql-socket-vol-1:/var/run/mysqld/ - borg-config-vol-1:/root/.config/borg - borg-cache-vol-1:/root/.cache/borg - ./data/conf/borgmatic/etc:/etc/borgmatic.d:Z - ./data/conf/borgmatic/ssh:/root/.ssh:Z environment: - TZ=${TZ} - BORG_PASSPHRASE=${BORG_PASSPHRASE} - DBNAME=${DBNAME} - DBUSER=${DBUSER} - DBPASS=${DBPASS} networks: mailcow-network: aliases: - borgmatic volumes: borg-cache-vol-1: borg-config-vol-1: ``` **注意: 如果要從備份還原時必須將上面內容裡的 `:ro` 移除, 此設定只允許讀取不允許寫入(read-only), 如果為了方便不修改在寫入上述內容時可將 `:ro` 移除. 這樣就可以有讀或寫的權限.** **注意: 目前備份是不加密因此上面內容 `BORG_PASSPHRASE=${BORG_PASSPHRASE}` 已移除. 如需要加密請閱讀[官方文件](https://docs.mailcow.email/third_party/borgmatic/third_party-borgmatic/#setting-up-borgmatic)如何加密設定.** 這裡有兩種方式 1. 直接在目錄下建立檔案並用`vim`做編輯, 2. 在你的電腦上建立檔案並編輯最後用`scp`複製到 Mailcow 資料目錄下. - 直接在目錄下建立並編輯 1. `touch docker-compose.override.yml` 2. `vim docker-compose.override.yml` 3. 貼入上述內容 - 在你的電腦上建立檔案並編輯 1. 利用任何文字編輯器建立新檔案 `docker-compose.override.yml` 2. 貼上上述內容 3. [連到公司VPN伺服器](#VPN伺服器) 4. 在你的電腦上終端機裡面利用 `scp` 傳送檔案到伺服器 `scp {檔案路徑} {登入帳號}@{伺服器IP}:/opt/mailcow-dockerized` - {檔案路徑}: 完整或相對檔案路徑 - {登入帳號}: 登入伺服器時用的帳號 - {伺服器IP}: [參考這裡](#內部機器-IP-和指定) 再來要建立 Borgmatic backup 設定檔案. 在 `mailcow-dockerized` 目錄下 `mkdir -p data/conf/borgmatic/etc/` 建立路徑. `touch data/conf/borgmatic/etc/config.yaml` 建立設定檔案. 編輯設定檔案 `vim data/conf/borgmatic/etc/config.yaml`. 貼入以下內容或[參照這裡](https://docs.mailcow.email/third_party/borgmatic/third_party-borgmatic/#create-dataconfborgmaticetcconfigyaml). ``` source_directories: - /mnt/source/vmail - /mnt/source/crypt - /mnt/source/redis - /mnt/source/rspamd - /mnt/source/postfix repositories: - path: ssh://uXXXXX@uXXXXX.your-storagebox.de:23/./mailcow label: rsync exclude_patterns: - '/mnt/source/postfix/public/' - '/mnt/source/postfix/private/' - '/mnt/source/rspamd/rspamd.sock' keep_hourly: 24 keep_daily: 7 keep_weekly: 4 keep_monthly: 6 mariadb_databases: - name: ${DBNAME} username: ${DBUSER} password: ${DBPASS} options: "--default-character-set=utf8mb4 --skip-ssl" list_options: "--skip-ssl" restore_options: "--skip-ssl" ``` **注意: 必須修改內容裡 `repositories` 底下的 `path` 成雲端備份的目的地. `label` 可以自己取相對應的雲端伺服器名字以便於以後辨認** **注意: 在目前的 Mailcow 裡 `data/conf/borgmatic/etc/` 目錄下並沒有 `config.yaml` 檔案, 而是分成 `borgbase_repo.yaml` 和 `nas_repo.yaml` 兩個檔案分別備份到borgbase雲端和NAS機器上(Borgwarehouse). 請參考[這裡](https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/)如何做多個目的地備份. 下面作說明.** ![Screenshot 2025-05-24 112007](https://hackmd.io/_uploads/BysejhRWxx.png) 利用 `cat {檔案路徑}` 來觀看 `borgbase_repo.yaml` 和 `nas_repo.yaml` 檔案, 會發現包含 `!include` 字樣並緊接著檔案路徑到`.yaml`檔案. 因為某些設定有重複因此這裡使用 YAML 裡的 `!include` 功能將重複設定抽出到其他檔案. 這些檔案放在 `sub_conf` 目錄下. `template_conf` 目錄下包含原始設定參考的樣板. `sub_conf` 目錄下. ![Screenshot 2025-05-24 112542](https://hackmd.io/_uploads/SkDBhnR-xg.png) - `mariadb_config.yaml`: Maria資料庫設定 - `sources_config.yaml`: 備份資料來源路徑設定 了解設定和參數[教學](https://torsion.org/borgmatic/docs/how-to/make-per-application-backups/). [設定參數手冊](https://torsion.org/borgmatic/docs/reference/configuration/). 設定備份執行的時間. 在 `data/conf/borgmatic/etc/` 目錄下建立 `crontab.txt` 檔案. `touch data/conf/borgmatic/etc/crontab.txt`. 並貼上以下內容. `0 2 * * * PATH=$PATH:/usr/local/bin /usr/local/bin/borgmatic --stats -v 0 2>&1`. **如想自行調整備份時間請先到[這裡](https://crontab.guru/#0_2_*_*_*)嘗試並將結果用 `vim` 更改到 `crontab.txt`裡面.** 接下來[建立 ssh key](#建立-borgmatic-backup-ssh-key)用於安全連線. 執行備份前先建立 Repo 雲端備份目的地. - [Borgbase雲端設定](#Borgbase-雲端伺服器設定) 回到 mailcow 主目錄下 `cd /opt/mailcow-dockerized` 啟動容器 `docker compose up -d`. 初始化備份. `docker compose exec borgmatic-mailcow borgmatic init --encryption repokey-blake2` **注意: 目前備份的 `--encryption` 使用 `none` 也就是不加密.** 重新啟動容器. `docker compose restart borgmatic-mailcow`. **建議做第一次備份測試**. `docker compose exec borgmatic-mailcow borgmatic create --verbosity 1 --list --stats` ## 建立 borgmatic backup ssh key Borgmatic backup 備份都須透過 SSH 安全線因此要建立 SSH 鑰匙. 確認 `ssh-keygen` 已安裝. 如沒安裝 `apt-get install openssh-client`. 在 `data/conf/borgmatic/ssh` 目錄下 `ssh-keygen -t ed25519` 並跟著導引完成. **注意: ssh key檔案必須要儲存到 `data/conf/borgmatic/ssh` 目錄下. 當ssh-keygen詢問passphrase時候直接按`Enter`不給passphrase不然備份自動執行時候會因為要求輸入passphrase而造成失敗**. 完成後 `data/conf/borgmatic/ssh` 底下會有兩個鑰匙一個是私用另一個`.pub`是公用. ![Screenshot 2025-05-24 115509](https://hackmd.io/_uploads/By147TCWee.png) 這公用鑰匙內容將會需要複製到 borg 雲端備份伺服器來達成安全連線. ## Borgbase 雲端伺服器設定 **注意: 要先建立 borgmatic backup SSH Key [看這裡](#建立-borgmatic-backup-ssh-key)** [連到公司VPN伺服器](#VPN伺服器). [SSH連入到內部Ubuntu-Server機器](#SSH安全連線到公司內部機器). 進入最高權限 `sudo -i`. 進到 ssh 目錄下`cd /opt/mailcow-dockerized/data/conf/borgmatic/ssh` . 印出公用鑰匙內容 `cat {鑰匙檔名}.pub`並拷貝內容. ![Screenshot 2025-05-24 120343](https://hackmd.io/_uploads/SJhkL6Rblx.png) 登入到 [borgbase](https://www.borgbase.com/login). 設定ssh-key如果之前都沒有設定過或要用不同ssh-key. ![Screenshot 2025-05-24 120838](https://hackmd.io/_uploads/HyoL8pAbeg.png) ![Screenshot 2025-05-24 120944](https://hackmd.io/_uploads/HJ-o86RWeg.png) 建立 Repo 備份目的地. 設定 Repo 名字. 設定 ssh 鑰匙. ![Screenshot 2025-05-24 121211](https://hackmd.io/_uploads/BkYEwTC-lg.png) 複製備份目的地URL. ![Screenshot 2025-05-24 121341](https://hackmd.io/_uploads/ryhcDaRWgg.png) **將 URL 設定到 Borgmatic 備份設定檔案裡面 `repositories` 下的 `path`** . ## Borgwarehouse 備份伺服器架設 [Borgwarehouse](https://borgwarehouse.com/docs/prologue/introduction/) 是用於Borg備份的伺服器端, 主要是儲存備份並提供客戶端連接. 如前面所講 [Borgmatic備份](#設定使用-Borgmatic-備份) 是屬於客戶端. 如果你使用 Borg 備份 [Borgwarehouse](https://borgwarehouse.com/docs/prologue/introduction/) 是非必要的因為網路提共許多雲端支援 Borg 備份. 如果你不想花錢, 想用自己的設備, 安全疑慮等等 [Borgwarehouse](https://borgwarehouse.com/docs/prologue/introduction/) 則提供你的需求. [Borgwarehouse](https://borgwarehouse.com/docs/prologue/introduction/) 不僅提供 Borg 備份也提供管理介面. 以下將講解如何架設自己的 [Borgwarehouse](https://borgwarehouse.com/docs/prologue/introduction/) 伺服器 ### 1. 安裝 Portainer [Portainer](https://www.portainer.io/) 是一個 Docker 管理工具. 它具備許多 [Synology Container Manager](https://www.synology.com/en-global/dsm/feature/docker) 沒有的功能且更加齊全. 請依照官方文件進行 [Portainer CE 的安裝](https://docs.portainer.io/start/install-ce/server/docker/linux)並完成設定. [影片教學](https://www.youtube.com/watch?v=g7oAZQR1fiY). 將 Portainer 加入到 Cloudflare Zero Trust Tunnel 裡. [參考這裡](#建立-Zero-Trust-通道). ![Screenshot 2025-06-03 131513](https://hackmd.io/_uploads/rkLgHZnGlg.png) ### 2. 自行建置 Borgwarehouse 說明 我們將用 docker compose 方式建立 Borgwarehouse. 但必須要重新建置還要設定 cronjob. 根據[官方文件](https://borgwarehouse.com/docs/admin-manual/docker-installation/#build-your-own-docker-image). > The BorgWarehouse container is intentionally designed not to execute any root processes for enhanced security. The Docker image available on Docker Hub is constructed with a user ID of 1001 and a group ID of 1001. Consequently, it is essential that both volumes and containers operate with a user ID and group ID of 1001 to avoid encountering permission issues. If you prefer not to utilize the 1001:1001 user and group configuration, you must build your image. 因此必須要使用 Synology 特定用戶的 ID 來重新建置影像檔. **經過測試後使用預設值將會遇到權限問題, 除非你在 Synology 的帳號 ID 是 1001 否則必須除重建**. 根據[官方文件](https://borgwarehouse.com/docs/admin-manual/docker-installation/#scheduled-tasks). > Since version 2.1.0, the cron service is no longer included with the container. This is a better way of giving you control over the scheduler. So you’re free to use the service that suits you, your service’s cron or whatever… 因此我們還要設定一個 cronjob. 這會用來定時呼叫 Borgwarehouse 的 API 以至於更新 Borgwarehouse 的介面資訊 而這裡我們將用 [Supercronic](https://github.com/aptible/supercronic) 來建立影像檔. 最後當 Borg 備份沒有如預定時間備份則需要用 E-mail 通知回報狀況. [官方文件參考](https://borgwarehouse.com/docs/admin-manual/apprise-configuration/). 在這裡我們還會使用到 [Apprise](https://github.com/caronc/apprise). 總共會有3個程序需要建立: - Borgwarehouse - Supercronic - Apprise **如果建置太過繁雜可使用 https://github.com/Sretw/borgwarehouse 預先設定調整過的 Borgwarehouse 並跳到[步驟6](#6-建立-Borgwarehouse-相關資料夾)再從[步驟8](#8-設定-Crontab)繼續**. ### 3. 設定 Borgwarehouse 確保在你的電腦上有安裝 [Git](https://git-scm.com/). 確保你有 [GitHub](https://github.com/) 帳號(將你設定過的 Borgwarehouse 推送到你的 Repository). 使用 Git 複製 Borgwarehouse 到你的電腦任何位置 `git clone https://github.com/Ravinou/borgwarehouse.git`. 用 [Visual Studio Code](https://code.visualstudio.com/) 打開專案或任何你熟悉的專案編輯軟體. 如沒有 [Visual Studio Code](https://code.visualstudio.com/) 請下載安裝. 在專案目錄下打開 `Dockerfile`. 更改 `EXPOSE 3000 22` 成 `EXPOSE 3000 3022` 這會是告訴容器打開對外的連接埠. 這裡使用 `3000 3022` 主要是不跟 Synology 舊有的服務相衝突. **注意: `3000` 用於連到介面的連接埠 `22` 用於 SSL 安全連線做備份**. 開啟專案目錄下檔案 `docker/sshd_config`. 更改 `Port 22` 成 `Port 3022`. 告訴 Borgwarehouse 用 `3022` 作為 SSL 安全連線備份的連接埠. ### 4. 設定 Supercronic 在專案主目錄下建立資料夾命名 `supercronic`. 進入該目錄下. 在該目錄下建立3個檔案並命名: - **crontab_default**: 預設的 cronjob 但也可以客製化 - **Dockerfile**: 建立 supercronic 影像檔的 Dockerfile - **run.sh**: 容器啟動後要執行的 shell 腳本 **請利用終端機指令產生 Token `請用 `openssl rand -base64 32` 在終端機上產生 Token` 並記下, 下面和之後的步驟會用到.** 打開 `crontab_default` 貼入以下內容. **確保檔案是用 `CRLF`**. ``` * * * * * * * curl --request POST --url 'http://192.168.50.228:3000/api/v1/cron/status' --header 'Authorization: Bearer {你的 Token 或任何字串}' > /dev/null 2>&1 * * * * * * * curl --request POST --url 'http://192.168.50.228:3000/api/v1/cron/storage' --header 'Authorization: Bearer {你的 Token 或任何字串}' > /dev/null 2>&1 ``` supercronic `*` 的格式意思請參照[這裡](https://github.com/aptible/supercronic/tree/master/cronexpr#golang-cron-expression-parser), 上面的預設是每秒都會執行. `curl` 則是呼叫 borgwarehouse 的 API, [參考這裡](https://borgwarehouse.com/docs/admin-manual/docker-installation/#scheduled-tasks). `{你的 Token 或任何字串}` 用於認證. **如果有不同的 Token 或字串則需要回這裡更改**. 打開 `Dockerfile`. 貼入以下內容. ``` FROM debian:12.10-slim # Latest releases available at https://github.com/aptible/supercronic/releases ENV SUPERCRONIC_URL=https://github.com/aptible/supercronic/releases/download/v0.2.33/supercronic-linux-amd64 \ SUPERCRONIC_SHA1SUM=71b0d58cc53f6bd72cf2f293e09e294b79c666d8 \ SUPERCRONIC=supercronic-linux-amd64 # Update all packages and install curl RUN apt-get update && apt-get install -y \ curl && \ apt-get clean && rm -rf /var/lib/apt/lists/* # Refer to https://github.com/aptible/supercronic/releases RUN curl -fsSLO "$SUPERCRONIC_URL" \ && echo "${SUPERCRONIC_SHA1SUM} ${SUPERCRONIC}" | sha1sum -c - \ && chmod +x "$SUPERCRONIC" \ && mv "$SUPERCRONIC" "/usr/local/bin/${SUPERCRONIC}" \ && ln -s "/usr/local/bin/${SUPERCRONIC}" /usr/local/bin/supercronic # Change working directory to crontab WORKDIR /crontab # Copy run.sh to the directory COPY run.sh ./run.sh # Change the run.sh previleage to excutable RUN chmod +x ./run.sh # Copy crontab_default file to the directory COPY crontab_default ./crontab_default # Change the crontab_default previleage to excutable RUN chmod +x ./crontab_default ENTRYPOINT [ "./run.sh" ] ``` 打開 `run.sh`. 貼入以下內容. 確保檔案是用 `CRLF`. ``` #!/bin/bash set -e # define variables CRONTAB_DIR="/etc/crontab" CRONTAB_FILE="$CRONTAB_DIR/crontab" DEFAULT_CRONTAB_FILE="./crontab_default" # if crontab file not exits then # copy defult crontab file to crontab directory if [[ ! -f $CRONTAB_FILE ]]; then echo "crontabl doesn't exists, use default crontab" cp $DEFAULT_CRONTAB_FILE $CRONTAB_FILE else echo "Use external crontab $CRONTAB_FILE" fi # run crontab file supercronic -inotify $CRONTAB_FILE ``` ### 5. 設定 docker compose 檔案 在專案目錄下打開 `docker-compose.yml`. 刪除所有內容並貼上以下內容. ``` services: borgwarehouse: container_name: borgwarehouse pull_policy: build # If you want to build the image yourself, uncomment the following lines and comment the image line build: context: . dockerfile: Dockerfile args: - UID=${UID} - GID=${GID} # image: borgwarehouse/borgwarehouse user: '${UID:?UID variable missing}:${GID:?GID variable missing}' network_mode: bridge ports: - '${WEB_SERVER_PORT:?WEB_SERVER_PORT variable missing}:3000' - '${SSH_SERVER_PORT:?SSH_SERVER_PORT variable missing}:3022' env_file: - stack.env volumes: - ${CONFIG_PATH:?CONFIG_PATH variable missing}:/home/borgwarehouse/app/config - ${SSH_PATH:?SSH_PATH variable missing}:/home/borgwarehouse/.ssh - ${SSH_HOST:?SSH_HOST variable missing}:/etc/ssh - ${BORG_REPOSITORY_PATH:?BORG_REPOSITORY_PATH variable missing}:/home/borgwarehouse/repos - ${TMP_PATH:?TMP_PATH variable missing}:/home/borgwarehouse/tmp - ${LOGS_PATH:?LOGS_PATH variable missing}:/home/borgwarehouse/logs # Apprise is used to send notifications, it's optional. http://apprise:8000 is the URL to use in BorgWarehouse. apprise: container_name: apprise image: caronc/apprise network_mode: bridge ports: - '${APPRISE_PORT:?APPRISE_PORT variable missing}:8000' # # user: 'www-data:www-data' supercronic: container_name: supercronic pull_policy: build # If you want to build the image yourself, uncomment the following lines and comment the image line build: context: ./supercronic dockerfile: Dockerfile volumes: - ${CRONTAB_PATH:?CRONTAB_PATH variable missing}:/etc/crontab network_mode: bridge ``` 這裡我們告訴 Docker 有3個服務需要啟動 borgwarehouse, apprise, supercronic. **注意: borgwarehouse, supercronic 都有 `build` 的關鍵字是告訴 Docker 它們有自己的建置來源不像 apprise 是從 docker hub 下載預先建立好的影像檔**. ### 6. 建立 Borgwarehouse 相關資料夾 從這裡 https://nas.sretw.com 登入 NAS 機器. 打開 Control Panel -> Shared Folder. 並建立分享資料夾. ![Screenshot 2025-06-03 123726](https://hackmd.io/_uploads/B1_L2e2Gxe.png) **注意: 確保該資料夾是在 Volume2 底下並命名為 borgwarehouse. 你也可以在不同位置建立**. 開啟 File Station -> borgwarehouse. 如圖建立以下資料夾. - **config** - **tmp** - **ssh** - **repos** - **crontab** - **logs** - **ssh_host** ![Screenshot 2025-06-03 123617](https://hackmd.io/_uploads/SJFEalhflg.png) ### 7. 建立 stack.env 檔案 `stack.env` 是用在 Portainer 上建立 Stack 的環境參數. 在主目錄下建立 `stack.env` 檔案. 貼入以下內容. ``` ## Required variables section ## # Host port mappings WEB_SERVER_PORT=3000 SSH_SERVER_PORT=3022 # Hostname and URL FQDN=192.168.50.228 NEXTAUTH_URL=http://192.168.50.228 # Secrects NEXTAUTH_SECRET={你的 Token 或任何字串} CRONJOB_KEY={你的 Token 或任何字串} # UID:GID must match the user and group ID of the host folders and must be > 1000 # If you want to use a different user than 1001:1001, you must rebuild the image yourself. UID=1041 GID=1041 # Config and data folders (volume mounts) # The host folders must be owned by the user with UID and GID specified above CONFIG_PATH=/volume2/borgwarehouse/config SSH_PATH=/volume2/borgwarehouse/ssh SSH_HOST=/volume2/borgwarehouse/ssh_host BORG_REPOSITORY_PATH=/volume2/borgwarehouse/repos TMP_PATH=/volume2/borgwarehouse/tmp LOGS_PATH=/volume2/borgwarehouse/logs ## Optional variables section ## # LAN feature FQDN_LAN=192.168.50.228 SSH_SERVER_PORT_LAN=3022 # Disable the DELETE feature #DISABLE_DELETE_REPO=true # Disable the integrations (API tokens to CRUD repositories) #DISABLE_INTEGRATIONS=true # Hide the SSH port in the UI : quickcommands & wizard #HIDE_SSH_PORT=true # SMTP server settings MAIL_SMTP_FROM= MAIL_SMTP_HOST= MAIL_SMTP_PORT= MAIL_SMTP_LOGIN= MAIL_SMTP_PWD= MAIL_REJECT_SELFSIGNED_TLS= # Force app to start on IPv6 #HOSTNAME= # Supercronic crontab CRONTAB_PATH=/volume2/borgwarehouse/crontab # Apprise port APPRISE_PORT=8001 ``` **注意: 務必修改 `UID` `GID` 成你 Synology 帳號的 ID. 如不知道 ID 請用 [ssh 連線到 NAS 機器](#SSH安全連線到公司內部機器)並登入. 打入 `id` 查看你的 ID**. **注意: 建議利用[步驟4](#4-設定-Supercronic)產生 Token 方式更改 `NEXTAUTH_SECRET`**. **注意: 用[步驟4](#4-設定-Supercronic)產生的 Token 取代 `CRONJOB_KEY`**. **如果[步驟3](#3-設定-Borgwarehouse)使用不同的連接埠請更改這幾個設定 `WEB_SERVER_PORT` `SSH_SERVER_PORT` `SSH_SERVER_PORT_LAN`**. **如果[步驟6](#6-建立-Borgwarehouse-相關資料夾)的資料夾在不同位置請更改這幾個設定 `CONFIG_PATH` `SSH_PATH` `SSH_HOST` `BORG_REPOSITORY_PATH` `TMP_PATH` `LOGS_PATH` `CRONTAB_PATH`**. ### 8. 設定 Crontab **注意: Crontab 執行是參照系統的時間來執行, 如果系統時間所在地區不是你預期的請依照下面方式設定**. 1. 檢查目前時間地區 `sudo timedatectl` 2. 列出所有可用的時間地區 `sudo timedatectl list-timezones` 3. 設定時間地區 `sudo timedatectl set-timezone {時間地區代號}`, `{時間地區代號}` 取代為你想要的時間地區 **如果想用預設的 crontab 可跳過下面的設定**. 在你的電腦上建立 crontab 的檔案(文字檔)並設定 cronjob. **確保檔案是用 `CRLF`**. 例如每分鐘執行一次. 依此範例進行修改. [格式參考](https://github.com/aptible/supercronic/tree/master/cronexpr). ``` * * * * * * curl --request POST --url 'http://192.168.50.228:3000/api/v1/cron/status' --header 'Authorization: Bearer {Token}' > /dev/null 2>&1 * * * * * * curl --request POST --url 'http://192.168.50.228:3000/api/v1/cron/storage' --header 'Authorization: Bearer {Token}' > /dev/null 2>&1 ``` **注意: `{Token}` 必須要給. 用[步驟4](#4-設定-Supercronic)產生的 Token 取代**. 從這裡 https://nas.sretw.com 登入 NAS 機器. 將 crontab 檔案上傳到 [步驟6](#6-建立-Borgwarehouse-相關資料夾) crontab 資料夾裡. ### 9. 在 Portainer 建立 Stack 請在 GitHub 上建立一個 Repository 並用 Git 將需要建置的 Borgwarehouse 專案推送上去. 記下該 Repository 的網址. **確保你有安裝並設定 Portainer [步驟1](#1-安裝-Portainer)**. 打開 Portainer 網頁介面並登入. 進入 `local`. ![Screenshot 2025-06-03 131014](https://hackmd.io/_uploads/rkAjr-2Gge.png) 建立新的 Stack. ![Screenshot 2025-06-03 131939](https://hackmd.io/_uploads/ry9-I-hGlg.png) 選擇 **Repository** 並填入相關資訊. ![Screenshot 2025-06-03 132204](https://hackmd.io/_uploads/BJQC8Z3Mex.png) **注意: `Repository URL` 就是推送到 GitHub 上的專案網址. `Repository reference` 就是 GitHub repostiory 的 `branch` 通常是 `main` 不然就是 `master`**. **注意: 如果你用預先調整過的專案 https://github.com/Sretw/borgwarehouse 那就在 `Repository URL` 填入這個網址 `Repository reference` 填上 `main`**. 載入 `stack.env` 專案裡的環境參數檔案. ![Screenshot 2025-06-03 133318](https://hackmd.io/_uploads/S1Mwtbnfxx.png) **注意: 這將是最後一次針對環境變數進行調整**. **注意: 如果你用預先調整過的專案 https://github.com/Sretw/borgwarehouse 可在這裡進行調整變數, 請務必更改 `UID` `GID`**. **變數相關調整請參考[步驟7](#7-建立-stackenv-檔案)**. 確定後進行佈署的動作並等待完成. ![Screenshot 2025-06-03 133933](https://hackmd.io/_uploads/r1qocb3Gxe.png) **注意: 部屬時有可能跳出失敗訊息但 Stack 裡的容器都可正常運作, 如遇此狀況請檢察容器是否運作**. ![Screenshot 2025-06-03 134336](https://hackmd.io/_uploads/H1DisWnzlg.png) ## Borgwarehouse 雲端伺服器設定 **注意: [要先架設 Borgwarehouse 伺服器](#Borgwarehouse-備份伺服器架設)** **注意: 要先建立 borgmatic backup SSH Key [看這裡](#建立-borgmatic-backup-ssh-key)** [連到公司VPN伺服器](#VPN伺服器). [SSH連入到內部Ubuntu-Server機器](#SSH安全連線到公司內部機器). 進入最高權限 `sudo -i`. 進到 ssh 目錄下`cd /opt/mailcow-dockerized/data/conf/borgmatic/ssh` . 印出公用鑰匙內容 `cat {鑰匙檔名}.pub`並拷貝內容. ![Screenshot 2025-05-24 120343](https://hackmd.io/_uploads/SJhkL6Rblx.png) 登入 Borgwarehouse. 預設帳密為 admin/admin 除非有更改過. 建立新的 Repository. ![Screenshot 2025-06-09 103156](https://hackmd.io/_uploads/ByQpDp7mgx.png) 填入相關設定資訊並建立. ![Screenshot 2025-06-09 104132](https://hackmd.io/_uploads/Hy2gqa7Xlx.png) 設定解說: 1. Repository 名字 2. SSH Key 3. 容量大小可以先從小容量開始再慢慢擴大 4. 產生內部網路使用的指令; 產生出一個僅透過內部網路連線到該 Repository 的 ssh 網址 **`Alert if there is no backup since` 是設定在多少天後沒備份要進行通知** 設定沒備份時候的通知. 如果 `Alert if there is no backup since` 設定 `Disabled` 可略過此項. ![Screenshot 2025-06-09 104847](https://hackmd.io/_uploads/SkaiiTQ7lx.png) ![Screenshot 2025-06-09 110421](https://hackmd.io/_uploads/ryrIyC77xg.png) **注意: 請選 `Stateless API server` 並填入 Apprise 服務器的位置與連接埠(預設8001)** **在 Apprise URLs 填入設定範例如下** ``` mailtos://sretw.com?smtp=mail.sretw.com&user=noreply@sretw.com&pass=1234567&from=noreply@sretw.com&to=nelson@sretw.com ``` 格式說明如下. 這是參照 [Apprise 文件](https://github.com/caronc/apprise/wiki/Notify_email)設定. ``` mailtos://{Mail domain}?smtp={Mail smtp address}&user={User account}&pass={User password}&from={Sender address}&to={Recipient address} ``` * {Mail domain}: 郵件伺服器網域例如 sretw.com * {Mail smtp address}: 郵件寄件伺服器的位置例如 mail.sretw.com * {User account}: 登入郵件寄件伺服器帳號 * {User password}: 登入郵件寄件伺服器密碼 * {Sender address}: 寄件者. 如果要用一個公用的話則在 mailcow 裡創建一個 * {Recipient address}: 收件者 E-mail 位置