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

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Hannes Ahlin
2026-08-22 14:59:25 +02:00
parent d2f70ee2a7
commit b36331b00b
13 changed files with 192 additions and 66 deletions
+5 -5
View File
@@ -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.
+15 -10
View File
@@ -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"]
+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**
## 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 <din-remote> /home/ncadmin/nextcloud-collabora-nodered
git clone https://kode.hannesahlin.se/<user>/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/AGENT-MANUAL.md](docs/AGENT-MANUAL.md) — full assistentmanual för flödesagenter
- `artifacts/Assistentmanual-Nextcloud-Collabora-noder.docx` — genereras med `./scripts/build-manual.sh` (kräver pandoc)
- [docs/AGENT-MANUAL.md](docs/AGENT-MANUAL.md) — assistentmanual
- [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 <din-git-url>
git remote add origin https://kode.hannesahlin.se/<user>/nextcloud-collabora-nodered.git
# eller SSH: git@kode.hannesahlin.se:<user>/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
+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:
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:
+4 -2
View File
@@ -27,9 +27,11 @@ Du är en **flödesagent**. Du skapar och modifierar Node-RED-flöden, inte Libr
| CODE | container `code`, `127.0.0.1:9980`, aliasgroup `https://cloud.hannesahlin.se:443` |
| Befintlig Node-RED | `nextcloud-node-red` `:1880` (OCS-noder) |
| Ny sidecar | `nextcloud-collabora-nodered` `:1881` |
| Intern CODE-URL från sidecar | `http://host.docker.internal:9980` |
| Intern CODE-URL från sidecar | `http://172.17.0.2:9980` (Docker bridge, container `code`) |
| Auth | Basic + Nextcloud app-lösenord, header `OCS-APIRequest: true` |
Se [INFRASTRUCTURE.md](INFRASTRUCTURE.md) för container- och nätverkskartor.
---
## 3. Kartan Nextcloud → Collabora
@@ -139,7 +141,7 @@ HTML i `payload` → `htmlToOffice` format docx eller pdf. Använd mall via conv
| Symptom | Orsak | Åtgärd |
|---------|-------|--------|
| ECONNREFUSED :9980 | Fel Docker-nät | host.docker.internal, 172.17.0.2 eller network_mode host |
| ECONNREFUSED :9980 | Sidecar inte på bridge / fel IP | Använd `http://172.17.0.2:9980`, kontrollera `docker network inspect bridge` |
| Tomt convert-svar | CODE storage / fel URL | Anropa intern 9980, inte publik host |
| WebDAV 401 | App-lösen / user | Nytt app-lösen, samma uid som sökvägen |
| WebDAV 404 | Fel sökväg | Leading slash, rätt folder, URL-encode segment |
+58
View File
@@ -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
+8 -8
View File
@@ -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}"
+2 -2
View File
@@ -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
},
+44 -16
View File
@@ -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 <<EOF
Nästa steg:
1. Öppna http://<server-ip>: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/<user>/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."
+1 -1
View File
@@ -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
});
+1 -1
View File
@@ -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, {
+4 -3
View File
@@ -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 @@
<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>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.hannesahlin.se</code>.</p>
</script>
+1 -1
View File
@@ -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;