基于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. 验证并关注日志、定期更新与备份。

目录
相关文章
|
IDE Shell 网络安全
使用ESC服务器配置code-server
使用ESC服务器来配置code-server服务(在线VSCode编辑器)
1754 1
使用ESC服务器配置code-server
|
Ubuntu 网络协议 Java
【Android平板编程】远程Ubuntu服务器code-server编程写代码
【Android平板编程】远程Ubuntu服务器code-server编程写代码
|
1月前
|
消息中间件 缓存 NoSQL
Redis + Java 架构实战:从锁机制到消息队列的整合
本文深入解析Redis与Java的整合实践,涵盖分布式锁、消息队列、缓存策略、高性能数据结构及容错机制。结合电商场景,助力构建高并发、高可用的分布式系统。
130 8
|
1月前
|
存储 调度 KVM
深入浅出KVM虚拟化技术原理——Ansible安全基线配置(一)
本文深入解析KVM虚拟化核心机制,涵盖内核如何调度QEMU进程与KVM模块协同工作、CPU虚拟化扩展(VT-x/AMD-V)的硬件加速原理,以及存储池的管理与优势,助你全面掌握KVM底层运行逻辑。
290 12
|
1月前
|
JSON 网络安全 数据格式
深入浅出Ansible技术原理——Ansible安全基线配置(一)
本系列深入解析Ansible安全自动化,涵盖其无代理、幂等性、声明式三大设计哲学,剖析基于Python的内核原理与SSH通信机制,并详解Inventory、Roles、Handlers、Vault等核心组件与最佳实践,助你从入门到精通,构建高效、安全、可复用的自动化运维体系。
166 7
|
1月前
|
人工智能 安全 测试技术
Strix:用AI做渗透测试,把安全漏洞扼杀在开发阶段
Strix是开源AI安全测试工具,模拟黑客攻击并验证真实漏洞,支持代码与环境协同扫描,误报率低,可集成CI/CD,将数周渗透测试压缩至几小时,助力开发与安全团队高效发现风险。
Strix:用AI做渗透测试,把安全漏洞扼杀在开发阶段
|
4月前
|
缓存 算法 搜索推荐
从O(n²)到O(n log n):深度剖析快速排序的内存优化与cache-friendly实现 🌟 Hello,我是摘星!
作为一名深耕算法优化领域多年的技术工程师,我见证了无数次关于排序算法性能讨论的激烈辩论,而快速排序(QuickSort)始终以其卓越的实践表现占据着核心地位。今天我想和大家深入探讨的,不仅仅是快速排序的基础实现,更是如何通过精妙的内存优化策略,将其从理论上的O(n²)最坏时间复杂度,提升到实际应用中稳定的O(n log n)性能表现,并实现真正的cache-friendly设计。在我的实践经验中,许多开发者对快速排序的理解还停留在基础的递归实现层面,而忽略了现代计算机体系结构下内存层次结构对算法性能的深刻影响。本文将系统地分析快速排序在内存访问模式、缓存局部性、尾递归优化等方面的核心技术要点,
211 0
从O(n²)到O(n log n):深度剖析快速排序的内存优化与cache-friendly实现 🌟 Hello,我是摘星!
|
1月前
|
Shell KVM 数据安全/隐私保护
深入浅出Ansible语法——Ansible安全基线配置(一)
本文由Prism撰写,系统讲解Ansible核心语法与实战技巧,涵盖变量、流程控制、错误处理、Roles、模板、Vault加密及常用模块,附丰富示例,助力运维与开发人员快速上手并应用于真实环境。
107 7
|
1月前
|
缓存 Linux KVM
深入浅出KVM内存管理——Ansible安全基线配置(一)
本文介绍了KVM的内存管理机制设计,用于帮助大家更深入理解KVM的内存管理
234 4