A clean post-merge deploy showed an unintended UX wart: hitting
http://<host>:<port>/ in a browser returned 404 'File not found'
because Core's static-disk handler serves /core/data and we never
put anything there. Functionally fine — the API and Swagger are
reachable on /api and /api/swagger — but a confusing first
impression for a brand-new operator.
Fix is deploy-side, not code-side: ship a small landing page +
the existing test/whep-player.html as default content for the data
volume.
Pieces:
deploy/truenas/core/static/
index.html — Dragon Fork-branded landing page; links
to Swagger and the WHEP player; live
/api status panel.
whep-player.html — same self-contained Pion subscriber that
lives at test/whep-player.html.
deploy/truenas/core/seed-data.sh
First-boot script. Copies /core/static/* into /core/data/
only when the destination filename doesn't already exist —
operator-supplied content is never clobbered, so this is a
safe addition that respects upstream's contract that
/core/data is operator-owned.
deploy/truenas/core/Dockerfile
COPYs the static dir and seed script into the runtime image,
wraps the entrypoint as 'seed-data.sh && exec run.sh' (run.sh
itself is unchanged from upstream).
Image size impact: ~15KB.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
69 lines
2.6 KiB
Docker
69 lines
2.6 KiB
Docker
# Dragon Fork datarhei Core image (M2 + WebRTC egress).
|
|
#
|
|
# Builds the real root Core binary — the one that replaces the M1 PoC
|
|
# in production. FFmpeg is baked in so restream processes can run the
|
|
# RTP output legs emitted by the WebRTC subsystem.
|
|
#
|
|
# Two-stage:
|
|
# 1. builder: compile a static Go binary (CGO off — no dynamic libs)
|
|
# 2. runtime: alpine with ffmpeg for the subprocess path
|
|
#
|
|
# Usage via compose:
|
|
# docker compose -f deploy/truenas/core/docker-compose.yml up -d --build
|
|
#
|
|
# The compose file drives configuration via CORE_* env vars — see
|
|
# README.md in this directory.
|
|
|
|
# ---- builder ----
|
|
# go.mod requires go 1.24; pinning the image keeps Docker's toolchain
|
|
# download off the hot path and makes the build reproducible.
|
|
FROM golang:1.24-alpine3.20 AS builder
|
|
|
|
WORKDIR /src
|
|
RUN apk add --no-cache git make
|
|
|
|
COPY . .
|
|
|
|
ENV CGO_ENABLED=0 GOOS=linux GOARCH=amd64
|
|
RUN make release && make import && make ffmigrate
|
|
|
|
# ---- runtime ----
|
|
# Alpine with ffmpeg (Core shells out to it for every restream process).
|
|
# Scratch isn't an option here because the process manager needs ffmpeg
|
|
# on PATH.
|
|
FROM alpine:3.20 AS runtime
|
|
|
|
RUN apk add --no-cache ffmpeg tini ca-certificates
|
|
|
|
# make release's `-o core` lands the binary inside the core/ Go
|
|
# package directory (Go cannot overwrite a directory with a file, so
|
|
# it places the output file _inside_ it). The `import` and `ffmigrate`
|
|
# Makefile targets cd into app/<name> and write the binary back up to
|
|
# the repo root with a relative path, so those end up at /src/import
|
|
# and /src/ffmigrate.
|
|
COPY --from=builder /src/core/core /core/bin/core
|
|
COPY --from=builder /src/import /core/bin/import
|
|
COPY --from=builder /src/ffmigrate /core/bin/ffmigrate
|
|
COPY --from=builder /src/mime.types /core/mime.types
|
|
COPY --from=builder /src/run.sh /core/bin/run.sh
|
|
|
|
# Dragon Fork landing page + browser WHEP player. Seeded into
|
|
# /core/data on first boot by /core/bin/seed-data.sh below; the seed
|
|
# is a no-op when the operator has already put content in /core/data.
|
|
COPY --from=builder /src/deploy/truenas/core/static/ /core/static/
|
|
COPY --from=builder /src/deploy/truenas/core/seed-data.sh /core/bin/seed-data.sh
|
|
|
|
RUN chmod +x /core/bin/seed-data.sh && mkdir -p /core/config /core/data
|
|
|
|
ENV CORE_CONFIGFILE=/core/config/config.json
|
|
ENV CORE_STORAGE_DISK_DIR=/core/data
|
|
ENV CORE_DB_DIR=/core/config
|
|
|
|
VOLUME ["/core/data", "/core/config"]
|
|
EXPOSE 8080/tcp
|
|
|
|
# Seed /core/data on first boot, then exec the upstream run.sh which
|
|
# handles imports, ffmpeg migrations, and the core binary. tini reaps
|
|
# child PIDs and forwards signals.
|
|
ENTRYPOINT ["/sbin/tini", "--", "/bin/sh", "-c", "/core/bin/seed-data.sh && exec /core/bin/run.sh"]
|
|
WORKDIR /core
|