laforceit-blog/src/config/terminal.js

414 lines
18 KiB
JavaScript

/**
* Terminal Configuration
* Central configuration for the Terminal component across the site
*/
// Default terminal prompt settings
export const TERMINAL_DEFAULTS = {
promptPrefix: "[laforceit@argobox]",
title: "argobox:~/blog",
theme: "dark", // Default theme (dark or light)
height: "auto",
showTitleBar: true,
showPrompt: true
};
// Commonly used commands
export const COMMON_COMMANDS = [
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "ls -la ./infrastructure",
output: [
"total 20",
"drwxr-xr-x 5 laforceit users 4096 Apr 23 09:15 <span class='highlight'>kubernetes/</span>",
"drwxr-xr-x 3 laforceit users 4096 Apr 20 17:22 <span class='highlight'>docker/</span>",
"drwxr-xr-x 2 laforceit users 4096 Apr 19 14:30 <span class='highlight'>networking/</span>",
"drwxr-xr-x 4 laforceit users 4096 Apr 22 21:10 <span class='highlight'>monitoring/</span>",
"drwxr-xr-x 3 laforceit users 4096 Apr 21 16:45 <span class='highlight'>storage/</span>",
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "grep -r \"kubernetes\" --include=\"*.md\" ./posts | wc -l",
output: ["7 matches found"]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "kubectl get nodes",
output: [
"NAME STATUS ROLES AGE VERSION",
"argobox-cp1 Ready control-plane,master 92d v1.27.3",
"argobox-cp2 Ready control-plane,master 92d v1.27.3",
"argobox-cp3 Ready control-plane,master 92d v1.27.3",
"argobox-node1 Ready worker 92d v1.27.3",
"argobox-node2 Ready worker 92d v1.27.3"
]
}
];
// Advanced blog search command sequence
export const BLOG_SEARCH_SEQUENCE = [
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "cd ./posts && grep -r \"homelab\" --include=\"*.md\" | sort | head -5",
output: [
"<span class='term-green'>homelab-essentials.md</span>:<span class='term-blue'>title:</span> \"Essential Tools for Your Home Lab Setup\"",
"<span class='term-green'>homelab-essentials.md</span>:<span class='term-blue'>description:</span> \"A curated list of must-have tools for building your home lab infrastructure\"",
"<span class='term-green'>kubernetes-at-home.md</span>:<span class='term-blue'>title:</span> \"Running Kubernetes in Your Homelab\"",
"<span class='term-green'>proxmox-cluster.md</span>:<span class='term-blue'>description:</span> \"Building a resilient homelab foundation with Proxmox VE cluster\"",
"<span class='term-green'>storage-solutions.md</span>:<span class='term-blue'>body:</span> \"...affordable homelab storage solutions for a growing collection of VMs and containers...\""
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "find ./posts -type f -name \"*.md\" | xargs wc -l | sort -nr | head -3",
output: [
"2567 total",
" 842 ./posts/kubernetes-the-hard-way.md",
" 756 ./posts/home-automation-guide.md",
" 523 ./posts/proxmox-cluster.md"
]
}
];
// System monitoring sequence
export const SYSTEM_MONITOR_SEQUENCE = [
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "htop",
output: [
"<span class='term-purple'>Tasks:</span> <span class='term-cyan'>143</span> total, <span class='term-green'>4</span> running, <span class='term-yellow'>139</span> sleeping, <span class='term-red'>0</span> stopped, <span class='term-red'>0</span> zombie",
"<span class='term-purple'>%Cpu(s):</span> <span class='term-green'>12.5</span> us, <span class='term-blue'>4.2</span> sy, <span class='term-cyan'>0.0</span> ni, <span class='term-green'>82.3</span> id, <span class='term-yellow'>0.7</span> wa, <span class='term-red'>0.0</span> hi, <span class='term-red'>0.3</span> si, <span class='term-cyan'>0.0</span> st",
"<span class='term-purple'>MiB Mem:</span> <span class='term-cyan'>32102.3</span> total, <span class='term-green'>12023.4</span> free, <span class='term-yellow'>10654.8</span> used, <span class='term-blue'>9424.1</span> buff/cache",
"<span class='term-purple'>MiB Swap:</span> <span class='term-cyan'>16384.0</span> total, <span class='term-green'>16384.0</span> free, <span class='term-yellow'>0.0</span> used. <span class='term-green'>20223.3</span> avail Mem",
"",
" <span class='term-cyan'>PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND</span>",
"<span class='term-yellow'> 23741 laforcei 20 0 4926.0m 257.9m 142.1m S 25.0 0.8 42:36.76 node</span>",
" 22184 root 20 0 743.9m 27.7m 17.6m S 6.2 0.1 27:57.21 dockerd",
" 15532 root 20 0 1735.9m 203.5m 122.1m S 6.2 0.6 124:29.93 k3s-server",
" 1126 prometheu 20 0 1351.5m 113.9m 41.3m S 0.0 0.4 3:12.52 prometheus"
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "df -h",
output: [
"Filesystem Size Used Avail Use% Mounted on",
"/dev/nvme0n1p2 932G 423G 462G 48% /",
"/dev/nvme1n1 1.8T 1.1T 638G 64% /data",
"tmpfs 16G 12M 16G 1% /run",
"tmpfs 32G 0 32G 0% /dev/shm"
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "docker stats --no-stream",
output: [
"CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS",
"7d9915b1f946 blog-site 0.15% 145.6MiB / 32GiB 0.44% 648kB / 4.21MB 12.3MB / 0B 24",
"c7823beac704 prometheus 2.33% 175.2MiB / 32GiB 0.53% 15.5MB / 25.4MB 29.6MB / 12.4MB 15",
"db9d8512f471 postgres 0.03% 96.45MiB / 32GiB 0.29% 85.1kB / 106kB 21.9MB / 63.5MB 11",
"f3b1c9e2a147 grafana 0.42% 78.32MiB / 32GiB 0.24% 5.42MB / 12.7MB 86.4MB / 1.21MB 13"
]
}
];
// Blog deployment sequence
export const BLOG_DEPLOYMENT_SEQUENCE = [
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "git status",
output: [
"On branch <span class='term-cyan'>main</span>",
"Your branch is up to date with 'origin/main'.",
"",
"Changes not staged for commit:",
" (use \"git add <file>...\" to update what will be committed)",
" (use \"git restore <file>...\" to discard changes in working directory)",
" <span class='term-red'>modified: src/content/posts/kubernetes-at-home.md</span>",
" <span class='term-red'>modified: src/components/Terminal.astro</span>",
"",
"Untracked files:",
" (use \"git add <file>...\" to include in what will be committed)",
" <span class='term-red'>src/content/posts/new-homelab-upgrades.md</span>",
"",
"no changes added to commit (use \"git add\" and/or \"git commit -a\")"
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "git add . && git commit -m \"feat: add new post about homelab upgrades\"",
output: [
"[main <span class='term-green'>f92d47a</span>] <span class='term-cyan'>feat: add new post about homelab upgrades</span>",
" 3 files changed, 214 insertions(+), 12 deletions(-)",
" create mode 100644 src/content/posts/new-homelab-upgrades.md"
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "npm run build && npm run deploy",
output: [
"<span class='term-green'>✓</span> Building for production...",
"<span class='term-green'>✓</span> Generating static routes",
"<span class='term-green'>✓</span> Client side rendering with hydration",
"<span class='term-green'>✓</span> Applying optimizations",
"<span class='term-green'>✓</span> Complete! 187 pages generated in 43.2 seconds",
"",
"<span class='term-blue'>Deploying to production environment...</span>",
"<span class='term-green'>✓</span> Upload complete",
"<span class='term-green'>✓</span> CDN cache invalidated",
"<span class='term-green'>✓</span> DNS configuration verified",
"<span class='term-green'>✓</span> Blog is live at https://laforceit.com!"
]
}
];
// Kubernetes operation sequence
export const K8S_OPERATION_SEQUENCE = [
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "kubectl create namespace blog-prod",
output: [
"namespace/blog-prod created"
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "kubectl apply -f kubernetes/blog-deployment.yaml",
output: [
"deployment.apps/blog-frontend created",
"service/blog-frontend created",
"configmap/blog-config created",
"secret/blog-secrets created"
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "kubectl get pods -n blog-prod",
output: [
"NAME READY STATUS RESTARTS AGE",
"blog-frontend-7d9b5c7b8d-2xprm 1/1 Running 0 35s",
"blog-frontend-7d9b5c7b8d-8bkpl 1/1 Running 0 35s",
"blog-frontend-7d9b5c7b8d-f9j7s 1/1 Running 0 35s"
]
},
{
prompt: TERMINAL_DEFAULTS.promptPrefix + "$",
command: "kubectl get ingress -n blog-prod",
output: [
"NAME CLASS HOSTS ADDRESS PORTS AGE",
"blog-ingress <none> blog.laforceit.com 192.168.1.50 80, 443 42s"
]
}
];
// Predefined terminal content blocks
export const TERMINAL_CONTENT = {
fileExplorer: `<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">ls -la</span>
total 42
drwxr-xr-x 6 laforceit users 4096 Nov 7 22:15 .
drwxr-xr-x 12 laforceit users 4096 Nov 7 20:32 ..
-rw-r--r-- 1 laforceit users 182 Nov 7 22:15 .astro
drwxr-xr-x 2 laforceit users 4096 Nov 7 21:03 components
drwxr-xr-x 3 laforceit users 4096 Nov 7 21:14 content
drwxr-xr-x 4 laforceit users 4096 Nov 7 21:42 layouts
drwxr-xr-x 5 laforceit users 4096 Nov 7 22:10 pages
-rw-r--r-- 1 laforceit users 1325 Nov 7 22:12 package.json`,
tags: `<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">cat ./content/tags.txt</span>
cloudflare
coding
containers
devops
digital-garden
docker
file-management
filebrowser
flux
git
gitea
gitops
grafana
homelab
infrastructure
k3s
knowledge-management
kubernetes
learning-in-public
monitoring
networking
observability
obsidian
prometheus
proxmox
quartz
rancher
remote-development
security
self-hosted
terraform
test
tunnels
tutorial
virtualization
vscode`,
blogDeployment: `<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">git add src/content/posts/kubernetes-monitoring.md</span>
<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">git commit -m "feat: add new article on Kubernetes monitoring"</span>
[main <span class="term-green">8fd43a9</span>] <span class="term-cyan">feat: add new article on Kubernetes monitoring</span>
1 file changed, 147 insertions(+)
create mode 100644 src/content/posts/kubernetes-monitoring.md
<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">git push origin main</span>
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 2.12 KiB | 2.12 MiB/s, done.
Total 5 (delta 3), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (3/3), completed with 3 local objects.
<span class="term-green">✓</span> Deployed to https://laforceit.com
<span class="term-green">✓</span> Article published successfully`,
k8sInstall: `<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">curl -sfL https://get.k3s.io | sh -</span>
[INFO] Finding release for channel stable
[INFO] Using v1.27.4+k3s1 as release
[INFO] Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.27.4+k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.27.4+k3s1/k3s
[INFO] Verifying binary download
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Creating /usr/local/bin/ctr symlink to k3s
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO] systemd: Starting k3s
<span class="term-green">✓</span> K3s has been installed successfully
<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">kubectl get pods -A</span>
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system helm-install-traefik-crd-k7gxl 0/1 Completed 0 2m43s
kube-system helm-install-traefik-pvvhg 0/1 Completed 1 2m43s
kube-system metrics-server-67c658dc48-mxnxp 1/1 Running 0 2m43s
kube-system local-path-provisioner-7b7dc8d6f5-q99nl 1/1 Running 0 2m43s
kube-system coredns-b96499967-nkvnz 1/1 Running 0 2m43s
kube-system svclb-traefik-bd0bfb17-ht8gq 2/2 Running 0 96s
kube-system traefik-7d586bdc47-d6lzr 1/1 Running 0 96s`,
dockerCompose: `<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">cat docker-compose.yaml</span>
version: '3.8'
services:
blog:
image: node:18-alpine
restart: unless-stopped
volumes:
- ./:/app
working_dir: /app
command: sh -c "npm install && npm run dev"
ports:
- "3000:3000"
environment:
- NODE_ENV=development
db:
image: postgres:14-alpine
restart: unless-stopped
volumes:
- postgres_data:/var/lib/postgresql/data
environment:
- POSTGRES_PASSWORD=secure_password
- POSTGRES_USER=bloguser
- POSTGRES_DB=blogdb
ports:
- "5432:5432"
volumes:
postgres_data:
<div class="term-blue">${TERMINAL_DEFAULTS.promptPrefix}</div><span>$</span> <span class="term-bold">docker-compose up -d</span>
Creating network "laforceit-blog_default" with the default driver
Creating volume "laforceit-blog_postgres_data" with default driver
Pulling blog (node:18-alpine)...
Pulling db (postgres:14-alpine)...
Creating laforceit-blog_db_1 ... done
Creating laforceit-blog_blog_1 ... done`
};
// Helper function to create terminal presets
export function createTerminalPreset(type) {
switch (type) {
case 'blog-search':
return BLOG_SEARCH_SEQUENCE[Math.floor(Math.random() * BLOG_SEARCH_SEQUENCE.length)];
case 'system-monitor':
return SYSTEM_MONITOR_SEQUENCE[Math.floor(Math.random() * SYSTEM_MONITOR_SEQUENCE.length)];
case 'blog-deploy':
return BLOG_DEPLOYMENT_SEQUENCE[Math.floor(Math.random() * BLOG_DEPLOYMENT_SEQUENCE.length)];
case 'k8s-ops':
return K8S_OPERATION_SEQUENCE[Math.floor(Math.random() * K8S_OPERATION_SEQUENCE.length)];
case 'k8s':
return {
title: "argobox:~/kubernetes",
command: "kubectl get pods -A",
output: `NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66bff467f8-8p7z2 1/1 Running 0 15d
kube-system coredns-66bff467f8-v68vr 1/1 Running 0 15d
kube-system etcd-control-plane 1/1 Running 0 15d
kube-system kube-apiserver-control-plane 1/1 Running 0 15d
kube-system kube-controller-manager-control-plane 1/1 Running 0 15d
kube-system kube-proxy-c84qf 1/1 Running 0 15d
kube-system kube-scheduler-control-plane 1/1 Running 0 15d`
};
case 'docker':
return {
title: "argobox:~/docker",
command: "docker ps",
output: `CONTAINER ID IMAGE COMMAND STATUS PORTS NAMES
d834f0efcf2f nginx:latest "/docker-entrypoint.…" Up 2 days 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp web
0b292940b4c0 postgres:13 "docker-entrypoint.s…" Up 2 days 0.0.0.0:5432->5432/tcp db
a834fa3ede06 redis:6 "docker-entrypoint.s…" Up 2 days 0.0.0.0:6379->6379/tcp cache`
};
case 'search':
return {
title: "argobox:~/blog",
command: "grep -r \"kubernetes\" --include=\"*.md\" ./posts | wc -l",
output: "7 matches found"
};
case 'random-cool':
// Pick a random sequence for a cool effect
const sequences = [
TERMINAL_CONTENT.k8sInstall,
TERMINAL_CONTENT.blogDeployment,
TERMINAL_CONTENT.dockerCompose,
...BLOG_SEARCH_SEQUENCE.map(item => `<div class="term-blue">${item.prompt}</div><span>$</span> <span class="term-bold">${item.command}</span>\n${item.output.join('\n')}`),
...SYSTEM_MONITOR_SEQUENCE.map(item => `<div class="term-blue">${item.prompt}</div><span>$</span> <span class="term-bold">${item.command}</span>\n${item.output.join('\n')}`),
...BLOG_DEPLOYMENT_SEQUENCE.map(item => `<div class="term-blue">${item.prompt}</div><span>$</span> <span class="term-bold">${item.command}</span>\n${item.output.join('\n')}`),
...K8S_OPERATION_SEQUENCE.map(item => `<div class="term-blue">${item.prompt}</div><span>$</span> <span class="term-bold">${item.command}</span>\n${item.output.join('\n')}`)
];
return {
title: "argobox:~/cool-stuff",
content: sequences[Math.floor(Math.random() * sequences.length)]
};
default:
return {
title: TERMINAL_DEFAULTS.title,
command: "echo 'Hello from LaForceIT Terminal'",
output: "Hello from LaForceIT Terminal"
};
}
}