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:
@@ -0,0 +1,4 @@
|
|||||||
|
# River Rooks Blog Environment Template
|
||||||
|
# Copy to .env and adjust variables as needed:
|
||||||
|
SITE_DOMAIN=riverrooks.dev
|
||||||
|
SITE_URL=https://riverrooks.dev
|
||||||
@@ -3,3 +3,4 @@ _site/
|
|||||||
.cache/
|
.cache/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
*.log
|
*.log
|
||||||
|
.env
|
||||||
|
|||||||
@@ -3,6 +3,12 @@ FROM node:22-alpine AS builder
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Dynamic build arguments for domain & full URL
|
||||||
|
ARG SITE_URL=https://riverrooks.dev
|
||||||
|
ARG SITE_DOMAIN=riverrooks.dev
|
||||||
|
ENV SITE_URL=$SITE_URL
|
||||||
|
ENV SITE_DOMAIN=$SITE_DOMAIN
|
||||||
|
|
||||||
# Copy dependency definitions and install
|
# Copy dependency definitions and install
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
RUN npm ci
|
RUN npm ci
|
||||||
|
|||||||
@@ -5,9 +5,15 @@ services:
|
|||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
|
args:
|
||||||
|
SITE_URL: ${SITE_URL:-https://riverrooks.dev}
|
||||||
|
SITE_DOMAIN: ${SITE_DOMAIN:-riverrooks.dev}
|
||||||
image: river-rooks-blog:latest
|
image: river-rooks-blog:latest
|
||||||
container_name: river_rooks_web
|
container_name: river_rooks_web
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
- SITE_URL=${SITE_URL:-https://riverrooks.dev}
|
||||||
|
- SITE_DOMAIN=${SITE_DOMAIN:-riverrooks.dev}
|
||||||
ports:
|
ports:
|
||||||
- "8080:80"
|
- "8080:80"
|
||||||
healthcheck:
|
healthcheck:
|
||||||
|
|||||||
@@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
{
|
|
||||||
"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.rooks.dev",
|
|
||||||
"external": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"label": "RSS Feed",
|
|
||||||
"url": "/feed.xml"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -8,6 +8,6 @@
|
|||||||
|
|
||||||
<div class="footer-right">
|
<div class="footer-right">
|
||||||
<span>© {{ currentYear or "2026" }} {{ site.author }}</span>
|
<span>© {{ currentYear or "2026" }} {{ site.author }}</span>
|
||||||
<a href="https://git.rooks.dev" target="_blank" rel="noopener noreferrer" class="footer-link">Source Forge ↗</a>
|
<a href="https://git.{{ site.domain }}" target="_blank" rel="noopener noreferrer" class="footer-link">Source Forge ↗</a>
|
||||||
</div>
|
</div>
|
||||||
</footer>
|
</footer>
|
||||||
|
|||||||
+8
-30
@@ -20,7 +20,7 @@ title: "River Rooks | Homelab Gateway"
|
|||||||
<div class="hero-directive-box">
|
<div class="hero-directive-box">
|
||||||
<strong>PRIMARY DESTINATIONS:</strong>
|
<strong>PRIMARY DESTINATIONS:</strong>
|
||||||
<a href="/dispatches/" style="color: var(--accent-cyan); text-decoration: none; margin-left: 8px;">[1] Technical Blog ({{ collections.posts.length }} Articles)</a> •
|
<a href="/dispatches/" style="color: var(--accent-cyan); text-decoration: none; margin-left: 8px;">[1] Technical Blog ({{ collections.posts.length }} Articles)</a> •
|
||||||
<a href="https://git.rooks.dev" target="_blank" rel="noopener noreferrer" style="color: inherit; text-decoration: none;">[2] Forgejo Git Repos</a> •
|
<a href="https://git.{{ site.domain }}" target="_blank" rel="noopener noreferrer" style="color: inherit; text-decoration: none;">[2] Forgejo Git Repos</a> •
|
||||||
<span>[3] Public Tools</span> •
|
<span>[3] Public Tools</span> •
|
||||||
<span>[4] Cluster Telemetry</span>
|
<span>[4] Cluster Telemetry</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -70,41 +70,19 @@ title: "River Rooks | Homelab Gateway"
|
|||||||
<span class="status-indicator"></span>
|
<span class="status-indicator"></span>
|
||||||
// HOMELAB SERVICES ROUTER
|
// HOMELAB SERVICES ROUTER
|
||||||
</div>
|
</div>
|
||||||
<span class="tile-meta">4 PUBLIC TOOLS</span>
|
<span class="tile-meta">{{ site.services.length }} PUBLIC TOOLS</span>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="services-mini-grid">
|
<div class="services-mini-grid">
|
||||||
<a href="https://git.rooks.dev" target="_blank" rel="noopener noreferrer" class="service-tile-item">
|
{% for svc in site.services %}
|
||||||
|
<a href="{{ svc.url }}" target="_blank" rel="noopener noreferrer" class="service-tile-item">
|
||||||
<div>
|
<div>
|
||||||
<div class="service-item-title">Forgejo Git</div>
|
<div class="service-item-title">{{ svc.name }}</div>
|
||||||
<div class="service-item-tag">git.rooks.dev:2222</div>
|
<div class="service-item-tag">{{ svc.tag }}</div>
|
||||||
</div>
|
</div>
|
||||||
<p class="service-item-desc">Self-hosted code repositories & dotfiles.</p>
|
<p class="service-item-desc">{{ svc.desc }}</p>
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="https://chef.rooks.dev" target="_blank" rel="noopener noreferrer" class="service-tile-item">
|
|
||||||
<div>
|
|
||||||
<div class="service-item-title">CyberChef</div>
|
|
||||||
<div class="service-item-tag">chef.rooks.dev:443</div>
|
|
||||||
</div>
|
|
||||||
<p class="service-item-desc">Hex decoding, cryptography & forensics.</p>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="https://pdf.rooks.dev" target="_blank" rel="noopener noreferrer" class="service-tile-item">
|
|
||||||
<div>
|
|
||||||
<div class="service-item-title">Stirling PDF</div>
|
|
||||||
<div class="service-item-tag">pdf.rooks.dev:443</div>
|
|
||||||
</div>
|
|
||||||
<p class="service-item-desc">Private document OCR and manipulation.</p>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<a href="https://status.rooks.dev" target="_blank" rel="noopener noreferrer" class="service-tile-item">
|
|
||||||
<div>
|
|
||||||
<div class="service-item-title">Uptime Kuma</div>
|
|
||||||
<div class="service-item-tag">status.rooks.dev:443</div>
|
|
||||||
</div>
|
|
||||||
<p class="service-item-desc">High-frequency ping & latency monitors.</p>
|
|
||||||
</a>
|
</a>
|
||||||
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user