01 / BEFORE WE BUILD
先盘点,再决定清理范围
最初的想法是清空服务器,重新搭一套文件服务。登录后先检查了系统、磁盘、监听端口、运行中的服务和已有目录,确认旧网站由 Docker 中的 Nginx 提供,code-server 则在独立运行。
随后调整了范围:不重装系统,只删除旧网站容器,保留 code-server、Docker 引擎、原网站文件和开发环境。删除前后核对了 code-server 的进程编号与启动时间,确认没有受到影响。
原来的 share.py 保留不动,在副本上开发;旧业务和配置做了本地备份,并对下载前后的校验值进行比对。验收结束后,清除了服务器上的临时备份副本与测试文件。
02 / PYTHON FILE SERVER
让文件共享程序也能写一点文字
沿用 Python 标准库的 http.server,保留目录浏览、文件上传、文件夹上传、单文件下载及目录 ZIP 下载。新增“新建文本文件”窗口:填写文件名、输入文字,保存为 UTF-8 文件。
- 同名文件不会被覆盖,保存失败时输入的文字保留在窗口中。
- 补充路径检查和跨源写入拦截,下载文件按附件处理。
- 上传的
index.html 不会替换目录页面,HTML 文件也按附件下载。 - 验证了中文内容、文件下载、重名冲突、ZIP 下载和路径访问限制。
部署使用 Python、Caddy 和 systemd:Python 处理文件,Caddy 处理网站入口与登录验证,systemd 负责后台运行、异常重启和开机启动。文件服务以独立系统用户运行,后端仅监听服务器内部地址。
03 / GETTING IN
从端口入口,走到更好记的地址
文件服务最初通过主域名提供 HTTPS 访问。为了和 8080 上的代码编辑器区分,又把文件服务入口移到 8081,释放了 80 端口。文件网站的访问密码也按要求更新,并验证新密码可以使用、旧密码已失效。
之后遇到一次“无法访问”。检查时公网端口、服务状态和账号登录均正常,最终确认与地址输入有关:当时 8081 提供的是 HTTPS,省略协议后浏览器可能按 HTTP 请求。为满足直接输入“域名加端口”的使用习惯,8081 后来改为 HTTP,并保留登录验证。
再往后决定使用子域名,不再记端口号。现在输入代码或文件子域名,就能从默认 HTTP 入口自动转到对应的 HTTPS 页面。此前的端口入口暂时保留。
04 / DOMAIN NAMES
分清域名购买、DNS 解析和备案
为代码空间选择 code.guguking.com,为文件空间选择 file.guguking.com。文件子域名最终使用的是单数 file,不是最初讨论的 files。
添加记录时发现:域名虽然在阿里云管理,注册局指定的权威 DNS 却属于 DNSPod。因此,仅在阿里云解析后台增加记录,不会改变当前实际生效的解析。核对注册局和多处 DNS 查询结果后,改由本人在 DNSPod 添加记录。
期间也讨论过把 DNS 和备案接入统一到阿里云;了解了记录迁移、修改 DNS 服务器以及接入备案的区别后,最终决定暂不迁移。DNS 继续由 DNSPod 提供,备案接入没有变更。
记录生效后,刷新服务器 DNS 缓存,重试证书申请。两个子域名均通过公网验证:代码空间能打开登录页,文件空间要求登录且原账号可用。主域名与 www 的 A 记录也随后查到正确的服务器地址。
DNSPod 保留 · 子域名已接通
05 / A PLACE OF MY OWN
最后,为自己留一个主页
主域名原来会跳转到文件服务器,现在换成独立的静态个人主页。介绍保留一句简单的话:“这是guguking的网站”。联系邮箱为 a282928@outlook.com,页面同时提供代码编辑器和文件服务器入口。
主页采用浅色背景与绿色点缀,适配手机与桌面。静态页面直接部署在自己的服务器上,由 Caddy 提供访问,不需要再启动一套网站应用。
最后把今天的过程整理成这篇建站记录,并在主页增加文章入口。以后回看时,既能看到最后搭成了什么,也能知道中间为什么改过端口、为什么去 DNSPod 添加记录,以及哪些迁移只是讨论而没有执行。
主页与今日记录已发布
06 / MY TECH STACK
我的技术栈:每一层负责什么
这套网站部署在阿里云服务器上,当前使用以下组件。版本和目录在发布前通过服务器实际查询核对。
| 组成 | 使用的技术与职责 |
| 服务器系统 | Debian GNU/Linux 13.1,提供运行环境、磁盘和系统服务。 |
| 个人主页与文章 | 原生 HTML + CSS 静态页面,使用响应式布局;当前没有前端框架,也不需要构建或数据库。 |
| 文件服务后端 | Python 3.13.5,基于标准库 http.server 的 ThreadingHTTPServer 与 SimpleHTTPRequestHandler,运行改造后的 share.py。 |
| 文件服务前端 | HTML、CSS 和原生 JavaScript。通过 fetch 发送 HTTP PUT 请求上传文件、保存 UTF-8 文字;ZIP 使用 Python 标准库 zipfile 生成。 |
| 网站入口 | Caddy 2.6.2,按域名分发请求、提供 HTTPS、申请和续期证书、记录访问日志,并为文件网站提供 HTTP Basic 账号验证;密码以 bcrypt 哈希配置。 |
| 后台进程管理 | systemd 管理 Python 文件服务的开机启动和异常重启。服务名称为 fileshare.service;Caddy 由 caddy.service 管理。 |
| 浏览器代码编辑器 | 保留既有的 code-server 4.110.0~rc.1,继续使用原来的登录验证,由 Caddy 反向代理到其 8080 端口。 |
| 域名解析 | 腾讯 DNSPod。@、www、code、file 的 A 记录指向同一台服务器,再由 Caddy 区分服务。 |
| 数据存储 | 服务器本地文件系统。上传文件和新建文本直接写入磁盘;当前没有 MySQL、PostgreSQL 或对象存储。 |
| 容器使用情况 | 旧 Nginx 网站容器已删除,Docker 引擎保留。本次的个人主页和 Python 文件服务直接部署在系统中,没有放进 Docker 容器。 |
访问请求如何到达文件
浏览器 → Caddy(80 自动转 HTTPS,443 接收请求)
guguking.com → 读取静态主页与文章
www.guguking.com → 跳转至 guguking.com
code.guguking.com → 127.0.0.1:8080 → code-server
file.guguking.com → 登录验证 → 127.0.0.1:8000 → Python → 磁盘文件
原来的 8080、8081 端口入口暂时保留。日常访问使用上面的子域名;Python 文件后端的 8000 端口只监听本机回环地址。
07 / WHERE EVERYTHING LIVES
文件到底存放在哪里
通过文件网站上传或新建的内容,实际存放在服务器的 /srv/fileshare/。 浏览器中的目录结构与这里对应。它与个人主页的静态文件目录分开,上传文件不会自动出现在主页上。
服务器上的程序、内容与配置
| 用途 | 实际位置 |
| 文件服务器程序 | /opt/fileshare/share.py 处理目录浏览、上传、下载、ZIP 和新建文本。 |
| 上传和新建的文件 | /srv/fileshare/ 例如在文件网站根目录创建“笔记.txt”,服务器上对应 /srv/fileshare/笔记.txt。这是路径示例,不代表已创建该文件。 |
| 主页静态目录 | /srv/guguking-homepage/ 由 Caddy 直接读取并提供访问。 |
| 主页 HTML | /srv/guguking-homepage/index.html |
| 当前这篇文章 | /srv/guguking-homepage/journal/2026-10-22/index.html |
| 域名、HTTPS 与反向代理 | /etc/caddy/Caddyfile 配置各域名对应的服务及文件网站的认证规则。 |
| 文件服务启动配置 | /etc/systemd/system/fileshare.service 指定运行用户 fileshare、程序路径、数据目录和重启策略。 |
| code-server 服务模板 | /usr/lib/systemd/system/code-server@.service 目前使用 code-server@root.service 这个实例。 |
| code-server 配置 | /root/.config/code-server/config.yaml 是私有配置文件,不作为网页公开。 |
| code-server 用户数据 | /root/.local/share/code-server/ 用于编辑器自身的用户数据;项目文件位置取决于编辑器中打开的文件夹。 |
| 保留的旧项目目录 | /srv/guguking.com/
/home/guguking/file_and_txt/
/root/mycode/
/root/test/ 这些目录已确认保留,未因删除旧网站容器而清空。 |
访问日志与部署记录
| 记录类型 | 实际位置或查看方式 |
| Caddy 访问日志 | /var/log/caddy/ 主页:homepage-access.log 代码子域名:code-access.log 文件子域名:file-domain-access.log 旧文件入口:files-access.log 访问日志设置了大小轮转和保留数量。 |
| Python 与代理运行日志 | journalctl -u fileshare
journalctl -u caddy 由 systemd journal 管理,持久日志目录为 /var/log/journal/。 |
| 当天部署操作记录 | /var/log/fileshare-deployment/20261022/ 保存服务器侧变更日志、部分配置备份和操作记录,未放进网站静态目录。 |
本地电脑上的源码与备份
原始 Python 程序仍在 Windows 电脑的 E:\文件服务器\share.py,原文件未修改。今天的工作副本、页面源码、操作日志和备份统一保存在:
C:\Users\guguking\Documents\ChatGPT\本地\server-migration-20261022\
share.original.py:原始程序备份;share.py:改造后的文件服务器程序。homepage/dist/index.html:个人主页源码。homepage/dist/journal/2026-10-22/index.html:这篇文章的源码。操作记录.md、remote-operations.log 和各验证日志:操作过程、命令输出及检查结果。legacy-backup.tar.gz:旧业务与配置的本地备份。它不在公开网站目录中。
这里公开的是文件位置与技术说明,不是文件访问权限。配置、日志、备份和编辑器私有数据不会因为列出路径而通过主页提供下载;它们的内容仍需在本地或登录服务器后查看。
本文是根据今天的实际操作整理的公开记录。密码、密钥、身份资料和私人备份未公开;包含具体命令、输出、配置备份与验证结果的详细运维记录另行保存。本文所述状态以 2026 年 10 月 22 日本次发布时为准。