Skip to content

Docker 部署

偏好容器?服务端有现成的单镜像:

bash
podman pull ghcr.io/yinyue123/16code:latest    # docker 同理

容器需要宿主机提供两样东西,都要持久化:

宿主机路径挂载到用途
/etc/code.yaml/etc/code.yaml配置文件——见配置文件
/var/lib/code/var/lib/code/data全部数据,包括 HTTPS 证书缓存。不持久化的话,每次重建容器都重签证书,很快触发 Let's Encrypt 限流。

容器内进程以非 root 用户(uid 10001)运行,两个路径的属主都要给它。

准备

bash
# 1. 配置——从示例开始改(至少改 tlsDomains、cookieSecure)
sudo curl -fsSL -o /etc/code.yaml \
  https://raw.githubusercontent.com/yinyue123/16code/main/deploy/server.example.yaml
sudo $EDITOR /etc/code.yaml

# 2. 数据目录 + 容器用户属主
sudo mkdir -p /var/lib/code
sudo chown 10001:10001 /etc/code.yaml /var/lib/code

运行

bash
podman run -d --name code-server --network host \
  --cap-add NET_BIND_SERVICE \
  -v /etc/code.yaml:/etc/code.yaml \
  -v /var/lib/code:/var/lib/code/data \
  --restart always \
  ghcr.io/yinyue123/16code:latest
  • --network host——服务器直接绑定 80/443;对 ACME 验证和 WebSocket 都最省事。
  • --cap-add NET_BIND_SERVICE——允许非 root 进程绑定 1024 以下的端口。改用高端口就不需要。
  • 配置文件读写挂载(不加 :ro),这样可以在容器里现场编辑:
bash
podman exec -it code-server code-server-setup

Ctrl+S 保存后服务器原地重载——不用重启容器。

作为 systemd 服务(Podman quadlet)

写入 /etc/containers/systemd/code-server.container,然后 systemctl daemon-reload && systemctl start code-server

ini
[Unit]
Description=code cloud server

[Container]
Image=ghcr.io/yinyue123/16code:latest
ContainerName=code-server
Network=host
Volume=/etc/code.yaml:/etc/code.yaml
Volume=/var/lib/code:/var/lib/code/data
AddCapability=CAP_NET_BIND_SERVICE

[Service]
Restart=always

[Install]
WantedBy=multi-user.target

在已有反向代理后面

如果这台机器上已有 nginx/Caddy/隧道在终结 TLS,就不开自动 HTTPS,把服务器放到环回高端口:/etc/code.yaml 里设 tlsDomains: []listen: "127.0.0.1:5080",去掉 AddCapability,代理指向 127.0.0.1:5080(必须透传 WebSocket)。

升级

bash
podman pull ghcr.io/yinyue123/16code:latest
podman restart code-server        # quadlet 用: systemctl restart code-server

配置、数据、历史、证书全在宿主机卷上——升级镜像什么都不会动。