内容
活动
关注

基于code-server的云端编程环境部署

简介: 本文档描述如何在 Ubuntu 主机上部署 code-server(即“网页版 VS Code”),并通过 autossh 将服务反向隧道到跳板机、使用 Nginx 反向代理域名访问、以及使用 certbot 配置 HTTPS。适合在多设备间共享同一开发环境、并解决个人主机动态公网 IP 的访问问题。

概述

本文档描述如何在 Ubuntu 主机上部署 code-server(即“网页版 VS Code”),并通过 autossh 将服务反向隧道到跳板机、使用 Nginx 反向代理域名访问、以及使用 certbot 配置 HTTPS。适合在多设备间共享同一开发环境、并解决个人主机动态公网 IP 的访问问题。

本文要点:

  • 使用 code-server 提供浏览器可访问的开发环境
  • 使用 autossh 建立反向隧道到跳板机,避免暴露个人主机公网地址
  • 在跳板机上用 Nginx 反向代理到域名
  • 用 certbot 配置有效的 TLS/HTTPS
  • 提供必要的安全提示与故障排查方法

先决条件

  • 目标主机:运行 Ubuntu(本文以 Ubuntu 为例)
  • 跳板机:具有固定公网 IP 或已配置域名,可做反向代理
  • 域名:已在 DNS 中解析到跳板机(A 或 CNAME 记录)
  • 本地与跳板机之间可做 SSH 连接(可通过密钥认证)
  • 具有 sudo 权限的用户

一、部署 code-server(目标主机)

建议:将 code-server 绑定到 localhost 或内部端口,再通过跳板机/Nginx 暴露到公网,避免直接把 code-server 绑定到 0.0.0.0(除非有额外防护)。

  1. 安装 code-server(官方脚本)

    curl -fsSL https://code-server.dev/install.sh | sh 
  2. 打开并编辑配置文件(路径因版本可能不同,常见为 ~/.config/code-server/config.yaml)

    nano /home/$USER/.config/code-server/config.yaml 
  3. 建议的 config.yaml 关键项(示例)

  • 如果通过跳板机和 Nginx 暴露,建议 bind 到 localhost 并使用内部端口(例如 127.0.0.1:8080)
  • 新版 code-server 常用 auth 字段

示例:

bind-addr: 127.0.0.1:8080 auth: password password: "请使用强密码或从环境变量/secret 管理" cert: false 

安全提示:

  • 更安全的做法是使用反向代理的 TLS(Nginx + certbot),并在 code-server 中禁用直接证书管理(cert: false)。
  • 如需更高安全性,可考虑配合 OAuth、OIDC 或组织内反向代理认证。
  1. 启动并管理 systemd 服务(脚本通常已创建 service)
    sudo systemctl daemon-reload sudo systemctl start code-server@${USER} sudo systemctl enable code-server@${USER} sudo systemctl status code-server@${USER} 

验证(在目标主机上):

addr=$(grep -E '^\s*bind-addr' /home/$USER/.config/code-server/config.yaml | cut -d ':' -f 2- | tr -d ' ') curl -i http://${addr} # 如果绑定到 localhost,请用 localhost 替代或先确认端口监听 ss -tlnp | grep 8080 

二、使用 autossh 建立反向隧道(目标主机 -> 跳板机)

