diff --git a/.env.example b/.env.example index b82a8c7..6a61c75 100644 --- a/.env.example +++ b/.env.example @@ -5,6 +5,17 @@ # exposed to browser-side code. # ----------------------------------------------------------------------------- +# ----------------------------------------------------------------------------- +# Public site URLs +# These values are safe to expose to the generated site and can stay empty +# until the final domain / service URLs are ready. +# ----------------------------------------------------------------------------- +PUBLIC_SITE_URL= +PUBLIC_GITEA_URL= +PUBLIC_GITHUB_URL=https://github.com/sepcomet +PUBLIC_BLOG_URL= +PUBLIC_GITEA_USERNAME= + # ----------------------------------------------------------------------------- # Gitea # ----------------------------------------------------------------------------- diff --git a/Dockerfile b/Dockerfile index d633c08..d7c84bb 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,11 @@ ARG GITEA_TOKEN="" ARG GITEA_USERNAME="" ARG SEAFILE_BASE_URL="" ARG SEAFILE_TOKEN="" +ARG PUBLIC_SITE_URL="" +ARG PUBLIC_GITEA_URL="" +ARG PUBLIC_GITHUB_URL="" +ARG PUBLIC_BLOG_URL="" +ARG PUBLIC_GITEA_USERNAME="" ARG SYNC_OUTPUT_DIR="src/data/generated" ARG STRICT_SYNC="false" ARG SEAFILE_MIRROR_DOWNLOADS="false" @@ -28,6 +33,11 @@ ENV GITEA_BASE_URL="${GITEA_BASE_URL}" \ GITEA_USERNAME="${GITEA_USERNAME}" \ SEAFILE_BASE_URL="${SEAFILE_BASE_URL}" \ SEAFILE_TOKEN="${SEAFILE_TOKEN}" \ + PUBLIC_SITE_URL="${PUBLIC_SITE_URL}" \ + PUBLIC_GITEA_URL="${PUBLIC_GITEA_URL}" \ + PUBLIC_GITHUB_URL="${PUBLIC_GITHUB_URL}" \ + PUBLIC_BLOG_URL="${PUBLIC_BLOG_URL}" \ + PUBLIC_GITEA_USERNAME="${PUBLIC_GITEA_USERNAME}" \ SYNC_OUTPUT_DIR="${SYNC_OUTPUT_DIR}" \ STRICT_SYNC="${STRICT_SYNC}" \ SEAFILE_MIRROR_DOWNLOADS="${SEAFILE_MIRROR_DOWNLOADS}" \ diff --git a/README.md b/README.md index 46acaf9..beea174 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,11 @@ cp .env.example .env 然后填写: +- `PUBLIC_SITE_URL` +- `PUBLIC_GITEA_URL` +- `PUBLIC_GITHUB_URL` +- `PUBLIC_BLOG_URL` +- `PUBLIC_GITEA_USERNAME` - `GITEA_BASE_URL` - `GITEA_TOKEN` - `GITEA_USERNAME` @@ -41,6 +46,7 @@ cp .env.example .env - `SEAFILE_TOKEN` 如果某些远端还没接好,也可以先保留为空;系统会按当前策略回退到 seed data。 +如果正式域名还没下来,`PUBLIC_SITE_URL` / `PUBLIC_BLOG_URL` 也可以先留空。 ### 3. 本地开发 @@ -102,6 +108,22 @@ npm run rebuild - 文件:`src/content/seafile/index.json` +## 推荐的内容维护边界 + +当前更推荐把下面这些文件视为 **AstrBot 可维护输入文件**: + +- `src/content/projects/index.json` +- `src/content/seafile/index.json` +- `src/content/shares/index.json` + +也就是说: + +- 你在 AstrBot 里维护项目 / 分享 / 下载配置 +- AstrBot 负责更新这些 JSON +- 仓库只负责在构建时读取并消费它们 + +这样比手工直接改 JSON 更适合日常维护,也不需要额外引入数据库或在线后台。 + ## 统一重建入口 适合 AstrBot / cron 调用的命令: diff --git a/astro.config.mjs b/astro.config.mjs index fc588d9..6869913 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -1,5 +1,11 @@ import { defineConfig } from 'astro/config'; +import { loadEnv } from 'vite'; -export default defineConfig({ - site: 'https://sepcomet.xyz', +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, process.cwd(), ''); + const site = env.PUBLIC_SITE_URL?.trim(); + + return { + ...(site ? { site } : {}), + }; }); diff --git a/docker-compose.yml b/docker-compose.yml index 733b681..0cc158c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -4,6 +4,11 @@ services: context: . dockerfile: Dockerfile args: + PUBLIC_SITE_URL: ${PUBLIC_SITE_URL:-} + PUBLIC_GITEA_URL: ${PUBLIC_GITEA_URL:-} + PUBLIC_GITHUB_URL: ${PUBLIC_GITHUB_URL:-} + PUBLIC_BLOG_URL: ${PUBLIC_BLOG_URL:-} + PUBLIC_GITEA_USERNAME: ${PUBLIC_GITEA_USERNAME:-} GITEA_BASE_URL: ${GITEA_BASE_URL:-} GITEA_TOKEN: ${GITEA_TOKEN:-} GITEA_USERNAME: ${GITEA_USERNAME:-} diff --git a/docs/content-sync-guide.md b/docs/content-sync-guide.md index a890686..26dcf84 100644 --- a/docs/content-sync-guide.md +++ b/docs/content-sync-guide.md @@ -43,6 +43,20 @@ npm run rebuild cp .env.example .env ``` +### 2.0 公开 URL 配置 + +| 变量 | 必填 | 作用 | +|------|------|------| +| `PUBLIC_SITE_URL` | 可选 | 站点正式地址,对应 Astro `site` | +| `PUBLIC_GITEA_URL` | 可选 | 页面里展示的 Gitea 根地址 | +| `PUBLIC_GITHUB_URL` | 可选 | 页面里展示的 GitHub 地址 | +| `PUBLIC_BLOG_URL` | 可选 | 页面里展示的 Blog 地址 | +| `PUBLIC_GITEA_USERNAME` | 可选 | 页面展示用 Gitea 用户名 | + +这些变量会进入最终静态页面,因此只应放公开信息。 + +如果正式域名还没发下来,可以先留空;页面会继续构建,只是不会输出对应外链。 + ### 2.1 Gitea | 变量 | 必填 | 作用 | @@ -99,6 +113,22 @@ cp .env.example .env ## 3. 映射文件如何填写 +### 3.0 推荐的维护边界 + +当前建议把以下文件视为 **AstrBot 可维护输入文件**: + +- `src/content/projects/index.json` +- `src/content/seafile/index.json` +- `src/content/shares/index.json` + +推荐工作流: + +1. 你在 AstrBot 里编辑项目 / 分享 / 下载配置 +2. AstrBot 更新这些 JSON +3. AstrBot 执行 `npm run rebuild` + +仓库本身只负责消费这些文件,不需要额外引入数据库或在线后台。 + ### 3.1 项目种子数据:`src/content/projects/index.json` 每个项目至少包含: diff --git a/docs/docker-deploy.md b/docs/docker-deploy.md index dd46fb5..f4036c3 100644 --- a/docs/docker-deploy.md +++ b/docs/docker-deploy.md @@ -17,6 +17,11 @@ 确保仓库根目录有可用的 `.env`,或在执行 `docker compose` 前导出这些变量: +- `PUBLIC_SITE_URL` +- `PUBLIC_GITEA_URL` +- `PUBLIC_GITHUB_URL` +- `PUBLIC_BLOG_URL` +- `PUBLIC_GITEA_USERNAME` - `GITEA_BASE_URL` - `GITEA_TOKEN` - `GITEA_USERNAME` diff --git a/src/components/GiteaActivity.astro b/src/components/GiteaActivity.astro index acf5a44..481c5c4 100644 --- a/src/components/GiteaActivity.astro +++ b/src/components/GiteaActivity.astro @@ -41,9 +41,13 @@ const isPlaceholder = activity.source === 'placeholder'; : '这里展示构建阶段同步下来的 Gitea 热力图与最近活动摘要。'}

