部署架构
- 服务部署在家庭网络的小型服务器上(包括Golang程序、MySQL等)
- 通过ngrok代理,提供服务给外网环境使用(微信公众号、uni-app等)
- 通过发送邮件的方式,推送消息通知到微信
部署流程
- 开发机上交叉编译生成arm64 linux的二进制包
- scp传送到小型服务器
- 发送信号重启服务
外网环境下开发
- 使用花生壳软件提供映射服务
- 映射MySQL,是开发机能正常启动服务
- 映射小型服务器ssh端口,使可以正常登录机器操作以及传送程序文件
部署和配置
部署服务
vi ~/.weixin_app/config/config.yml
通用配置(MySQL数据库配置)
database:
username: user
password: pass
host: 192.168.33.174
port: 3306
dbname: weixin_app
timeout: 10s
vi ~/.weixin_app/config/private_config.yml
配置私有配置
encrypt: # 用于加解密敏感信息
key: 123456... #(16位字符)
weixin: # 微信开放平台的配置
appid: xxxx #使用encrypt.key AES加密后填写
appSecret: xxxx #使用encrypt.key AES加密后填写
token: xxxx #使用encrypt.key AES加密后填写
mail: #用于发送通知的邮件
address: fffff #使用encrypt.key AES加密后填写
pass: fff #使用encrypt.key AES加密后填写 # 邮箱密码或授权码
name: 拉巴力 # 发送用户名
smtpHost: smtp.qq.com
receiverList: [{ # 通过微信openid找到对应的邮箱,用于发送邮件通知
openId: "xxx", #(微信公众号openid)
address: "xxx@qq.com"
},{
openId: "ddd",
address: "dd@qq.com"
}
]
admin:
accounts: [ # 管理员 微信公众号openid
"oqV-xxxxx",
"oqV-xxxxx"
]
go run cmd/main.go
- 访问 http://127.0.0.1:8989/ 查看是否启动成功
配置外网代理
微信公众号配置
功能分类
基本功能
- 添加、查看、删除todo事项
- 定时微信消息提醒(通过发邮件方式实现,微信需要设置开启邮件提醒)
- 保存发送的图片或视频到服务器,并在第二天汇总发送邮件备份
实现要点
- 对接微信开放平台,接收被动消息,处理并回复
- 查询并缓存微信公众号的access token,用于主动发送请求到微信公众号服务器的场景
- 给符合条件的微信号发送邮件通知
- 敏感配置使用AES加解密
- 接收微信的图片或视频链接,下载到本地服务器相应的位置
运维支持
- 服务器外网ip定时检查,若有变更发送邮件通知(查询微信公众号的accessToken,需要配置白名单ip)
- 设置与开发 -> 基本配置 -> 公众号开发信息 -> IP白名单
- 改功能未完全实现
- 服务接收信号优雅重启
- 服务启动成功发送邮件通知,并附带服务相关信息(外网代理地址,外网ip,内网ip等)
- 服务启动时检查ngrok进程是否运行,否则触发启动
- 服务部署和更新脚本
./script/make.sh
打包二进制文件
./script/upload.sh
上传服务器
./script/deploy.sh
开始重启
- 服务器内网ip定时检查,若有变更发送邮件通知,方便在外网通过花生壳链接,进行ssh登录到家庭服务器
- 服务器重启,配置服务自动启动(centos启动项配置)
被动消息场景如何新增指令
- weixin/wxaction/wxaction.go
registerHandler(cmd, func(openid, content string) string {
return "msg"
})
可以学习
- 使用gorm的例子
- 如何对接微信公众号接收被动消息
- 如何主动通过微信公众号API发送请求查询信息
- 定时任务github.com/robfig/cron/v3的使用
- 使用github.com/fvbock/endless对服务进行优雅重启
- 使用gopkg.in/yaml.v2读取yaml配置文件例子
todo
- 用户openid和对应的邮箱放在数据库维护,目前是配置在private_config.yml#mail.receiverList
- 管理员openid放在数据库维护,目前是配置在private_config.yml#admin.accounts
- 定时邮件提醒时间可配置,cron/cron.go
- 自动启动,启动花生壳并发送二维码到邮件,扫码后可以在外网ssh到服务器
- 合master自动部署脚本,git hook触发服务更新并重启
- 添加用户、 拉黑用户、发送消息通知管理员账号id
- 指令上下文记忆能力
- 接入配置中心,比如nacos
- 保存的图片,支持根据图片信息生成经纬度城市时间水印
说明
- 代码目前的实现,只考虑单机服务
- 若使用sqllite,还可以考虑定时备份到git,common/backup/backup.go
- releases
- packages
- new branch