几款VPS

搬瓦工 The DC9 Plan 限量版套餐补货!$38/年,1核 CPU,768MB 内存,15GB SSD 硬盘,750GB 月流量,1.5Gbps 带宽,可选 DC9 CN2 GIA 机房,暂不支持迁移机房。

购买链接:https://bwh81.net/aff.php?aff=30937&pid=145

优惠码:BWHCGLUKKB  (6.77%)

搬瓦工 THE PLAN 套餐补货!$29美元/季度,$55美元/半年,$99美元/年,2核 CPU,2GB 内存,40GB SSD 硬盘,1000GB 流量,可选 19 个机房!同等配置常规套餐需要约 $299.99 美元。

购买链接:https://bwh81.net/aff.php?aff=30937&pid=147

优惠码:BWHCGLUKKB  (6.77%)

优惠后 92.3美元

方案名称:SPECIAL 10G KVM PROMO V5 – LOS ANGELES – CN2 GIA LIMITED EDITION VPS

方案配置:

硬盘:10 GB SSD
内存:512 MB
CPU:1 核
流量:500 GB/月
带宽:1Gbps

方案价格:

$49.99 USD/年

购买链接:点击直达 (https://bwh81.net/aff.php?aff=30937&pid=94)

 

优惠码:BWHCGLUKKB  (6.77%)

搬瓦工推出 OSAKA LIMITED EDITION 40G

日本软银限量版高配套餐!$79.99/年,1核 CPU、2GB 内存、40GB SSD 硬盘、2.5Gbps 带宽、2000GB 月流量,可选日本软银 JPOS_1 机房,暂不支持迁移机房。

购买链接:https://bwh81.net/aff.php?aff=30937&pid=146

优惠码:BWHCGLUKKB  (6.77%)

 

CN2 GIA-E 1GB 2核 20GB 1TB 2.5Gbps 美国 DC6 CN2 GIA-E
美国 DC9 CN2 GIA
日本软银 JPOS_1
荷兰 EUNL_9
美国圣何塞 CN2 GIA
加拿大 CN2 GIA
$49.99/季度
$169.99/年
购买

 

 

DMIT

线路:
三网优化,中国优化线路CN2GIA

配置信息:
LAX.Pro.WEE

1 vCPU

1 GB RAM

20G SSD Storage

500GB Transfer

500Mbps VirtIO Interface

1 IPv4 & 1 IPv6 /64

Premium Network Profile

价格:$39.9/年

https://www.dmit.io/aff.php?aff=8138&&pid=183

 

PVM.LAX.EB.WEE

$39.9 /年,CMI线路
1C/1G/20G/1000G@1Gbps

https://www.dmit.io/aff.php?aff=8138&pid=188

线路:
三网优化,中国优化线路CN2GIA

LAX.Pro.MALIBU

1 vCPU
1 GB RAM
20G SSD Storage
1000GB Transfer
1Gbps VirtIO Interface
1 IPv4 & 1 IPv6 /64
Premium Network Profile
价格:$49.9/年

https://www.dmit.io/aff.php?aff=8138&&pid=186

 

PVM.LAX.Pro.Tiny(有货)

$88.88/year  – 1C/2G/20G/800G@1Gbps

LAX.Pro.TINY

1 vCPU

2 GB RAM

20G SSD Storage

800GB Transfer

1Gbps VirtIO Interface

1 IPv4 & 1 IPv6 /64

Premium Network Profile

Quarterly:$28.88 USD Semi-Annually:$48.88 USD Annually:$88.88 USD

https://www.dmit.io/aff.php?aff=8138&pid=100

Ddns Cloudflare 脚本

#!/bin/bash

# 配置部分,请根据实际情况修改
API_KEY="你的Cloudflare API密钥"
EMAIL="你的Cloudflare邮箱"
ZONE_ID="你的域名对应的Zone ID"
RECORD_NAME="要更新的记录名称,例如@或www"
RECORD_TYPE="A"  # 或AAAA,根据需要修改
INTERVAL="3"  # 定时任务更新间隔,单位分

# 获取当前主机IP
IPV4=$(curl -4 ip.gs)
IPV6=$(curl -6 ip.gs)

# 更新Cloudflare DNS记录
function update_record() {
  local ip=$1
  local record_type=$2
  curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"type\": \"$record_type\", \"name\": \"$RECORD_NAME\", \"content\": \"$ip\"}" > /dev/null 2>&1
}

# 获取记录ID
RECORD_ID=$(curl -sX GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=$RECORD_NAME&type=$RECORD_TYPE" \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $API_KEY" | jq -r '.result[0].id')

# 更新IPv4记录
update_record "$IPV4" "A"

# 更新IPv6记录
update_record "$IPV6" "AAAA"

# 定时任务设置, /opt/ddns.sh 脚本位置
echo "*/$INTERVAL * * * * root /opt/ddns.sh" | crontab -

小鸡开机改密码登录命令

1)用这种一键脚本避免在密码中包含 $,可能会被 shell 解释为变量名。单独用passwd root设定时不存在这样的问题;
2)一键指令默认删除的其他用户名为admin,可以手动改成其他用户名,要想知道其他潜在要删除的用户名,可以用cat /etc/passwd指令查看。

