dpl/docs/maintenance/SITE_PROFILES.md

119 lines
13 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# dpl / hn 独立实例与主题
2026-10-27 用户确定 hn 先使用 `EZ`。当前独立工作树的默认值与 `.env.hn.example` 已改为 EZ,旧 Hardnerd 功能草稿保留为显式选项;已批准的 `tpl-a` 继续独立保存、不绑定 hn,见 [THEME_DESIGNS](THEME_DESIGNS.md)。2026-10-27 已独立部署 HN 到 sitejp02,主域名 hardnerd.net;DPL 未发布。当前生产和回退见 [HN_PRODUCTION](HN_PRODUCTION.md)。
## 配置与边界
同一后端仓库、同一业务逻辑,分别部署到各自服务器/目录。`SITE_PROFILE` 为启动参数,不按访问域名切换租户,不共享数据库。
| 参数 | 行为 |
| --- | --- |
| 未设置或 `SITE_PROFILE=dpl` | 保持既有 APP_NAME、APP_FULL_NAME、数据库品牌设置与 frontend_theme(包括 Stellar),缓存/Redis/Horizon/session 默认命名规则不变 |
| `SITE_PROFILE=hn` | 默认 EZ,示例配置显式 `SITE_THEME=EZ`;旧 Hardnerd 草稿仅在显式 `SITE_THEME=Hardnerd` 时启用;默认 hardnerd / hardnerd.net;独立命名空间 hn_cache / hn_database_ / hn_horizon: / hn_session |
| 其他值 | 启动报错,防止拼写错误误选 dpl |
hn 可用 `SITE_NAME`、`SITE_FULL_NAME`、`SITE_DESCRIPTION`、`SITE_LOGO` 覆盖品牌;后台读到的主题/品牌与部署配置一致,不能在后台切换成另一站的主题。读取覆盖在缓存取出后、请求内合并,不写回原有设置,也不污染 Redis 中的配置。dpl 后台设置流程保持原状。
**选择 hn 不会自动创建数据库或隔离错误复制的私密环境。** 使用 `.env.hn.example` 建立 hn 自己的 `.env`,独立创建 hn 数据库和最小权限用户、APP_KEY、storage、日志及 worker/scheduler。不得复用 dpl 的实际 `.env`、业务数据库、storage 挂载或加密配置。显式 CACHE_PREFIX / REDIS_PREFIX / HORIZON_PREFIX / SESSION_COOKIE 优先于默认值,复制环境时必须核对。
邮件、支付商户、订阅域名、节点和通知配置由 hn 自己设置。共用功能不等于已有外部资源授权共用;新实例未配置这些服务时,不宣称能发信、收款或提供真实节点。
## EZ 来源与适配
原始源码:[EZTHEME/EZ_THEME](https://github.com/EZTHEME/EZ_THEME),package v0.4.0;Git 子模块 `frontends/ez-theme` 锁定 `2c0581386d86006315e6eba2f5970c923892caba`。上游源码不直接改写,hn 适配层在 `frontends/hn`,依赖和锁文件在 `frontends/`。后台资源与 Stellar 各自既有仓库边界保持不变。
上游 package.json 标注 ISC,当前锁定版本未包含单独 LICENSE 文件;保留作者/上游出处,公开再分发前复核授权声明,不能自行称作 MIT。
适配明确使用 Xboard API、当前站点的 `/api/v1`,删除演示 API、中间件地址和占位客户端链接。默认深色、绿色主题和 hn logo;禁用上游的随机外部背景、工单第三方图片托管、工单外部 IP 定位与 Crisp 用户数据传送。登录验证码仍由实例配置决定,不改变后端验证逻辑。客户端导入等 EZ 自带能力保留,下载卡片因未指定正式链接而隐藏。EZ 使用 hash 路由,无需修改 dpl Stellar history fallback。
后端服务、认证、用户、套餐、订单、支付、邮件与订阅仍使用同一现有实现;只接入站点配置和主题。浏览器令牌保存于本站 origin,部署应使用两个独立域名。
## 本地开发
在独立 hn checkout 使用自己的 `.env`、空数据库和独立 Redis。不要把 dpl 的本地运行目录改成 hn。
```bash
git submodule update --init frontends/ez-theme
cd frontends
npm ci --ignore-scripts
npm run dev:hn
```
固定开发入口为 `http://hn.loc/`(2026-10-27 已配置并在浏览器验收 EZ 首页)。hosts 仅映射 `127.0.0.1` / `::1`;前端 Nginx 的 `/usr/local/etc/nginx/servers/hn.loc.conf` 同样只监听双回环80。普通请求代理独立 HN PHP `127.0.0.1:8592`;`/__hn_vite/` 代理 EZ Vite `127.0.0.1:5184`,保留 WebSocket 升级。未让 root Nginx 直接读文稿、未扩大 GemCodes 书签或监听权限;此工作树仍在既有 Codex 路径,PHP CLI 直接提供 public。
Vite 标记文件 `storage/framework/ez-vite.hot` 内容为 `http://hn.loc/__hn_vite`;后端只在允许的本地 hostname、标记匹配且5184在线时加载该同源路径,公共 hostname 或失效标记仍回退正式资源。APP_URL 已设为 `http://hn.loc`,其余私密环境未变,数据库仍是 `database/hn-preview.sqlite`,Redis 仍为独立6387。未将 Laravel .env 注入前端。
本次三个开发进程已启动,未新增登录项;关闭进程或重启后需重新启动。以下命令各在独立终端运行(先确认专用端口未被占用,不结束其他项目进程):
```bash
# Redis:无持久化的本地演示缓存,不使用 dpl 的 Redis
/usr/local/bin/redis-server --bind 127.0.0.1 --port 6387 --protected-mode yes --save '' --appendonly no
# PHP:在本工作树的 public/ 下运行,使用实际 PHP 8.4,避免 Herd 占位二进制
cd public
/usr/local/bin/php -S 127.0.0.1:8592 -t . ../vendor/laravel/framework/src/Illuminate/Foundation/resources/server.php
# Vite:在本工作树根运行
npm --prefix frontends run dev:hn
```
`npm run dev:hn` 的内部端口已由5174改为5184,避免与其他项目冲突;生产构建路径不变。不能把直接打开 Vite 或8591设计预览当作 hn.loc 的功能入口。
历史 EZ/功能预览使用工作树内部 `database/hn-preview.sqlite` 和临时 Redis `127.0.0.1:6387`;这些不是 dpl 数据。2026-10-14 当前 `http://127.0.0.1:8591` 已切为纯前端设计预览,不连接该 SQLite / Redis。启动区别见 [THEME_DESIGNS](THEME_DESIGNS.md)。
## 发布与恢复
2026-10-27 HN 首发已按 Git 提交、推送并在 sitejp02 更新到明确提交;实际版本、独立服务、TLS、备份和服务器验收见 [HN_PRODUCTION](HN_PRODUCTION.md)。后续发布按 Git:提交并推送共享版本,在指定 hn 服务器 checkout 更新明确提交,初始化锁定子模块、安装依赖并构建。版本升级前备份 hn 自己的数据库/配置;dpl 发布单独授权、单独验收。
```bash
git submodule update --init frontends/ez-theme
cd frontends
npm ci --ignore-scripts
npm run build:hn
cd ..
php scripts/hn/publish-assets.php
php artisan config:cache
```
构建输出 `theme/EZ/assets/` 默认忽略,不把下载依赖/私密环境入 Git;发布脚本仅允许 hn 配置,将 EZ 资源复制至当前实例 `public/theme/EZ`,不切换或删除其他主题。脚本需要 PHP >=8.2、Laravel dependencies 与 hn 自身运行资源。修改参数前需清理旧配置缓存,发布后重启 hn 自己的长驻 worker/Octane。首次实例初始化按已有安装流程执行迁移、创建独立管理员;不要通过拷贝 dpl 用户和订单完成初始化。
回滚恢复 hn 的原 Git 版本、原 lock/submodule 和相应构建资源,清配置缓存、重启 hn 进程;本次没有新增业务迁移。不要把已运行 hn 的参数切成 dpl 代替版本回滚。现有 dpl 部署无需安装或构建 EZ;保留原主题和环境即可。
## 验证
新增站点测试:`php vendor/bin/phpunit --bootstrap vendor/autoload.php tests/Feature/SiteProfile`。前台配置测试:在 frontends 运行 `npm run test:hn`。构建检查:`npm run build:hn`。
支付/邮件既有隔离套件和订单并发套件应在独立 PHP 进程运行:前者使用精简 user schema,Eloquent 的静态 guardable columns 缓存会影响后者,合并执行可产生缺 password 的测试夹具错误。不要据此修改业务模型。
当次实际验证与尚未验收事项见 [STATUS](STATUS.md)。不将本地主题验证当作服务器上线、真实付款或客户端节点连接验收。
## hn.loc 验收与回退(2026-10-27)
双栈解析仅回环;首页、Vite client/main.js、品牌SVG和公开站点配置接口均200,接口品牌 hardnerd。浏览器显示 EZ 的 hardnerd 深色首页,日志确认 `[vite] connected.`,未见警告/错误。原 dpl.loc 与 home.loc 首页均200。站点回归14项/31断言、EZ配置测试1项、PHP语法和差异检查通过。没有登录账户、创建业务记录、真实付款或访问线上。
备份及截图:主工作区 `codex/output/hn-local-domain-20261027/`(含私密.env备份,文件600,不提交);管理员安装备份与回执在 `/private/tmp/hn-loc-admin-20261027/`。撤回域名时只移除本次 `hn.loc.conf` 及 hosts 中带 HN 标记的两条精确映射,先 `nginx -t` 再向核实后的 master 平滑HUP;不恢复整份hosts覆盖其他项目新条目。开发文件按备份逐项比较恢复,APP_URL 改动也只恢复对应字段;不覆盖并行修改,不清理SQLite数据。域名和服务配置已本机启用,代码未提交、推送或生产发布。
## HN 本地默认管理员(2026-10-27)
用户要求补齐默认管理员。账号/密码按 GemDocs AI版 `ACC-005` 的统一字段契约取用,本文不保存凭据值。本次先检查发现约定账号不存在;SQLite在线备份后,使用项目官方 `XboardInstall::registerAdmin` 在 hn-preview.sqlite 中创建,用户ID3,is_admin=true、banned=false,密码哈希匹配。未覆盖旧管理员或用户、未触碰dpl/线上库。
管理入口现为 `http://admin.hn.loc/`(同日按用户要求新增);原 `http://hn.loc/hn-preview-admin` 继续兼容。浏览器已确认登录界面、邮箱与密码框正常显示。本次通过该实例正常HTTP登录API获得is_admin=true,并验证管理端plan/fetch返回200、访客同一路由403;接口返回的凭据和业务内容没有输出。唯一API验收会话已撤销,未在浏览器保存登录状态或密码,未改验证码/认证策略。
任务前数据库备份位于主工作区 `codex/output/hn-local-domain-20261027/hn-before-default-admin.sqlite`(600,含私有数据,不提交)。默认账号已经创建;如需撤销仅处理本次新建ID3并核对其后业务引用,不能整库覆盖丢失后续修改。后台登录页面截图同目录 `hn-admin-login.png`。各实例账号独立存在,此本地结果不代表HN生产管理员已经建立。
## EZ 购买套餐页精简(2026-10-27)
用户指定:中文“商店”改为“购买套餐”,移除进入页面自动弹出的用户须知,以及全球节点、极速体验、流媒体解锁、多设备支持四张宣传卡片。HN 适配层在 `runtime-config.mjs` 设置 `SHOP_CONFIG.popup.enabled=false`、`showPlanFeatureCards=false`;Vite 适配仅改写简体中文模块的“商店”文案,覆盖导航、页面标题与返回入口。上游锁定子模块保持原样,其他实例和语言不改;套餐/价格/库存/支付/下单二次确认逻辑未改。
本地浏览器已验证:导航与标题显示购买套餐,从仪表盘进入不再弹须知,四张宣传卡片不显示,套餐和购买按钮正常显示;一次性筛选空态及重置筛选可用,控制台无警告/错误。EZ同源配置测试及差异检查通过。未创建订单、未付款、未构建发布或修改dpl。截图和两文件修改前备份位于主工作区 `codex/output/hn-shop-cleanup-20261027/`。
## 独立本地后台域名(2026-10-27)
用户指定 `admin.hn.loc`。hosts 新增IPv4/IPv6回环映射;`/usr/local/etc/nginx/servers/admin.hn.loc.conf` 只监听127.0.0.1/[::1]:80,精确根 `/` 内部代理到既有PHP8592的 `/hn-preview-admin`,其他管理静态资源和API同源代理至同一PHP。浏览器地址保持 `http://admin.hn.loc/#/sign-in`,无需携带内部管理路径。未改app_url、secure_path、账户、认证中间件或前端构建产物;后台与hn.loc属于两个浏览器origin,登录状态分别保存,使用同一HN本地管理员。
验收:解析仅双回环;管理HTML与8项静态资源均200;浏览器实际显示品牌登录界面且无警告/错误;在新域名实际管理员登录/受限接口200、访客403,准确比对登录前会话ID后仅撤销本次新增验收会话。hn.loc/dpl.loc首页仍200,原hn.loc虚拟主机摘要未变。未访问线上、未改其他站点或放宽监听/认证。
安装候选、原hn.loc摘要及截图:主工作区 `codex/output/hn-admin-domain-20261027/`;管理员hosts备份/回执在 `/private/tmp/hn-admin-loc-20261027/`。回退只移除 `admin.hn.loc.conf` 与hosts中本次精确域名两行,保留hn.loc映射及并行配置;nginx配置检查通过后对核实的master平滑HUP。不覆盖整份hosts。
## 公告与购买须知的区别(2026-10-27代码核对)
购买套餐页须知仅由 `SHOP_CONFIG.popup.enabled` 控制,本次设false不涉及公告。网站公告由 `/api/v1/user/notice/fetch` 提供启用项,在仪表盘公告卡片展示标题/日期,查看详情打开公告弹窗;当前EZ自动弹窗只识别tags数组里的精确“弹窗”标签,选择返回列表中第一条符合者,并按公告ID在sessionStorage记录,当前标签页会话仅自动展示一次。后台独立popup字段不是该主题现有判断条件。未修改这套逻辑、未新建公告或做新的公告发布实测。