因为配置Docker时没注意,把系统搞爆了
目录
最近在重塑消息源(不希望天天依靠 B 站来获取信息了,太容易被其他东西吸引注意了),准备在自己的小主机上部署一个RSShub,期间发生了亿点点意外,以下是复盘
因为小主机使用CasaOS面板来管理 docker,所以我很自然地考虑使用 CasaOS 来部署 RSShub(因为对于命令行部署的 docker 容器 CasaOS 只能提供有限的管理功能)
使用 CasaOS 部署的时候选择了 docker-compose 的方式,但是我是第一次尝试用 CasaOS 的这个功能
部署的时候有个弹窗,如图:
但是我没有特别在意(伏笔 1)
然后继续部署,中间有些 warning,我没特别在意去看
部署完,访问 RSShub 实例的时候第一次很正常,但是第二次就无法访问了,F12 一看网页网页控制台输出发现 500 了,怀疑是服务器的问题,所以去看 docker 日志,发现了
Redis error: getaddrinfo ENOTFOUND
这样的报错,查询了一下发现和网络有关(解决 Redis 报错:Error getaddrinfo ENOTFOUND),查看了 CasaOS 的配置,我认为是 CasaOS 没有正确解析文件,导致没有配好 docker 网络,进而导致主服务没有正确访问到 Redis 服务(RssHub 的 docker-compose 部署版本有 3 个服务)
检查 CasaOS 的配置的时候我发现 redis 的/data 目录挂载在了小主机的根目录下,这个地方感觉很可疑,但当时我觉得问题不在这里(伏笔 2)
同时翻阅日志的时候发现了chwon
的字样,有点疑惑但是没太在意(伏笔 3)
然后我准备去登陆小主机,准备用命令行来部署,然后发现登陆不上去了,无论是 root 还是普通用户,都无法登陆,报错如下:
kex_exchange_identification
噔噔咚!
于是重启小主机,启动后检查发现,一些 docker 应用没有正常启动,我还以为是硬盘挂载问题(因为之前有过这个问题,我是用 USB 连接的)
我 ssh 登陆上去(这个时候 ssh 能登陆但是莫名其妙很慢)检查硬盘,发现硬盘没有自动挂载(这个地方也很可疑),然后手动挂载硬盘
挂载之后 docker 应用还是不能启动,检查日志发现了一堆Permission denied
的报错
修改了对应权限的读写权限,然后发现还是不行,而且权限似乎又被改回去了
上课去了,上课的时候,联系了挂载,权限,想到可能是 docker 的 Redis 容器导致的问题
晚上回来,尝试检查系统,发现 ufw,su,sudo 等一系列基础命令都无法使用,报错类似于
sudo:/usr/bin/sudo 必须属于用户 ID 0(的用户)并且设置 setuid 位
好在 chown 还能用,然后尝试一个一个修改权限,但是很快发现,修改完很快就被改回去了
我在想是哪个用户干的,但是没找到 id 为 999 的用户
百思不得其解的时候,我又去翻看了 docker 日志和 CasaOS 的配置,然后我突然意识到:
tmd,CasaOS 把 redis 的/data 目录挂载到了根目录,然后 Redis 容器循环修改文件权限,导致外面爆炸了!!!!
进入 Redis 的容器,发现里面也有大量文件属于 999 用户,这下确定了我的猜测
接下来就好办了,暂停了 CasaOS 的 docker-compose,使用命令行部署,然后逐步修改文件权限,但是怎么改呢?
我不知道文件权限在这之前是什么样的,查询得到如下命令:
sudo find / -user 999 -exec chown root:root {} +
这条命令可以找到所有属于 999 用户的文件,然后修改回 root 用户,这样似乎还没解决问题,不过主要问题源已经解决了,下面就是一下小文件的具体权限配置了,看哪里报错改哪里,慢慢就该回去了
这给我折腾了大概 3~4 个小时
总结一下,问题在于:
- CasaOS 解析 docker-compose 文件功能并不完善,然后我也没有注意到提示
- 发现 docker 挂载到根目录,但是意识不足