Zum Inhalt

Docker-Deployment

Das Docker-Image enthält .NET, Node.js und mermaid-cli — eine konsistente, portable Laufzeitumgebung.


Image bauen

docker build -t confluencesynkmd .
docker build -t confluencesynkmd .
docker build -t confluencesynkmd .

Ausführen

# Upload: Zugangsdaten per Umgebungsvariablen injizieren
docker run --rm -it \
  -e CONFLUENCE__BASEURL \
  -e CONFLUENCE__AUTHMODE \
  -e CONFLUENCE__USEREMAIL \
  -e CONFLUENCE__APITOKEN \
  -v $(pwd)/docs:/workspace/docs:ro \
  confluencesynkmd \
  upload \
  --path /workspace/docs \
  --conf-space IHR_SPACE_KEY \
  --conf-parent-id IHRE_PAGE_ID

# Download: separater schreibbarer Output-Mount
docker run --rm -it \
  -e CONFLUENCE__BASEURL \
  -e CONFLUENCE__AUTHMODE \
  -e CONFLUENCE__USEREMAIL \
  -e CONFLUENCE__APITOKEN \
  -v $(pwd)/output:/workspace/output \
  confluencesynkmd \
  download \
  --path /workspace/output \
  --conf-space IHR_SPACE_KEY \
  --conf-parent-id IHRE_PAGE_ID

# Upload (CI/CD empfohlen): Secrets als Runner-Umgebungsvariablen injizieren
docker run --rm -it \
  -e CONFLUENCE__BASEURL \
  -e CONFLUENCE__AUTHMODE \
  -e CONFLUENCE__USEREMAIL \
  -e CONFLUENCE__APITOKEN \
  -v $(pwd)/docs:/workspace/docs:ro \
  confluencesynkmd \
  upload \
  --path /workspace/docs \
  --conf-space IHR_SPACE_KEY \
  --conf-parent-id IHRE_PAGE_ID

# Download (CI/CD empfohlen): schreibbarer Output-Mount
docker run --rm -it \
  -e CONFLUENCE__BASEURL \
  -e CONFLUENCE__AUTHMODE \
  -e CONFLUENCE__USEREMAIL \
  -e CONFLUENCE__APITOKEN \
  -v $(pwd)/output:/workspace/output \
  confluencesynkmd \
  download \
  --path /workspace/output \
  --conf-space IHR_SPACE_KEY \
  --conf-parent-id IHRE_PAGE_ID
# Upload: Zugangsdaten per Umgebungsvariablen injizieren
docker run --rm -it `
  -e CONFLUENCE__BASEURL `
  -e CONFLUENCE__AUTHMODE `
  -e CONFLUENCE__USEREMAIL `
  -e CONFLUENCE__APITOKEN `
  -v ${PWD}/docs:/workspace/docs:ro `
  confluencesynkmd `
  upload `
  --path /workspace/docs `
  --conf-space IHR_SPACE_KEY `
  --conf-parent-id IHRE_PAGE_ID

# Download: separater schreibbarer Output-Mount
docker run --rm -it `
  -e CONFLUENCE__BASEURL `
  -e CONFLUENCE__AUTHMODE `
  -e CONFLUENCE__USEREMAIL `
  -e CONFLUENCE__APITOKEN `
  -v ${PWD}/output:/workspace/output `
  confluencesynkmd `
  download `
  --path /workspace/output `
  --conf-space IHR_SPACE_KEY `
  --conf-parent-id IHRE_PAGE_ID

# Upload (CI/CD empfohlen): Secrets als Runner-Umgebungsvariablen injizieren
docker run --rm -it `
  -e CONFLUENCE__BASEURL `
  -e CONFLUENCE__AUTHMODE `
  -e CONFLUENCE__USEREMAIL `
  -e CONFLUENCE__APITOKEN `
  -v ${PWD}/docs:/workspace/docs:ro `
  confluencesynkmd `
  upload `
  --path /workspace/docs `
  --conf-space IHR_SPACE_KEY `
  --conf-parent-id IHRE_PAGE_ID

