feat: make SITE_URL and SITE_DOMAIN dynamic via .env and docker compose

- Create .env and .env.example with SITE_DOMAIN=riverrooks.dev and SITE_URL=https://riverrooks.dev
- Migrate src/_data/site.json to src/_data/site.js reading environment variables dynamically
- Update subdomains across Forgejo, CyberChef, Stirling PDF, and Uptime Kuma to inherit site.domain
- Update docker-compose.yml and Dockerfile to accept dynamic SITE_URL and SITE_DOMAIN build args
- Add .env to .gitignore
This commit is contained in:
venus
2026-09-13 01:10:20 -05:00
parent b13a50ccee
commit 1491d3fa5c
8 changed files with 130 additions and 81 deletions
+101
View File
@@ -0,0 +1,101 @@
import fs from "node:fs";
import path from "node:path";
// Load .env variables into process.env if present
try {
const envPath = path.resolve(process.cwd(), ".env");
if (fs.existsSync(envPath)) {
const envContent = fs.readFileSync(envPath, "utf-8");
for (const line of envContent.split("\n")) {
const trimmed = line.trim();
if (trimmed && !trimmed.startsWith("#") && trimmed.includes("=")) {
const [key, ...vals] = trimmed.split("=");
const value = vals.join("=").trim().replace(/^["']|["']$/g, "");
if (!process.env[key.trim()]) {
process.env[key.trim()] = value;
}
}
}
}
} catch (e) {
// Silent fallback
}
const siteDomain = process.env.SITE_DOMAIN || "riverrooks.dev";
const siteUrl = process.env.SITE_URL || `https://${siteDomain}`;
export default {
domain: siteDomain,
url: siteUrl,
name: "River Rooks",
title: "River Rooks | Homelab Gateway",
description: "Engineering Notes, CTF Write-Ups & Systems Architecture",
status: "SYSTEMS NOMINAL",
author: "River Rooks",
systemSpec: "IEEE STD 1003.1",
nav: [
{
label: "Gateway 3",
url: "/"
},
{
label: "Dispatches",
url: "/dispatches/"
},
{
label: "Git Forge",
url: `https://git.${siteDomain}`,
external: true
},
{
label: "RSS Feed",
url: "/feed.xml"
}
],
services: [
{
name: "Forgejo Git",
url: `https://git.${siteDomain}`,
tag: `git.${siteDomain}:2222`,
desc: "Self-hosted code repositories & dotfiles."
},
{
name: "CyberChef",
url: `https://chef.${siteDomain}`,
tag: `chef.${siteDomain}:443`,
desc: "Hex decoding, cryptography & forensics."
},
{
name: "Stirling PDF",
url: `https://pdf.${siteDomain}`,
tag: `pdf.${siteDomain}:443`,
desc: "Private document OCR and manipulation."
},
{
name: "Uptime Kuma",
url: `https://status.${siteDomain}`,
tag: `status.${siteDomain}:443`,
desc: "High-frequency ping & latency monitors."
}
],
topics: [
{
title: "Hardware & Firmware",
slug: "firmware",
desc: "SPI dumping, UART interfacing & flash memory extraction",
badge: "TRACE: HARDWARE"
},
{
title: "Systems Architecture",
slug: "homelab",
desc: "Traefik routing, WireGuard mesh & containerized microkernels",
badge: "SYSTEM: INFRA"
},
{
title: "Offensive Security",
slug: "security",
desc: "Kernel exploitation, binary reverse-engineering & CTF writeups",
badge: "CTF: OFFENSIVE"
}
]
};