From 664ca69fb3cff1226e3da903420f122ffba58740 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Przemek=20Wi=C4=99ch?= Date: Wed, 6 May 2026 00:18:03 +0200 Subject: [PATCH] Added examples and documentation for the published docker image --- README.md | 32 +++++++++++++++++++++++ docker/examples/photos/Dockerfile | 13 ++++++++++ docker/examples/photos/README.md | 18 +++++++++++++ docker/examples/photos/family.ged | 32 +++++++++++++++++++++++ docker/examples/photos/photos/I1.jpg | Bin 0 -> 20883 bytes docker/examples/photos/photos/I2.jpg | Bin 0 -> 19001 bytes docker/examples/simple/Dockerfile | 8 ++++++ docker/examples/simple/README.md | 15 +++++++++++ docker/examples/simple/family.ged | 37 +++++++++++++++++++++++++++ 9 files changed, 155 insertions(+) create mode 100644 docker/examples/photos/Dockerfile create mode 100644 docker/examples/photos/README.md create mode 100644 docker/examples/photos/family.ged create mode 100644 docker/examples/photos/photos/I1.jpg create mode 100644 docker/examples/photos/photos/I2.jpg create mode 100644 docker/examples/simple/Dockerfile create mode 100644 docker/examples/simple/README.md create mode 100644 docker/examples/simple/family.ged diff --git a/README.md b/README.md index 2ff4868..54bcf8a 100644 --- a/README.md +++ b/README.md @@ -158,6 +158,38 @@ This may be combined with the other build environment variables described above. The [topola-webpack](https://github.com/develancer/topola-webpack) tool can build a Topola Genealogy Viewer package bundled together with a GEDCOM file. +## Docker Container Deployment + +Topola Viewer can be run locally or deployed to standard cloud environments using Docker. + +### Running Topola Viewer +To pull and run Topola Viewer: +```bash +docker run -d -p 8080:8080 ghcr.io/pewu/topola-viewer:latest +``` +Open your web browser and go to `http://localhost:8080` to upload your family tree files locally. + +### Running with Your Own Data (Zero-Build Run) +You can serve a standalone, pre-loaded family tree with zero compilation by mounting your family tree data (a `.ged` file or a zipped `.gdz` archive containing photos) directly into the running container: +```bash +docker run -d -p 8080:8080 \ + -e STATIC_URL=my_family.gdz \ + -v ./my_family.gdz:/app/public/my_family.gdz \ + ghcr.io/pewu/topola-viewer:latest +``` + +### Building the Base Image Locally +To build the base image from source: +```bash +docker build -t topola-viewer -f docker/Dockerfile . +``` + +### Ready-To-Use Standalone Templates +For creating completely self-contained Docker images that bundle your genealogy data and serve it instantly, see these pre-configured examples: + +1. **[Simple Standalone Tree](docker/examples/simple/)**: Demonstrates how to package and pre-load a `.ged` file directly inside a custom image. +2. **[Standalone Tree with Photos](docker/examples/photos/)**: Packages your family tree and a `photos/` folder into a valid `.gdz` archive on-the-fly. + ## Additional options ### `handleCors` diff --git a/docker/examples/photos/Dockerfile b/docker/examples/photos/Dockerfile new file mode 100644 index 0000000..ad7f030 --- /dev/null +++ b/docker/examples/photos/Dockerfile @@ -0,0 +1,13 @@ +# Stage 1: Multi-stage helper to zip GEDCOM & photos together preserving directory structure +FROM alpine:latest AS zipper +RUN apk add --no-cache zip +WORKDIR /build +COPY family.ged ./ +COPY photos/ ./photos/ +# Zip contents relative to build root to preserve directories as referenced in GEDCOM +RUN zip -r family.gdz family.ged photos/ + +# Stage 2: Load the zip file into the official container +FROM ghcr.io/pewu/topola-viewer:latest +COPY --from=zipper /build/family.gdz /app/public/family.gdz +ENV STATIC_URL=family.gdz diff --git a/docker/examples/photos/README.md b/docker/examples/photos/README.md new file mode 100644 index 0000000..d27bb3d --- /dev/null +++ b/docker/examples/photos/README.md @@ -0,0 +1,18 @@ +# Standalone Zipped Family Tree Container with Photos + +This example leverages a multi-stage Docker build to automatically compress your `.ged` file and `photos/` folder into a secure `.gdz` archive on-the-fly, preserving your image directory path structures. + +## Structure +* Place your `family.ged` file here. +* Place your photos also in this directory, or inside a `photos/` folder in this directory. If you put the photos in the `photos/` directory, make sure your GEDCOM file contains file references containing the `photos/` prefix. See the sample [family.ged](family.ged). + +## Instructions + +1. Build your custom container: + ```bash + docker build -t my-photo-tree . + ``` +2. Run your container: + ```bash + docker run -d -p 8080:8080 my-photo-tree + ``` diff --git a/docker/examples/photos/family.ged b/docker/examples/photos/family.ged new file mode 100644 index 0000000..608902c --- /dev/null +++ b/docker/examples/photos/family.ged @@ -0,0 +1,32 @@ +0 HEAD +1 SOUR GENJ +2 VERS 1.0 +1 GEDC +2 VERS 5.5.1 +2 FORM Lineage-Linked +1 CHAR UTF-8 +0 @I1@ INDI +1 NAME John /Doe/ +1 SEX M +1 OBJE +2 FILE photos/I1.jpg +3 FORM JPG +3 TITL John Doe Photo +1 FAMS @F1@ +0 @I2@ INDI +1 NAME Jane /Smith/ +1 SEX F +1 OBJE +2 FILE photos/I2.jpg +3 FORM JPG +3 TITL Jane Smith Photo +1 FAMS @F1@ +0 @F1@ FAM +1 HUSB @I1@ +1 WIFE @I2@ +1 CHIL @I3@ +0 @I3@ INDI +1 NAME Bobby /Doe/ +1 SEX M +1 FAMC @F1@ +0 TRLR diff --git a/docker/examples/photos/photos/I1.jpg b/docker/examples/photos/photos/I1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e759458857789347f207190edbfda7f8d1187314 GIT binary patch literal 20883 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�i$c^zv-a8)$YBL*#<%JF*I8vHS!)q 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 literal 0 HcmV?d00001 diff --git a/docker/examples/photos/photos/I2.jpg b/docker/examples/photos/photos/I2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4abddd20833a0cad97fb0f04e42822d12d054766 GIT binary patch literal 19001 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 literal 0 HcmV?d00001 diff --git a/docker/examples/simple/Dockerfile b/docker/examples/simple/Dockerfile new file mode 100644 index 0000000..84da28f --- /dev/null +++ b/docker/examples/simple/Dockerfile @@ -0,0 +1,8 @@ +# Start from the official compiled container +FROM ghcr.io/pewu/topola-viewer:latest + +# Copy the unzipped GEDCOM file directly into public folder +COPY family.ged /app/public/family.ged + +# Configure server to pre-load this raw GEDCOM file +ENV STATIC_URL=family.ged diff --git a/docker/examples/simple/README.md b/docker/examples/simple/README.md new file mode 100644 index 0000000..6557164 --- /dev/null +++ b/docker/examples/simple/README.md @@ -0,0 +1,15 @@ +# Standalone GEDCOM Container Example + +This example builds a self-contained image that hosts a single `.ged` file directly (no photos). + +## Instructions + +1. Put your GEDCOM file in this directory and name it `family.ged`. +2. Build your custom container: + ```bash + docker build -t my-simple-tree . + ``` +3. Run your container: + ```bash + docker run -d -p 8080:8080 my-simple-tree + ``` diff --git a/docker/examples/simple/family.ged b/docker/examples/simple/family.ged new file mode 100644 index 0000000..0397e57 --- /dev/null +++ b/docker/examples/simple/family.ged @@ -0,0 +1,37 @@ +0 HEAD +1 SOUR GENJ +2 VERS 1.0 +1 GEDC +2 VERS 5.5.1 +2 FORM Lineage-Linked +1 CHAR UTF-8 +0 @I1@ INDI +1 NAME John /Doe/ +1 SEX M +1 FAMS @F1@ +1 FAMC @F2@ +0 @I2@ INDI +1 NAME Jane /Smith/ +1 SEX F +1 FAMS @F1@ +0 @F1@ FAM +1 HUSB @I1@ +1 WIFE @I2@ +1 CHIL @I3@ +1 CHIL @I4@ +0 @I3@ INDI +1 NAME Bobby /Doe/ +1 SEX M +1 FAMC @F1@ +0 @I4@ INDI +1 NAME Sally /Doe/ +1 SEX F +1 FAMC @F1@ +0 @I5@ INDI +1 NAME Grandpa /Doe/ +1 SEX M +1 FAMS @F2@ +0 @F2@ FAM +1 HUSB @I5@ +1 CHIL @I1@ +0 TRLR