#切换管理员权限:
sudo su -
#更改密钥登陆为密码登陆:
sudo sed -i -e '/^#\?\s*PermitRootLogin/s/^#\?\s*PermitRootLogin\s\+.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sudo sed -i -e '/^#\?\s*PasswordAuthentication/s/^#\?\s*PasswordAuthentication\s\+.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
#一键更改root密码为12345678
echo "root:12345678" | chpasswd
#删除admin多余账户:
sudo userdel -r admin
#重启SSH服务使得设置生效:
sudo systemctl restart sshd

Debian 11 使用 Docker 安装 Mailcow 自建域名邮箱

Debian 11 使用 Docker 安装 Mailcow 自建域名邮箱

本文将指导如何在 Debian 11 下使用 Docker 安装 Mailcow 搭建自建邮箱。

PS:本文同时适用于任何可安装 Docker 的 Linux 发行版。
本站注:使用黑暗模式查阅本文更直观。

什么是电子邮箱?

电子邮箱,即电子邮件,就是 Email,是指一种由一寄件人将数字信息发送给一个人或多个人的信息交换方式,一般会通过互联网或其他电脑网络进行书写、发送和接收信件,目的是达成发信人和收信人之间的信息交互。一些早期的电子邮件需要寄件人和收件人同时在线,类似即时通信。(Wikipedia)

国内用户一般会使用网易(@163.com)、腾讯(@qq.com)等免费邮箱服务,国外用户一般会使用 Google(@gmail.com)、Yahoo(@yahoo.com)、Microsoft(@outlook.com)等免费服务。

为什么要自建邮箱?

首先,你的数据是你自己的,你的隐私应当得到保护,而不是那些垄断巨头公司的,几乎所有市面上的免费邮箱服务,都是以牺牲你的隐私和数据为代价,利用你的大数据来进行广告行为分析来盈利,那么,你愿意把你自己的数据交付给和你素不相识的第三方么?

其次,看本博客的读者,几乎人手一个域名,人手一只 VPS,那为何不把现有资源利用起来做一些很酷的事情呢?

自建邮箱的优势和劣势

那么,会有小伙伴指出,市面上也有收费的邮箱呀,比如国内一些大厂的「企业邮箱」,为什么不用收费服务呢?我们就自建邮箱,免费邮箱和收费邮箱做一个简单的表格对比:

对比 自建邮箱 免费邮箱 收费邮箱
隐私性 高 低 中
维护难度 高 低 低
价格 中 无 中 – 高
使用成本 高 无 中
隐性成本* 中 极高 高

着重指出一下我所强调的隐性成本:

