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:
@@ -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
|
||||
Reference in New Issue
Block a user