jmartin f03d448303 Authorize admin by username jmartin only
Drop group membership checks; trust Authelia Remote-User when it
equals the configured ADMIN_USERS list (default: jmartin).
2026-07-24 09:38:23 -04:00

jmartgraphix.com — Portfolio CMS

Single-container portfolio website: Fastify API + Vite/React SPA, backed by PostgreSQL and Typesense 30.2. Admin is protected by Authelia (Remote-User / Remote-Groups headers).

Architecture

Traefik (TLS) → jmartgraphix-com:3000
                  ├── static SPA (public + /admin)
                  ├── /api/v1/* (OpenAPI at /api/docs)
                  ├── /uploads/*
                  └── /.well-known/* (matrix, webfinger)

Sidecars: Typesense
Shared:   Postgres (catalog), optional imgproxy
Path Auth
/, /portfolio/*, /resume, /api/v1/* (public) None
/admin, /api/v1/admin/* Authelia forwardAuth → Remote-User

Source of truth

  • Gitea: https://git.jmartgraphix.com/jmartin/jmartgraphix.com.git
  • Local clone: /docker/jmartgraphix/hub/
  • Host workspace /docker/jmartgraphix is not the git root (uploads, typesense data, prompt live there)

Deploy loop

cd /docker/jmartgraphix/hub
git add -A && git commit -m "…" && git push origin master

cd /docker/komodo/periphery/stacks/jmartgraphix-com
docker compose up -d --build

Verify:

curl -s https://jmartgraphix.com/api/v1/health
docker logs jmartgraphix-com --tail 80

Look for: Database migrations applied, Typesense index, Server listening.

Environment

See .env.example. Stack secrets live in
/docker/komodo/periphery/stacks/jmartgraphix-com/.env.

ArtStation import

docker exec -it jmartgraphix-com \
  npx tsx scripts/import-artstation.ts --user jmartgraphix

# dry run
docker exec -it jmartgraphix-com \
  npx tsx scripts/import-artstation.ts --user jmartgraphix --dry-run

# single artwork
docker exec -it jmartgraphix-com \
  npx tsx scripts/import-artstation.ts --url https://www.artstation.com/artwork/XXXX

Imported projects are drafts — review and publish in /admin.

Local development

cd /docker/jmartgraphix/hub
cp .env.example .env   # set DATABASE_URL, REQUIRE_REMOTE_USER=false
npm install
npm run db:migrate -w server
npm run dev

Features

  • Multi-category projects with media gallery, YouTube/Vimeo/self-hosted video
  • Portfolio views (/portfolio/game-dev, /portfolio/engineering, …)
  • Typesense search, filters, featured, sort by priority/date/title
  • Editable resume + PDF download
  • OpenAPI docs at /api/docs
  • Sitemap /sitemap.xml, RSS /rss.xml
S
Description
my personal website
Readme
496 KiB
Languages
TypeScript 88.9%
SCSS 9.2%
Dockerfile 1%
HTML 0.9%