因为免费和收费的邮箱服务,你的数据都是保存在第三方,你没有服务器的权限,你的帐号都是别人服务器里的冷冰冰的数据库,那么,你邮箱的提供商可以:

  1. 随时用各种理由关停你的服务,无论是合法的还是莫须有的原因,比如这里的例子
  2. 随时把你的资料卖给第三方,你作为最终用户是不可能知道的,比如?
  3. 随时面临倒闭关门从而永久丢失数据的风险,比如曾经的雅虎中文邮箱。

这些成本是你使用第三方服务的时候可能没有考虑过的,而自建邮箱服务的话,这个隐性成本我们是可控的:

  1. 你可以控制你的域名,只要选对有良好信誉的注册局和注册商,每年稳定续费并不做违反 ToS 的事情,域名一般不会被强制暂停;
  2. 你可以选择你的服务器供应商,只要选对有良好信誉的供应商,每月稳定续费并不做违反 ToS 的事情,服务器一般不会被强制暂停;
  3. 你可以每天备份你的数据,自己做数据容灾备份,不丢失任何重要的资料。

自建邮箱需要准备的资料

首先,你需要有一个你「完全拥有使用权限」的「国际化」的域名,我们不推荐使用任何小国家的国别后缀,不然哪天你域名怎么没的都不知道,这里主要还是推荐如下几个稳如狗的 gTLD 后缀:

  • .com
  • .net
  • .org

其次,你需要一台服务器或 KVM / Xen 构架的 VPS,按照官网的说法,推荐的最小配置要求如下:

Resource mailcow: dockerized
CPU 1 GHz
内存 最低 6 GiB + 1 GiB swap (实际测试 4 GiB 内存也足够)
硬盘 20 GiB (不包含邮件的占用)
系统 x86_64

并且从防火墙放行这几个 TCP 端口:

服务 协议 端口 容器名
Postfix SMTP TCP 25 postfix-mailcow
Postfix SMTPS TCP 465 postfix-mailcow
Postfix Submission TCP 587 postfix-mailcow
Dovecot IMAP TCP 143 dovecot-mailcow
Dovecot IMAPS TCP 993 dovecot-mailcow
Dovecot POP3 TCP 110 dovecot-mailcow
Dovecot POP3S TCP 995 dovecot-mailcow
Dovecot ManageSieve TCP 4190 dovecot-mailcow
HTTP(S) TCP 80/443 nginx-mailcow

请注意,因为垃圾邮件滥用的原因,很多国外的 VPS 商家并不允许架设邮件发送服务器,并且默认 25 端口的出口方向是屏蔽的,请自行咨询厂商。

安装 Docker 和 Docker Compose

请参考本站教程

设置 DNS 解析记录

我们假设你的邮箱服务器需要使用域名 mail.example.com,你想搭建 username@example.com 的邮箱;

然后你的服务器 IPv4 为 192.0.2.25,IPv6 为 2001:db8::25,那么请预先做好如下解析:

域名 解析类型 解析值
mail.example.com A 192.0.2.25
mail.example.com AAAA 2001:db8::25
example.com MX 10 mail.example.com.
example.com TXT “v=spf1 mx ~all”
_dmarc.example.com TXT “v=DMARC1; p=reject; sp=reject; adkim=s; aspf=s;”
autodiscover.example.com CNAME mail.example.com.
autoconfig.example.com CNAME mail.example.com.

本站注:
案例 apihub.top (参考上述配置)最终配置如图:

请注意某些 DNS 厂商的控制面板添加 MX 和 CNAME 记录时不需要输入最后的点号,添加 TXT 记录时不需要最前面和最后面的引号。

另外需要联系你的 VPS 厂商,设置 PTR 记录,即 IP 反向解析,请设置 192.0.2.25 和 2001:db8::25 的 PTR 记录为 mail.example.com. 提高邮件到达率。

安装 Mailcow

首先我们获取 Mailcow 的安装代码:

apt install git -y
cd /opt
git clone https://github.com/mailcow/mailcow-dockerized
cd mailcow-dockerized 