- - 打开 Gitea - + { + site.gitea.url ? ( + + 打开 Gitea + + ) : null + }
diff --git a/src/components/ProjectCard.astro b/src/components/ProjectCard.astro index e7d54ec..3f84283 100644 --- a/src/components/ProjectCard.astro +++ b/src/components/ProjectCard.astro @@ -33,7 +33,7 @@ const { source, } = Astro.props; -const fallbackRepoUrl = repo ? `${site.gitea.url}/${repo}` : ''; +const fallbackRepoUrl = repo && site.gitea.url ? `${site.gitea.url}/${repo}` : ''; const resolvedRepoUrl = repoUrl || fallbackRepoUrl; const visibleDownloads = downloads.filter((item) => item.name || item.url); const sourceLabels = { diff --git a/src/config.ts b/src/config.ts index 1819123..bd8f29c 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,3 +1,12 @@ +const publicSiteUrl = import.meta.env.PUBLIC_SITE_URL?.trim() || ''; +const publicGiteaUrl = import.meta.env.PUBLIC_GITEA_URL?.trim() || ''; +const publicGithubUrl = import.meta.env.PUBLIC_GITHUB_URL?.trim() || ''; +const publicBlogUrl = import.meta.env.PUBLIC_BLOG_URL?.trim() || publicSiteUrl; +const publicGiteaUsername = + import.meta.env.PUBLIC_GITEA_USERNAME?.trim() || + import.meta.env.GITEA_USERNAME?.trim() || + 'sepcomet'; + export const site = { name: 'SepComet', title: '个人主页', @@ -7,13 +16,13 @@ export const site = { avatar: '/images/avatar.svg', location: 'Shanghai / Remote', gitea: { - url: 'https://gitea.sepcomet.xyz', - username: 'sepcomet', + url: publicGiteaUrl, + username: publicGiteaUsername, }, links: [ - { name: 'GitHub', url: 'https://github.com/sepcomet' }, - { name: 'Gitea', url: 'https://gitea.sepcomet.xyz' }, - { name: 'Blog', url: 'https://sepcomet.xyz' }, - ], + { name: 'GitHub', url: publicGithubUrl }, + { name: 'Gitea', url: publicGiteaUrl }, + { name: 'Blog', url: publicBlogUrl }, + ].filter((link) => link.url), stacks: ['Unity', 'Astro', 'TypeScript', 'Docker'], } as const;