jpaul.io hub page
build / build (push) Successful in 17s

Single self-contained index.html (avatar + favicon inlined; only Google
Fonts external; zero JS; dark-mode; responsive) served by a baked
nginx:alpine image behind Traefik, built and published by CI on push
to main and rolled out by Watchtower.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LbhPvfSERrnuY5jdhAdB7v
This commit is contained in:
2026-07-02 21:11:38 -04:00
commit e3c7bf2e74
8 changed files with 719 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# jpaul.io hub page — a single container behind Traefik. The site is baked into
# the image by CI (see .gitea/workflows/build.yml + Dockerfile); Watchtower
# recreates the container when a new image is published, so what's running
# always matches what CI built.
#
# First run: docker compose up -d
# Updates: automatic — push to main -> CI builds -> Watchtower redeploys.
services:
jpaulio:
image: git.jpaul.io/justin/jpaulio:latest
container_name: jpaulio
restart: always
pull_policy: always
networks:
- web
labels:
- "traefik.enable=true"
- "traefik.http.routers.jpaulio.rule=Host(`jpaul.io`) || Host(`www.jpaul.io`)"
- "traefik.http.routers.jpaulio.entrypoints=websecure"
- "traefik.http.routers.jpaulio.tls.certresolver=myresolver"
# A compound (||) rule doesn't auto-populate the ACME domain list, so name
# the cert domains explicitly: one cert for the apex + www SAN.
- "traefik.http.routers.jpaulio.tls.domains[0].main=jpaul.io"
- "traefik.http.routers.jpaulio.tls.domains[0].sans=www.jpaul.io"
- "traefik.http.services.jpaulio.loadbalancer.server.port=80"
# Watchtower auto-updates this container when a new image is published.
- "com.centurylinklabs.watchtower.enable=true"
networks:
web:
external: true