# ul-disk **Repository Path**: ulthon/ul-disk ## Basic Information - **Project Name**: ul-disk - **Description**: ul-disk 是基于ThinkPHP6打造的网盘系统。PHP有很多优秀的网盘系统,然而他们都是插件化的、生态化的。ul-disk的定位是仅提供基本的网盘功能,并且试图提供更多的技术使用和部署范围。 - **Primary Language**: PHP - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 65 - **Forks**: 12 - **Created**: 2018-02-28 - **Last Updated**: 2026-08-12 ## Categories & Tags **Categories**: filemanager **Tags**: None ## README # uldisk 基于 ThinkPHP 8 的分布式分块存储引擎,提供 WebDAV / S3 / REST 多协议接入,配套 HTMX 管理后台与浏览器文件界面。把文件可靠地存到任意后端,再可靠地取出来。 ![admin 仪表盘](docs/images/dashboard.png) ## 特性 ### 存储引擎核心 - **分块存储**:4MB 分块 + MD5 内容寻址,相同内容全局只物理存一份 - **Hamming 路由**:按位置 MD5 与 chunk MD5 的 Hamming 距离选择最佳存储位置,距离相同时按权重降序 - **三级优先级路由**:priority → 容量 → 距离 → 权重逐级筛选,高优先级位置优先承接写入 - **自动性能评分**:`position:benchmark` 命令对每个位置一次性测速,结果写入 `priority_mode` 字段供路由参考 - **多副本 + Reed-Solomon 纠删码**:两种可靠性模式可配。多副本按 `replica_count` 复制全量 chunk;纠删码按 N+M 分片,存储成本更低、容错点更高,二者按位置策略二选一 - **流式读取**:固定 4MB 内存窗口,任意大小文件读取内存占用恒定 - **零拷贝 MOVE/COPY**:目录移动仅改 path/pid,文件复制复用 chunk_md5 索引,快照成本接近零 - **引用计数**:删除文件时逐 chunk 计数,最后一个引用才真正物理删除 - **容量追踪**:每个存储位置实时记录 size_used,写入时按 size_limit 路由;dir_size 增量维护祖先目录体积 - **AES-256-GCM 静态加密**:per-position 可选,密钥由 APP_KEY 派生,SigV4 验签需还原明文 - **数据压缩**:文本类文件按 mime 检测压缩后存储,二进制与已压缩格式自动跳过,per-position 开关 - **后端内容过滤**:per-position `content_filter` 按 mime / 扩展名限定或排除,精准控制后端承接的内容类型 - **多驱动支持**:Local / SFTP / FTP / WebDAV / 七牛云,基于 FlySystem 3.0 统一抽象 ### 多协议接入 - **WebDAV 服务**:完整 SabreDAV 4.x 实现,通过 litmus 合规性测试(basic / copymove / http 全 PASS) - **WebDAV 多认证**:Basic / Digest / JWT Bearer 三种凭证可按场景配置,独立凭证表与 admin 登录密码解耦(反模式 #10) - **S3 兼容 API**:14 个操作(ListBuckets / CreateBucket / DeleteBucket / HeadBucket / ListObjectsV2 / PutObject / GetObject 含 Range / HeadObject / DeleteObject / CopyObject / CreateMultipartUpload / UploadPart / CompleteMultipartUpload / AbortMultipartUpload),手写 SigV4 鉴权零依赖,兼容 rclone / aws-cli / boto3。**D14 跨区域复制开源版仅入队**:`PutObject` 后写 `storage_cross_region_task` pending 任务,Worker 认领后立即标 ready,**不实际跨节点物理写入**;多节点部署下也仅入队,真跨节点写入属企业版范畴。详见 [`docs/s3-cross-region.md`](docs/s3-cross-region.md) - **S3 协议层 SSE 头**:服务端加密头透传,联动 per-position AES-256-GCM 静态加密 - **REST API**:管理后台与程序化访问的 HTTP 接口,含 Prometheus 指标端点(`GET /api/metrics`)、健康检查(`GET /api/health`)、OpenAPI 规范(`GET /api/openapi.yaml`) - **分享管理**:随机短链分享文件,支持验证码、过期时长、隐藏真实路径,与公开直链互补 - **HTMX 管理后台**:基于 ULUI 的零 JS 框架后台,单管理员架构,位置 CRUD、文件浏览器、系统配置、Webhook 订阅、版本历史、Timer 调度一应俱全 ![管理后台文件浏览器](docs/images/browser.png) - **WebDAV 浏览器界面**:现代化文件管理 UI,支持拖拽上传、文件预览、目录树导航,作为 WebDAV 协议的图形化前端 ### 公开访问与分享 - **公开直链**:通过 `/raw/{space}/{path}` 暴露文件,默认 fail-closed,需显式开启 - **预签名 URL**:`php think raw:presign` 为任意对象生成带签名与过期的临时链接,与 S3 客户端原生 presign 兼容 - **空间访问策略**:per-space `access_policy`(private / public)开关,与 raw 直链、预签名协同 - **访问限流**:per-space / per-file 频率与流量控制,独立于后端三维度限流 - **IP 黑白名单**:公开访问支持 per-space IP 白名单或黑名单 - **防盗链**:引擎层 Referer 校验,防外部站点盗用,不依赖 nginx 配置 - **CORS 配置**:per-space 跨域资源共享规则,OPTIONS 预检自动处理,支持浏览器直传 - **空间回源**:配置上游 URL,文件不存在时自动回源拉取并缓存 ### 可靠性与运维 - **Worker Pool 异步补副本**:三档 durability_mode 可选。`sync_one` 同步写 1 副本立即返回再异步补齐(默认);`async` 仅入队不写远端;`sync_all` 阻塞等全副本(合规场景) - **Worker 监控 UI**:admin 后台可视化进程队列状态,排队任务数、处理中任务、失败任务、Worker 健康度一目了然 - **自愈扫描**:`selfheal:scan` 扫描副本不足并重新入队补充;`selfheal:verify` 校验 chunk 完整性,损坏自动重建 - **position 自动健康检查**:定期探测后端可达性,连续失败自动隔离(offline),恢复后自动启用 - **副本数主动裁剪**:`replica_count` 下调时主动删除多余副本,优先保留高优先级位置的副本 - **回收站**:删除先走 `trashFile` 软删,默认 30 天保留期(`recycle.retention_days` 可配),配合 `gc:expired_trash` / `gc:orphan_chunks` / `gc:stale_cache` 三命令清理 - **文件版本控制**:覆盖上传自动归档历史版本,admin UI 查看与下载,归档复用 chunk_md5 物理共享 - **Webhook 通知**:11 处触发点覆盖 9 类事件(file.uploaded / modified / deleted / copied / moved + quota.exceeded + replica.degraded + dir.created / dir.deleted),HMAC-SHA256 签名,两阶段投递(trigger 写表零阻塞,dispatch timer 调度异步 curl + 指数退避) - **三维度限流**:RPM 令牌桶、并发计数、带宽分桶三维度独立配置,APCu 共享内存跨 FPM worker,APCu 不可用时 fail-closed 拒绝 - **跨节点复制**:**D14 开源版仅入队**(Worker 认领后立即标 ready,不实际跨节点物理写入;多节点部署下也仅入队,真跨节点写入属企业版范畴)。开源版写入本地并入队,企业版通过 internal 跨节点接口与 S3 跨区域复制实现跨机房写入 - **Prometheus 指标**:`GET /api/metrics` 输出 text format v0.0.4,5 个核心指标 + 60s 进程内缓存,手写零依赖 - **ECharts 仪表盘**:4 图表可视化统计(容量分布、协议流量、副本健康、Worker 队列),本地化资源无 CDN 依赖 - **流量统计**:总流量计数,基础维度统计;企业版扩展为按后端 / 节点 / 空间多维分析 - **存储性能基准**:`benchmark:run` 多维度测速(后端 IO / 端到端吞吐 / 副本到达延迟 / 故障恢复计时),作为容量规划与位置优先级依据 - **X-Accel-Redirect 零拷贝下载**:大文件下载走 nginx sendfile,PHP 不经手 body - **预取调度**:顺序读 + 目录关联预取,降低大文件串行访问延迟 ### 部署与运维工具 - **Docker 多栈**:开发栈(源码热重载 + MySQL + phpMyAdmin)、生产栈(外部 MySQL)、开箱即用栈(自行构建镜像 + MySQL)三种部署方式 - **多节点部署**:无状态水平扩展,通过 internal 跨节点接口协同 - **数据导入**:`php think import:from-fs` 从本地文件系统批量导入到指定位置,保留元数据与目录结构 - **数据导出**:`php think export:to-fs` 将文件树导出到本地或外部存储,支持备份与迁移场景 - **存储位置再平衡**:`position:rebalance` 在位置间迁移数据平衡容量与负载,`position:evacuate` 清空指定位置准备下线 - **域名绑定**:`php think domain:bind` 绑定域名并直接监听 80 / 443 端口对外服务 - **TLS 证书管理**:admin 后台手动上传 PEM 格式证书(openssl_x509_parse 解析 NotAfter),nginx-ssl.conf 模板占位符自动渲染,过期证书标红警告;ACME 自动签发属企业版 J10 - **PHP SDK**:官方开发包,封装 WebDAV / S3 / API / raw 四协议调用示例,版本与 Access Key 协同 ## 架构 ``` +----------+ +----------+ +----------+ +----------+ +----------+ | admin | | webdav | | s3 | | api | | raw | | HTMX | | SabreDAV | | SigV4 | | REST | | 公开直链 | | 后台UI | | +浏览器 | | 零依赖 | | +Metrics | | | +----+-----+ +----+-----+ +----+-----+ +----+-----+ +----+-----+ | | | | | +-------------+------+------+------+------+-------------+ | +--------+--------+ | ChunkStorage | 存储引擎核心 | 4MB 分块 + MD5 | 多副本 / 纠删码 | Hamming 路由 | 引用计数 / 版本归档 +--------+--------+ | +--------+--------+ | Worker Pool | 异步补副本 / 自愈 | durability_mode | 三档可配 +--------+--------+ | +-----+-----+ |FlySystem 3| +-----+-----+ | +------+------+------+------+------+ | | | | | | Local SFTP FTP WebDAV 七牛云 internal (跨节点) ``` ## 技术栈 | 层 | 技术 | |---|---| | 框架 | ThinkPHP 8(多应用:admin / webdav / s3 / api / raw / internal) | | 存储 | FlySystem 3.0(local / sftp / ftp / webdav / qiniu adapters) | | WebDAV | SabreDAV 4.x | | S3 | 手写 SigV4 鉴权,零依赖 | | 后台 | HTMX + ULUI(//ului.top) | | 测试 | Pest 4.x(860+ tests) | | 数据库 | MySQL 8(think-orm 4.0) | | 缓存 | APCu(限流 + 共享内存) | | 加密 | AES-256-GCM(per-position 可选) | | 部署 | Docker(PHP 8.4-FPM + Nginx) | ## 快速开始 镜像需自行构建(基于 `docker/prod/Dockerfile`,首次约 10-15 分钟),三种部署方式按需选择。 ### 方式一:一键启动(推荐,开箱即用) 仓库根目录的 `docker-compose.yml` 内含 uldisk + MySQL,首次启动自动初始化数据库(migrate + seed): ```bash docker compose up -d --build ``` 首次启动会构建镜像(约 10-15 分钟,apt + composer 安装依赖),后续启动秒级。 #### 更新升级 本栈采用「bind mount 源码 + 命名卷保护 vendor」模式,源码目录直接挂载进容器,`git pull` 后重启即生效: - **纯 PHP 代码更新**(`app/` `config/` `route/` 等日常变更): ```bash git pull docker compose restart uldisk ``` bind mount 挂载源码,FPM 重启即加载新代码,无需重新构建镜像。 - **composer 依赖变更**(`composer.json` 改动,低频): ```bash git pull docker compose down # 停容器(不带 -v,保留数据库等命名卷) docker volume rm uldisk_uldisk_vendor # 只删 vendor 卷(命名卷已存在时不会重新初始化,必须先删) docker compose up -d --build # 重建镜像 + vendor 卷重新从镜像层初始化 ``` `vendor/` 在 `.gitignore` 中不在 git 仓库,需重建镜像生成。切勿用 `down -v`,它会清空所有命名卷(含 `mysql_data`,丢数据库)。 > **关于 .env**:不要在宿主机项目根创建 ThinkPHP 格式的 `.env`(如带 `[DATABASE]` 配置块)。bind mount 会把它映射进容器,ThinkPHP 优先读取 `.env` 而覆盖 docker-compose 注入的 `DB_*` / `APP_KEY`。数据库连接等配置统一走 `docker-compose.yml` 的 environment 段;如需自定义密码/端口/密钥,在同级目录建 `.env` 只写 `DB_PASS=xxx` / `APP_KEY=xxx` 等平铺变量(docker compose 用于 `${VAR}` 替换,变量名与 environment 段一致即可)。 默认访问 http://localhost:8001/admin(admin / admin123,**首次登录后请立即修改密码**)。 ![admin 登录页](docs/images/login.png) 自定义数据库密码/端口,在同级目录建 `.env` 覆盖(可选变量见 `docker-compose.yml` 头部注释)。 > **Windows PowerShell 用户**:如手工创建 `.env` 文件自定义配置,请用 `Out-File -Encoding utf8NoBOM` 或 `[IO.File]::WriteAllText` 避免UTF-8 BOM 破坏 docker compose 解析(详见 docker-compose.yml 头部注释)。 ### 方式二:docker run(单容器,自备 MySQL) > **注意**:需先在仓库根执行 `docker build -f docker/prod/Dockerfile -t ulthon/ul-disk:latest .` 构建本地镜像,否则下面的 docker run 会因镜像不存在失败。 ```bash docker run -d --name uldisk \ -p 8001:8000 \ -e DB_HOST=<你的MySQL地址> \ -e DB_NAME=uldisk -e DB_USER=root -e DB_PASS=<密码> -e DB_PORT=3306 -e DB_PREFIX=uld_ \ -v uldisk_runtime:/var/www/html/runtime \ -v uldisk_data:/var/www/html/data/storage \ ulthon/ul-disk:latest ``` ### 方式三:生产部署(外部 MySQL) ```bash cd docker/prod cp .env.example .env # 配置外部 MySQL 连接 docker compose up -d ``` 生产栈仅拉取 uldisk 镜像(不含 MySQL),连接外部数据库实例。 ### 访问地址 | 服务 | URL(默认端口 8001) | 凭据 | |---|---|---| | 管理后台 | http://localhost:8001/admin | admin / admin123 | | WebDAV + 浏览器界面 | http://localhost:8001/dav | admin / admin123(Basic Auth) | | S3 兼容 API | http://localhost:8001/s3 | admin 后台生成 Access Key(SigV4 鉴权) | | Prometheus 指标 | http://localhost:8001/api/metrics | 公开 | ### 自动初始化说明 uldisk 镜像首次启动会自动完成数据库初始化(无需手动 migrate/seed): 1. 等待 MySQL 可达(默认超时 120s,可用 `DB_WAIT_TIMEOUT` 调整) 2. 执行 `php think migrate:run`(建表,phinx 幂等) 3. 执行 `php think seed:run`(建管理员 + 配置 + 默认空间,仅首次) 4. 写入 `runtime/.db_initialized` 标志文件,后续启动跳过 如需跳过自动初始化(已手动初始化的环境),设置环境变量 `SKIP_AUTO_INIT=1`。 ### 从源码构建(开发) 开发栈含热重载(绑定挂载源码)+ phpMyAdmin,适合二次开发: ```bash cd docker/dev && docker compose up -d # 首次需手动初始化(开发栈不走 entrypoint 自动初始化) docker exec uldisk-dev-uldisk-1 php think migrate:run docker exec uldisk-dev-uldisk-1 php think seed:run ``` 开发栈端口:8002(Web)/ 13306(MySQL)/ 18888(phpMyAdmin)。 ### 构建并推送自有镜像 本项目未发布预构建镜像到 Docker Hub,下面是自构建并推到自己 registry 的高级用法。 ```bash # 多架构(amd64 + arm64)构建并推送到你的 Docker Hub 仓库 IMAGE_REPO=<你的用户名>/ul-disk ./scripts/build-docker.sh v1.0.0 ``` 前置:需先注册 qemu binfmt 支持 arm64 跨架构编译(`docker run --privileged --rm tonistiigi/binfmt --install arm64`)。详见 `scripts/build-docker.sh` 头部说明。 ### 首次使用 容器启动后,建议按以下顺序完成首次配置: 1. 浏览器访问 `http://:8001/admin`,使用默认凭据(admin / admin123)登录,**第一时间修改密码** 2. 登录后访问 `/admin/guide`,按内置引导完成存储位置创建、空间策略、限流等基础配置 3. 详细配置步骤与场景示例参阅 [`docs/first-run.md`](docs/first-run.md) 如需通过 WebDAV / S3 客户端接入,凭据与端点见上文「访问地址」表。 ## 项目结构 ``` app/ admin/ # 管理后台应用(/admin/*) controller/ # Auth/Index/Position/Browser/Config/Hook 等 middleware/ # AdminAuth 会话校验 route/ # completeMatch(true) 防 group 前缀碰撞 view/ # HTMX 视图(局部刷新,_ 前缀为片段) webdav/ # WebDAV 服务应用(/dav/*) auth/ # AdminBackend (Basic Auth) browser/ # 浏览器文件管理 UI controller/ # SabreDAV Server 引导 fs/ # File/Directory/Node/RootCollection response/ # SabreDAV 与 ThinkPHP 响应桥接 route/ s3/ # S3 兼容 API 应用(/s3/*) auth/ # SigV4Verifier / SigV4StreamingPayloadVerifier controller/ # Index/Bucket/S3Object/Multipart middleware/ # SigV4Auth response/ # XML 响应封装 service/ # MultipartService route/ api/ # REST API 应用(/api/*) controller/ # Metrics(Prometheus 指标) route/ raw/ # 公开直链应用(/raw/{space}/{path}) controller/ route/ internal/ # 跨节点内部接口(/internal/*,X-Internal-Token 鉴权) middleware/ # InternalTokenAuth route/ common/ # 公共模块(无路由,deny_app_list) command/ # gc:expired_trash / gc:orphan_chunks / gc:stale_cache / worker:run / selfheal:scan / selfheal:verify / webhook:dispatch model/ # 8 张表 ORM service/ # ConfigService / WebhookService / RateLimiterService storage/ # ChunkStorage / DriverFactory / PositionRuntime common.php # 全局辅助(str_to_bin / format_size / recycle_count) config/ # ThinkPHP 配置(.env 仅放 DB,其余存 config 表) database/ migrations/ # 12 个迁移(10 张业务表 + 2 张 S3 multipart) seeds/ # InitAdmin / InitConfig docker/ dev/ # 开发栈(源码热重载 + MySQL + phpMyAdmin) prod/ # 生产栈(image 模式,外部 MySQL) docker-compose.yml # 开箱即用(自行构建镜像 + MySQL) docs/ # 25 篇专题文档(见下文索引) scripts/ # build-docker.sh / insert_worker_config.php / S3 e2e 脚本 source/docker/ # nginx.conf / PHP 运行时配置 / docker-entrypoint.sh / supervisord.conf tests/ # Pest 4.x 测试套件(860+ tests) ``` ## WebDAV 客户端配置 WebDAV 服务兼容主流客户端,地址为 `http://:8001/dav`(默认端口,见所选部署方式),使用 Basic Auth(admin 账号)。 ### 内置浏览器界面 除标准 WebDAV 协议外,`/dav` 同时提供现代化浏览器文件管理 UI,支持拖拽上传、文件预览、目录树导航。不熟悉 WebDAV 客户端配置的用户可直接用浏览器完成日常文件操作。 ![WebDAV 浏览器界面](docs/images/webdav-ui.png) ### 已验证客户端 - Windows 资源管理器(映射网络驱动器) - macOS Finder(连接服务器) - Linux GVFS / davfs2 - Cyberduck / WinSCP / Rclone - litmus 合规性测试工具 ### 合规性测试结果 | 测试套件 | 通过 / 总数 | |---|---| | basic | 16 / 16 | | copymove | 13 / 13 | | http | 4 / 4 | | props | 11 / 14(PROPPATCH 待优化) | | locks | 19 / 30(SabreDAV 锁语义限制) | ## 开发指南 ### 启用调试 `config/trace.php` 控制调试栏(默认关闭)。需要调试时改为 `enable => true`。 ### 存储位置配置 在管理后台「存储位置」新建,选择驱动类型(Local / SFTP / FTP / WebDAV / 七牛云)并填写对应配置。每个位置可单独开启限流(`rate_limit_rpm` / `max_concurrent` / `bandwidth_limit_mbps`)、静态加密、副本数或纠删码策略。位置会自动计算 MD5 指纹用于 Hamming 路由。 ### 核心算法说明 - **分块大小**:固定 4MB(`ChunkStorage::getChunkSize()`) - **路由策略**:Hamming 距离升序 → 权重降序 → 前若干个可用位置(副本数由 `storage.replica_count` 决定);启用纠删码的位置按 N+M 分片写入 - **去重粒度**:chunk 级别(4MB),相同 MD5 的 chunk 全局只物理存一份,跨副本共享 - **容量计数**:仅物理新写入累加 size_used,物理去重命中不计 - **可靠性模式**:多副本与 Reed-Solomon 纠删码二选一,由存储位置策略决定;Worker Pool 负责异步补副本与自愈 ### 测试 测试基于 Pest 4.x(860+ tests),独立测试库 `uldisk_test`,事务回滚隔离: ```bash docker exec uldisk-dev-uldisk-1 ./vendor/bin/pest # 单元 + 集成 docker exec uldisk-dev-uldisk-1 php scripts/api_test.php # 接口测试 ``` WebDAV 合规性用 litmus(basic / copymove / http 为硬性回归门),S3 兼容性用 rclone 与 aws-cli e2e 脚本(各 10/10)。详见 `tests/AGENTS.md`。 ## 文档索引 `docs/` 目录下提供 25 篇专题文档,按主题分类: **协议与接入** - [`api.md`](docs/api.md) — REST API 规范,含 OpenAPI 描述(`docs/openapi.yaml`) - [`s3.md`](docs/s3.md) — S3 兼容 API,14 操作、ETag 格式、客户端配置、已知限制 - [`raw-upstream.md`](docs/raw-upstream.md) — 公开直链端点语义与 fail-closed 设计 - [`webdav-credential.md`](docs/webdav-credential.md) — WebDAV 独立凭证表,Basic / Digest 凭证创建与吊销 - [`sdk.md`](docs/sdk.md) — 官方 PHP SDK,封装 WebDAV / S3 / API / raw 四协议调用示例 **可靠性与存储策略** - [`worker-pool.md`](docs/worker-pool.md) — Worker Pool 三档 durability_mode、部署配置、监控 - [`erasure-coding.md`](docs/erasure-coding.md) — Reed-Solomon N+M 分片策略,与全副本对照 - [`reliability.md`](docs/reliability.md) — 自愈扫描、PositionRuntime 池、三维度限流 - [`multi-node.md`](docs/multi-node.md) — 跨节点复制架构,internal 接口语义 - [`s3-cross-region.md`](docs/s3-cross-region.md) — S3 跨区域复制 **数据管理** - [`versioning.md`](docs/versioning.md) — 文件版本控制,version_id 语义、admin UI、归档机制 - [`recycle.md`](docs/recycle.md) — 回收站保留期、GC 三命令、已知限制 - [`webhook.md`](docs/webhook.md) — Webhook 事件 schema、HMAC 签名验证、timer 调度配置 - [`share.md`](docs/share.md) — 分享链接管理,与预签名 URL 区别、admin UI、与 raw 直链协同 - [`import-export.md`](docs/import-export.md) — `import:from-fs` / `export:to-fs` 数据导入导出工具 **公开访问与分享** - [`raw-presign.md`](docs/raw-presign.md) — 预签名 URL,`raw:presign` 命令、与分享链接区别 - [`space.md`](docs/space.md) — 空间访问策略,access_policy 语义、quota_limit 配置 - [`public-access.md`](docs/public-access.md) — K1-K8 公开访问合集,前缀模式、限流、IP 限制、防盗链 - [`cors.md`](docs/cors.md) — CORS 跨域配置,OPTIONS 预检、S3 浏览器访问 **性能与运维** - [`predictive-prefetch.md`](docs/predictive-prefetch.md) — 顺序读与目录关联预取调度 - [`timer.md`](docs/timer.md) — 统一调度器,HTTP 触发模式 + 3 种 run_type + admin UI - [`observability.md`](docs/observability.md) — X-Accel-Redirect 零拷贝、Prometheus 指标、ECharts 仪表盘 - [`performance-benchmark.md`](docs/performance-benchmark.md) — 性能基准测试方法与结果 - [`deploy-domain.md`](docs/deploy-domain.md) — 生产部署与域名配置 - [`tls-cert.md`](docs/tls-cert.md) — TLS 证书手动上传,nginx-ssl.conf 模板渲染、过期警告 > 首次使用指引见「快速开始 → 首次使用」章节,或直接参阅 [`docs/first-run.md`](docs/first-run.md)。 ## 版权信息 本项目基于 ThinkPHP 8 框架开发,遵循 Apache-2.0 开源协议。 ThinkPHP 版权所有 Copyright (c) 2006-2024 by ThinkPHP (http://thinkphp.cn) 更多细节参阅 [LICENSE.txt](LICENSE.txt)。