Fix Docker/nätverk mot faktisk server: bridge 172.17.0.2, Gitea, Alpine-mönster

This commit is contained in:
dev
2026-08-22 14:59:25 +02:00
parent 20a8bec404
commit 55d068cb12
12 changed files with 188 additions and 64 deletions
+5 -5
View File
@@ -1,9 +1,9 @@
# Nextcloud Collabora Node-RED sidecar — miljövariabler # Miljö för /home/ncdeploy/nextcloud-collabora-nodered
# Kopiera till .env och fyll i app-lösenord i Node-RED UI (nc-collab-config) # CODE-container "code" på Docker bridge 172.17.0.2 — INTE host.docker.internal på Linux
NEXTCLOUD_URL=https://cloud.domain.name NEXTCLOUD_URL=https://cloud.domain.name
COLLABORA_URL=http://host.docker.internal:9980 COLLABORA_URL=http://172.17.0.2:9980
TZ=Europe/Stockholm TZ=Europe/Stockholm
NODERED_CREDENTIAL_SECRET=byt-den-här-hemligheten-vid-produktion
# App-lösenord konfigureras i Node-RED (sparas krypterat i /data), # App-lösenord konfigureras i Node-RED UI (nc-collab-config), inte här.
# inte här — undvik hemligheter i miljöfiler.
+15 -10
View File
@@ -2,16 +2,21 @@ FROM nodered/node-red:latest
USER root USER root
COPY package.json /opt/nextcloud-collabora-nodered/package.json # Samma mönster som /home/ncdeploy/nextcloud-node-red/Dockerfile
COPY lib /opt/nextcloud-collabora-nodered/lib RUN apk add --no-cache \
COPY nodes /opt/nextcloud-collabora-nodered/nodes 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 flows /opt/nextcloud-collabora-nodered/flows
COPY settings.js.example /opt/nextcloud-collabora-nodered/settings.js.example 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 && \ ENTRYPOINT ["/entrypoint.sh"]
cd /opt/nextcloud-collabora-nodered && npm install --omit=dev
USER node-red
ENTRYPOINT ["/opt/nextcloud-collabora-nodered/entrypoint.sh"]
+29 -15
View File
@@ -4,28 +4,40 @@ Node-RED sidecar (port **1881**) för Nextcloud Office + Collabora CODE — WebD
**Version 1.0 — 22 augusti 2026** **Version 1.0 — 22 augusti 2026**
## Miljö (cloud / 192.168.1.10)
| Tjänst | Adress |
|--------|--------|
| Nextcloud | https://cloud.domain.name |
| CODE (intern) | http://172.17.0.2:9980 (container `code` på Docker `bridge`) |
| Sidecar Node-RED | http://192.168.1.10:1881 |
| Befintlig OCS Node-RED | http://192.168.1.10:1880 (orört) |
| Gitea | https://git.domain.name |
Detaljer: [docs/INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md)
## Snabbstart (Ubuntu) ## Snabbstart (Ubuntu)
```bash ```bash
git clone <din-remote> /home/ncdeploy/nextcloud-collabora-nodered git clone https://git.domain.name/<user>/nextcloud-collabora-nodered.git /home/ncdeploy/nextcloud-collabora-nodered
cd /home/ncdeploy/nextcloud-collabora-nodered cd /home/ncdeploy/nextcloud-collabora-nodered
cp .env.example .env cp .env.example .env
chmod +x install.sh chmod +x install.sh
./install.sh ./install.sh
``` ```
Öppna http://192.168.1.10: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 ## Överföring från Windows
```bash ```bash
# På Windows (Git Bash/WSL):
./package.sh ./package.sh
# Kopiera till server:
scp artifacts/nextcloud-collabora-nodered-1.0.0.tar.gz ncdeploy@192.168.1.10:/home/ncdeploy/ scp artifacts/nextcloud-collabora-nodered-1.0.0.tar.gz ncdeploy@192.168.1.10:/home/ncdeploy/
```
# På Ubuntu: På servern:
```bash
mkdir -p ~/nextcloud-collabora-nodered mkdir -p ~/nextcloud-collabora-nodered
tar -xzf ~/nextcloud-collabora-nodered-1.0.0.tar.gz -C ~/nextcloud-collabora-nodered tar -xzf ~/nextcloud-collabora-nodered-1.0.0.tar.gz -C ~/nextcloud-collabora-nodered
cd ~/nextcloud-collabora-nodered && ./install.sh cd ~/nextcloud-collabora-nodered && ./install.sh
@@ -45,24 +57,26 @@ cd ~/nextcloud-collabora-nodered && ./install.sh
## Dokumentation ## Dokumentation
- [docs/NODES.md](docs/NODES.md) — nodreferens och exempel - [docs/NODES.md](docs/NODES.md)
- `artifacts/Nextcloud-Collabora-noder.docx` — genereras med `./scripts/build-manual.sh` (kräver pandoc) - [docs/INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md) — Docker/nätverk på servern
## Gränser ## Gränser
- Skriver till `/Dokument/OfficeOut/` som standard (original orört) - Skriver till `/Dokument/OfficeOut/` som standard
- Port 9980 exponeras **inte** — sidecar når CODE via `host.docker.internal` - Port 9980 exponeras **inte** utanför loopback på host
- Befintlig `nextcloud-node-red:1880` lämnas orörd - Sidecar når CODE via Docker **`bridge`** (`172.17.0.2`), inte `host.docker.internal`
- Odds-scraper ignoreras - `nextcloud-node-red:1880` och odds-scraper **orörda**
## Git ## Git push (Gitea)
```bash ```bash
git init # redan gjort vid leverans git remote add origin https://git.domain.name/<user>/nextcloud-collabora-nodered.git
git remote add origin <din-git-url> # eller SSH: git@git.domain.name:<user>/nextcloud-collabora-nodered.git (port 2222)
git push -u origin main git push -u origin main
``` ```
Skapa tomt repo i Gitea UI först om det behövs.
## Licens ## Licens
MIT MIT
+20 -2
View File
@@ -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: services:
nextcloud-collabora-nodered: nextcloud-collabora-nodered:
build: . build: .
@@ -10,12 +12,28 @@ services:
PORT: "1881" PORT: "1881"
TZ: ${TZ:-Europe/Stockholm} TZ: ${TZ:-Europe/Stockholm}
NEXTCLOUD_URL: ${NEXTCLOUD_URL:-https://cloud.domain.name} NEXTCLOUD_URL: ${NEXTCLOUD_URL:-https://cloud.domain.name}
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: extra_hosts:
- "host.docker.internal:host-gateway"
- "cloud.domain.name:192.168.1.10" - "cloud.domain.name:192.168.1.10"
volumes: volumes:
- nodered_collab_data:/data - 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: volumes:
nodered_collab_data: nodered_collab_data:
+58
View File
@@ -0,0 +1,58 @@
# Infrastruktur — cloud.domain.name (192.168.1.10)
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.domain.name
- Host: 192.168.1.10, `/var/www/nextcloud`
- Sidecar: `extra_hosts: cloud.domain.name:192.168.1.10`, `verifyTls: false` tills cert i container
## CODE
- `aliasgroup1=https://cloud.domain.name: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://git.domain.name/
- SSH: port 2222 på host
- Repo-förslag: `nextcloud-collabora-nodered`
## Kataloger på host
```
/home/ncdeploy/
├── nextcloud-node-red/ # :1880 — orört
├── nextcloud-collabora-nodered/ # :1881 — detta paket
├── your-userode/ # 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
+8 -8
View File
@@ -1,18 +1,18 @@
#!/bin/sh #!/bin/sh
set -e set -e
PKG_SRC="/opt/nextcloud-collabora-nodered" PKG="/opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora"
PKG_DEST="/data/node_modules/node-red-contrib-nextcloud-collabora" AUX="/opt/nextcloud-collabora-nodered"
rm -rf "$PKG_DEST" mkdir -p /data/node_modules
cp -a "$PKG_SRC" "$PKG_DEST" cp -a "${PKG}" /data/node_modules/node-red-contrib-nextcloud-collabora
if [ ! -f /data/settings.js ] && [ -f "$PKG_SRC/settings.js.example" ]; then if [ ! -f /data/settings.js ] && [ -f "${AUX}/settings.js.example" ]; then
cp "$PKG_SRC/settings.js.example" /data/settings.js cp "${AUX}/settings.js.example" /data/settings.js
fi fi
if [ -f "$PKG_SRC/flows/example-flows.json" ] && [ ! -f /data/flows.json ]; then if [ -f "${AUX}/flows/example-flows.json" ] && [ ! -f /data/flows.json ]; then
cp "$PKG_SRC/flows/example-flows.json" /data/flows.json cp "${AUX}/flows/example-flows.json" /data/flows.json
fi fi
exec npm --prefix /usr/src/node-red start -- --userDir /data --port "${PORT:-1881}" exec npm --prefix /usr/src/node-red start -- --userDir /data --port "${PORT:-1881}"
+2 -2
View File
@@ -11,8 +11,8 @@
"type": "nc-collab-config", "type": "nc-collab-config",
"name": "cloud.domain.name", "name": "cloud.domain.name",
"nextcloudUrl": "https://cloud.domain.name", "nextcloudUrl": "https://cloud.domain.name",
"collaboraUrl": "http://host.docker.internal:9980", "collaboraUrl": "http://172.17.0.2:9980",
"collaboraPublicUrl": "", "collaboraPublicUrl": "https://cloud.domain.name",
"username": "FILL_IN_USER", "username": "FILL_IN_USER",
"verifyTls": false "verifyTls": false
}, },
+43 -15
View File
@@ -1,12 +1,14 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# install.sh — nextcloud-collabora-nodered v1.0 # 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.10): /home/ncdeploy/nextcloud-collabora-nodered
set -euo pipefail set -euo pipefail
VERSION="1.0.0" VERSION="1.0.0"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
INSTALL_DIR="${INSTALL_DIR:-$SCRIPT_DIR}" INSTALL_DIR="${INSTALL_DIR:-$SCRIPT_DIR}"
COMPOSE="docker compose" COMPOSE="docker compose"
CODE_CONTAINER="${CODE_CONTAINER:-code}"
COLLABORA_IP="${COLLABORA_IP:-172.17.0.2}"
log() { printf '[install] %s\n' "$*"; } log() { printf '[install] %s\n' "$*"; }
die() { printf '[install] FEL: %s\n' "$*" >&2; exit 1; } 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 elif command -v docker-compose >/dev/null 2>&1; then
COMPOSE="docker-compose" COMPOSE="docker-compose"
else else
die "Docker Compose saknas (docker compose eller docker-compose)" die "Docker Compose saknas"
fi fi
cd "${INSTALL_DIR}" cd "${INSTALL_DIR}"
@@ -38,19 +40,36 @@ if [ ! -f .env ]; then
cp .env.example .env cp .env.example .env
fi fi
# Valfri tarball-import (skickad från Windows) # Valfri tarball från Windows
if [ -n "${IMPORT_TARBALL:-}" ] && [ -f "${IMPORT_TARBALL}" ]; then if [ -n "${IMPORT_TARBALL:-}" ] && [ -f "${IMPORT_TARBALL}" ]; then
log "Extraherar ${IMPORT_TARBALL}" log "Extraherar ${IMPORT_TARBALL}"
tmpdir="$(mktemp -d)" tmpdir="$(mktemp -d)"
tar -xzf "${IMPORT_TARBALL}" -C "${tmpdir}" tar -xzf "${IMPORT_TARBALL}" -C "${tmpdir}"
src="$(find "${tmpdir}" -maxdepth 2 -name docker-compose.yml -printf '%h\n' | head -1)" 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}/" rsync -a "${src}/" "${INSTALL_DIR}/"
rm -rf "${tmpdir}" rm -rf "${tmpdir}"
fi fi
log "Bygger och startar container (port 1881)..." # 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 ${COMPOSE} build --no-cache
else
${COMPOSE} build
fi
${COMPOSE} up -d ${COMPOSE} up -d
log "Väntar på Node-RED..." log "Väntar på Node-RED..."
@@ -60,22 +79,31 @@ for i in $(seq 1 30); do
break break
fi fi
sleep 2 sleep 2
if [ "$i" -eq 30 ]; then [ "$i" -eq 30 ] && log "Varning: Node-RED svarade inte inom 60 s"
log "Varning: Node-RED svarade inte inom 60 s — kontrollera: ${COMPOSE} logs -f"
fi
done 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 <<EOF
Nästa steg: Nästa steg:
1. Öppna http://<server-ip>:1881 1. Öppna http://192.168.1.10:1881
2. Lägg till nc-collab-config med app-lösenord (inte kontolösen) 2. nc-collab-config: app-lösenord, collaboraUrl=${collab_url}
3. Importera/kör exempelflödet (flows/example-flows.json) 3. Kör acceptansflödet (capabilities → ncFileToPdf)
4. Testa: capabilities → ncFileToPdf mot känd fil → /Dokument/OfficeOut/
CODE ska redan köra på 127.0.0.1:9980 — starta inte ny CODE-container. Git (Gitea): https://git.domain.name/
Befintlig nextcloud-node-red på :1880 lämnas orörd. git remote add origin https://git.domain.name/<user>/nextcloud-collabora-nodered.git
git push -u origin main
Orört: nextcloud-node-red :1880 (odds_network), odds-scraper, Gitea-databaslösen.
EOF EOF
log "Klart." log "Klart."
+1 -1
View File
@@ -80,7 +80,7 @@ async function ncFileConvert(config, msg, format) {
if (msg.compareNcPath) { if (msg.compareNcPath) {
const cmp = await webdavGet(config, msg.compareNcPath); const cmp = await webdavGet(config, msg.compareNcPath);
extraFields.push({ extraFields.push({
name: 'compare', name: 'file',
buffer: cmp.buffer, buffer: cmp.buffer,
filename: cmp.filename filename: cmp.filename
}); });
+1 -1
View File
@@ -30,7 +30,7 @@ module.exports = function (RED) {
} }
if (msg.compareNcPath) { if (msg.compareNcPath) {
const cmp = await webdavGet(cfg, 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, { const result = await convertTo(cfg, {
+4 -3
View File
@@ -4,8 +4,8 @@
defaults: { defaults: {
name: { value: '' }, name: { value: '' },
nextcloudUrl: { value: 'https://cloud.domain.name', required: true }, nextcloudUrl: { value: 'https://cloud.domain.name', required: true },
collaboraUrl: { value: 'http://host.docker.internal:9980', required: true }, collaboraUrl: { value: 'http://172.17.0.2:9980', required: true },
collaboraPublicUrl: { value: '' }, collaboraPublicUrl: { value: 'https://cloud.domain.name' },
username: { value: '', required: true }, username: { value: '', required: true },
verifyTls: { value: false } verifyTls: { value: false }
}, },
@@ -51,5 +51,6 @@
<script type="text/html" data-help-name="nc-collab-config"> <script type="text/html" data-help-name="nc-collab-config">
<p>En instans per miljö. Använd <strong>app-lösenord</strong>, aldrig vanligt kontolösen.</p> <p>En instans per miljö. Använd <strong>app-lösenord</strong>, aldrig vanligt kontolösen.</p>
<p>Fält: <code>nextcloudUrl</code>, <code>collaboraUrl</code>, <code>username</code>, app-lösen, <code>verifyTls</code>.</p> <p><code>collaboraUrl</code>: <code>http://172.17.0.2:9980</code> (CODE på Docker bridge). Host-loopback 127.0.0.1:9980 når sidecar inte.</p>
<p><code>collaboraPublicUrl</code>: publik WOPI-värd, t.ex. <code>https://cloud.domain.name</code>.</p>
</script> </script>
+1 -1
View File
@@ -84,7 +84,7 @@ module.exports = function (RED) {
result = await ocsRequest(cfg, { result = await ocsRequest(cfg, {
method: 'POST', method: 'POST',
path: '/ocs/v2.php/apps/richdocuments/api/v1/document', path: '/ocs/v2.php/apps/richdocuments/api/v1/document',
body: { fileid: fileId } body: { fileid: Number(fileId) }
}); });
msg.fileId = fileId; msg.fileId = fileId;
msg.editorUrl = result.data?.url || result.data; msg.editorUrl = result.data?.url || result.data;