目标:在目标主机上运行 autossh,将 code-server 的本地端口反向映射到跳板机的某个端口(跳板机上监听该端口,供 Nginx 转发到域名)。

  1. 安装 autossh(目标主机)

    sudo apt update sudo apt install -y autossh 
  2. 配置 SSH 密钥(目标主机生成并把公钥拷到跳板机)

    ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_code_server ssh-copy-id -i ~/.ssh/id_rsa_code_server.pub user@jumphost.example.com # 测试无密码登录 ssh -i ~/.ssh/id_rsa_code_server user@jumphost.example.com 
  3. 在目标主机创建 systemd 服务文件 /etc/systemd/system/autossh-code-server.service(示例)
    ```ini
    [Unit]
    Description=autossh reverse tunnel for code-server
    After=network-online.target
    Wants=network-online.target

[Service]
User=your_local_user

如果使用特定私钥,确保权限正确

Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -N -T \
-i /home/your_local_user/.ssh/id_rsa_code_server \
-o "ServerAliveInterval=30" -o "ServerAliveCountMax=3" \
-R 127.0.0.1:12345:127.0.0.1:8080 user@jumphost.example.com
Restart=always
RestartSec=5
KillMode=process

[Install]
WantedBy=multi-user.target

说明: - 把 12345 换成跳板机上要映射的端口(跳板机需保证该端口可用) - 如果需要远程任何地址可访问(非仅 localhost),在 -R 中去掉 127.0.0.1 前缀,但这会扩大暴露面,慎用。 4. 启动并启用服务 ```shell sudo systemctl daemon-reload sudo systemctl start autossh-code-server sudo systemctl enable autossh-code-server sudo systemctl status autossh-code-server 
  1. 跳板机注意事项
  • 在跳板机上确保所用端口在防火墙/云安全组中已放行(TCP)。
  • 若跳板机使用 OpenSSH 的 GatewayPorts 设置,可能需要在 /etc/ssh/sshd_config 中配置 GatewayPorts yes(重启 sshd)。

三、跳板机:Nginx 反向代理配置

