blueteamvillage/ctf-dot-blueteamvillage-dot-org
GitHub: blueteamvillage/ctf-dot-blueteamvillage-dot-org
蓝队村 DEF CON 34 CTF 赛事的官方网站,基于 Next.js 全静态架构与 Contentful CMS,在弱网环境下为参赛者提供赛事信息与搭建指南。
Stars: 2 | Forks: 0
# 蓝队村 CTF — DEF CON 34
Blue Team Village 在 DEF CON 34(2026年8月6–9日,拉斯维加斯)举办的 Project Obsidian CTF 官方网站:用于容器化环境中恶意软件取证分析的中心枢纽。该网站被构建得极其轻量且移动优先——它必须在 DEF CON 不稳定的互联网环境下保持正常工作。前一年的网站原样保存在
[`/archive/dc33`](https://ctf.blueteamvillage.org/archive/dc33)。
## 技术栈
- **Next.js 16**(App Router,所有路由均为完全静态)+ **React 19** + TypeScript
- **Tailwind CSS v4** — `app/globals.css` 中的 DEF CON 34 "Agency" 主题 token
(官方调色板:海军蓝 `#0d294a`,蓝绿色 `#017FA4`,薄荷绿 `#6CCDB8`,
金色 `#f1b435`,洋红 `#E0004E`;Lato + Geist Mono)
- **Contentful**(仅在构建时获取,无客户端 API 调用)
- **Vercel** + `@vercel/analytics`
- **pnpm**
```
pnpm install
pnpm dev # http://localhost:3000
pnpm build # production build — must stay all-static (○)
pnpm lint # eslint 9 flat config
```
## 内容管理
布局存在于代码中;可变内容存在于 Contentful
(space `mgfsp0s6h7v2`,environment `master`)。内容模型:
| 模型 | 驱动 | 备注 |
|---|---|---|
| `siteSettings` | 公告横幅、MetaCTF 名称/URL、Discord、下载链接 | singleton — 仅保留一个条目 |
| `eventInfo` | 日期、场地、倒计时目标、状态、标语 | singleton |
| `challengeTrack` | `/challenges` 赛道 | body 为 Markdown |
| `scenario` | `/challenges/converged-frontier` 列表 | **仅限标题和简短描述**(见防护准则) |
| `setupSection` | `/setup` 编号步骤 | `tier: advanced` 会渲染 live-malware 警告 |
| `sponsor` | 主页赞助商网格 | `active: false` 为隐藏而非删除;可选的 `logo` 资产渲染在白色色块上(支持任何字标颜色) |
| `faqItem` | `/faq` | answer 为 Markdown |
数据流向:
1. 页面是静态的服务器组件。在**构建时**,它们会通过 Contentful Delivery API(`lib/contentful/`)获取已发布的条目。
2. 如果 `CONTENTFUL_SPACE_ID` / `CONTENTFUL_DELIVERY_TOKEN` 未设置或 API
无法访问,每个查询都会回退到 `lib/content/fallback.ts` 中已提交的默认值——网站将始终能成功构建。当您进行重大内容更改时,请保持 `fallback.ts`
与 Contentful 大致同步。
3. **发布更改本身不会触发重新部署。** 只需配置一次 webhook:
- Vercel → Project → Settings → Git → **Deploy Hooks** → 为生产分支创建一个 hook;
复制其 URL。
- Contentful → Settings → **Webhooks** → Add webhook → 粘贴 Vercel
部署 hook URL → 仅在 **Entry publish / unpublish** 事件时触发。
此后,编辑人员在 Contentful 中发布内容,Vercel 就会重新构建网站。
凭证:仅限环境变量(见 `.env.example`),在 Vercel 项目
设置中配置。切勿提交 token。
## 内容防护准则
仅发布**对参与者安全的框架**:场景标题和主题级别的简短描述、赛道、层级、工具栈、设置步骤。严禁在代码、Contentful 或回退内容中发布:
- flag 值、flag 格式/锚点或答案
- IOC 表、场景种子或 `scenario.yaml` 内部逻辑
- 已解决的报告/演练,或任何来自 `Organizers_Only/` 的内容
- 私有 `dc34-obsidian-seceng` 仓库中的原文内容
## 代码布局
```
app/
├── (dc34)/ # current site — shared chrome in (dc34)/layout.tsx
│ ├── page.tsx # home: hero, focus grid, tracks, sponsors
│ ├── challenges/ # tracks + converged-frontier scenarios
│ ├── setup/ # environment setup guide
│ ├── rules/ faq/ about/ past-winners/ …
├── archive/dc33/ # frozen DEF CON 33 site (own chrome, own ui copies)
├── layout.tsx # fonts (Lato/Geist Mono), metadata, analytics
└── not-found.tsx # terminal-flavored 404
components/
├── dc34/ # DC34 components (header, hero, terminal-prompt, …)
├── archive/dc33/ # frozen DC33 components — do not restyle
└── ui/ # shared primitives styled with DC34 tokens
lib/
├── contentful/ # delivery client + typed queries with fallback
└── content/ # fallback.ts — checked-in content defaults
```
存档被刻意冻结:它保留了 ui 原语的字节副本(`components/archive/dc33/ui/`)并固定了其原始字体栈,因此 DC34 的设计更改无法改变 DC33 页面。旧的 DC33 URL
(`/challenges/project-obsidian`、`/location`、……)会永久重定向到
存档(`next.config.ts`)。
## 性能基本规则
- 每个路由保持静态(构建输出中的 `○`)——没有服务器渲染,
没有客户端内容获取。
- 客户端 JS 仅限于倒计时、移动菜单和分析。
优先使用服务器组件和零 JS 模式(例如,FAQ 使用原生
`
`)。
- 所有动画均遵循 `prefers-reduced-motion`(`globals.css` 中的彻底关闭开关)。
## 关于 Blue Team Village
Blue Team Village 是一项由社区驱动的倡议,专注于防御性
网络安全——为分析师、取证调查员和 SOC 人员提供教育、培训和竞赛。
- **网站**:https://blueteamvillage.org
- **邮箱**:seceng@blueteamvillage.org
- **GitHub**:[@blueteamvillage](https://github.com/blueteamvillage)
标签:CTF赛事, 内容管理, 数字取证, 网络安全, 自动化攻击, 自动化脚本, 隐私保护