Appearance
由于 Docker for Mac 对资源的消耗有亿点大(在家充着电还好,一出门就尿崩),所以考虑将 docker 里运行着的服务使用 macOS 本地部署。
在 GPT 的帮助下,完成了。期间遇到了一些坑,本地部署也比 docker 容器管理起来要麻烦,于是在此记录一下,以便日后查看。
MySQL
日常开发的时候,本地的数据库还是必不可少的,用 docker 部署便于管理,数据也方便备份和迁移,而本地部署就没那么愉快了。
MySQL 提供了 pkg 安装包,一步步点确认往下走即可。
其中一步选择密码加密方式的时候应该选 Use Legacy Password Encryption
,在开发的时候可以直接用密码登录数据库,免去很多麻烦。
安装成功之后,可以在系统的设置面板去控制 MySQL。默认的安装目录是 /usr/local/mysql
(软连接执行真正的安装目录 /usr/local/mysql-8.0.34-macos13-x86_64
),配置文件是其下的 my.cnf
。
默认监听的是 0.0.0.0
,可以在 my.cnf
中配置:
cnf
[mysqld]
default-time-zone='+8:00'
default_authentication_plugin=mysql_native_password
bind-address = 127.0.0.1
mysqlx_bind_address = 127.0.0.1
关于 3306 和 33060
MySQL 数据库默认监听 3306 端口进行客户端到服务器的通信。然而,端口 33060 是 MySQL Server 8.0 开始引入的新特性,用于提供专门的 X Plugin API 支持。
这个 X Plugin 提供了一个新的协议,称为 MySQL X Protocol,它是一种可扩展的高级编码协议,支持异步操作并允许对 CRUD-style 数据对象进行编码。X Protocol 使用更现代、灵活和强大的方式处理数据库交互,并且支持如 NoSQL Document Store(文档存储)等额外功能。
端口 33060 默认用于 MySQL X Protocol 的连接,这个协议使用了更先进的消息格式,即 Protocol Buffers(也被称为 Protobuf),而不是传统 MySQL 协议所用的自定义消息格式。
在实际应用中,如果你正在使用支持 MySQL X Protocol 的客户端库(如 MySQL Connector/J 8.0 或更高版本),你将连接到端口 33060。否则,仍然是连接到传统的 3306 端口。
Redis
官方文档 使用 brew 安装,倒是简单:
sh
brew install redis
brew services start redis
brew services info redis
默认数据目录是 /usr/local/var/db/redis/
,配置文件是 /usr/local/etc/redis.conf
。默认监听的就是 127.0.0.1
。
Vaultwarden(Bitwarden)
vaultwarden 没有提供 macOS 的可执行文件,所以尝试在本地编译了一下,耗时久就算了,硬盘占用 1.7G,还要处理墙的问题。索性用 GitHub Actions keng42/vaultwarden 编译一个自用的。代价就是不能及时更新。
开机启动
launchd 实在是整不明白,写了个脚本处理运行状态。
sh
#!/bin/bash
echo "Checking vaultwarden..."
cd ~/Applications/vaultwarden
export ROCKET_PORT=8001
export ROCKET_ADDRESS=127.0.0.1
export WEB_VAULT_VERSION=2.x.y
export DATA_FOLDER=PATH_TO_VAULTWARDEN_DATA
pgrep -f "./vaultwarden" &> /dev/null
if [ $? -ne 0 ]; then
echo "vaultwarden is not running in the background!"
echo "Starting vaultwarden in the background..."
# start vaultwarden and let it run in the background.
nohup ./vaultwarden > ./log.txt 2>&1 &
echo "vaultwarden has been started in the background."
else
echo "vaultwarden is already running in the background!"
fi
pgrep -f "./vaultwarden" &> /dev/null
if [ $? -ne 0 ]; then
echo "vaultwarden ❌"
else
echo "vaultwarden ✅"
fi
Git server
之前是在 docker 里运行了一个 sshd 容器,作为 git server 供局域网其他设备同步。
最简单的是 git daemon,直接在本地仓库启动一个服务供其他设备通过 git 协议同步,缺点是没有任何安全限制。 对于我这种即使是局域网里也要用 https 的人接受不了 🤷。
其次是 nginx + git-http-backend + fcgiwrap + socat 实现 https git server,折腾了许久,没成功,放弃。
最后还是 ssh + git-shell 搞了一个。
- 控制面板创建一个新用户(暂命名为 giter),要求标准用户(共享用户没有 home 目录、没有 shell 功能)
- 控制面板搜索 sharing, 打开
Remote Login
,并允许 giter 登录,同时勾选Full Disk
权限(为了将 git 仓库放入 Documents 等受保护的文件夹内) - 使用
su giter
进入 giter 的 shell,完成一些配置,以下命令也可通过sudo -u giter xxx
执行
sh
mkdir -p ~/.ssh
vi ~/.ssh/authorized_keys # 其他设备的公钥
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
mkdir -p ~/Documents/git-repos # 放在 Documents 下可受 TCC 保护
cd ~/Documents/git-repos
git init --bare proj1.git
控制面板用户管理右键点击 giter,进入高级选项,将 shell 改为
git-shell
(/usr/local/bin/git-shell
)Remote Login
其实就是 OpenSSH,修改 sshd 配置sudo vi /etc/ssh/sshd_config
,禁用密码登录,IP 白名单,改完直接在控制面板关闭开启Remote Login
即可生效
PasswordAuthentication no
ChallengeResponseAuthentication no
AllowUsers [email protected] [email protected]
- 在其他设备可同步 git 仓库
sh
git clone ssh://[email protected]/Users/giter/Documents/git-repos/proj1.git
吐槽一下 macOS 的防火墙是真的难用。
总结
至此,所有的 docker 容器都变成本地部署了,内存 free 4G
🤣
可以用 sudo lsof -i -P -n | grep LISTEN
查看目前所有监听中的端口,避免安全隐患。
-i
找出那些使用 Internet 协议(TCP 和 UDP)的文件-P
阻止服务名称转换成端口号-n
防止将网络地址转换成主机名,这可能会加快命令的速度