3 Landing Sites
Drew edited this page 2026-07-26 21:30:33 -04:00
This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Landing Sites

Two static sites served by one compose file, each as its own nginx container with the document root bind-mounted from disk. Edits are zero-downtime — nginx rereads the volume on every request.

/var/landing/docker-compose.yml

version: '3.7'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "8080:80"
    volumes:
      - ./html:/usr/share/nginx/html:ro
    restart: unless-stopped

  nginx-butterbian:
    image: nginx:alpine
    ports:
      - "8082:80"
    volumes:
      - ./butterbian:/usr/share/nginx/html:ro
    restart: unless-stopped

Both use the stock nginx:alpine with no custom nginx.conf — the default config serves index.html from /usr/share/nginx/html. No PHP, no rewrites, no headers customisation — pure static delivery.

Sites

Site Local port Source dir Public URLs
JustAGuyLinux :8080 /var/landing/html/ justaguylinux.com, www.justaguylinux.com
Butterbian :8082 /var/landing/butterbian/ butterbian.org, www.butterbian.org

Both www. and apex hostnames are mapped to the same backend in /etc/cloudflared/config.yml — see Cloudflare Tunnel.

Site 1 — JustAGuyLinux (/var/landing/html/)

A single-page CRT-styled "fastfetch" landing page. Pure HTML/CSS/JS in one index.html (~360 lines), an inline <style> block (no external stylesheet), and an inline <script> driving the matrix-rain background and 18 keyboard navigation.

Files:

/var/landing/html/
├── index.html         # the entire site (~10 KB)
├── index.html.bak     # previous version — safe to delete
└── logo.png           # avatar shown in the fake neofetch

Embedded outbound links (the only "content" the page links to):

Key Link Destination
[1] YouTube youtube.com/@justaguylinux
[2] Butterforge justaguy.dev/drew
[3] The Butter Lab lab.justaguylinux.com (Discourse, this host)
[4] The Churn justaguylinux.chat (community chat — not on this host)
[5] Wiki justaguy.wiki (this wiki)
[6] Mastodon fosstodon.org/@justaguylinux
[7] Butterbian butterbian.org (the second site below)
[8] Email mailto:<REDACTED>

The page font is loaded from Google Fonts (Fira Code) — third-party dependency to be aware of for privacy/CSP if either becomes a concern.

Site 2 — Butterbian (/var/landing/butterbian/)

A multi-section project landing page for the Butterbian Debian-13 installer (BTRFS + Timeshift + grub-btrfs from day one). Two editions: XFCE (Calamares) and butterknife (Python+urwid TUI). Companion butterrepo APT repo for Ghostty, Neovim, rofi 2.0, Zen Browser, Helium, etc.

Files:

/var/landing/butterbian/
├── index.html              # the page (~280 lines)
├── style.css               # external stylesheet (~175 lines)
├── butterbian_blue60.png   # header logo
├── desktop.png             # screenshot (referenced by alt content if any)
├── logo.png                # 60px logo variant
├── logo_60.png             # 60px logo
└── logo_dark60.png         # dark variant

Sections in index.html (anchor links): about, editions, features, theming, subvolumes, requirements, butterrepo, download, issues, links.

Editing content

# Either site — just edit the HTML/CSS/assets in place:
$EDITOR /var/landing/html/index.html
$EDITOR /var/landing/butterbian/index.html

No restart needed. :ro mount means the container can't accidentally trash the source.

If a custom nginx.conf is ever added (cache headers, gzip tuning, redirects), docker compose restart nginx (or nginx-butterbian) to reload.

Adding a third site

  1. Create /var/landing/<name>/ with index.html.
  2. Append a service to the compose file:
  nginx-newsite:
    image: nginx:alpine
    ports:
      - "8084:80"
    volumes:
      - ./newsite:/usr/share/nginx/html:ro
    restart: unless-stopped
  1. cd /var/landing && docker compose up -d
  2. Add ingress in /etc/cloudflared/config.yml (see Cloudflare Tunnel).
  3. Create the DNS record: sudo cloudflared tunnel route dns <TUNNEL_UUID> newsite.example.com.
  4. sudo systemctl restart cloudflared.

Backup

These sites are tiny (HTML + a few PNGs). Treat them as part of the configs tarball — see Backups:

sudo tar czf /backups/landing-$(date +%F).tar.gz -C /var landing/

The .bak files in html/ are previous versions of index.html — keep or delete at will, they're not load-bearing.