From f9e3a979f76701c0d4c9120d0398627373f5fe28 Mon Sep 17 00:00:00 2001 From: Hannes Ahlin Date: Sat, 22 Aug 2026 14:59:25 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20Docker/n=C3=A4tverk=20mot=20faktisk=20ser?= =?UTF-8?q?ver:=20bridge=20172.17.0.2,=20Gitea,=20Alpine-m=C3=B6nster?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.example | 10 +++---- Dockerfile | 25 +++++++++------- README.md | 44 +++++++++++++++++---------- docker-compose.yml | 22 ++++++++++++-- docs/INFRASTRUCTURE.md | 58 +++++++++++++++++++++++++++++++++++ entrypoint.sh | 16 +++++----- flows/example-flows.json | 4 +-- install.sh | 60 +++++++++++++++++++++++++++---------- lib/bridge.js | 2 +- nodes/collabora-convert.js | 2 +- nodes/nc-collab-config.html | 7 +++-- nodes/nc-office.js | 2 +- 12 files changed, 188 insertions(+), 64 deletions(-) create mode 100644 docs/INFRASTRUCTURE.md diff --git a/.env.example b/.env.example index 11c88d1..69bc29c 100644 --- a/.env.example +++ b/.env.example @@ -1,9 +1,9 @@ -# Nextcloud Collabora Node-RED sidecar — miljövariabler -# Kopiera till .env och fyll i app-lösenord i Node-RED UI (nc-collab-config) +# Miljö för /home/ncadmin/nextcloud-collabora-nodered +# CODE-container "code" på Docker bridge 172.17.0.2 — INTE host.docker.internal på Linux NEXTCLOUD_URL=https://cloud.hannesahlin.se -COLLABORA_URL=http://host.docker.internal:9980 +COLLABORA_URL=http://172.17.0.2:9980 TZ=Europe/Stockholm +NODERED_CREDENTIAL_SECRET=byt-den-här-hemligheten-vid-produktion -# App-lösenord konfigureras i Node-RED (sparas krypterat i /data), -# inte här — undvik hemligheter i miljöfiler. +# App-lösenord konfigureras i Node-RED UI (nc-collab-config), inte här. diff --git a/Dockerfile b/Dockerfile index 7ef956e..59b8bc9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,16 +2,21 @@ FROM nodered/node-red:latest USER root -COPY package.json /opt/nextcloud-collabora-nodered/package.json -COPY lib /opt/nextcloud-collabora-nodered/lib -COPY nodes /opt/nextcloud-collabora-nodered/nodes +# Samma mönster som /home/ncadmin/nextcloud-node-red/Dockerfile +RUN apk add --no-cache \ + curl \ + bash + +RUN mkdir -p /opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora + +COPY package.json /opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora/ +COPY lib /opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora/lib +COPY nodes /opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora/nodes +RUN cd /opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora && npm install --omit=dev + COPY flows /opt/nextcloud-collabora-nodered/flows COPY settings.js.example /opt/nextcloud-collabora-nodered/settings.js.example -COPY entrypoint.sh /opt/nextcloud-collabora-nodered/entrypoint.sh +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh -RUN chmod +x /opt/nextcloud-collabora-nodered/entrypoint.sh && \ - cd /opt/nextcloud-collabora-nodered && npm install --omit=dev - -USER node-red - -ENTRYPOINT ["/opt/nextcloud-collabora-nodered/entrypoint.sh"] +ENTRYPOINT ["/entrypoint.sh"] diff --git a/README.md b/README.md index 7885592..e01acea 100644 --- a/README.md +++ b/README.md @@ -4,28 +4,40 @@ Node-RED sidecar (port **1881**) för Nextcloud Office + Collabora CODE — WebD **Version 1.0 — 22 augusti 2026** +## Miljö (cloud / 192.168.1.26) + +| Tjänst | Adress | +|--------|--------| +| Nextcloud | https://cloud.hannesahlin.se | +| CODE (intern) | http://172.17.0.2:9980 (container `code` på Docker `bridge`) | +| Sidecar Node-RED | http://192.168.1.26:1881 | +| Befintlig OCS Node-RED | http://192.168.1.26:1880 (orört) | +| Gitea | https://kode.hannesahlin.se | + +Detaljer: [docs/INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md) + ## Snabbstart (Ubuntu) ```bash -git clone /home/ncadmin/nextcloud-collabora-nodered +git clone https://kode.hannesahlin.se//nextcloud-collabora-nodered.git /home/ncadmin/nextcloud-collabora-nodered cd /home/ncadmin/nextcloud-collabora-nodered cp .env.example .env chmod +x install.sh ./install.sh ``` -Öppna http://192.168.1.26:1881 → konfigurera `nc-collab-config` med **app-lösenord** → kör acceptansflödet. +`install.sh` verifierar att CODE redan kör, ansluter sidecar till Docker `bridge`, och testar `/hosting/capabilities`. ## Överföring från Windows ```bash -# På Windows (Git Bash/WSL): ./package.sh - -# Kopiera till server: scp artifacts/nextcloud-collabora-nodered-1.0.0.tar.gz ncadmin@192.168.1.26:/home/ncadmin/ +``` -# På Ubuntu: +På servern: + +```bash mkdir -p ~/nextcloud-collabora-nodered tar -xzf ~/nextcloud-collabora-nodered-1.0.0.tar.gz -C ~/nextcloud-collabora-nodered cd ~/nextcloud-collabora-nodered && ./install.sh @@ -45,24 +57,26 @@ cd ~/nextcloud-collabora-nodered && ./install.sh ## Dokumentation -- [docs/NODES.md](docs/NODES.md) — nodreferens och exempel -- `artifacts/Nextcloud-Collabora-noder.docx` — genereras med `./scripts/build-manual.sh` (kräver pandoc) +- [docs/NODES.md](docs/NODES.md) +- [docs/INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md) — Docker/nätverk på servern ## Gränser -- Skriver till `/Dokument/OfficeOut/` som standard (original orört) -- Port 9980 exponeras **inte** — sidecar når CODE via `host.docker.internal` -- Befintlig `nextcloud-node-red:1880` lämnas orörd -- Odds-scraper ignoreras +- Skriver till `/Dokument/OfficeOut/` som standard +- Port 9980 exponeras **inte** utanför loopback på host +- Sidecar når CODE via Docker **`bridge`** (`172.17.0.2`), inte `host.docker.internal` +- `nextcloud-node-red:1880` och odds-scraper **orörda** -## Git +## Git push (Gitea) ```bash -git init # redan gjort vid leverans -git remote add origin +git remote add origin https://kode.hannesahlin.se//nextcloud-collabora-nodered.git +# eller SSH: git@kode.hannesahlin.se:/nextcloud-collabora-nodered.git (port 2222) git push -u origin main ``` +Skapa tomt repo i Gitea UI först om det behövs. + ## Licens MIT diff --git a/docker-compose.yml b/docker-compose.yml index 8942b1a..34461b6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,5 @@ +# Sidecar — port 1881. Rör INTE nextcloud-node-red (:1880) eller odds_network. +# CODE (container "code") ligger på Docker bridge: 172.17.0.2:9980 services: nextcloud-collabora-nodered: build: . @@ -10,12 +12,28 @@ services: PORT: "1881" TZ: ${TZ:-Europe/Stockholm} NEXTCLOUD_URL: ${NEXTCLOUD_URL:-https://cloud.hannesahlin.se} - COLLABORA_URL: ${COLLABORA_URL:-http://host.docker.internal:9980} + COLLABORA_URL: ${COLLABORA_URL:-http://172.17.0.2:9980} + NODERED_CREDENTIAL_SECRET: ${NODERED_CREDENTIAL_SECRET:-byt-den-här-hemligheten-vid-produktion} extra_hosts: - - "host.docker.internal:host-gateway" - "cloud.hannesahlin.se:192.168.1.26" volumes: - nodered_collab_data:/data + networks: + - collab_default + - docker_bridge + healthcheck: + test: ["CMD-SHELL", "curl -sf http://127.0.0.1:1881 >/dev/null || exit 1"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s + +networks: + collab_default: + driver: bridge + docker_bridge: + external: true + name: bridge volumes: nodered_collab_data: diff --git a/docs/INFRASTRUCTURE.md b/docs/INFRASTRUCTURE.md new file mode 100644 index 0000000..c9aec15 --- /dev/null +++ b/docs/INFRASTRUCTURE.md @@ -0,0 +1,58 @@ +# Infrastruktur — cloud.hannesahlin.se (192.168.1.26) + +Verifierad 2026-08-22. Sidecar ska passa in utan att röra befintliga tjänster. + +## Containers + +| Container | Image | Port | Nätverk | IP | +|-----------|-------|------|---------|-----| +| `code` | collabora/code:latest (26.04.3.1) | 127.0.0.1:9980 | `bridge` | 172.17.0.2 | +| `nextcloud-node-red` | nextcloud-node-red:latest | 0.0.0.0:1880 | `nextcloud-node-red_odds_network` | 172.18.0.3 | +| `nextcloud-collabora-nodered` | nextcloud-collabora-nodered:latest | 0.0.0.0:1881 | `collab_default` + **`bridge`** | (dynamisk) | +| `gitea_server` | gitea/gitea:latest | 127.0.0.1:3000 | (egen) | — | +| `odds-postgres` | postgres:16-alpine | 5433 | odds_network | — | + +## Viktigt om nätverk + +- **CODE** ligger på Docker **`bridge`** (172.17.0.0/16), inte på `odds_network`. +- **Sidecar** ansluter till **`bridge`** för att nå CODE på `http://172.17.0.2:9980`. +- `127.0.0.1:9980` på host når CODE, men **inte** från en container utan bridge/host-mode. +- `host.docker.internal` är opålitligt på Linux — använd **172.17.0.2**. +- **nextcloud-node-red** (:1880) ska **inte** flyttas till bridge; den stannar på odds_network. + +## Nextcloud + +- URL: https://cloud.hannesahlin.se +- Host: 192.168.1.26, `/var/www/nextcloud` +- Sidecar: `extra_hosts: cloud.hannesahlin.se:192.168.1.26`, `verifyTls: false` tills cert i container + +## CODE + +- `aliasgroup1=https://cloud.hannesahlin.se:443` +- Starta **ingen** ny CODE-container +- REST: `/cool/convert-to`, `/cool/extract-document-structure`, `/cool/transform-document-structure` +- WOPI discovery: `/hosting/discovery`, `/hosting/capabilities` + +## Git (Gitea) + +- https://kode.hannesahlin.se/ +- SSH: port 2222 på host +- Repo-förslag: `nextcloud-collabora-nodered` + +## Kataloger på host + +``` +/home/ncadmin/ +├── nextcloud-node-red/ # :1880 — orört +├── nextcloud-collabora-nodered/ # :1881 — detta paket +├── n3wkode/ # Gitea compose +├── odds-scraper/ # ignoreras +└── nodered-embed/ +``` + +## Collabora SDK (referens) + +- [Conversion API](https://sdk.collaboraonline.com/docs/conversion_api.html) +- [Extract/Transform API](https://sdk.collaboraonline.com/docs/extract_transform_api.html) +- [Linking API](https://sdk.collaboraonline.com/docs/linking_api.html) +- postMessage: webbläsare/iframe — **inte** Node-RED diff --git a/entrypoint.sh b/entrypoint.sh index b23e2e8..8c33e3c 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,18 +1,18 @@ #!/bin/sh set -e -PKG_SRC="/opt/nextcloud-collabora-nodered" -PKG_DEST="/data/node_modules/node-red-contrib-nextcloud-collabora" +PKG="/opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora" +AUX="/opt/nextcloud-collabora-nodered" -rm -rf "$PKG_DEST" -cp -a "$PKG_SRC" "$PKG_DEST" +mkdir -p /data/node_modules +cp -a "${PKG}" /data/node_modules/node-red-contrib-nextcloud-collabora -if [ ! -f /data/settings.js ] && [ -f "$PKG_SRC/settings.js.example" ]; then - cp "$PKG_SRC/settings.js.example" /data/settings.js +if [ ! -f /data/settings.js ] && [ -f "${AUX}/settings.js.example" ]; then + cp "${AUX}/settings.js.example" /data/settings.js fi -if [ -f "$PKG_SRC/flows/example-flows.json" ] && [ ! -f /data/flows.json ]; then - cp "$PKG_SRC/flows/example-flows.json" /data/flows.json +if [ -f "${AUX}/flows/example-flows.json" ] && [ ! -f /data/flows.json ]; then + cp "${AUX}/flows/example-flows.json" /data/flows.json fi exec npm --prefix /usr/src/node-red start -- --userDir /data --port "${PORT:-1881}" diff --git a/flows/example-flows.json b/flows/example-flows.json index d148fcc..8f16883 100644 --- a/flows/example-flows.json +++ b/flows/example-flows.json @@ -11,8 +11,8 @@ "type": "nc-collab-config", "name": "cloud.hannesahlin.se", "nextcloudUrl": "https://cloud.hannesahlin.se", - "collaboraUrl": "http://host.docker.internal:9980", - "collaboraPublicUrl": "", + "collaboraUrl": "http://172.17.0.2:9980", + "collaboraPublicUrl": "https://cloud.hannesahlin.se", "username": "FILL_IN_USER", "verifyTls": false }, diff --git a/install.sh b/install.sh index 0dedf22..e56bad6 100644 --- a/install.sh +++ b/install.sh @@ -1,12 +1,14 @@ #!/usr/bin/env bash # install.sh — nextcloud-collabora-nodered v1.0 -# Kör på Ubuntu/Nextcloud-servern efter överföring från Windows. +# Kör på cloud (192.168.1.26): /home/ncadmin/nextcloud-collabora-nodered set -euo pipefail VERSION="1.0.0" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" INSTALL_DIR="${INSTALL_DIR:-$SCRIPT_DIR}" COMPOSE="docker compose" +CODE_CONTAINER="${CODE_CONTAINER:-code}" +COLLABORA_IP="${COLLABORA_IP:-172.17.0.2}" log() { printf '[install] %s\n' "$*"; } die() { printf '[install] FEL: %s\n' "$*" >&2; exit 1; } @@ -24,7 +26,7 @@ if docker compose version >/dev/null 2>&1; then elif command -v docker-compose >/dev/null 2>&1; then COMPOSE="docker-compose" else - die "Docker Compose saknas (docker compose eller docker-compose)" + die "Docker Compose saknas" fi cd "${INSTALL_DIR}" @@ -38,19 +40,36 @@ if [ ! -f .env ]; then cp .env.example .env fi -# Valfri tarball-import (skickad från Windows) +# Valfri tarball från Windows if [ -n "${IMPORT_TARBALL:-}" ] && [ -f "${IMPORT_TARBALL}" ]; then log "Extraherar ${IMPORT_TARBALL}" tmpdir="$(mktemp -d)" tar -xzf "${IMPORT_TARBALL}" -C "${tmpdir}" src="$(find "${tmpdir}" -maxdepth 2 -name docker-compose.yml -printf '%h\n' | head -1)" - [ -n "${src}" ] || die "Ogiltig tarball — saknar docker-compose.yml" + [ -n "${src}" ] || die "Ogiltig tarball" rsync -a "${src}/" "${INSTALL_DIR}/" rm -rf "${tmpdir}" fi -log "Bygger och startar container (port 1881)..." -${COMPOSE} build --no-cache +# Verifiera att CODE redan kör (starta INTE ny) +if ! docker ps --format '{{.Names}}' | grep -qx "${CODE_CONTAINER}"; then + die "CODE-container '${CODE_CONTAINER}' körs inte. Starta inte ny CODE — fixa befintlig instans först." +fi + +code_ip="$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "${CODE_CONTAINER}" 2>/dev/null | head -1)" +if [ -n "${code_ip}" ] && [ "${code_ip}" != "${COLLABORA_IP}" ]; then + log "OBS: CODE IP är ${code_ip} (inte ${COLLABORA_IP}). Uppdatera COLLABORA_URL i .env om nödvändigt." + if grep -q '^COLLABORA_URL=' .env; then + sed -i "s|^COLLABORA_URL=.*|COLLABORA_URL=http://${code_ip}:9980|" .env + fi +fi + +log "Bygger och startar sidecar (port 1881, nätverk bridge + collab_default)..." +if [ "${FORCE_REBUILD:-0}" = "1" ]; then + ${COMPOSE} build --no-cache +else + ${COMPOSE} build +fi ${COMPOSE} up -d log "Väntar på Node-RED..." @@ -60,22 +79,31 @@ for i in $(seq 1 30); do break fi sleep 2 - if [ "$i" -eq 30 ]; then - log "Varning: Node-RED svarade inte inom 60 s — kontrollera: ${COMPOSE} logs -f" - fi + [ "$i" -eq 30 ] && log "Varning: Node-RED svarade inte inom 60 s" done -cat <<'EOF' +log "Testar CODE capabilities från sidecar..." +collab_url="$(grep '^COLLABORA_URL=' .env | cut -d= -f2- || echo "http://${COLLABORA_IP}:9980")" +if docker exec nextcloud-collabora-nodered curl -sf "${collab_url}/hosting/capabilities" >/dev/null 2>&1; then + log "OK: CODE nås på ${collab_url}" +else + log "VARNING: Kunde inte nå ${collab_url}/hosting/capabilities från sidecar." + log " Kontrollera: docker network inspect bridge | grep -A2 code" + log " Alternativ: docker network connect bridge nextcloud-collabora-nodered" +fi + +cat <:1881 -2. Lägg till nc-collab-config med app-lösenord (inte kontolösen) -3. Importera/kör exempelflödet (flows/example-flows.json) -4. Testa: capabilities → ncFileToPdf mot känd fil → /Dokument/OfficeOut/ +1. Öppna http://192.168.1.26:1881 +2. nc-collab-config: app-lösenord, collaboraUrl=${collab_url} +3. Kör acceptansflödet (capabilities → ncFileToPdf) -CODE ska redan köra på 127.0.0.1:9980 — starta inte ny CODE-container. -Befintlig nextcloud-node-red på :1880 lämnas orörd. +Git (Gitea): https://kode.hannesahlin.se/ + git remote add origin https://kode.hannesahlin.se//nextcloud-collabora-nodered.git + git push -u origin main +Orört: nextcloud-node-red :1880 (odds_network), odds-scraper, Gitea-databaslösen. EOF log "Klart." diff --git a/lib/bridge.js b/lib/bridge.js index 26d7df6..4b0e2a8 100644 --- a/lib/bridge.js +++ b/lib/bridge.js @@ -80,7 +80,7 @@ async function ncFileConvert(config, msg, format) { if (msg.compareNcPath) { const cmp = await webdavGet(config, msg.compareNcPath); extraFields.push({ - name: 'compare', + name: 'file', buffer: cmp.buffer, filename: cmp.filename }); diff --git a/nodes/collabora-convert.js b/nodes/collabora-convert.js index 0de467f..7e73d8d 100644 --- a/nodes/collabora-convert.js +++ b/nodes/collabora-convert.js @@ -30,7 +30,7 @@ module.exports = function (RED) { } if (msg.compareNcPath) { const cmp = await webdavGet(cfg, msg.compareNcPath); - extraFields.push({ name: 'compare', buffer: cmp.buffer, filename: cmp.filename }); + extraFields.push({ name: 'file', buffer: cmp.buffer, filename: cmp.filename }); } const result = await convertTo(cfg, { diff --git a/nodes/nc-collab-config.html b/nodes/nc-collab-config.html index a11956f..3437283 100644 --- a/nodes/nc-collab-config.html +++ b/nodes/nc-collab-config.html @@ -4,8 +4,8 @@ defaults: { name: { value: '' }, nextcloudUrl: { value: 'https://cloud.hannesahlin.se', required: true }, - collaboraUrl: { value: 'http://host.docker.internal:9980', required: true }, - collaboraPublicUrl: { value: '' }, + collaboraUrl: { value: 'http://172.17.0.2:9980', required: true }, + collaboraPublicUrl: { value: 'https://cloud.hannesahlin.se' }, username: { value: '', required: true }, verifyTls: { value: false } }, @@ -51,5 +51,6 @@ diff --git a/nodes/nc-office.js b/nodes/nc-office.js index c508910..3450410 100644 --- a/nodes/nc-office.js +++ b/nodes/nc-office.js @@ -84,7 +84,7 @@ module.exports = function (RED) { result = await ocsRequest(cfg, { method: 'POST', path: '/ocs/v2.php/apps/richdocuments/api/v1/document', - body: { fileid: fileId } + body: { fileid: Number(fileId) } }); msg.fileId = fileId; msg.editorUrl = result.data?.url || result.data;