# Download (CI/CD empfohlen): schreibbarer Output-Mount
docker run --rm -it `
  -e CONFLUENCE__BASEURL `
  -e CONFLUENCE__AUTHMODE `
  -e CONFLUENCE__USEREMAIL `
  -e CONFLUENCE__APITOKEN `
  -v ${PWD}/output:/workspace/output `
  confluencesynkmd `
  download `
  --path /workspace/output `
  --conf-space IHR_SPACE_KEY `
  --conf-parent-id IHRE_PAGE_ID
REM Upload: Zugangsdaten per Umgebungsvariablen
docker run --rm -it ^
  -e CONFLUENCE__BASEURL ^
  -e CONFLUENCE__AUTHMODE ^
  -e CONFLUENCE__USEREMAIL ^
  -e CONFLUENCE__APITOKEN ^
  -v %cd%/docs:/workspace/docs:ro ^
  confluencesynkmd ^
  upload ^
  --path /workspace/docs ^
  --conf-space IHR_SPACE_KEY ^
  --conf-parent-id IHRE_PAGE_ID

REM Download: separater schreibbarer Output-Mount
docker run --rm -it ^
  -e CONFLUENCE__BASEURL ^
  -e CONFLUENCE__AUTHMODE ^
  -e CONFLUENCE__USEREMAIL ^
  -e CONFLUENCE__APITOKEN ^
  -v %cd%/output:/workspace/output ^
  confluencesynkmd ^
  download ^
  --path /workspace/output ^
  --conf-space IHR_SPACE_KEY ^
  --conf-parent-id IHRE_PAGE_ID

REM Upload (CI/CD empfohlen): Secrets als Runner-Umgebungsvariablen injizieren
docker run --rm -it ^
  -e CONFLUENCE__BASEURL ^
  -e CONFLUENCE__AUTHMODE ^
  -e CONFLUENCE__USEREMAIL ^
  -e CONFLUENCE__APITOKEN ^
  -v %cd%/docs:/workspace/docs:ro ^
  confluencesynkmd ^
  upload ^
  --path /workspace/docs ^
  --conf-space IHR_SPACE_KEY ^
  --conf-parent-id IHRE_PAGE_ID

REM Download (CI/CD empfohlen): schreibbarer Output-Mount
docker run --rm -it ^
  -e CONFLUENCE__BASEURL ^
  -e CONFLUENCE__AUTHMODE ^
  -e CONFLUENCE__USEREMAIL ^
  -e CONFLUENCE__APITOKEN ^
  -v %cd%/output:/workspace/output ^
  confluencesynkmd ^
  download ^
  --path /workspace/output ^
  --conf-space IHR_SPACE_KEY ^
  --conf-parent-id IHRE_PAGE_ID

Arbeitsverzeichnis

Wenn Sie ${PWD} / $(pwd) mounten, muss der Befehl im gewünschten Projektverzeichnis ausgeführt werden. Bevorzugen Sie gezielte Mounts nur für benötigte Pfade.


Mount-Strategien & Arbeitsverzeichnis

Mount Anwendungsfall
-v $(pwd)/docs:/workspace/docs:ro Empfohlen für Upload: Docs-only mit Minimalrechten
-v $(pwd)/docs:/workspace/docs:ro + zusätzliche Mounts (z. B. -v $(pwd)/img:/workspace/img:ro) Wenn Markdown auf Assets außerhalb von docs verweist
-v $(pwd):/workspace Vollständiger Workspace-Mount (Fallback), nur bei vielen pfadübergreifenden Referenzen

Pfade mit Leerzeichen

Mount-Pfade mit Leerzeichen müssen korrekt quotiert werden, z. B. PowerShell: -v "${PWD}/my docs:/workspace/docs:ro".

Validierung

Die PowerShell-Mount-Syntax mit Pfaden inklusive Leerzeichen wurde gegen das Docker-Image geprüft. Bash-Syntax im Ziel-CI-Runner separat validieren.