然后生成配置文件,请注意使用 FQDN (比如 mail.example.com) 作为 hostname:

bash generate_config.sh 

按照提示输入自己的需求后即可生成好配置文件 mailcow.conf,如有需要可以自己修改这个文件。

然后拉取 Docker 镜像并启动

docker compose pull
docker compose up -d 

耐心等待几分钟后即可访问 https://mail.example.com/ 默认用户名 admin 默认密码 moohoo,建议立马修改并开启 2FA 两步验证确保安全。

添加域名和邮箱

进入 Mailcow 后台后,我们可以在顶部的 Configuration > Mail Setup 里添加域名

在左侧的 Domains tab 里选择 +Add domain 添加域名:

按照自己的要求填入各种设置:

如果需要立马生效 Web 客户端,可以选择 Add domain and restart SOGo:

开启 DKIM 并添加 DNS 记录

开启 DKIM 后邮件发信到达率更高,你可以登录 Mailcow 后台后在 Configuration > ARC/DKIM keys 查看你域名的 dkim 记录值:

右边那一串 v=DKIM1;k=rsa;t=s;s=email;p= 的 2048 位字符即你的 DKIM 值,如果未开启,可以在下方输入域名,选择 2048 位,然后点 + Add 按钮添加

默认添加完域名后即开启了 DKIM,且 Selector 设置为 dkim,然后我们需要添加如下 DNS 记录:

域名 解析类型 解析值
dkim._domainkey.example.com TXT “v=DKIM1;k=rsa;t=s;s=email;p=blablablablablabla”

某些 DNS 厂商的后台可能无法直接添加 2048 位 DKIM 的 TXT 记录,因为 TXT 类型的 DNS 记录最大长度为 255 个字符,那么请手工截断成两个 TXT 记录,第一个需要 255 个字符,第二个记录为剩下的字符串

添加邮箱用户

我们可以在 Mailboxes 这个 tab 里选择 +Add mailbox 按钮添加用户:

按要求提示填写即可:

测试邮件

我们使用刚开的用户登录 Mailcow 自带的 SOGo,默认情况下地址为 https://mail.example.com/SOGo/
或者点击右上角 “应用” 下的 “Webmail”。

首先,测试接受邮件,使用任何外部邮箱给 username@example.com 发一封邮件,看看是否正常收到邮件。

然后我们测试发送邮件,在 mail-tester.com 发送一封 Plain Text 格式的测试邮件,稍等片刻后即可查看你的邮件分数,我们可以看到,严格按照本文教程搭建的自建邮箱服务评分可以是 10 分:

Mailcow 的更新和备份

Mailcow 的更新只需执行 update.sh 脚本即可:

cd /opt/mailcow-dockerized
./update.sh 

按照提示更新仓库文件:

然后再次执行 ./update.sh 更新 Mailcow,提供提示 Are you sure you want to update mailcow: dockerized? All containers will be stopped. [y/N] 输入 y 然后按回车:

然后耐心等待 Docker 更新并重启容器,并且可以选择删除旧的容器:

你也可以使用 docker system prune 命令清除无用的 Docker 镜像。

Mailcow 的备份也自带脚本,我们只需进入目录执行 ./helper-scripts/backup_and_restore.sh 即可:

假设你需要备份到 /opt/backup 目录

cd /opt/mailcow-dockerized
MAILCOW_BACKUP_LOCATION=/opt/backup
./helper-scripts/backup_and_restore.sh backup all 

建议使用定时脚本每天定时备份并同步到第三方机房加密保存

一个简单的 crontab 定时脚本如下

5 3 * * * cd /opt/mailcow-dockerized/; MAILCOW_BACKUP_LOCATION=/opt/backup /opt/mailcow-dockerized/helper-scripts/backup_and_restore.sh backup all 

具体备份命令可参考官方教程

Mailcow 的迁移

有时候我们需要更换服务器,因为基于 Docker 安装,迁移 Mailcow 是个很简单的事情。

