Make site URLs environment-driven

This commit is contained in:
SepComet 2026-05-06 11:00:06 +08:00
parent f0a6da915a
commit df4afe8a57
10 changed files with 114 additions and 12 deletions

View File

@ -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
# -----------------------------------------------------------------------------

View File

@ -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}" \

View File

@ -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 调用的命令:

View File

@ -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 } : {}),
};
});

View File

@ -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:-}

View File

@ -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`
每个项目至少包含:

View File

@ -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`

View File

@ -41,9 +41,13 @@ const isPlaceholder = activity.source === 'placeholder';
: '这里展示构建阶段同步下来的 Gitea 热力图与最近活动摘要。'}
</p>
</div>
{
site.gitea.url ? (
<a class="section-link" href={site.gitea.url} target="_blank" rel="noreferrer">
打开 Gitea
</a>
) : null
}
</div>
<div class="activity-grid">

View File

@ -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 = {

View File

@ -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;