Sicherheit

Für CI/CD bevorzugt Secrets des CI-Systems (GitHub/GitLab geschützte Variablen) zur Laufzeit injizieren.


Minimale CI-Snippets

name: Confluence Sync

on:
  workflow_dispatch:

jobs:
  upload:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Docker Image bauen
        run: docker build -t confluencesynkmd .

      - name: Upload ausführen
        env:
          CONFLUENCE__BASEURL: ${{ secrets.CONFLUENCE__BASEURL }}
          CONFLUENCE__AUTHMODE: Basic
          CONFLUENCE__USEREMAIL: ${{ secrets.CONFLUENCE__USEREMAIL }}
          CONFLUENCE__APITOKEN: ${{ secrets.CONFLUENCE__APITOKEN }}
        run: |
          docker run --rm \
            -e CONFLUENCE__BASEURL \
            -e CONFLUENCE__AUTHMODE \
            -e CONFLUENCE__USEREMAIL \
            -e CONFLUENCE__APITOKEN \
            -v "$PWD/docs:/workspace/docs:ro" \
            confluencesynkmd \
            upload \
            --path /workspace/docs \
            --conf-space "${{ vars.CONFLUENCE_SPACE }}" \
            --conf-parent-id "${{ vars.CONFLUENCE_PARENT_ID }}"
stages: [upload]

confluence_upload:
  stage: upload
  image: docker:27
  services:
    - docker:27-dind
  variables:
    DOCKER_HOST: tcp://docker:2375
    DOCKER_TLS_CERTDIR: ""
  script:
    - docker build -t confluencesynkmd .
    - |
      docker run --rm \
        -e CONFLUENCE__BASEURL \
        -e CONFLUENCE__AUTHMODE \
        -e CONFLUENCE__USEREMAIL \
        -e CONFLUENCE__APITOKEN \
        -v "$CI_PROJECT_DIR/docs:/workspace/docs:ro" \
        confluencesynkmd \
        upload \
        --path /workspace/docs \
        --conf-space "$CONFLUENCE_SPACE" \
        --conf-parent-id "$CONFLUENCE_PARENT_ID"
  variables:
    CONFLUENCE__AUTHMODE: "Basic"
  # Als masked/protected CI variables setzen:
  # CONFLUENCE__BASEURL, CONFLUENCE__USEREMAIL, CONFLUENCE__APITOKEN,
  # CONFLUENCE_SPACE, CONFLUENCE_PARENT_ID

Inhalt des Standard-Images

Das veröffentlichte ghcr.io/opendocsync/confluencesynkmd:0.1 Image enthält alle vom Projekt versprochenen Renderer vorinstalliert:

Renderer Engine
Mermaid @mermaid-js/mermaid-cli + Chromium (Puppeteer)
Draw.io drawio-desktop (Electron, headless via Xvfb-once aus entrypoint.sh)
PlantUML default-jre-headless + das plantuml Paket
LaTeX TeX Live (texlive-latex-base + texlive-latex-extra + fonts-recommended) + Ghostscript direkt (ohne ImageMagick)

Zur Verifikation der Renderer-Gesundheit: docker run --rm ghcr.io/opendocsync/confluencesynkmd:0.1 doctor --renderers-only

Forward-Only-Fix-Politik

Falls ein veröffentlichtes :0.1.x Release einen kritischen Bug enthält, liefert das Projekt einen :0.1.x+1 Patch und aktualisiert den fortlaufenden :0.1 Tag. Digest-Pulls (docker pull ghcr.io/opendocsync/confluencesynkmd@sha256:...) werden niemals gelöscht — Nutzer, die per Digest pinnen, haben einen Grund dafür.

Nur für sicherheitskritische Vorfälle (geleakte Credentials, aktiv schädliche Regression) löscht der release-yank.yml Workflow einen Tag (nicht einen Digest) aus GHCR. Entscheidungskriterien sind in der Workflow-Datei dokumentiert.