首先,在需要迁移的服务器安装 Docker 和 Docker Compose,并确保两边的版本一致,然后停止 Docker 服务:

systemctl stop docker.service
systemctl stop docker.socket 

使用 systemctl status docker 命令检查下 Docker 的状态:

然后从原来的机器把 Docker 容器和挂载的 Volumes 同步到新的机器:

新旧机器均需要安装 rsync:

apt install rsync -y 

旧的机器生成一个 SSH Key:

ssh-keygen -t ed25519 

然后把 /root/.ssh/id_ed25519.pub 文件内容加到新机器的 /root/.ssh/authorized_keys

然后同步 Mailcow 文件和 Docker 挂载的 Volumes:

rsync -aHhP --numeric-ids --delete /opt/mailcow-dockerized/ root@新机器:/opt/mailcow-dockerized
rsync -aHhP --numeric-ids --delete /var/lib/docker/volumes/ root@新机器:/var/lib/docker/volumes 

然后在原来的机器停止 Mailcow 容器:

cd /opt/mailcow-dockerized
docker compose down 

然后再次执行一次同步:

rsync -aHhP --numeric-ids --delete /opt/mailcow-dockerized/ root@新机器:/opt/mailcow-dockerized
rsync -aHhP --numeric-ids --delete /var/lib/docker/volumes/ root@新机器:/var/lib/docker/volumes 

然后在新的机器启动 Docker 服务:

systemctl start docker.service 

然后在新的机器启动 Mailcow 容器:

cd /opt/mailcow-dockerized
docker compose pull
docker compose up -d 

记得迁移之前需要修改好 DNS 记录,解析到新的服务器 IP 即可。

这个迁移方法理论上适合任何使用 Docker 安装的软件

问题集锦

  • 提示:too many colons in address
    docker compose up -d
    WARN[0000] The "WATCHDOG_NOTIFY_EMAIL" variable is not set. Defaulting to a blank string.
    1 error(s) decoding:
    
    * error decoding 'Ports': Invalid ip address :: address ::: too many colons in address

    解决

       - "${HTTPS_BIND:-:}:${HTTPS_PORT:-443}:${HTTPS_PORT:-443}" 
       - "${HTTP_BIND:-:}:${HTTP_PORT:-80}:${HTTP_PORT:-80}" 
    
    # 修改为
    
       - "80:80"
       - "443:443"
  • 提示:Pool overlaps with other one on this address space
     Network mailcowdockerized_mailcow-network  Error                                                                                                                                   0.0s
    failed to create network mailcowdockerized_mailcow-network: Error response from daemon: Pool overlaps with other one on this address space

    解决
    由于 当前 Docker 网络已占用 172.22.1 网段,导致无法启动本程序。

    # 查看网络
    docker network ls  | awk '{print $1}' | xargs docker inspect | grep -B 15 172.22
    
    # 找出 `"Name"` 选项中的网络,先停止该容器,待启动本项目,再启动该容器。

给docker设置个代理

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf

if ! grep HTTP_PROXY /etc/systemd/system/docker.service.d/http-proxy.conf;
then
cat >> /etc/systemd/system/docker.service.d/http-proxy.conf <<EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:3128/" "HTTPS_PROXY=http://127.0.0.1:3128/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
EOF
fi

# Flush changes:
sudo systemctl daemon-reload
#Restart Docker:
sudo systemctl restart docker
#Verify that the configuration has been loaded:
sudo systemctl show --property=Environment docker
# 像这样:Environment=HTTP_PROXY=http://127.0.0.1:8081/ NO_PROXY=localhost,127.0.0.1,docker-registry.so

systemd 设置环境变量

设置 systemd 的环境变量,有如下几种方式:

  • 1. 在 xxx.service 通过 Environment="MY_VAR_1=VAR_1_VALUE" 设置变量
  • 2. 在 xxx.service 通过 EnvironmentFile=/opt/workspace/my_env 指定配置文件
  • 3.systemctl edit xxx.service 或手动创建 /etc/systemd/system/xxx.service.d/override.conf 文件进行配置

