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赛事, 内容管理, 数字取证, 网络安全, 自动化攻击, 自动化脚本, 隐私保护