1. 场景与总体拓扑概述
目标:为香港高校或编程班提供一套可复制的VPS组网与协作开发环境。
拓扑:每组学生各自或共享一个VPS(具有公网IP),VPS上运行code-server/Gitea/Docker,Nginx做反向代理并用Let's Encrypt做证书,学生本地用SSH或浏览器访问。
要点:安全(SSH key、UFW)、可协作(Gitea+code-server)、易恢复(Docker Compose + 数据卷备份)。
2. 选择VPS与域名、DNS设置
步骤1:选供应商(建议选择香港或邻近亚太节点以降低延迟,如Vultr、Linode、Alibaba HK等)。
步骤2:配置规格:最低1核、1GB内存、20GB盘(教学用可按需扩展);购买后记录公网IP。
步骤3:购买域名并在DNS托管里添加A记录指向VPS公网IP,设置TTL为300以便调试。
3. 系统初始化与用户/SSH配置
步骤1:登录VPS(通常用root),更新系统:apt update && apt upgrade -y。
步骤2:创建普通用户并加入sudo:adduser student && usermod -aG sudo student。
步骤3:配置SSH key:在学生本地生成ssh-keygen -t ed25519,收集公钥并在VPS的~/.ssh/authorized_keys里添加;禁止root密码登录并在/etc/ssh/sshd_config中设置PermitRootLogin no,PasswordAuthentication no,重启sshd。
4. 防火墙与基本安全策略(UFW + Fail2ban)
步骤1:安装并启用UFW:apt install ufw -y;允许必要端口:ufw allow OpenSSH;如果使用HTTPS/HTTP:ufw allow 80 && ufw allow 443。
步骤2:配置自定义端口(若更改SSH端口)并添加规则:ufw allow 2222/tcp。
步骤3:安装fail2ban防暴力破解:apt install fail2ban -y,确认sshd jail已启用。
5. 部署代码托管(Gitea)与仓库管理
步骤1:使用Docker Compose部署Gitea(推荐):
- 编写docker-compose.yml(gitea服务、postgres或mysql数据卷)。
- docker-compose up -d。
步骤2:通过域名访问Gitea,完成首次安装(DB连接、管理员账号)。
步骤3:班级分组策略:为每小组创建组织并设置私有仓库,邀请学生SSH公钥到Gitea账户以便git push/pull。
6. 部署code-server以实现浏览器端协作开发
步骤1:准备Docker Compose添加code-server镜像或直接安装:https://github.com/coder/code-server。
步骤2:配置code-server用户认证(密码或使用OAuth反向代理),推荐通过Nginx的基本认证或用外部身份提供者。
步骤3:在Gitea仓库里克隆到code-server工作区,学生可通过浏览器在VPS上直接编辑、终端运行与调试,实现即时协作。
7. 反向代理与HTTPS证书(Nginx + Let's Encrypt)
步骤1:安装Nginx并为域名配置server块,指向相应的服务(如code-server在127.0.0.1:8080)。
步骤2:使用certbot获取证书:apt install certbot python3-certbot-nginx -y && certbot --nginx -d yourdomain.example。
步骤3:设置自动续期(certbot renew),并在Nginx里强制HTTPS与合理的headers(HSTS、X-Frame-Options等)。
8. 使用Docker Compose组织开发环境与数据库
原则:每个项目用docker-compose管理服务(app、db、redis、mq)。
步骤1:为项目创建compose文件,使用named volumes保存数据;示例:postgres+app+redis。
步骤2:在Gitea仓库里放置docker-compose.yml并在code-server里通过docker-compose up -d运行。
步骤3:备份策略:每天备份volume(pg_dump或rsync到远程存储),并定期测试恢复流程。
9. CI/CD 与作业提交流程
步骤1:使用Gitea内置Action或连接外部CI(GitHub/GitLab)。
步骤2:在仓库中添加工作流:自动化测试(单元/集成)、构建镜像并推送到私有registry(可在VPS上部署Harbor或使用Docker Hub)。
步骤3:示范作业流程:学生提交PR,导师在Gitea上评审并触发CI,CI通过后自动部署到临时环境供检查。
10. 日常运维与故障恢复要点
建议:设置监控(Prometheus+Grafana或简单的UptimeRobot)、日志轮转(logrotate)与磁盘报警。
恢复演练:定期做一次从备份恢复数据库到新实例,验证应用能正常启动。
权限管理:定期清理不再使用的SSH key与用户,审计Gitea组织与仓库权限。
11. 问:如何在课堂上分配VPS资源给多个学生小组?
答:可采用两种策略:一是每组一个VPS(成本高但隔离好);二是一个较大VPS运行多个容器/命名空间,每组使用独立Docker Compose和端口/子域隔离,结合Gitea组织管理权限。推荐教学阶段用后者以节省成本并便于统一维护。
12. 问:学生如何安全地在公共网络(如校外Wi‑Fi)访问VPS?
答:强制使用HTTPS访问code-server/Gitea,使用SSH key对git操作进行认证;对敏感操作可启用VPN或使用SSH隧道;教育学生不要在公共Wi‑Fi输入明文密码,定期更换凭证并启用2FA(如Gitea支持的二次验证)。
13. 问:如果学生误删了仓库或数据,如何快速恢复?
答:事先建立自动化备份(数据库dump、docker volumes快照)并保留最近7–14天副本;恢复步骤:1)从备份中恢复DB或卷;2)用docker-compose重建服务;3)如果是git仓库,可在Gitea侧开启垃圾回收前的回收策略并利用bare备份还原。定期演练恢复流程以确保可行性。