同一个变量,在多个方式同时配置,会存在覆盖。建议只使用一种方式。

方式 1 Environment=

编辑 systemd 的 service 文件,添加 Environment= 形如下:

  • [Service]
  • Environment=“MY_VAR_1=VAR_1_VALUE”
  • Environment=“MY_VAR_2=VAR_2_VALUE”

上述添加了两个环境变量:MY_VAR_1=VAR_1_VALUE 和 MY_VAR_2=VAR_2_VALUE

如需修改环境变量,即修改 service 文件,需要重新 reload

  • systemctl daemon-reload

方式 2 EnvironmentFile=

编辑 systemd 的 service 文件,添加 EnvironmentFile= 形如下:

  • [Service]
  • EnvironmentFile=/opt/workspace/env_test.env
  • EnvironmentFile=-/opt/workspace/env_test_not_exist.env

上述指定了两个设置环境变量的文件:/opt/workspace/env_test.env 和 /opt/workspace/env_test_not_exist.env。
需要注意的是,第二个 EnvironmentFile 使用 - 在目录前,作用是忽略文件不存在。

创建 /opt/workspace/env_test.env 格式如下

  • MY_VAR_1=VAR_1_VALUE
  • MY_VAR_2=VAR_2_VALUE

方式 3 创建 xxx.service.d/override.conf

创建这个文件,有两种方式,执行 systemctl edit xxx.service 后,进入 nano 编辑界面保存成文件即可。或者在 xxx.service 同目录下,创建 xxx.service.d 文件夹,在该文件夹下,创建 override.conf (文件名随便,一般为 override.conf )。

创建的文件格式如下:

  • [Service]
  • Environment=“MY_VAR_1=VAR_1_VALUE”
  • Environment=“MY_VAR_2=VAR_2_VALUE”

以 Debian 系统为例,一般 xxx.service 文件在 /etc/systemd/system/ 下,
所以创建的文件路径为 /etc/systemd/system/xxx.service.d/override.conf

引用:

How to set environment variable in systemd service?

PVE OP overlay分区扩容

官方镜像硬盘空间只有一百多兆,如果安装比较多的插件空间会比较紧张,需要扩容,网上找到使用最多的教程方法,不知道为什么在我这里一直无法成功扩容,常见教程都是将硬盘剩余空间新建分区,然后迁移overlay分区文件到新分区,再挂载为外部/overlay,或者迁移根目录下所有内容再挂载为根目录/,这两种我试了不下5次,均告失败,还有按openwrt官方方法也是未能成功扩容,最后找到较少见的直接扩容原overlay空间的方法,好不容易成功扩容,记录一下,以防忘记。

1. 安装必要工具

opkg install losetup parted cfdisk block-mount fdisk resize2fs

2. 调整硬盘大小

在pve中调整硬盘大小,然后启动虚拟机。

3. 扩容操作

ssh登录openwrt,运行以下命令:

cfdisk #查看硬盘分区信息,检查是不是有一个调整硬盘大小后多出来的free space,一般overlay目录挂载的是/dev/sda2

parted /dev/sda

print #查看硬盘信息,第二个分区即sda2,注意现在空间大小(size)

resizepart 2 100% #修改第二个分区sda2大小为100%,即将所有free space划入sda2

print #检查看空间大小是不是变了

losetup #记住/dev/loop0的offset偏移值

losetup -o offset偏移值 /dev/loop100 /dev/sda2 #offset偏移值换成上一命令显示的offset值,loop100可以改成其他,只要不跟现有loop设备重复就行

e2fsck /dev/loop100 #检查文件系统,一路按y确认就可以

resize2fs /dev/loop100 #修改分区空间大小

reboot #重启系统后可使用df -h命令检查overlay是不是变大了,或者进入软件安装界面查看剩余空间

至此完成overlay分区扩容。