Initial portfolio CMS: Fastify API + Vite SPA
Single-container app with Postgres catalog, Typesense search, Authelia Remote-User admin, portfolio views, resume/PDF, media uploads, and ArtStation import tooling.
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
# 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
|
||||
|
||||
```bash
|
||||
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:
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
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
|
||||
|
||||
```bash
|
||||
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`
|
||||
Reference in New Issue
Block a user