docs: refresh DEV_WORKFLOW for 5-image build + tweak campaign card layout

- DEV_WORKFLOW.md: reflect that build-and-push.sh now produces 5 images
  (api, admin, media-api, nginx, ccp-agent), not 4.
- CampaignsListPage: move card title below cover photo instead of
  overlaying it, so titles remain legible when no cover image is set.

Bunker Admin
This commit is contained in:
bunker-admin 2026-05-18 14:16:25 -06:00
parent 1f240ad518
commit ecde194002
2 changed files with 12 additions and 29 deletions

View File

@ -33,8 +33,9 @@ All three methods share the same Gitea container registry at `gitea.bnkops.com/a
│ BUILD & PUBLISH │ │ BUILD & PUBLISH │
│ │ │ │
│ Step 1: ./scripts/build-and-push.sh │ │ Step 1: ./scripts/build-and-push.sh │
│ Builds 4 production images, pushes to Gitea registry │ │ Builds 5 production images, pushes to Gitea registry │
│ (api, admin, media-api, nginx) tagged :SHA + :latest │ │ (api, admin, media-api, nginx, ccp-agent) │
│ tagged :SHA + :latest │
│ │ │ │
│ Step 2: ./scripts/mirror-images.sh (run once/rarely) │ │ Step 2: ./scripts/mirror-images.sh (run once/rarely) │
│ Mirrors 36 third-party images to Gitea registry │ │ Mirrors 36 third-party images to Gitea registry │
@ -98,7 +99,7 @@ After code changes are tested locally:
./scripts/build-and-push.sh ./scripts/build-and-push.sh
``` ```
This builds **4 services** with multi-stage Dockerfiles (production target, no dev dependencies), tags each image with `:SHA` and `:latest`, and pushes to `gitea.bnkops.com/admin/changemaker-{service}`: This builds **5 services** with multi-stage Dockerfiles (production target, no dev dependencies), tags each image with `:SHA` and `:latest`, and pushes to `gitea.bnkops.com/admin/changemaker-{service}`:
| Service | Dockerfile | What it produces | | Service | Dockerfile | What it produces |
|---------|-----------|-----------------| |---------|-----------|-----------------|
@ -106,6 +107,7 @@ This builds **4 services** with multi-stage Dockerfiles (production target, no d
| `admin` | `admin/Dockerfile` | Nginx serving React build output | | `admin` | `admin/Dockerfile` | Nginx serving React build output |
| `media-api` | `api/Dockerfile.media` | Fastify + FFmpeg (compiled JS) | | `media-api` | `api/Dockerfile.media` | Fastify + FFmpeg (compiled JS) |
| `nginx` | `nginx/Dockerfile` | Nginx with `envsubst` domain templating | | `nginx` | `nginx/Dockerfile` | Nginx with `envsubst` domain templating |
| `ccp-agent` | `../changemaker-control-panel/agent/Dockerfile` | Remote management agent (sibling repo) |
```bash ```bash
# Build specific services only # Build specific services only
@ -269,7 +271,7 @@ docker compose logs -f api # Watch API logs
docker compose exec api npx prisma migrate dev # Create migration docker compose exec api npx prisma migrate dev # Create migration
# ── Build & Publish ── # ── Build & Publish ──
./scripts/build-and-push.sh # Build + push 4 images ./scripts/build-and-push.sh # Build + push 5 images
./scripts/mirror-images.sh # Mirror 36 third-party images ./scripts/mirror-images.sh # Mirror 36 third-party images
git tag --sort=-v:refname | head -3 # Check latest version tags git tag --sort=-v:refname | head -3 # Check latest version tags
./scripts/build-release.sh --tag vX.Y.Z --upload # Package + upload release ./scripts/build-release.sh --tag vX.Y.Z --upload # Package + upload release
@ -310,7 +312,7 @@ There are **two separate Gitea tokens** with different purposes. Using the wrong
# Check commits since the last tag # Check commits since the last tag
git log $(git tag --sort=-v:refname | head -1)..HEAD --oneline git log $(git tag --sort=-v:refname | head -1)..HEAD --oneline
``` ```
4. [ ] `./scripts/build-and-push.sh` — builds and pushes 4 production images 4. [ ] `./scripts/build-and-push.sh` — builds and pushes 5 production images
5. [ ] `./scripts/mirror-images.sh` — only if third-party versions changed 5. [ ] `./scripts/mirror-images.sh` — only if third-party versions changed
6. [ ] `./scripts/build-release.sh --tag vX.Y.Z --upload` — packages and uploads tarball 6. [ ] `./scripts/build-release.sh --tag vX.Y.Z --upload` — packages and uploads tarball
7. [ ] **Add release notes** (via Gitea web UI or API): 7. [ ] **Add release notes** (via Gitea web UI or API):

View File

@ -451,7 +451,7 @@ export default function CampaignsListPage() {
styles={{ body: { padding: 0, display: 'flex', flexDirection: 'column', height: '100%' } }} styles={{ body: { padding: 0, display: 'flex', flexDirection: 'column', height: '100%' } }}
> >
<Link to={`/campaign/${campaign.slug}`} style={{ display: 'block', flex: 1, padding: 20 }}> <Link to={`/campaign/${campaign.slug}`} style={{ display: 'block', flex: 1, padding: 20 }}>
{campaign.coverPhoto ? ( {campaign.coverPhoto && (
<div <div
style={{ style={{
height: 140, height: 140,
@ -459,31 +459,12 @@ export default function CampaignsListPage() {
backgroundImage: `url(${campaign.coverPhoto})`, backgroundImage: `url(${campaign.coverPhoto})`,
backgroundSize: 'cover', backgroundSize: 'cover',
backgroundPosition: 'center', backgroundPosition: 'center',
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}} }}
> />
<Title level={4} style={{ color: '#fff', margin: 0, textShadow: '0 2px 8px rgba(0,0,0,0.6)', textAlign: 'center', padding: '0 16px' }} ellipsis={{ rows: 2 }}>
{campaign.title}
</Title>
</div>
) : (
<div
style={{
height: 140,
margin: '-20px -20px 16px -20px',
background: `linear-gradient(135deg, ${token.colorPrimaryBg} 0%, ${colorBgContainer} 100%)`,
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
}}
>
<Title level={4} style={{ color: '#fff', margin: 0, textAlign: 'center', padding: '0 16px' }} ellipsis={{ rows: 2 }}>
{campaign.title}
</Title>
</div>
)} )}
<Title level={4} style={{ color: '#fff', margin: '0 0 12px', fontSize: isMobile ? 18 : 17, lineHeight: 1.35 }} ellipsis={{ rows: 2 }}>
{campaign.title}
</Title>
{campaign.description && ( {campaign.description && (
<Paragraph <Paragraph
style={{ color: 'rgba(255,255,255,0.55)', fontSize: isMobile ? 14 : 13, margin: '0 0 12px', lineHeight: 1.5 }} style={{ color: 'rgba(255,255,255,0.55)', fontSize: isMobile ? 14 : 13, margin: '0 0 12px', lineHeight: 1.5 }}