十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

code-server 多用户隔离指南:N 人共享一台机器

code-server 多用户隔离指南:N 人共享一台机器 code-server 多用户隔离指南N 人共享一台机器【免费下载链接】code-serverVS Code in the browser项目地址: https://gitcode.com/GitHub_Trending/co/code-server同一个 code-server 实例给整个团队用时配置文件互相覆盖、扩展越装越乱、权限边界形同虚设。本文给出一条基于 Unix 用户的隔离路径每人一个独立进程按 4 个阶段从 0 搭到可上线并附踩坑记录与检查清单。先想清楚哪种隔离策略适合你的团队三种常见路子KVM 级虚机、每用户一个 Docker 容器、每用户一个 Unix 账户加独立进程。方案隔离强度内存开销运维复杂度KVM 虚机最强极高每用户数百 MB 起高Docker 容器强中中镜像、存储、编排都要管Unix 用户 独立进程中够用低低全靠系统原生命令选 Unix 用户方案的理由很直接code-server 是单用户设计天然一进程一环境用系统原生的用户、文件权限、systemd 资源限额就能划清边界不需要学一套容器编排。代价是隔离强度弱于容器——内核漏洞、恶意node_modules这类场景它管不住。适用边界≤30 人的内部团队、彼此基本可信。对外提供服务或需要内核级隔离请直接上容器方案。code-server 多用户隔离架构速览整条链路四段浏览器 → Nginx子路径路由 TLS 终结→ 每个用户一个独立 code-server 进程 → 各自的隔离数据目录。每个实例只监听127.0.0.1上的专属端口对外唯一的入口就是 Nginx 的子路径每个实例的工作目录、用户数据、扩展目录都圈在自己的 Unix 账户里实例之间互相不可读。阶段一打地基——装好运行环境与隔离的根目录用官方安装脚本装一份系统级 code-server再为多租户数据预留独立根目录并建一个只记录「用户 → 端口」的映射文件后面路由阶段靠它取端口sh install.sh # 仓库自带的官方安装脚本 mkdir -p /var/lib/code-server /etc/nginx/snippets # 端口映射文件一行一个用户名 端口 touch /var/lib/code-server/ports.map阶段二给每个开发者开独立实例给每个用户建系统账户、生成专属配置、挂一个带资源限额的 systemd 实例。端口不要靠 UID 推导——UID 空间和普通用户重叠迟早撞车所以随机取端口并登记进映射文件#!/usr/bin/env bash # /usr/local/bin/cs-open-account set -euo pipefail NAME$1 DIR/var/lib/code-server/$NAME PORT$(shuf -i 9000-9999 -n 1) useradd -r -m -d $DIR -s /bin/bash codesrv-$NAME sudo -u codesrv-$NAME bash -c mkdir -p $DIR/projects $DIR/.config/code-server cat $DIR/.config/code-server/config.yaml EOF bind-addr: 127.0.0.1:$PORT auth: password password: \$(openssl rand -hex 16) cert: false user-data-dir: $DIR/.local/share/code-server extensions-dir: $DIR/.local/share/code-server/extensions EOF chmod 600 $DIR/.config/code-server/config.yaml echo $NAME $PORT /var/lib/code-server/ports.mapsystemd 模板保证每个实例跑在自己的账户里顺带压住资源上限# /etc/systemd/system/code-server.service [Unit] Descriptioncode-server instance %i Afternetwork.target [Service] Usercodesrv-%i WorkingDirectory/var/lib/code-server/%i/projects ExecStart/usr/local/bin/code-server \ --config /var/lib/code-server/%i/.config/code-server/config.yaml \ --abs-proxy-base-path /users/%i CPUQuota50% MemoryMax1G TasksMax512 Restartalways注意--abs-proxy-base-path子路径部署时内置端口代理/proxy/端口/依赖它才能算对地址漏配就是后面要复盘的坑 2。建完用户执行systemctl daemon-reload systemctl enable --now code-server名字即可拉起。阶段三接流量——Nginx 按子路径分发到对应端口给每个用户生成一段固定端口的 location比在 Nginx 里现算变量稳得多脚本从映射文件取端口# /usr/local/bin/cs-proxy-snippet 用户名输出对应 location 片段 NAME$1; PORT$(awk -v n$NAME $1n{print $2} /var/lib/code-server/ports.map) cat EOF location /users/$NAME/ { proxy_pass http://127.0.0.1:$PORT/; proxy_http_version 1.1; proxy_set_header Upgrade \$http_upgrade; proxy_set_header Connection upgrade; proxy_set_header Host \$host; proxy_set_header X-Real-IP \$remote_addr; proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto \$scheme; } EOF把片段 include 进站点配置nginx -t通过后 reloadTLS 在 Nginx 层终结各实例只管 127.0.0.1永远不对公网暴露端口。阶段四上保险——收权限、挡 SSH、留审计# 1. 禁止这批账户 SSH 登录 echo DenyUsers codesrv-* /etc/ssh/sshd_config systemctl reload sshd # 2. 数据目录整体收紧权限防止组内互读 find /var/lib/code-server -user codesrv-* -type d -exec chmod 700 {} find /var/lib/code-server -user codesrv-* -type f -exec chmod 600 {} # 3. 对数据根目录挂审计规则 auditctl -w /var/lib/code-server -p rwxa -k cs-access密码写在各用户的config.yaml里所以该文件必须保持 600阶段四的 find 会把已放宽的权限重新收回来。踩坑实录四条都是真实事故现象页面能打开、刷新一次就白屏。原因代理层没转发 WebSocket Upgrade 头。解法location 里补Upgrade/Connection两行。现象子路径下内置端口代理/proxy/3000全部 404。原因code-server 不知道自己挂在子路径里。解法启动参数加--abs-proxy-base-path并与代理路径对齐。现象A 登进去却看到 B 的项目。原因端口分配撞车A 的代理指向了 B 的端口。解法端口随机生成后登记映射文件创建前查重。现象有用户直接cat到了别人的登录密码。原因config.yaml默认权限组可读。解法生成时chmod 600并定期复检。上线前检查清单检查项通过标准各实例端口唯一端口映射文件无重复端口实例仅监听回环地址ss -tlnp见 127.0.0.1无 0.0.0.0--abs-proxy-base-path与 Nginx 子路径逐字一致WebSocket 代理头终端、Git 扩展实测可用资源限额systemd 中MemoryMax/CPUQuota已生效目录权限用户目录 700、配置 600SSH 收口codesrv-*登录被拒审计规则auditctl -l含 cs-access 规则清单全绿后再开第二个用户。接下来值得继续挖的两个方向用反向代理层的 SSO 替换各实例的独立密码以及把整套模板搬到 Kubernetes 做按需弹性伸缩。【免费下载链接】code-serverVS Code in the browser项目地址: https://gitcode.com/GitHub_Trending/co/code-server创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表