在跳板机上安装 Nginx,并将跳板机上由 autossh 映射出的端口反向代理到你的域名,提供 websocket 支持与 TLS 协议终端。

  1. 安装 Nginx

    sudo apt update sudo apt install -y nginx 
  2. 放行防火墙端口(示例使用 ufw)

    sudo ufw allow 'Nginx Full' # 放行 80 和 443 sudo ufw reload 
  3. 创建 Nginx 配置文件,例如 /etc/nginx/sites-available/code-server.conf
    示例配置(把 domain.example.com 和 12345 替换为真实值):

    server {  listen 80; server_name domain.example.com; # 可选:强制 HTTPS(如果希望自动跳转到 HTTPS,可把下行取消注释) # return 301 https://$host$request_uri; location / {  proxy_pass http://127.0.0.1:12345/; # websocket & headers proxy_http_version 1.1; proxy_set_header Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 关闭缓冲以改善 websocket 实时性 proxy_buffering off; } } 
  4. 启用站点并测试 Nginx 配置

    sudo ln -s /etc/nginx/sites-available/code-server.conf /etc/nginx/sites-enabled/ sudo nginx -t sudo systemctl reload nginx 
  5. 测试(在跳板机上)

    curl -i http://domain.example.com/ # 或直接请求映射端口 curl -i http://127.0.0.1:12345/ 

四、在跳板机上配置 HTTPS(certbot)

使用 certbot 的 nginx 插件自动为 Nginx 站点获取与安装证书。

  1. 安装 certbot 与插件

    sudo apt update sudo apt install -y certbot python3-certbot-nginx 
  2. 运行 certbot(交互式,会自动修改 Nginx 配置并重载)

    sudo certbot --nginx -d domain.example.com 
  3. 自动续期(certbot 会添加系统 timer,亦可手动测试)

    sudo certbot renew --dry-run 
  4. 验证 HTTPS

    curl -I https://domain.example.com/ 

安全提示:

  • 确保 DNS 指向正确并且 80/443 已被放行,certbot 才能完成域名验证。
  • 确保 Nginx 配置没有开放不必要的代理路径。

五、安全建议与最佳实践

  • 永远使用密钥登录 SSH,禁用密码登录(/etc/ssh/sshd_config)。
  • 把 code-server 绑定到 localhost,只通过受控的跳板机和 TLS 暴露服务。
  • 在跳板机上限制映射端口的访问来源(防火墙规则),如仅允许来自特定 IP 段访问管理端口。
  • 为 code-server 使用强密码或集成 SSO/OAuth。
  • 定期更新系统与相关组件(code-server、nginx、certbot、autossh)。
  • 监控日志(/var/log/nginx、journalctl -u autossh-code-server、systemctl status code-server@${USER})。

六、常见故障排查

  • 无法通过域名访问:
    • 检查 DNS 是否已生效(dig 或 nslookup)。
    • 检查跳板机 Nginx 是否运行(sudo systemctl status nginx)。
    • 检查 autossh 隧道是否建立(在跳板机 ss -tlnp | grep 12345)。
  • code-server 页面空白或认证失败:
    • 确认 code-server 正在目标主机上监听正确端口(ss -tlnp)。
    • 查看 code-server 日志:journalctl -u code-server@${USER} -f
  • certbot 验证失败:
    • 确保 80 端口可访问(临时关闭防火墙或允许来自 Let’s Encrypt 的访问),并确认域名解析到跳板机。

七、示例整体流程(简洁步骤)

  1. 在目标机安装并配置 code-server(bind 到 127.0.0.1:8080)。
  2. 在目标机生成 SSH 密钥并将公钥上送跳板机。
  3. 在目标机用 autossh 建立 -R 隧道到跳板机端口 12345,并把其设为 systemd 服务。
  4. 在跳板机安装 Nginx,配置反向代理 domain.example.com -> 127.0.0.1:12345。
  5. 在跳板机用 certbot 为 domain.example.com 申请证书并启用 HTTPS。
  6. 验证并关注日志、定期更新与备份。

目录
相关文章
|
6天前
|
消息中间件 缓存 NoSQL
Redis + Java 架构实战:从锁机制到消息队列的整合
本文深入解析Redis与Java的整合实践,涵盖分布式锁、消息队列、缓存策略、高性能数据结构及容错机制。结合电商场景,助力构建高并发、高可用的分布式系统。
66 8
|
15天前
|
并行计算 负载均衡 关系型数据库
超长序列并行之Ulysses + Ring-Attention技术原理与实现
本文介绍大模型长序列训练中的显存优化技术,重点解析Ulysses与Ring-Attention的融合方案。通过序列并行降低显存占用,结合zigzag切分与padding_free适配,实现高效多模态训练,在3B模型上显存从75GB降至18GB,显著提升长序列训练可行性。
436 30
|
7天前
|
存储 调度 KVM
深入浅出KVM虚拟化技术原理——Ansible安全基线配置(一)
本文深入解析KVM虚拟化核心机制,涵盖内核如何调度QEMU进程与KVM模块协同工作、CPU虚拟化扩展(VT-x/AMD-V)的硬件加速原理,以及存储池的管理与优势,助你全面掌握KVM底层运行逻辑。
115 11
|
25天前
|
Kubernetes Java Go
Cloud Naive最佳开发实践
经过多年的工作,我们的精神导师John领悟了java那一套docker in docker的艺术并带到golang项目架构设计中。
387 49
|
8天前
|
人工智能 安全 测试技术
Strix:用AI做渗透测试,把安全漏洞扼杀在开发阶段
Strix是开源AI安全测试工具,模拟黑客攻击并验证真实漏洞,支持代码与环境协同扫描,误报率低,可集成CI/CD,将数周渗透测试压缩至几小时,助力开发与安全团队高效发现风险。
Strix:用AI做渗透测试,把安全漏洞扼杀在开发阶段
|
7天前
|
监控 安全 Linux
Linux如何部署服务并设置为开机自启
系统ctl命令用于管理Linux服务,包括启动、停止、重启和重载配置等操作。journalctl命令可查看特定服务日志。编写服务文件时需定义[Unit]、[Service]和[Install]部分,通过systemctl管理新服务并设置开机自启。
128 12
|
1月前
|
人工智能 运维 Serverless
函数计算 × MSE Nacos : 轻松托管你的 MCP Server
本文将通过一个具体案例,演示如何基于 MCP Python SDK 开发一个标准的 MCP Server,并将其部署至函数计算。在不修改任何业务代码的前提下,通过控制台简单配置,即可实现该服务自动注册至 MSE Nacos 企业版,并支持后续的动态更新与统一管理。
526 42
|
28天前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
357 37
下一篇