Translate user-facing docs and node help to English
README, NODES.md, install scripts, palette help text, and example flows — node .js logic unchanged.
This commit is contained in:
+7
-7
@@ -1,23 +1,23 @@
|
|||||||
# Miljövariabler för install.sh / integrate-into-nodered.sh
|
# Environment for install.sh / integrate-into-nodered.sh
|
||||||
# Kopiera till .env och justera per VM.
|
# Copy to .env and adjust per VM.
|
||||||
|
|
||||||
# Nextcloud (visas i exempelflöden och dokumentation — påverkar inte själva nodkoden)
|
# Nextcloud (used in example flows and install hints — does not change node code)
|
||||||
NEXTCLOUD_URL=https://cloud.domain.name
|
NEXTCLOUD_URL=https://cloud.domain.name
|
||||||
NEXTCLOUD_PUBLIC_URL=https://cloud.domain.name
|
NEXTCLOUD_PUBLIC_URL=https://cloud.domain.name
|
||||||
|
|
||||||
# Collabora CODE — IP detekteras automatiskt från Docker bridge om du utelämnar COLLABORA_IP
|
# Collabora CODE — bridge IP auto-detected if COLLABORA_IP is empty
|
||||||
CODE_CONTAINER=code
|
CODE_CONTAINER=code
|
||||||
COLLABORA_IP=
|
COLLABORA_IP=
|
||||||
COLLABORA_URL=
|
COLLABORA_URL=
|
||||||
|
|
||||||
# Befintlig Node-RED-installation (integrate-läge)
|
# Existing Node-RED install (integrate mode)
|
||||||
NODERED_DIR=
|
NODERED_DIR=
|
||||||
NODERED_CONTAINER=nextcloud-node-red
|
NODERED_CONTAINER=nextcloud-node-red
|
||||||
NODERED_PORT=1880
|
NODERED_PORT=1880
|
||||||
INSTALL_USER=
|
INSTALL_USER=
|
||||||
|
|
||||||
# Sidecar-läge (ej standard)
|
# Sidecar mode (not default)
|
||||||
NC_HOST=cloud.domain.name
|
NC_HOST=cloud.domain.name
|
||||||
NC_HOST_IP=
|
NC_HOST_IP=
|
||||||
TZ=Europe/Stockholm
|
TZ=Europe/Stockholm
|
||||||
NODERED_CREDENTIAL_SECRET=byt-den-här-hemligheten-vid-produktion
|
NODERED_CREDENTIAL_SECRET=change-this-secret-in-production
|
||||||
|
|||||||
@@ -1,82 +1,81 @@
|
|||||||
# nextcloud-collabora-nodered
|
# nextcloud-collabora-nodered
|
||||||
|
|
||||||
Collabora/Nextcloud Office-noder för **befintlig** `nextcloud-node-red` på port **1880**.
|
Collabora / Nextcloud Office nodes for your **existing** `nextcloud-node-red` on port **1880**.
|
||||||
|
|
||||||
Skapar **ingen** ny Node-RED-container.
|
Does **not** create a new Node-RED container.
|
||||||
|
|
||||||
## Standard: integrate (inte sidecar)
|
## Default: integrate (not sidecar)
|
||||||
|
|
||||||
**INSTALL_MODE=integrate** (default) patchar och bygger om befintlig `nextcloud-node-red` på **:1880**.
|
**INSTALL_MODE=integrate** (default) patches and rebuilds the existing `nextcloud-node-red` on **:1880**.
|
||||||
Ingen ny container, ingen port 1881. Sidecar kräver uttryckligen `INSTALL_MODE=sidecar`.
|
No extra container, no port 1881. Sidecar only if you explicitly set `INSTALL_MODE=sidecar`.
|
||||||
|
|
||||||
## Installation (cloud / valfri VM)
|
## Quick install
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
curl -fsSL https://git.domain.name/your-user/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh | sudo -u ncdeploy bash
|
curl -fsSL https://git.domain.name/your-user/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh | sudo -u ncdeploy bash
|
||||||
```
|
```
|
||||||
|
|
||||||
Det skriptet:
|
That script:
|
||||||
1. Klonar detta repo till `/home/ncdeploy/nextcloud-collabora-nodered`
|
1. Clones this repo
|
||||||
2. Kopierar noder till `/home/ncdeploy/nextcloud-node-red/nodes/nextcloud-collabora/`
|
2. Copies nodes into your `nextcloud-node-red` tree
|
||||||
3. Patchar `Dockerfile` + `entrypoint.sh` i nextcloud-node-red
|
3. Patches `Dockerfile` + `entrypoint.sh`
|
||||||
4. Bygger om **samma** `nextcloud-node-red`-image och startar om containern
|
4. Rebuilds the **same** image and restarts the container
|
||||||
5. Ansluter `nextcloud-node-red` till Docker `bridge` så CODE (`172.17.0.2:9980`) nås
|
5. Connects Node-RED to Docker `bridge` so CODE is reachable
|
||||||
|
|
||||||
## Uppdatera noder
|
## Update nodes
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /home/ncdeploy/nextcloud-collabora-nodered
|
cd /path/to/nextcloud-collabora-nodered
|
||||||
git pull
|
git pull
|
||||||
./install.sh
|
./install.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
## Manuell integration
|
## Manual integration
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /home/ncdeploy/nextcloud-collabora-nodered
|
NODERED_DIR=/path/to/nextcloud-node-red ./scripts/integrate-into-nodered.sh
|
||||||
NODERED_DIR=/home/ncdeploy/nextcloud-node-red ./scripts/integrate-into-nodered.sh
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Sidecar :1881 (ej rekommenderat)
|
## Sidecar :1881 (not recommended)
|
||||||
|
|
||||||
Endast om du uttryckligen vill separat instans:
|
Only if you explicitly want a separate instance:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
INSTALL_MODE=sidecar docker compose --profile sidecar up -d --build
|
INSTALL_MODE=sidecar docker compose --profile sidecar up -d --build
|
||||||
```
|
```
|
||||||
|
|
||||||
## Noder
|
## Nodes
|
||||||
|
|
||||||
Palett: **nextcloud collabora** — sex noder i samma lila, alla kopplade till **nc-collab-config** (kugghjul, inte flödesnod).
|
Palette: **nextcloud collabora** — six nodes in the same purple, all wired to **nc-collab-config** (gear icon, not a flow node).
|
||||||
|
|
||||||
`nc-collab-config` · `collabora-bridge` · `nc-office` · `collabora-convert` · `collabora-extract` · `collabora-transform` · `collabora-wopi`
|
`nc-collab-config` · `collabora-bridge` · `nc-office` · `collabora-convert` · `collabora-extract` · `collabora-transform` · `collabora-wopi`
|
||||||
|
|
||||||
Full förklaring och exempel: **[docs/NODES.md](docs/NODES.md)** · importera **[flows/example-flows.json](flows/example-flows.json)**
|
Full guide and examples: **[docs/NODES.md](docs/NODES.md)** · import **[flows/example-flows.json](flows/example-flows.json)**
|
||||||
|
|
||||||
## Installera på valfri Nextcloud-VM
|
## Install on any Nextcloud VM
|
||||||
|
|
||||||
Kopiera `.env.example` → `.env` och sätt minst `NEXTCLOUD_URL`. Resten detekteras:
|
Copy `.env.example` → `.env` and set at least `NEXTCLOUD_URL`. The rest is auto-detected:
|
||||||
|
|
||||||
| Variabel | Default / auto |
|
| Variable | Default / auto |
|
||||||
|----------|----------------|
|
|----------|----------------|
|
||||||
| `NODERED_DIR` | compose-label eller `/home/ncdeploy/nextcloud-node-red` |
|
| `NODERED_DIR` | compose label or common paths |
|
||||||
| `CODE_CONTAINER` | `code` |
|
| `CODE_CONTAINER` | `code` |
|
||||||
| `COLLABORA_IP` | bridge-IP via `docker inspect` |
|
| `COLLABORA_IP` | bridge IP via `docker inspect` |
|
||||||
| `NODERED_CONTAINER` | `nextcloud-node-red` |
|
| `NODERED_CONTAINER` | `nextcloud-node-red` |
|
||||||
| `NODERED_PORT` | `1880` |
|
| `NODERED_PORT` | `1880` |
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
cd /home/ncdeploy/nextcloud-collabora-nodered
|
cp .env.example .env # set NEXTCLOUD_URL for your VM
|
||||||
cp .env.example .env # justera NEXTCLOUD_URL per VM
|
|
||||||
git pull
|
git pull
|
||||||
./install.sh # root/sudo för docker compose
|
./install.sh # needs root/sudo for docker compose
|
||||||
```
|
```
|
||||||
|
|
||||||
## Repo
|
## Repo
|
||||||
|
|
||||||
https://git.domain.name/your-user/nextcloud-collabora-nodered
|
https://git.domain.name/your-user/nextcloud-collabora-nodered
|
||||||
|
|
||||||
## Dokumentation
|
## Documentation
|
||||||
|
|
||||||
- [docs/NODES.md](docs/NODES.md)
|
- [docs/NODES.md](docs/NODES.md) — node reference and examples
|
||||||
- [docs/INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md)
|
- [docs/NODES.md](docs/NODES.md) — node reference and examples
|
||||||
|
- [docs/INFRASTRUCTURE.md](docs/INFRASTRUCTURE.md) — server layout
|
||||||
|
|||||||
+27
-27
@@ -1,12 +1,12 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# bootstrap-install.sh — klona från Gitea och integrera i befintlig nextcloud-node-red
|
# bootstrap-install.sh — clone from Gitea and integrate into existing nextcloud-node-red
|
||||||
#
|
#
|
||||||
# Skapar INTE ny Node-RED-container. Patchar /home/ncdeploy/nextcloud-node-red och bygger om.
|
# Does NOT create a new Node-RED container. Patches nextcloud-node-red and rebuilds.
|
||||||
#
|
#
|
||||||
# One-liner (kör som ncdeploy, INTE root):
|
# One-liner (run as install user, NOT root):
|
||||||
# curl -fsSL https://git.domain.name/your-user/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh | sudo -u ncdeploy bash
|
# curl -fsSL https://git.domain.name/your-user/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh | sudo -u ncdeploy bash
|
||||||
#
|
#
|
||||||
# Om git "dubious ownership" (root ägde repot):
|
# If git "dubious ownership" (root owned the repo):
|
||||||
# sudo bash scripts/fix-repo-ownership.sh
|
# sudo bash scripts/fix-repo-ownership.sh
|
||||||
#
|
#
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@@ -34,11 +34,11 @@ SKIP_APT="${SKIP_APT:-0}"
|
|||||||
SKIP_DOCKER_INSTALL="${SKIP_DOCKER_INSTALL:-1}"
|
SKIP_DOCKER_INSTALL="${SKIP_DOCKER_INSTALL:-1}"
|
||||||
|
|
||||||
log() { printf '[bootstrap] %s\n' "$*"; }
|
log() { printf '[bootstrap] %s\n' "$*"; }
|
||||||
warn() { printf '[bootstrap] VARNING: %s\n' "$*" >&2; }
|
warn() { printf '[bootstrap] WARNING: %s\n' "$*" >&2; }
|
||||||
die() { printf '[bootstrap] FEL: %s\n' "$*" >&2; exit 1; }
|
die() { printf '[bootstrap] ERROR: %s\n' "$*" >&2; exit 1; }
|
||||||
|
|
||||||
run_as_root() {
|
run_as_root() {
|
||||||
if [ "$(id -u)" -eq 0 ]; then "$@"; elif command -v sudo >/dev/null 2>&1; then sudo "$@"; else die "sudo krävs"; fi
|
if [ "$(id -u)" -eq 0 ]; then "$@"; elif command -v sudo >/dev/null 2>&1; then sudo "$@"; else die "sudo required"; fi
|
||||||
}
|
}
|
||||||
|
|
||||||
runtime_user() {
|
runtime_user() {
|
||||||
@@ -58,7 +58,7 @@ reexec_as_install_user() {
|
|||||||
local user
|
local user
|
||||||
user="$(runtime_user)"
|
user="$(runtime_user)"
|
||||||
if [ "$(id -un)" = "root" ] && [ "${user}" != "root" ] && [ -z "${BOOTSTRAP_REEXEC:-}" ]; then
|
if [ "$(id -un)" = "root" ] && [ "${user}" != "root" ] && [ -z "${BOOTSTRAP_REEXEC:-}" ]; then
|
||||||
log "Kör om som ${user} (inte root)..."
|
log "Re-running as ${user} (not root)..."
|
||||||
export BOOTSTRAP_REEXEC=1
|
export BOOTSTRAP_REEXEC=1
|
||||||
export INSTALL_DIR NODERED_DIR INSTALL_MODE GIT_REPO_URL GIT_BRANCH
|
export INSTALL_DIR NODERED_DIR INSTALL_MODE GIT_REPO_URL GIT_BRANCH
|
||||||
exec sudo -u "${user}" -H env \
|
exec sudo -u "${user}" -H env \
|
||||||
@@ -80,7 +80,7 @@ fix_repo_ownership() {
|
|||||||
[ -d "${INSTALL_DIR}" ] || return 0
|
[ -d "${INSTALL_DIR}" ] || return 0
|
||||||
owner="$(stat -c '%U' "${INSTALL_DIR}" 2>/dev/null || echo "")"
|
owner="$(stat -c '%U' "${INSTALL_DIR}" 2>/dev/null || echo "")"
|
||||||
if [ -n "${owner}" ] && [ "${owner}" != "${user}" ]; then
|
if [ -n "${owner}" ] && [ "${owner}" != "${user}" ]; then
|
||||||
log "Repo ägs av ${owner} — sätter ägare ${user}:${group}"
|
log "Repo owned by ${owner} — setting owner ${user}:${group}"
|
||||||
run_as_root chown -R "${user}:${group}" "${INSTALL_DIR}"
|
run_as_root chown -R "${user}:${group}" "${INSTALL_DIR}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@ ensure_git_safe_directory() {
|
|||||||
install_apt_packages() {
|
install_apt_packages() {
|
||||||
[ "${SKIP_APT}" = "1" ] && return 0
|
[ "${SKIP_APT}" = "1" ] && return 0
|
||||||
command -v apt-get >/dev/null 2>&1 || return 0
|
command -v apt-get >/dev/null 2>&1 || return 0
|
||||||
log "Installerar git, curl, rsync..."
|
log "Installing git, curl, rsync..."
|
||||||
run_as_root apt-get update -qq
|
run_as_root apt-get update -qq
|
||||||
run_as_root apt-get install -y -qq git curl ca-certificates rsync
|
run_as_root apt-get install -y -qq git curl ca-certificates rsync
|
||||||
}
|
}
|
||||||
@@ -106,7 +106,7 @@ install_apt_packages() {
|
|||||||
install_docker() {
|
install_docker() {
|
||||||
[ "${SKIP_DOCKER_INSTALL}" = "1" ] && return 0
|
[ "${SKIP_DOCKER_INSTALL}" = "1" ] && return 0
|
||||||
command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1 && return 0
|
command -v docker >/dev/null 2>&1 && docker info >/dev/null 2>&1 && return 0
|
||||||
log "Installerar Docker..."
|
log "Installing Docker..."
|
||||||
curl -fsSL https://get.docker.com | run_as_root sh
|
curl -fsSL https://get.docker.com | run_as_root sh
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,13 +115,13 @@ clone_or_update_repo() {
|
|||||||
ensure_git_safe_directory
|
ensure_git_safe_directory
|
||||||
|
|
||||||
if [ -d "${INSTALL_DIR}/.git" ]; then
|
if [ -d "${INSTALL_DIR}/.git" ]; then
|
||||||
log "Uppdaterar ${INSTALL_DIR}..."
|
log "Updating ${INSTALL_DIR}..."
|
||||||
git -C "${INSTALL_DIR}" fetch origin
|
git -C "${INSTALL_DIR}" fetch origin
|
||||||
git -C "${INSTALL_DIR}" checkout "${GIT_BRANCH}"
|
git -C "${INSTALL_DIR}" checkout "${GIT_BRANCH}"
|
||||||
git -C "${INSTALL_DIR}" pull --ff-only origin "${GIT_BRANCH}" || warn "git pull misslyckades"
|
git -C "${INSTALL_DIR}" pull --ff-only origin "${GIT_BRANCH}" || warn "git pull failed"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
log "Klonar ${GIT_REPO_URL} → ${INSTALL_DIR}"
|
log "Cloning ${GIT_REPO_URL} → ${INSTALL_DIR}"
|
||||||
mkdir -p "$(dirname "${INSTALL_DIR}")"
|
mkdir -p "$(dirname "${INSTALL_DIR}")"
|
||||||
git clone --branch "${GIT_BRANCH}" --depth 1 "${GIT_REPO_URL}" "${INSTALL_DIR}"
|
git clone --branch "${GIT_BRANCH}" --depth 1 "${GIT_REPO_URL}" "${INSTALL_DIR}"
|
||||||
fix_repo_ownership
|
fix_repo_ownership
|
||||||
@@ -129,25 +129,25 @@ clone_or_update_repo() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
preflight() {
|
preflight() {
|
||||||
command -v docker >/dev/null 2>&1 || die "Docker saknas"
|
command -v docker >/dev/null 2>&1 || die "Docker not found"
|
||||||
docker ps --format '{{.Names}}' | grep -qx "${NODERED_CONTAINER}" \
|
docker ps --format '{{.Names}}' | grep -qx "${NODERED_CONTAINER}" \
|
||||||
|| die "'${NODERED_CONTAINER}' körs inte — detta skript integrerar i befintlig Node-RED, skapar ingen ny"
|
|| die "'${NODERED_CONTAINER}' is not running — this script integrates into existing Node-RED, does not create a new one"
|
||||||
docker ps --format '{{.Names}}' | grep -qx "${CODE_CONTAINER}" \
|
docker ps --format '{{.Names}}' | grep -qx "${CODE_CONTAINER}" \
|
||||||
|| die "'${CODE_CONTAINER}' (Collabora) körs inte"
|
|| die "'${CODE_CONTAINER}' (Collabora) is not running"
|
||||||
[ -d "${NODERED_DIR}" ] || die "nextcloud-node-red-katalog saknas: ${NODERED_DIR}"
|
[ -d "${NODERED_DIR}" ] || die "nextcloud-node-red directory missing: ${NODERED_DIR}"
|
||||||
log "OK: ${NODERED_CONTAINER} + ${CODE_CONTAINER} körs"
|
log "OK: ${NODERED_CONTAINER} + ${CODE_CONTAINER} running"
|
||||||
}
|
}
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
reexec_as_install_user
|
reexec_as_install_user
|
||||||
|
|
||||||
log "bootstrap v${VERSION} — läge: ${INSTALL_MODE} (befintlig Node-RED :${NODERED_PORT})"
|
log "bootstrap v${VERSION} — mode: ${INSTALL_MODE} (existing Node-RED :${NODERED_PORT})"
|
||||||
log "Användare: $(id -un)"
|
log "User: $(id -un)"
|
||||||
log "Repo → ${INSTALL_DIR}"
|
log "Repo → ${INSTALL_DIR}"
|
||||||
log "Integrera → ${NODERED_DIR}"
|
log "Integrate → ${NODERED_DIR}"
|
||||||
|
|
||||||
if [ "$(id -u)" -eq 0 ] && [ "$(runtime_user)" = "root" ]; then
|
if [ "$(id -u)" -eq 0 ] && [ "$(runtime_user)" = "root" ]; then
|
||||||
warn "Körs som root — rekommenderat: curl ... | sudo -u ncdeploy bash"
|
warn "Running as root — recommended: curl ... | sudo -u ncdeploy bash"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
install_apt_packages
|
install_apt_packages
|
||||||
@@ -168,13 +168,13 @@ main() {
|
|||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
================================================================================
|
================================================================================
|
||||||
Klart — Collabora-noder i befintlig nextcloud-node-red
|
Done — Collabora nodes in existing nextcloud-node-red
|
||||||
================================================================================
|
================================================================================
|
||||||
Node-RED: http://${host_ip}:${NODERED_PORT} (samma som förut)
|
Node-RED: http://${host_ip}:${NODERED_PORT} (same as before)
|
||||||
Repo: ${INSTALL_DIR}
|
Repo: ${INSTALL_DIR}
|
||||||
Patchad: ${NODERED_DIR}
|
Patched: ${NODERED_DIR}
|
||||||
|
|
||||||
Uppdatera senare:
|
Update later:
|
||||||
cd ${INSTALL_DIR} && git pull && ./install.sh
|
cd ${INSTALL_DIR} && git pull && ./install.sh
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
+30
-52
@@ -1,66 +1,44 @@
|
|||||||
# Infrastruktur — cloud.domain.name (192.168.1.10)
|
# Infrastructure
|
||||||
|
|
||||||
Verifierad 2026-08-22. Sidecar ska passa in utan att röra befintliga tjänster.
|
Verified layout for integrate mode (nodes on existing `:1880`, not sidecar).
|
||||||
|
|
||||||
## Containers
|
## Containers
|
||||||
|
|
||||||
| Container | Image | Port | Nätverk | IP |
|
| Container | Image | Port | Network | Notes |
|
||||||
|-----------|-------|------|---------|-----|
|
|-----------|-------|------|---------|-------|
|
||||||
| `code` | collabora/code:latest (26.04.3.1) | 127.0.0.1:9980 | `bridge` | 172.17.0.2 |
|
| nextcloud-node-red | custom | 1880 | odds_network (+ bridge for CODE) | Existing Node-RED |
|
||||||
| `nextcloud-node-red` | nextcloud-node-red:latest | 0.0.0.0:1880 | `nextcloud-node-red_odds_network` | 172.18.0.3 |
|
| code | collabora/code | 127.0.0.1:9980 | bridge | Collabora CODE |
|
||||||
| `nextcloud-node-red` | nextcloud-node-red:latest | 0.0.0.0:1880 | odds_network + **bridge** (efter install) | 172.18.0.3 |
|
| odds-postgres | postgres:16 | 5433→5432 | odds_network | Odds scraper DB — do not touch |
|
||||||
| ~~nextcloud-collabora-nodered~~ | — | — | **Används ej** — noder integreras i :1880 | — |
|
|
||||||
| `gitea_server` | gitea/gitea:latest | 127.0.0.1:3000 | (egen) | — |
|
|
||||||
| `odds-postgres` | postgres:16-alpine | 5433 | odds_network | — |
|
|
||||||
|
|
||||||
## Viktigt om nätverk
|
Sidecar `nextcloud-collabora-nodered` on :1881 is **not used** — integrate mode patches the :1880 instance.
|
||||||
|
|
||||||
- **CODE** ligger på Docker **`bridge`** (172.17.0.0/16), inte på `odds_network`.
|
## Networking
|
||||||
- **Collabora-noder** installeras i befintlig `nextcloud-node-red` — ingen ny container
|
|
||||||
- **`install.sh`** patchar `/home/ncdeploy/nextcloud-node-red` och bygger om samma image
|
|
||||||
- Efter install: `docker network connect bridge nextcloud-node-red` (sker automatiskt)
|
|
||||||
- `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
|
- **CODE** runs on Docker **`bridge`** (typically 172.17.0.x), not on `odds_network`.
|
||||||
|
- After `docker compose up`, connect Node-RED to bridge:
|
||||||
|
`docker network connect bridge nextcloud-node-red`
|
||||||
|
- Host `127.0.0.1:9980` reaches CODE from the host, not from containers without bridge.
|
||||||
|
- On Linux, prefer detected bridge IP over `host.docker.internal`.
|
||||||
|
- **nextcloud-node-red** stays on `odds_network`; bridge is an extra attachment for CODE only.
|
||||||
|
|
||||||
- URL: https://cloud.domain.name
|
## Install paths (example host)
|
||||||
- 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/your-user/nextcloud-collabora-nodered
|
|
||||||
- SSH port **2222** på host
|
|
||||||
|
|
||||||
## Bootstrap (ny VM)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
curl -fsSL https://git.domain.name/your-user/nextcloud-collabora-nodered/raw/branch/main/bootstrap-install.sh | bash
|
|
||||||
```
|
|
||||||
|
|
||||||
## Kataloger på host
|
|
||||||
|
|
||||||
```
|
```
|
||||||
/home/ncdeploy/
|
/home/ncdeploy/
|
||||||
├── nextcloud-node-red/ # :1880 — orört
|
├── nextcloud-node-red/ # :1880 — patched by integrate
|
||||||
├── nextcloud-collabora-nodered/ # :1881 — detta paket
|
│ └── nodes/nextcloud-collabora/ # copied package (lib/ + nodes/)
|
||||||
├── your-userode/ # Gitea compose
|
└── nextcloud-collabora-nodered/ # this repo
|
||||||
├── odds-scraper/ # ignoreras
|
|
||||||
└── nodered-embed/
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Collabora SDK (referens)
|
## Public vs internal URLs
|
||||||
|
|
||||||
- [Conversion API](https://sdk.collaboraonline.com/docs/conversion_api.html)
|
| Use | URL |
|
||||||
- [Extract/Transform API](https://sdk.collaboraonline.com/docs/extract_transform_api.html)
|
|-----|-----|
|
||||||
- [Linking API](https://sdk.collaboraonline.com/docs/linking_api.html)
|
| Nextcloud API / WebDAV | `https://cloud.example.com` |
|
||||||
- postMessage: webbläsare/iframe — **inte** Node-RED
|
| CODE from Node-RED container | `https://<bridge-ip>:9980` (verifyTls=false) |
|
||||||
|
| Browser editor / WOPI | `collaboraPublicUrl` — usually same as Nextcloud proxy |
|
||||||
|
|
||||||
|
## Gitea (optional)
|
||||||
|
|
||||||
|
- https://git.domain.name/your-user/nextcloud-collabora-nodered
|
||||||
|
- SSH git on port 2222 if configured
|
||||||
|
|||||||
+81
-81
@@ -1,71 +1,71 @@
|
|||||||
# Noder — nextcloud collabora
|
# Nodes — nextcloud collabora
|
||||||
|
|
||||||
Sex flödesnoder i paletten + en config. Alla sex pekar på samma **nc-collab-config** (kugghjul, inte i paletten). Utan config händer inget.
|
Six flow nodes in the palette plus one config node. All six point at the same **nc-collab-config** (gear menu, not in the palette). Without config, nothing works.
|
||||||
|
|
||||||
## Backends
|
## Backends
|
||||||
|
|
||||||
| Backend | Typisk adress | Roll |
|
| Backend | Typical URL | Role |
|
||||||
|---------|---------------|------|
|
|---------|-------------|------|
|
||||||
| Nextcloud | `https://cloud.domain.name` | Filer (WebDAV) + Office-API (OCS) |
|
| Nextcloud | `https://cloud.example.com` | Files (WebDAV) + Office API (OCS) |
|
||||||
| Collabora CODE | `https://172.17.0.2:9980` | Konvertering (`/cool/...`) på Docker bridge |
|
| Collabora CODE | `https://172.17.0.2:9980` | Conversion (`/cool/...`) on Docker bridge |
|
||||||
|
|
||||||
Auth: **användarnamn + app-lösenord**. Inte kontolösen.
|
Auth: **username + app password**. Not your account password.
|
||||||
|
|
||||||
Standardutdata om du inte anger sökväg: `/Dokument/OfficeOut/`
|
Default output folder if you omit a path: `/Dokument/OfficeOut/` (or set your own via `destNcPath`).
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Så hänger de ihop
|
## How they fit together
|
||||||
|
|
||||||
```
|
```
|
||||||
nc-collab-config (URL + app-lösen)
|
nc-collab-config (URLs + app password)
|
||||||
│
|
│
|
||||||
┌────┼────┬────────────┐
|
┌────┼────┬────────────┐
|
||||||
▼ ▼ ▼ ▼
|
▼ ▼ ▼ ▼
|
||||||
collabora-* nc-office collabora-wopi collabora-bridge
|
collabora-* nc-office collabora-wopi collabora-bridge
|
||||||
(direkt CODE) (NC OCS) (health/WOPI) (kedjor + sparar)
|
(direct CODE) (NC OCS) (health/WOPI) (pipelines + save)
|
||||||
```
|
```
|
||||||
|
|
||||||
**Tumregel**
|
**Rules of thumb**
|
||||||
|
|
||||||
- PDF i Nextcloud → `collabora-bridge` **ncFileToPdf**
|
- PDF in Nextcloud → `collabora-bridge` **ncFileToPdf**
|
||||||
- Fylla mall i NC → **fillTemplateSave** eller `nc-office template:fillFields`
|
- Fill template in NC → **fillTemplateSave** or `nc-office template:fillFields`
|
||||||
- Öppna i webbläsaren → `nc-office` **document:direct**
|
- Open in browser → `nc-office` **document:direct**
|
||||||
- Bara byta format i minnet → `collabora-convert`
|
- Convert in memory only → `collabora-convert`
|
||||||
- Se fältnamn → `collabora-extract` eller bridge **extractToPayload**
|
- List field names → `collabora-extract` or bridge **extractToPayload**
|
||||||
- Kolla att CODE lever → `collabora-wopi` **capabilities**
|
- Check CODE is alive → `collabora-wopi` **capabilities**
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Gemensamma fält i msg
|
## Common `msg` fields
|
||||||
|
|
||||||
| Fält | Betydelse |
|
| Field | Meaning |
|
||||||
|------|-----------|
|
|-------|---------|
|
||||||
| `ncPath` | Sökväg i användarens filer, t.ex. `/Dokument/avtal.docx` |
|
| `ncPath` | Path in the user's files, e.g. `/Documents/contract.docx` |
|
||||||
| `fileId` | NC fil-id (slås upp från ncPath om saknas) |
|
| `fileId` | Nextcloud numeric file id (resolved from `ncPath` if missing) |
|
||||||
| `payload` | Rådata redan i flödet (Buffer eller HTML) |
|
| `payload` | Raw data already in the flow (Buffer or HTML string) |
|
||||||
| `format` | pdf, png, docx, html, … |
|
| `format` | pdf, png, docx, html, … |
|
||||||
| `destNcPath` | Exakt målsökväg |
|
| `destNcPath` | Exact destination path |
|
||||||
| `destFolder` / `destName` | Mapp + namn (default `/Dokument/OfficeOut/`) |
|
| `destFolder` / `destName` | Folder + name (default folder `/Dokument/OfficeOut/`) |
|
||||||
| `fields` / `transform` | JSON att skriva in i mall |
|
| `fields` / `transform` | JSON to merge into a template |
|
||||||
| `templateNcPath` | Extra mall till convert |
|
| `templateNcPath` | Extra template file for convert |
|
||||||
| `compareNcPath` | Gammal version för diff-PDF |
|
| `compareNcPath` | Older version for diff PDF |
|
||||||
| `operation` | Överstyr dropdown på noden |
|
| `operation` | Overrides the node dropdown |
|
||||||
|
|
||||||
Fel → `msg.error` + röd nod. Flödet dör inte tyst.
|
Errors go to `msg.error` and turn the node red. The flow does not fail silently.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 1. collabora-convert
|
## 1. collabora-convert
|
||||||
|
|
||||||
Gör om fil till annat format via CODE. Sparar **inte** i Nextcloud — utdata i `msg.payload` (Buffer).
|
Convert a file to another format via CODE. Does **not** save to Nextcloud — output is `msg.payload` (Buffer).
|
||||||
|
|
||||||
**In:** `msg.payload` eller WebDAV GET `msg.ncPath`. Valfritt `templateNcPath`, `compareNcPath`, `format`.
|
**In:** `msg.payload` or WebDAV GET `msg.ncPath`. Optional `templateNcPath`, `compareNcPath`, `format`.
|
||||||
|
|
||||||
**Ut:** `payload`, `filename`, `format`, `contentType`, `statusCode`.
|
**Out:** `payload`, `filename`, `format`, `contentType`, `statusCode`.
|
||||||
|
|
||||||
```
|
```
|
||||||
inject { ncPath: "/Dokument/avtal.docx", format: "pdf" }
|
inject { ncPath: "/Documents/contract.docx", format: "pdf" }
|
||||||
→ collabora-convert → debug
|
→ collabora-convert → debug
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -73,12 +73,12 @@ inject { ncPath: "/Dokument/avtal.docx", format: "pdf" }
|
|||||||
|
|
||||||
## 2. collabora-extract
|
## 2. collabora-extract
|
||||||
|
|
||||||
Lista struktur (content controls, fält …). JSON ut, ingen fil.
|
List structure inside a document (content controls, fields, etc.). JSON out, no file.
|
||||||
|
|
||||||
**In:** samma källa som convert. Filter: nod eller `msg.filter` (default `contentcontrol`).
|
**In:** same as convert. Filter: node dropdown or `msg.filter` (default `contentcontrol`).
|
||||||
|
|
||||||
```
|
```
|
||||||
inject { ncPath: "/Mallar/avtal.docx" }
|
inject { ncPath: "/Templates/contract.docx" }
|
||||||
→ collabora-extract → function → collabora-transform
|
→ collabora-extract → function → collabora-transform
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -86,50 +86,50 @@ inject { ncPath: "/Mallar/avtal.docx" }
|
|||||||
|
|
||||||
## 3. collabora-transform
|
## 3. collabora-transform
|
||||||
|
|
||||||
Skriv värden i dokument via CODE. Kräver `msg.fields` eller `msg.transform`.
|
Write values into a document via CODE. Requires `msg.fields` or `msg.transform`.
|
||||||
|
|
||||||
```
|
```
|
||||||
msg.ncPath = "/Mallar/avtal.docx"
|
msg.ncPath = "/Templates/contract.docx"
|
||||||
msg.fields = { "Kund": "AB Exempel", "Datum": "2026-08-22" }
|
msg.fields = { "Customer": "ACME Ltd", "Date": "2026-08-22" }
|
||||||
→ collabora-transform
|
→ collabora-transform
|
||||||
```
|
```
|
||||||
|
|
||||||
Spara själv efteråt om filen ska ligga i NC.
|
Save yourself afterwards if the file should live in Nextcloud.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. collabora-wopi
|
## 4. collabora-wopi
|
||||||
|
|
||||||
Hälsokoll och WOPI — inte konvertering.
|
Health checks and WOPI helpers — not conversion.
|
||||||
|
|
||||||
| Operation | Syfte |
|
| Operation | Purpose |
|
||||||
|-----------|--------|
|
|-----------|---------|
|
||||||
| `capabilities` | Första test att CODE svarar |
|
| `capabilities` | First test that CODE responds |
|
||||||
| `discovery` | mime → editor-URL |
|
| `discovery` | mime → editor URL |
|
||||||
| `buildEditor` | `wopiSrc` + `token` → `editorUrl` |
|
| `buildEditor` | `wopiSrc` + `token` → `editorUrl` |
|
||||||
| `checkFileInfo` / `getFile` | Felsökning |
|
| `checkFileInfo` / `getFile` | Debugging |
|
||||||
|
|
||||||
Publik editor-URL går via Nextcloud (`collaboraPublicUrl`), inte intern IP.
|
Public editor URLs go through Nextcloud (`collaboraPublicUrl`), not the internal CODE IP.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. nc-office
|
## 5. nc-office
|
||||||
|
|
||||||
Nextcloud richdocuments OCS — mallar, fält, editor-URL, assets.
|
Nextcloud richdocuments OCS — templates, fields, editor URL, assets.
|
||||||
|
|
||||||
| Operation | Kort |
|
| Operation | Summary |
|
||||||
|-----------|------|
|
|-----------|---------|
|
||||||
| `templates:list` | Lista mallar |
|
| `templates:list` | List templates |
|
||||||
| `templates:create` | Ny fil från mall |
|
| `templates:create` | New file from template |
|
||||||
| `template:extractFields` | Fält-JSON via NC |
|
| `template:extractFields` | Field JSON via NC |
|
||||||
| `template:fillFields` | Fyll + spara i NC |
|
| `template:fillFields` | Fill + save in NC |
|
||||||
| `document:direct` | `editorUrl` för inloggad användare |
|
| `document:direct` | `editorUrl` for logged-in user |
|
||||||
| `document:public` | Samma med shareToken |
|
| `document:public` | Same with `shareToken` |
|
||||||
| `files:convert` | NC → NC konvertering |
|
| `files:convert` | NC → NC conversion |
|
||||||
| `assets:create` | Infogningslänk till öppen editor |
|
| `assets:create` | One-shot insert URL for open editor |
|
||||||
|
|
||||||
```
|
```
|
||||||
inject { ncPath: "/Dokument/avtal.docx" }
|
inject { ncPath: "/Documents/contract.docx" }
|
||||||
→ nc-office (document:direct) → debug editorUrl
|
→ nc-office (document:direct) → debug editorUrl
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -137,38 +137,38 @@ inject { ncPath: "/Dokument/avtal.docx" }
|
|||||||
|
|
||||||
## 6. collabora-bridge
|
## 6. collabora-bridge
|
||||||
|
|
||||||
Färdiga pipelines — det mesta i vardagsflöden.
|
Ready-made pipelines — what you'll use most day to day.
|
||||||
|
|
||||||
| Operation | Gör |
|
| Operation | Does |
|
||||||
|-----------|-----|
|
|-----------|------|
|
||||||
| `ncFileToPdf` | NC-fil → PDF i OfficeOut |
|
| `ncFileToPdf` | NC file → PDF in OfficeOut |
|
||||||
| `ncFileToPng` | Förhandsvisning |
|
| `ncFileToPng` | Preview PNG |
|
||||||
| `ncFileToHtml` | HTML-export |
|
| `ncFileToHtml` | HTML export |
|
||||||
| `htmlToOffice` | HTML → docx/pdf … |
|
| `htmlToOffice` | HTML → docx/pdf … |
|
||||||
| `fillTemplateSave` | Mall + fält → spara i NC |
|
| `fillTemplateSave` | Template + fields → save in NC |
|
||||||
| `compareVersionsPdf` | Diff-PDF |
|
| `compareVersionsPdf` | Diff PDF |
|
||||||
| `extractToPayload` | Fält-JSON i msg |
|
| `extractToPayload` | Field JSON in msg |
|
||||||
| `createAssetLink` | assetUrl |
|
| `createAssetLink` | `assetUrl` |
|
||||||
|
|
||||||
```
|
```
|
||||||
inject { ncPath: "/Dokument/avtal.docx" }
|
inject { ncPath: "/Documents/contract.docx" }
|
||||||
→ collabora-bridge (ncFileToPdf)
|
→ collabora-bridge (ncFileToPdf)
|
||||||
→ debug destNcPath
|
→ debug destNcPath
|
||||||
```
|
```
|
||||||
|
|
||||||
Efter bridge kan du koppla dina befintliga OCS-noder (Talk, Mail, dela länk): först PDF i `/Dokument/OfficeOut/`, sedan dela.
|
Chain your existing OCS nodes (Talk, Mail, share link) after bridge: PDF lands in `/Dokument/OfficeOut/`, then share or send.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## Config: nc-collab-config
|
## Config: nc-collab-config
|
||||||
|
|
||||||
Skapas under kugghjul i Node-RED. Alla sex noder väljer samma config-instans.
|
Create under the gear icon in Node-RED. All six flow nodes pick the same config instance.
|
||||||
|
|
||||||
| Fält | Exempel |
|
| Field | Example |
|
||||||
|------|---------|
|
|-------|---------|
|
||||||
| nextcloudUrl | `https://cloud.domain.name` |
|
| nextcloudUrl | `https://cloud.example.com` |
|
||||||
| collaboraUrl | `https://172.17.0.2:9980` (bridge-IP, verifyTls=false) |
|
| collaboraUrl | `https://172.17.0.2:9980` (bridge IP, verifyTls=false) |
|
||||||
| collaboraPublicUrl | `https://cloud.domain.name` |
|
| collaboraPublicUrl | `https://cloud.example.com` |
|
||||||
| username + app-lösenord | Nextcloud-inloggning |
|
| username + app password | Nextcloud login |
|
||||||
|
|
||||||
IP för CODE detekteras vid `./install.sh` — se `.env.example`.
|
CODE IP is detected when you run `./install.sh` — see `.env.example`.
|
||||||
|
|||||||
@@ -2,9 +2,9 @@
|
|||||||
{
|
{
|
||||||
"id": "collab_tab",
|
"id": "collab_tab",
|
||||||
"type": "tab",
|
"type": "tab",
|
||||||
"label": "NC Collabora — exempel",
|
"label": "NC Collabora — examples",
|
||||||
"disabled": false,
|
"disabled": false,
|
||||||
"info": "Skapa nc-collab-config först (kugghjul). Byt FILL_IN_USER och app-lösenord.\n\n1. capabilities — CODE lever?\n2. ncFileToPdf — PDF i OfficeOut\n3. document:direct — editorUrl\n\nSe docs/NODES.md"
|
"info": "Create nc-collab-config first (gear menu). Set FILL_IN_USER and app password.\n\n1. capabilities — is CODE up?\n2. ncFileToPdf — PDF in OfficeOut\n3. document:direct — editorUrl\n\nSee docs/NODES.md"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "nc_collab_cfg",
|
"id": "nc_collab_cfg",
|
||||||
@@ -104,7 +104,7 @@
|
|||||||
"id": "inj_editor",
|
"id": "inj_editor",
|
||||||
"type": "inject",
|
"type": "inject",
|
||||||
"z": "collab_tab",
|
"z": "collab_tab",
|
||||||
"name": "3. Öppna i Office",
|
"name": "3. Open in Office",
|
||||||
"props": [
|
"props": [
|
||||||
{
|
{
|
||||||
"p": "ncPath",
|
"p": "ncPath",
|
||||||
@@ -149,7 +149,7 @@
|
|||||||
"id": "inj_extract",
|
"id": "inj_extract",
|
||||||
"type": "inject",
|
"type": "inject",
|
||||||
"z": "collab_tab",
|
"z": "collab_tab",
|
||||||
"name": "4. Fält i mall",
|
"name": "4. Template fields",
|
||||||
"props": [
|
"props": [
|
||||||
{
|
{
|
||||||
"p": "ncPath",
|
"p": "ncPath",
|
||||||
|
|||||||
+19
-19
@@ -1,17 +1,17 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# install.sh — integrera Collabora-noder i befintlig nextcloud-node-red (:1880)
|
# install.sh — integrate Collabora nodes into existing nextcloud-node-red (:1880)
|
||||||
#
|
#
|
||||||
# Standard: INSTALL_MODE=integrate (ingen ny container, ingen port 1881)
|
# Default: INSTALL_MODE=integrate (no new container, no port 1881)
|
||||||
# Sidecar (endast om du uttryckligen vill): INSTALL_MODE=sidecar
|
# Sidecar (only if you explicitly want it): INSTALL_MODE=sidecar
|
||||||
#
|
#
|
||||||
# Miljövariabler (valfria — .env i reporoten laddas automatiskt):
|
# Environment (optional — .env in repo root is loaded automatically):
|
||||||
# NODERED_DIR Sökväg till befintlig nextcloud-node-red (auto-detekteras om tom)
|
# NODERED_DIR Path to existing nextcloud-node-red (auto-detected if empty)
|
||||||
# NODERED_CONTAINER Docker-namn, default nextcloud-node-red
|
# NODERED_CONTAINER Docker name, default nextcloud-node-red
|
||||||
# NODERED_PORT default 1880
|
# NODERED_PORT default 1880
|
||||||
# CODE_CONTAINER Docker-namn för Collabora CODE, default code
|
# CODE_CONTAINER Collabora CODE container name, default code
|
||||||
# COLLABORA_IP CODE:s bridge-IP (auto-detekteras om tom)
|
# COLLABORA_IP CODE bridge IP (auto-detected if empty)
|
||||||
# NEXTCLOUD_URL t.ex. https://cloud.domain.name (hints i slutet)
|
# NEXTCLOUD_URL e.g. https://cloud.example.com (shown in install summary)
|
||||||
# INSTALL_USER filägare vid chown, default ncdeploy
|
# INSTALL_USER file owner for chown, default ncdeploy
|
||||||
# FORCE_REBUILD=1 docker compose build --no-cache
|
# FORCE_REBUILD=1 docker compose build --no-cache
|
||||||
#
|
#
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
@@ -21,7 +21,7 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|||||||
INSTALL_DIR="${INSTALL_DIR:-$SCRIPT_DIR}"
|
INSTALL_DIR="${INSTALL_DIR:-$SCRIPT_DIR}"
|
||||||
INSTALL_MODE="${INSTALL_MODE:-integrate}"
|
INSTALL_MODE="${INSTALL_MODE:-integrate}"
|
||||||
|
|
||||||
# Ladda .env om den finns (inga hemligheter krävs här)
|
# Load .env if present (no secrets required here)
|
||||||
if [ -f "${INSTALL_DIR}/.env" ]; then
|
if [ -f "${INSTALL_DIR}/.env" ]; then
|
||||||
set -a
|
set -a
|
||||||
# shellcheck disable=SC1091
|
# shellcheck disable=SC1091
|
||||||
@@ -39,25 +39,25 @@ NEXTCLOUD_URL="${NEXTCLOUD_URL:-https://cloud.domain.name}"
|
|||||||
[ -n "${NEXTCLOUD_URL}" ] || NEXTCLOUD_URL="https://cloud.domain.name"
|
[ -n "${NEXTCLOUD_URL}" ] || NEXTCLOUD_URL="https://cloud.domain.name"
|
||||||
|
|
||||||
log() { printf '[install] %s\n' "$*"; }
|
log() { printf '[install] %s\n' "$*"; }
|
||||||
die() { printf '[install] FEL: %s\n' "$*" >&2; exit 1; }
|
die() { printf '[install] ERROR: %s\n' "$*" >&2; exit 1; }
|
||||||
|
|
||||||
log "nextcloud-collabora-nodered v${VERSION} (läge: ${INSTALL_MODE})"
|
log "nextcloud-collabora-nodered v${VERSION} (mode: ${INSTALL_MODE})"
|
||||||
|
|
||||||
if [ "${INSTALL_MODE}" = "sidecar" ]; then
|
if [ "${INSTALL_MODE}" = "sidecar" ]; then
|
||||||
log "Sidecar-läge — varning: standard är integrate (befintlig :1880)"
|
log "Sidecar mode — note: default is integrate (existing :1880)"
|
||||||
require_cmd() { command -v "$1" >/dev/null 2>&1 || die "Saknar: $1"; }
|
require_cmd() { command -v "$1" >/dev/null 2>&1 || die "Missing: $1"; }
|
||||||
require_cmd docker
|
require_cmd docker
|
||||||
COMPOSE="docker compose"
|
COMPOSE="docker compose"
|
||||||
docker compose version >/dev/null 2>&1 || COMPOSE="docker-compose"
|
docker compose version >/dev/null 2>&1 || COMPOSE="docker-compose"
|
||||||
cd "${INSTALL_DIR}"
|
cd "${INSTALL_DIR}"
|
||||||
[ -f docker-compose.yml ] || die "docker-compose.yml saknas"
|
[ -f docker-compose.yml ] || die "docker-compose.yml not found"
|
||||||
[ -f .env ] || cp .env.example .env
|
[ -f .env ] || cp .env.example .env
|
||||||
if ! docker ps --format '{{.Names}}' | grep -qx "${CODE_CONTAINER}"; then
|
if ! docker ps --format '{{.Names}}' | grep -qx "${CODE_CONTAINER}"; then
|
||||||
die "CODE-container '${CODE_CONTAINER}' körs inte"
|
die "CODE container '${CODE_CONTAINER}' is not running"
|
||||||
fi
|
fi
|
||||||
${COMPOSE} build
|
${COMPOSE} build
|
||||||
${COMPOSE} up -d
|
${COMPOSE} up -d
|
||||||
log "Sidecar startad på :1881 (ej rekommenderat om :1880 redan kör)"
|
log "Sidecar started on :1881 (not recommended if :1880 already runs)"
|
||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -73,4 +73,4 @@ PKG_SRC="${INSTALL_DIR}" \
|
|||||||
INSTALL_USER="${INSTALL_USER:-}" \
|
INSTALL_USER="${INSTALL_USER:-}" \
|
||||||
bash "${SCRIPT_DIR}/scripts/integrate-into-nodered.sh"
|
bash "${SCRIPT_DIR}/scripts/integrate-into-nodered.sh"
|
||||||
|
|
||||||
log "Klart."
|
log "Done."
|
||||||
|
|||||||
+17
-17
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
<script type="text/html" data-template-name="collabora-bridge">
|
<script type="text/html" data-template-name="collabora-bridge">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-name"><i class="fa fa-tag"></i> Namn</label>
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
||||||
<input type="text" id="node-input-name">
|
<input type="text" id="node-input-name">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@@ -41,27 +41,27 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="collabora-bridge">
|
<script type="text/html" data-help-name="collabora-bridge">
|
||||||
<p><strong>Färdiga pipelines.</strong> Kedjar WebDAV + CODE + (ibland) OCS och skriver oftast tillbaka till Nextcloud. Det här är noden du når efter oftast.</p>
|
<p><strong>Ready-made pipelines.</strong> Chains WebDAV + CODE + (sometimes) OCS and usually writes back to Nextcloud. This is the node you'll reach for most often.</p>
|
||||||
<p>Defaultmål: <code>/Dokument/OfficeOut/</code> om du inte sätter <code>destNcPath</code> / <code>destFolder</code> / <code>destName</code>.</p>
|
<p>Default destination: <code>/Dokument/OfficeOut/</code> unless you set <code>destNcPath</code> / <code>destFolder</code> / <code>destName</code>.</p>
|
||||||
|
|
||||||
<table style="width:100%; font-size:11px;">
|
<table style="width:100%; font-size:11px;">
|
||||||
<tr><th>Operation</th><th>Resultat</th></tr>
|
<tr><th>Operation</th><th>Result</th></tr>
|
||||||
<tr><td><code>ncFileToPdf</code></td><td>PDF i NC</td></tr>
|
<tr><td><code>ncFileToPdf</code></td><td>PDF saved in NC</td></tr>
|
||||||
<tr><td><code>ncFileToPng</code></td><td>Förhandsvisning PNG</td></tr>
|
<tr><td><code>ncFileToPng</code></td><td>Preview PNG</td></tr>
|
||||||
<tr><td><code>ncFileToHtml</code></td><td>HTML i NC</td></tr>
|
<tr><td><code>ncFileToHtml</code></td><td>HTML in NC</td></tr>
|
||||||
<tr><td><code>htmlToOffice</code></td><td>HTML/text → docx/pdf …</td></tr>
|
<tr><td><code>htmlToOffice</code></td><td>HTML → docx/pdf …</td></tr>
|
||||||
<tr><td><code>fillTemplateSave</code></td><td>Fyll mall via OCS, spara i NC</td></tr>
|
<tr><td><code>fillTemplateSave</code></td><td>Fill template via OCS, save in NC</td></tr>
|
||||||
<tr><td><code>compareVersionsPdf</code></td><td>Diff-PDF (ny + <code>compareNcPath</code>)</td></tr>
|
<tr><td><code>compareVersionsPdf</code></td><td>Diff PDF (new + <code>compareNcPath</code>)</td></tr>
|
||||||
<tr><td><code>extractToPayload</code></td><td>JSON i <code>msg.fields</code> / <code>msg.structure</code></td></tr>
|
<tr><td><code>extractToPayload</code></td><td>Field JSON in msg</td></tr>
|
||||||
<tr><td><code>createAssetLink</code></td><td><code>msg.assetUrl</code> för infogning</td></tr>
|
<tr><td><code>createAssetLink</code></td><td><code>msg.assetUrl</code> for insert</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p>Överstyr via <code>msg.operation</code>. Skriver inte över original utan <code>msg.allowOverwrite=true</code>.</p>
|
<p>Override via <code>msg.operation</code>. Does not overwrite originals unless <code>msg.allowOverwrite=true</code>.</p>
|
||||||
<p>De andra noderna i paletten är byggstenar när bridge inte räcker.</p>
|
<p>The other palette nodes are building blocks when bridge isn't enough.</p>
|
||||||
|
|
||||||
<pre>inject { ncPath: "/Dokument/avtal.docx" }
|
<pre>inject { ncPath: "/Documents/contract.docx" }
|
||||||
→ collabora-bridge (ncFileToPdf)
|
→ collabora-bridge (ncFileToPdf)
|
||||||
→ debug { destNcPath: "/Dokument/OfficeOut/avtal.pdf" }</pre>
|
→ debug { destNcPath: "/Dokument/OfficeOut/contract.pdf" }</pre>
|
||||||
|
|
||||||
<p><strong>Tumregel:</strong> PDF i Nextcloud → <code>ncFileToPdf</code>. Mall + spara → <code>fillTemplateSave</code>. Öppna i webbläsare → <code>nc-office document:direct</code>.</p>
|
<p><strong>Rule of thumb:</strong> PDF in Nextcloud → <code>ncFileToPdf</code>. Fill template → <code>fillTemplateSave</code>. Open in browser → <code>nc-office document:direct</code>.</p>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
<script type="text/html" data-template-name="collabora-convert">
|
<script type="text/html" data-template-name="collabora-convert">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-name"><i class="fa fa-tag"></i> Namn</label>
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
||||||
<input type="text" id="node-input-name">
|
<input type="text" id="node-input-name">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@@ -42,26 +42,24 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="collabora-convert">
|
<script type="text/html" data-help-name="collabora-convert">
|
||||||
<p><strong>Gör om filen till annat format.</strong> Skickar dokument till CODE och får tillbaka binär data (pdf, png, docx, odt, html, xlsx, pptx …). Sparar inte i Nextcloud — resultatet ligger i <code>msg.payload</code> som Buffer.</p>
|
<p><strong>Convert a file to another format.</strong> Sends a document to CODE and returns binary data (pdf, png, docx, odt, html, xlsx, pptx …). Does not save to Nextcloud — result is <code>msg.payload</code> as a Buffer.</p>
|
||||||
|
|
||||||
<h4>Varifrån</h4>
|
<h4>Input</h4>
|
||||||
<p>Filinnehåll, i ordning:</p>
|
<p>File content, in order:</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li><code>msg.payload</code> om det redan är Buffer/text</li>
|
<li><code>msg.payload</code> if it's already a Buffer or text</li>
|
||||||
<li>annars WebDAV GET av <code>msg.ncPath</code></li>
|
<li>otherwise WebDAV GET of <code>msg.ncPath</code></li>
|
||||||
</ol>
|
</ol>
|
||||||
<p>Valfritt: <code>msg.templateNcPath</code> (mall), <code>msg.compareNcPath</code> (jämförelsefil).</p>
|
<p>Optional: <code>msg.templateNcPath</code> (template), <code>msg.compareNcPath</code> (compare file).</p>
|
||||||
|
|
||||||
<h4>Vart</h4>
|
<h4>Output</h4>
|
||||||
<p>POST multipart → <code>/cool/convert-to/<format></code> på CODE. Fält: <code>data</code> = källfilen.</p>
|
<p>POST multipart to CODE <code>/cool/convert-to/<format></code>. Field: <code>data</code> = source file.</p>
|
||||||
|
|
||||||
<h4>Ut</h4>
|
|
||||||
<p><code>msg.payload</code>, <code>msg.filename</code>, <code>msg.format</code>, <code>msg.contentType</code>, <code>msg.statusCode</code></p>
|
<p><code>msg.payload</code>, <code>msg.filename</code>, <code>msg.format</code>, <code>msg.contentType</code>, <code>msg.statusCode</code></p>
|
||||||
|
|
||||||
<h4>När</h4>
|
<h4>When to use</h4>
|
||||||
<p>När du själv styr nästa steg: spara med WebDAV/OCS, mejla, Talk, eller skicka vidare. Vill du ha PDF i Nextcloud direkt — använd <code>collabora-bridge</code> (<code>ncFileToPdf</code>).</p>
|
<p>When you control the next step: save via WebDAV/OCS, email, Talk, or pass on in the flow. For "file in NC → PDF in NC" use <code>collabora-bridge</code> (<code>ncFileToPdf</code>).</p>
|
||||||
|
|
||||||
<pre>inject { ncPath: "/Dokument/avtal.docx", format: "pdf" }
|
<pre>inject { ncPath: "/Documents/contract.docx", format: "pdf" }
|
||||||
→ collabora-convert
|
→ collabora-convert
|
||||||
→ debug (payload = PDF-bytes)</pre>
|
→ debug (payload = PDF bytes)</pre>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
<script type="text/html" data-template-name="collabora-extract">
|
<script type="text/html" data-template-name="collabora-extract">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-name"><i class="fa fa-tag"></i> Namn</label>
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
||||||
<input type="text" id="node-input-name">
|
<input type="text" id="node-input-name">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@@ -32,23 +32,21 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="collabora-extract">
|
<script type="text/html" data-help-name="collabora-extract">
|
||||||
<p><strong>Lista vad som finns i dokumentet.</strong> Content controls, fält, ev. annan struktur beroende på filter. Returnerar JSON — ingen ny fil.</p>
|
<p><strong>List what's inside a document.</strong> Content controls, fields, or other structure depending on filter. Returns JSON — no new file.</p>
|
||||||
|
|
||||||
<h4>Varifrån</h4>
|
<h4>Input</h4>
|
||||||
<p>Samma som convert: <code>msg.payload</code> eller WebDAV GET <code>msg.ncPath</code>.</p>
|
<p>Same as convert: <code>msg.payload</code> or WebDAV GET <code>msg.ncPath</code>.</p>
|
||||||
<p>Filter: dropdown eller <code>msg.filter</code>. Default <code>contentcontrol</code>.</p>
|
<p>Filter: dropdown or <code>msg.filter</code>. Default <code>contentcontrol</code>.</p>
|
||||||
|
|
||||||
<h4>Vart</h4>
|
<h4>Output</h4>
|
||||||
<p>POST multipart → <code>/cool/extract-document-structure</code></p>
|
<p>POST multipart to <code>/cool/extract-document-structure</code></p>
|
||||||
|
<p><code>msg.payload</code> and <code>msg.structure</code> = structure JSON</p>
|
||||||
|
|
||||||
<h4>Ut</h4>
|
<h4>When to use</h4>
|
||||||
<p><code>msg.payload</code> och <code>msg.structure</code> = struktur-JSON</p>
|
<p>Before filling a template. You get field names (Customer, Date …) for the next node.</p>
|
||||||
|
|
||||||
<h4>När</h4>
|
<pre>inject { ncPath: "/Templates/contract.docx" }
|
||||||
<p>Innan du fyller en mall. Du får fältnamnen (Kund, Datum …) så nästa nod vet vad den ska slå in.</p>
|
|
||||||
|
|
||||||
<pre>inject { ncPath: "/Mallar/avtal.docx" }
|
|
||||||
→ collabora-extract (filter: contentcontrol)
|
→ collabora-extract (filter: contentcontrol)
|
||||||
→ function (mappa data till fältnamn)
|
→ function (map your data to field names)
|
||||||
→ collabora-transform / nc-office / bridge fillTemplateSave</pre>
|
→ collabora-transform / nc-office / bridge fillTemplateSave</pre>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
<script type="text/html" data-template-name="collabora-transform">
|
<script type="text/html" data-template-name="collabora-transform">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-name"><i class="fa fa-tag"></i> Namn</label>
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
||||||
<input type="text" id="node-input-name">
|
<input type="text" id="node-input-name">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@@ -27,25 +27,23 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="collabora-transform">
|
<script type="text/html" data-help-name="collabora-transform">
|
||||||
<p><strong>Skriv in värden i dokumentet.</strong> Tar dokument + JSON med fält/transform och ber CODE fylla i. Resultat = ny dokument-binär, inte JSON.</p>
|
<p><strong>Write values into a document.</strong> Takes document + JSON fields/transform and asks CODE to fill them in. Result is a new document binary, not JSON.</p>
|
||||||
|
|
||||||
<h4>Varifrån</h4>
|
<h4>Input</h4>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Dokument: <code>msg.payload</code> eller <code>msg.ncPath</code> (WebDAV)</li>
|
<li>Document: <code>msg.payload</code> or <code>msg.ncPath</code> (WebDAV)</li>
|
||||||
<li>Instruktion: <code>msg.transform</code> eller <code>msg.fields</code> — måste finnas</li>
|
<li>Instruction: <code>msg.transform</code> or <code>msg.fields</code> — required</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<h4>Vart</h4>
|
<h4>Output</h4>
|
||||||
<p>POST multipart → <code>/cool/transform-document-structure</code>. Fält: <code>data</code> = filen, <code>transform</code> = JSON.</p>
|
<p>POST multipart to <code>/cool/transform-document-structure</code>. Fields: <code>data</code> = file, <code>transform</code> = JSON.</p>
|
||||||
|
<p><code>msg.payload</code> = modified file (Buffer), plus <code>contentType</code></p>
|
||||||
|
|
||||||
<h4>Ut</h4>
|
<h4>When to use</h4>
|
||||||
<p><code>msg.payload</code> = ändrad fil (Buffer), plus <code>contentType</code></p>
|
<p>Fill a template via CODE directly, not Nextcloud's template API. Save yourself afterwards (WebDAV PUT / bridge / nc-office) if the file should live in the cloud.</p>
|
||||||
|
|
||||||
<h4>När</h4>
|
<pre>msg.ncPath = "/Templates/contract.docx"
|
||||||
<p>Fylla mall via CODE direkt, inte Nextclouds mall-API. Spara själv efteråt (WebDAV PUT / bridge / nc-office) om filen ska ligga i molnet.</p>
|
msg.fields = { "Customer": "ACME Ltd", "Date": "2026-08-22" }
|
||||||
|
|
||||||
<pre>msg.ncPath = "/Mallar/avtal.docx"
|
|
||||||
msg.fields = { "Kund": "AB Exempel", "Datum": "2026-08-22" }
|
|
||||||
→ collabora-transform
|
→ collabora-transform
|
||||||
→ (spara eller konvertera till PDF)</pre>
|
→ (save or convert to PDF)</pre>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
+14
-14
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
<script type="text/html" data-template-name="collabora-wopi">
|
<script type="text/html" data-template-name="collabora-wopi">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-name"><i class="fa fa-tag"></i> Namn</label>
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
||||||
<input type="text" id="node-input-name">
|
<input type="text" id="node-input-name">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@@ -38,26 +38,26 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="collabora-wopi">
|
<script type="text/html" data-help-name="collabora-wopi">
|
||||||
<p>Inte filkonvertering — hälsokoll och WOPI-hjälp mot CODE.</p>
|
<p>Not file conversion — health checks and WOPI helpers against CODE.</p>
|
||||||
|
|
||||||
<table style="width:100%; font-size:12px;">
|
<table style="width:100%; font-size:12px;">
|
||||||
<tr><th>Operation</th><th>Du får</th></tr>
|
<tr><th>Operation</th><th>You get</th></tr>
|
||||||
<tr><td><code>capabilities</code></td><td>JSON: vad CODE kan (convert-to m.m.)</td></tr>
|
<tr><td><code>capabilities</code></td><td>JSON: what CODE supports (convert-to, etc.)</td></tr>
|
||||||
<tr><td><code>discovery</code></td><td>XML: mime → editor-URL</td></tr>
|
<tr><td><code>discovery</code></td><td>XML: mime → editor URL</td></tr>
|
||||||
<tr><td><code>buildEditor</code></td><td><code>msg.editorUrl</code> från <code>msg.wopiSrc</code> + <code>msg.token</code></td></tr>
|
<tr><td><code>buildEditor</code></td><td><code>msg.editorUrl</code> from <code>msg.wopiSrc</code> + <code>msg.token</code></td></tr>
|
||||||
<tr><td><code>checkFileInfo</code></td><td>JSON om filen (WOPI-host, oftast Nextcloud)</td></tr>
|
<tr><td><code>checkFileInfo</code></td><td>JSON about the file (WOPI host, usually Nextcloud)</td></tr>
|
||||||
<tr><td><code>getFile</code></td><td>filbytes via WOPI GET</td></tr>
|
<tr><td><code>getFile</code></td><td>file bytes via WOPI GET</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p><code>buildEditor</code> sätter ungefär:<br>
|
<p><code>buildEditor</code> builds roughly:<br>
|
||||||
<code>{collaboraPublicUrl}/browser/dist/cool.html?WOPISrc=...&access_token=...</code><br>
|
<code>{collaboraPublicUrl}/browser/dist/cool.html?WOPISrc=...&access_token=...</code><br>
|
||||||
Publik URL = Nextcloud/proxy (<code>https://cloud.domain.name</code>), inte intern CODE-IP.</p>
|
Public URL = Nextcloud/proxy, not internal CODE IP.</p>
|
||||||
|
|
||||||
<h4>När</h4>
|
<h4>When to use</h4>
|
||||||
<ul>
|
<ul>
|
||||||
<li>Första test att CODE lever → <code>capabilities</code></li>
|
<li>First test that CODE is up → <code>capabilities</code></li>
|
||||||
<li>WOPI-token från <code>nc-office document:direct</code> → bygg iframe-URL</li>
|
<li>WOPI token from <code>nc-office document:direct</code> → build iframe URL</li>
|
||||||
<li>Felsökning. Spara filer via WebDAV, inte WOPI PutFile.</li>
|
<li>Debugging. Save files via WebDAV, not WOPI PutFile.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<pre>inject → collabora-wopi (capabilities) → debug</pre>
|
<pre>inject → collabora-wopi (capabilities) → debug</pre>
|
||||||
|
|||||||
+16
-16
@@ -20,47 +20,47 @@
|
|||||||
|
|
||||||
<script type="text/html" data-template-name="nc-collab-config">
|
<script type="text/html" data-template-name="nc-collab-config">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-config-input-name"><i class="fa fa-tag"></i> Namn</label>
|
<label for="node-config-input-name"><i class="fa fa-tag"></i> Name</label>
|
||||||
<input type="text" id="node-config-input-name" placeholder="t.ex. cloud.domain.name">
|
<input type="text" id="node-config-input-name" placeholder="e.g. cloud.example.com">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-config-input-nextcloudUrl"><i class="fa fa-cloud"></i> Nextcloud URL</label>
|
<label for="node-config-input-nextcloudUrl"><i class="fa fa-cloud"></i> Nextcloud URL</label>
|
||||||
<input type="text" id="node-config-input-nextcloudUrl">
|
<input type="text" id="node-config-input-nextcloudUrl">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-config-input-collaboraUrl"><i class="fa fa-server"></i> Collabora intern URL</label>
|
<label for="node-config-input-collaboraUrl"><i class="fa fa-server"></i> Collabora internal URL</label>
|
||||||
<input type="text" id="node-config-input-collaboraUrl">
|
<input type="text" id="node-config-input-collaboraUrl">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-config-input-collaboraPublicUrl"><i class="fa fa-globe"></i> Collabora publik URL (valfri)</label>
|
<label for="node-config-input-collaboraPublicUrl"><i class="fa fa-globe"></i> Collabora public URL (optional)</label>
|
||||||
<input type="text" id="node-config-input-collaboraPublicUrl">
|
<input type="text" id="node-config-input-collaboraPublicUrl">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-config-input-username"><i class="fa fa-user"></i> Användare</label>
|
<label for="node-config-input-username"><i class="fa fa-user"></i> Username</label>
|
||||||
<input type="text" id="node-config-input-username">
|
<input type="text" id="node-config-input-username">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-config-input-password"><i class="fa fa-key"></i> App-lösenord</label>
|
<label for="node-config-input-password"><i class="fa fa-key"></i> App password</label>
|
||||||
<input type="password" id="node-config-input-password">
|
<input type="password" id="node-config-input-password">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-config-input-verifyTls"><i class="fa fa-lock"></i> Verifiera TLS</label>
|
<label for="node-config-input-verifyTls"><i class="fa fa-lock"></i> Verify TLS</label>
|
||||||
<input type="checkbox" id="node-config-input-verifyTls" style="width:auto">
|
<input type="checkbox" id="node-config-input-verifyTls" style="width:auto">
|
||||||
</div>
|
</div>
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="nc-collab-config">
|
<script type="text/html" data-help-name="nc-collab-config">
|
||||||
<p>Config-nod — syns inte i paletten som flödesnod, men alla sex Collabora-noder behöver en sådan här.</p>
|
<p>Config node — not in the flow palette, but all six Collabora nodes need one.</p>
|
||||||
<p>Utan config gör inget av dem något.</p>
|
<p>Without this, none of them do anything.</p>
|
||||||
|
|
||||||
<h4>Två backender</h4>
|
<h4>Two backends</h4>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Nextcloud</strong> (<code>nextcloudUrl</code>) — filer via WebDAV + Office-API (OCS richdocuments). T.ex. <code>https://cloud.domain.name</code></li>
|
<li><strong>Nextcloud</strong> (<code>nextcloudUrl</code>) — files via WebDAV + Office API (OCS richdocuments)</li>
|
||||||
<li><strong>Collabora CODE</strong> (<code>collaboraUrl</code>) — konverteringsmotorn (<code>/cool/...</code>). Intern Docker bridge, t.ex. <code>https://172.17.0.2:9980</code>. IP hämtas vid install med <code>docker inspect</code> — hardkoda inte blint.</li>
|
<li><strong>Collabora CODE</strong> (<code>collaboraUrl</code>) — conversion engine (<code>/cool/...</code>). Internal Docker bridge, e.g. <code>https://172.17.0.2:9980</code>. IP is detected at install — don't hardcode blindly on every host.</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p><strong>Auth:</strong> användarnamn + <em>app-lösenord</em>. Inte vanligt kontolösen.</p>
|
<p><strong>Auth:</strong> username + <em>app password</em>. Not your normal account password.</p>
|
||||||
<p><code>collaboraPublicUrl</code> — vad webbläsaren ska se vid WOPI/editor-länkar (proxad CODE via Nextcloud). Intern IP funkar inte i iframe.</p>
|
<p><code>collaboraPublicUrl</code> — what the browser sees for WOPI/editor links (CODE proxied via Nextcloud). Internal IP won't work in an iframe.</p>
|
||||||
<p><code>verifyTls</code> — stäng av mot intern CODE om cert inte matchar IP/host.</p>
|
<p><code>verifyTls</code> — turn off for internal CODE when the cert doesn't match IP/hostname.</p>
|
||||||
<p>Standardutdata i bridge om du inte anger mål: <code>/Dokument/OfficeOut/</code></p>
|
<p>Default output folder in bridge if you omit a destination: <code>/Dokument/OfficeOut/</code></p>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
+15
-15
@@ -18,7 +18,7 @@
|
|||||||
|
|
||||||
<script type="text/html" data-template-name="nc-office">
|
<script type="text/html" data-template-name="nc-office">
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
<label for="node-input-name"><i class="fa fa-tag"></i> Namn</label>
|
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
|
||||||
<input type="text" id="node-input-name">
|
<input type="text" id="node-input-name">
|
||||||
</div>
|
</div>
|
||||||
<div class="form-row">
|
<div class="form-row">
|
||||||
@@ -41,25 +41,25 @@
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<script type="text/html" data-help-name="nc-office">
|
<script type="text/html" data-help-name="nc-office">
|
||||||
<p><strong>Nextcloud Office-API.</strong> Trafik till Nextcloud OCS richdocuments — inte direkt till <code>/cool</code> (utom <code>files:convert</code> som internt kör WebDAV + CODE + WebDAV).</p>
|
<p><strong>Nextcloud Office API.</strong> Traffic goes to Nextcloud OCS richdocuments — not directly to <code>/cool</code> (except <code>files:convert</code>, which internally runs WebDAV + CODE + WebDAV).</p>
|
||||||
<p>Bas: <code>.../ocs/v2.php/apps/richdocuments/api/v1/...</code></p>
|
<p>Base: <code>.../ocs/v2.php/apps/richdocuments/api/v1/...</code></p>
|
||||||
|
|
||||||
<table style="width:100%; font-size:11px;">
|
<table style="width:100%; font-size:11px;">
|
||||||
<tr><th>Operation</th><th>Gör</th></tr>
|
<tr><th>Operation</th><th>Does</th></tr>
|
||||||
<tr><td><code>templates:list</code></td><td>Lista mallar (ev. <code>templateType</code>)</td></tr>
|
<tr><td><code>templates:list</code></td><td>List templates (optional <code>templateType</code>)</td></tr>
|
||||||
<tr><td><code>templates:create</code></td><td>Ny fil från NC-mall</td></tr>
|
<tr><td><code>templates:create</code></td><td>New file from NC template</td></tr>
|
||||||
<tr><td><code>template:extractFields</code></td><td>Fält-JSON (som extract, via NC)</td></tr>
|
<tr><td><code>template:extractFields</code></td><td>Field JSON (like extract, via NC)</td></tr>
|
||||||
<tr><td><code>template:fillFields</code></td><td>Fyll mall, spara i NC</td></tr>
|
<tr><td><code>template:fillFields</code></td><td>Fill template, save in NC</td></tr>
|
||||||
<tr><td><code>document:direct</code></td><td><code>editorUrl</code> — öppna fil i Office</td></tr>
|
<tr><td><code>document:direct</code></td><td><code>editorUrl</code> — open file in Office</td></tr>
|
||||||
<tr><td><code>document:public</code></td><td>Samma via <code>shareToken</code></td></tr>
|
<tr><td><code>document:public</code></td><td>Same with <code>shareToken</code></td></tr>
|
||||||
<tr><td><code>files:convert</code></td><td>NC-fil → ny NC-fil (t.ex. PDF)</td></tr>
|
<tr><td><code>files:convert</code></td><td>NC file → new NC file (e.g. PDF)</td></tr>
|
||||||
<tr><td><code>assets:create</code></td><td>Engångslänk för infogning i öppen editor</td></tr>
|
<tr><td><code>assets:create</code></td><td>One-shot URL to insert into open editor</td></tr>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
<p><code>fileId</code> kan saknas — slås upp med WebDAV PROPFIND från <code>ncPath</code>.</p>
|
<p><code>fileId</code> can be omitted — looked up via WebDAV PROPFIND from <code>ncPath</code>.</p>
|
||||||
<p>Överstyr via <code>msg.operation</code>. Gemensamma fält: <code>ncPath</code>, <code>fileId</code>, <code>destNcPath</code>, <code>fields</code>.</p>
|
<p>Override via <code>msg.operation</code>. Common fields: <code>ncPath</code>, <code>fileId</code>, <code>destNcPath</code>, <code>fields</code>.</p>
|
||||||
|
|
||||||
<pre>inject { ncPath: "/Dokument/avtal.docx" }
|
<pre>inject { ncPath: "/Documents/contract.docx" }
|
||||||
→ nc-office (document:direct)
|
→ nc-office (document:direct)
|
||||||
→ debug (editorUrl)</pre>
|
→ debug (editorUrl)</pre>
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -25,4 +25,4 @@ EOF
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
tar -cf /dev/null --exclude-from="${DI}" -C "${NODERED_DIR}" . \
|
tar -cf /dev/null --exclude-from="${DI}" -C "${NODERED_DIR}" . \
|
||||||
&& echo "[fix] Build context OK — kör ./install.sh"
|
&& echo "[fix] Build context OK — run ./install.sh"
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# Snabbfix om git "dubious ownership" efter root-kloning
|
# Quick fix if git reports "dubious ownership" after root clone
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
DIR="${1:-/home/ncdeploy/nextcloud-collabora-nodered}"
|
DIR="${1:-/home/ncdeploy/nextcloud-collabora-nodered}"
|
||||||
USER="${2:-ncdeploy}"
|
USER="${2:-ncdeploy}"
|
||||||
echo "chown ${USER} ${DIR}"
|
echo "chown ${USER} ${DIR}"
|
||||||
chown -R "${USER}:${USER}" "${DIR}"
|
chown -R "${USER}:${USER}" "${DIR}"
|
||||||
sudo -u "${USER}" git config --global --add safe.directory "${DIR}"
|
sudo -u "${USER}" git config --global --add safe.directory "${DIR}"
|
||||||
echo "Klart. Kör: cd ${DIR} && ./install.sh"
|
echo "Done. Run: cd ${DIR} && ./install.sh"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# integrate-into-nodered.sh — lägg Collabora-noder i BEFINTLIG nextcloud-node-red (:1880)
|
# integrate-into-nodered.sh — add Collabora nodes to EXISTING nextcloud-node-red (:1880)
|
||||||
# Anropas av install.sh / bootstrap-install.sh (standardläge).
|
# Called by install.sh / bootstrap-install.sh (default mode).
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||||
@@ -14,8 +14,8 @@ NEXTCLOUD_URL="${NEXTCLOUD_URL:-https://cloud.domain.name}"
|
|||||||
MARKER="nextcloud-collabora-nodered"
|
MARKER="nextcloud-collabora-nodered"
|
||||||
|
|
||||||
log() { printf '[integrate] %s\n' "$*"; }
|
log() { printf '[integrate] %s\n' "$*"; }
|
||||||
warn() { printf '[integrate] VARNING: %s\n' "$*" >&2; }
|
warn() { printf '[integrate] WARNING: %s\n' "$*" >&2; }
|
||||||
die() { printf '[integrate] FEL: %s\n' "$*" >&2; exit 1; }
|
die() { printf '[integrate] ERROR: %s\n' "$*" >&2; exit 1; }
|
||||||
|
|
||||||
run_as_root() {
|
run_as_root() {
|
||||||
if [ "$(id -u)" -eq 0 ]; then
|
if [ "$(id -u)" -eq 0 ]; then
|
||||||
@@ -23,7 +23,7 @@ run_as_root() {
|
|||||||
elif command -v sudo >/dev/null 2>&1; then
|
elif command -v sudo >/dev/null 2>&1; then
|
||||||
sudo "$@"
|
sudo "$@"
|
||||||
else
|
else
|
||||||
die "sudo/root krävs för: $*"
|
die "sudo/root required for: $*"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,12 +45,12 @@ patch_dockerignore() {
|
|||||||
local snippet="${PKG_SRC}/integrate/dockerignore.snippet"
|
local snippet="${PKG_SRC}/integrate/dockerignore.snippet"
|
||||||
|
|
||||||
if [ ! -f "${di}" ]; then
|
if [ ! -f "${di}" ]; then
|
||||||
log "Skapar .dockerignore"
|
log "Creating .dockerignore"
|
||||||
touch "${di}"
|
touch "${di}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if ! grep -q "${DOCKERIGNORE_MARKER}" "${di}" 2>/dev/null; then
|
if ! grep -q "${DOCKERIGNORE_MARKER}" "${di}" 2>/dev/null; then
|
||||||
log "Patchar .dockerignore (exkluderar oläsbara lokala artefakter)"
|
log "Patching .dockerignore (exclude unreadable local artifacts)"
|
||||||
{
|
{
|
||||||
echo ""
|
echo ""
|
||||||
echo "# ${DOCKERIGNORE_MARKER}"
|
echo "# ${DOCKERIGNORE_MARKER}"
|
||||||
@@ -72,7 +72,7 @@ patch_dockerignore() {
|
|||||||
while IFS= read -r relpath; do
|
while IFS= read -r relpath; do
|
||||||
[ -n "${relpath}" ] || continue
|
[ -n "${relpath}" ] || continue
|
||||||
if ! grep -qxF "${relpath}" "${di}" 2>/dev/null; then
|
if ! grep -qxF "${relpath}" "${di}" 2>/dev/null; then
|
||||||
log " + .dockerignore: ${relpath} (oläsbar)"
|
log " + .dockerignore: ${relpath} (unreadable)"
|
||||||
echo "${relpath}" >> "${di}"
|
echo "${relpath}" >> "${di}"
|
||||||
fi
|
fi
|
||||||
done < <(run_as_root find "${NODERED_DIR}/nodes" -type f ! -readable -printf 'nodes/%P\n' 2>/dev/null || true)
|
done < <(run_as_root find "${NODERED_DIR}/nodes" -type f ! -readable -printf 'nodes/%P\n' 2>/dev/null || true)
|
||||||
@@ -87,7 +87,7 @@ fix_nodered_build_permissions() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Fixar ägande och läsrättigheter för ${NODERED_DIR} (innehåll orört)"
|
log "Fixing ownership and read permissions for ${NODERED_DIR} (content unchanged)"
|
||||||
run_as_root chown -R "${user}:${group}" "${NODERED_DIR}"
|
run_as_root chown -R "${user}:${group}" "${NODERED_DIR}"
|
||||||
run_as_root find "${NODERED_DIR}/nodes" -type d -exec chmod u+rwx,go+rx {} + 2>/dev/null || true
|
run_as_root find "${NODERED_DIR}/nodes" -type d -exec chmod u+rwx,go+rx {} + 2>/dev/null || true
|
||||||
run_as_root find "${NODERED_DIR}/nodes" -type f -exec chmod u+rw,go+r {} + 2>/dev/null || true
|
run_as_root find "${NODERED_DIR}/nodes" -type f -exec chmod u+rw,go+r {} + 2>/dev/null || true
|
||||||
@@ -102,24 +102,24 @@ verify_build_context() {
|
|||||||
local errfile
|
local errfile
|
||||||
errfile="$(mktemp)"
|
errfile="$(mktemp)"
|
||||||
|
|
||||||
log "Verifierar Docker build context..."
|
log "Verifying Docker build context..."
|
||||||
patch_dockerignore
|
patch_dockerignore
|
||||||
|
|
||||||
if ! run_as_root tar -cf /dev/null \
|
if ! run_as_root tar -cf /dev/null \
|
||||||
--exclude-from="${di}" \
|
--exclude-from="${di}" \
|
||||||
-C "${NODERED_DIR}" . 2>"${errfile}"; then
|
-C "${NODERED_DIR}" . 2>"${errfile}"; then
|
||||||
warn "Build context-fel:"
|
warn "Build context error:"
|
||||||
sed 's/^/[integrate] /' "${errfile}" >&2 || true
|
sed 's/^/[integrate] /' "${errfile}" >&2 || true
|
||||||
# Sista utväg: tvinga bort kända problemfil
|
# Sista utväg: tvinga bort kända problemfil
|
||||||
if [ -f "${NODERED_DIR}/nodes/odds-scraper/odds-scraper" ]; then
|
if [ -f "${NODERED_DIR}/nodes/odds-scraper/odds-scraper" ]; then
|
||||||
echo "nodes/odds-scraper/odds-scraper" >> "${di}"
|
echo "nodes/odds-scraper/odds-scraper" >> "${di}"
|
||||||
log "Tvingade nodes/odds-scraper/odds-scraper in i .dockerignore"
|
log "Forced nodes/odds-scraper/odds-scraper into .dockerignore"
|
||||||
fi
|
fi
|
||||||
if ! run_as_root tar -cf /dev/null \
|
if ! run_as_root tar -cf /dev/null \
|
||||||
--exclude-from="${di}" \
|
--exclude-from="${di}" \
|
||||||
-C "${NODERED_DIR}" . 2>"${errfile}"; then
|
-C "${NODERED_DIR}" . 2>"${errfile}"; then
|
||||||
rm -f "${errfile}"
|
rm -f "${errfile}"
|
||||||
die "Build context oläsbar efter .dockerignore — se ${di}"
|
die "Build context still unreadable after .dockerignore — see ${di}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
rm -f "${errfile}"
|
rm -f "${errfile}"
|
||||||
@@ -155,10 +155,10 @@ detect_code_ip() {
|
|||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
if [ -n "${COLLABORA_IP}" ]; then
|
if [ -n "${COLLABORA_IP}" ]; then
|
||||||
warn "Kunde inte läsa bridge-IP — använder COLLABORA_IP=${COLLABORA_IP}"
|
warn "Could not read bridge IP — using COLLABORA_IP=${COLLABORA_IP}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
die "CODE bridge-IP saknas — sätt COLLABORA_IP eller kontrollera att ${CODE_CONTAINER} kör på Docker bridge"
|
die "CODE bridge IP missing — set COLLABORA_IP or ensure ${CODE_CONTAINER} runs on Docker bridge"
|
||||||
}
|
}
|
||||||
|
|
||||||
detect_nodered_dir() {
|
detect_nodered_dir() {
|
||||||
@@ -170,7 +170,7 @@ detect_nodered_dir() {
|
|||||||
from_compose="$(docker inspect -f '{{index .Config.Labels "com.docker.compose.project.working_dir"}}' "${NODERED_CONTAINER}" 2>/dev/null || true)"
|
from_compose="$(docker inspect -f '{{index .Config.Labels "com.docker.compose.project.working_dir"}}' "${NODERED_CONTAINER}" 2>/dev/null || true)"
|
||||||
if [ -n "${from_compose}" ] && [ -f "${from_compose}/Dockerfile" ]; then
|
if [ -n "${from_compose}" ] && [ -f "${from_compose}/Dockerfile" ]; then
|
||||||
NODERED_DIR="${from_compose}"
|
NODERED_DIR="${from_compose}"
|
||||||
log "Node-RED-katalog från compose-label: ${NODERED_DIR}"
|
log "Node-RED directory from compose label: ${NODERED_DIR}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
@@ -179,12 +179,12 @@ detect_nodered_dir() {
|
|||||||
"/opt/nextcloud-node-red"; do
|
"/opt/nextcloud-node-red"; do
|
||||||
if [ -f "${candidate}/Dockerfile" ]; then
|
if [ -f "${candidate}/Dockerfile" ]; then
|
||||||
NODERED_DIR="${candidate}"
|
NODERED_DIR="${candidate}"
|
||||||
log "Node-RED-katalog hittad: ${NODERED_DIR}"
|
log "Node-RED directory found: ${NODERED_DIR}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
die "NODERED_DIR saknas eller ogiltig — sätt sökväg till befintlig nextcloud-node-red (Dockerfile + entrypoint.sh)"
|
die "NODERED_DIR missing or invalid — set path to existing nextcloud-node-red (Dockerfile + entrypoint.sh)"
|
||||||
}
|
}
|
||||||
|
|
||||||
resolve_paths() {
|
resolve_paths() {
|
||||||
@@ -206,24 +206,24 @@ resolve_paths() {
|
|||||||
|
|
||||||
stop_sidecar_if_any() {
|
stop_sidecar_if_any() {
|
||||||
if docker ps -a --format '{{.Names}}' | grep -qx "nextcloud-collabora-nodered"; then
|
if docker ps -a --format '{{.Names}}' | grep -qx "nextcloud-collabora-nodered"; then
|
||||||
warn "Stoppar felaktig sidecar-container nextcloud-collabora-nodered (skulle inte skapas)"
|
warn "Stopping stray sidecar container nextcloud-collabora-nodered (should not exist)"
|
||||||
docker stop nextcloud-collabora-nodered 2>/dev/null || true
|
docker stop nextcloud-collabora-nodered 2>/dev/null || true
|
||||||
docker rm nextcloud-collabora-nodered 2>/dev/null || true
|
docker rm nextcloud-collabora-nodered 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
preflight() {
|
preflight() {
|
||||||
[ -d "${PKG_SRC}" ] || die "Paketkälla saknas: ${PKG_SRC}"
|
[ -d "${PKG_SRC}" ] || die "Package source missing: ${PKG_SRC}"
|
||||||
[ -f "${PKG_SRC}/package.json" ] || die "package.json saknas i ${PKG_SRC}"
|
[ -f "${PKG_SRC}/package.json" ] || die "package.json missing in ${PKG_SRC}"
|
||||||
[ -d "${NODERED_DIR}" ] || die "nextcloud-node-red saknas: ${NODERED_DIR}"
|
[ -d "${NODERED_DIR}" ] || die "nextcloud-node-red missing: ${NODERED_DIR}"
|
||||||
[ -f "${NODERED_DIR}/Dockerfile" ] || die "Dockerfile saknas i ${NODERED_DIR}"
|
[ -f "${NODERED_DIR}/Dockerfile" ] || die "Dockerfile missing in ${NODERED_DIR}"
|
||||||
[ -f "${NODERED_DIR}/entrypoint.sh" ] || die "entrypoint.sh saknas i ${NODERED_DIR}"
|
[ -f "${NODERED_DIR}/entrypoint.sh" ] || die "entrypoint.sh missing in ${NODERED_DIR}"
|
||||||
|
|
||||||
if ! docker ps --format '{{.Names}}' | grep -qx "${NODERED_CONTAINER}"; then
|
if ! docker ps --format '{{.Names}}' | grep -qx "${NODERED_CONTAINER}"; then
|
||||||
die "Container '${NODERED_CONTAINER}' körs inte — starta befintlig nextcloud-node-red först"
|
die "Container '${NODERED_CONTAINER}' is not running — start existing nextcloud-node-red first"
|
||||||
fi
|
fi
|
||||||
if ! docker ps --format '{{.Names}}' | grep -qx "${CODE_CONTAINER}"; then
|
if ! docker ps --format '{{.Names}}' | grep -qx "${CODE_CONTAINER}"; then
|
||||||
die "CODE-container '${CODE_CONTAINER}' körs inte"
|
die "CODE container '${CODE_CONTAINER}' is not running"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -232,25 +232,25 @@ assert_package_layout() {
|
|||||||
local missing=0
|
local missing=0
|
||||||
|
|
||||||
if [ ! -f "${dest}/package.json" ]; then
|
if [ ! -f "${dest}/package.json" ]; then
|
||||||
warn "Saknas: ${dest}/package.json"
|
warn "Missing: ${dest}/package.json"
|
||||||
missing=1
|
missing=1
|
||||||
fi
|
fi
|
||||||
if [ ! -d "${dest}/lib" ] || [ -z "$(ls -A "${dest}/lib" 2>/dev/null)" ]; then
|
if [ ! -d "${dest}/lib" ] || [ -z "$(ls -A "${dest}/lib" 2>/dev/null)" ]; then
|
||||||
warn "Saknas eller tom: ${dest}/lib/"
|
warn "Missing or empty: ${dest}/lib/"
|
||||||
missing=1
|
missing=1
|
||||||
fi
|
fi
|
||||||
if [ ! -d "${dest}/nodes" ] || [ -z "$(ls -A "${dest}/nodes" 2>/dev/null)" ]; then
|
if [ ! -d "${dest}/nodes" ] || [ -z "$(ls -A "${dest}/nodes" 2>/dev/null)" ]; then
|
||||||
warn "Saknas eller tom: ${dest}/nodes/"
|
warn "Missing or empty: ${dest}/nodes/"
|
||||||
missing=1
|
missing=1
|
||||||
fi
|
fi
|
||||||
if [ "${missing}" -ne 0 ]; then
|
if [ "${missing}" -ne 0 ]; then
|
||||||
die "Paketlayout fel efter kopiering — förväntat package.json + lib/ + nodes/ under ${dest}"
|
die "Wrong package layout after copy — expected package.json + lib/ + nodes/ under ${dest}"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
copy_node_package() {
|
copy_node_package() {
|
||||||
local dest="${NODERED_DIR}/nodes/nextcloud-collabora"
|
local dest="${NODERED_DIR}/nodes/nextcloud-collabora"
|
||||||
log "Kopierar paket → ${dest} (lib/ + nodes/, inte platt)"
|
log "Copying package → ${dest} (lib/ + nodes/, not flat)"
|
||||||
|
|
||||||
rm -rf "${dest}"
|
rm -rf "${dest}"
|
||||||
mkdir -p "${dest}/lib" "${dest}/nodes"
|
mkdir -p "${dest}/lib" "${dest}/nodes"
|
||||||
@@ -265,16 +265,16 @@ copy_node_package() {
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
assert_package_layout "${dest}"
|
assert_package_layout "${dest}"
|
||||||
log "Paketlayout OK: ${dest}/{package.json,lib/,nodes/}"
|
log "Package layout OK: ${dest}/{package.json,lib/,nodes/}"
|
||||||
}
|
}
|
||||||
|
|
||||||
patch_dockerfile() {
|
patch_dockerfile() {
|
||||||
local df="${NODERED_DIR}/Dockerfile"
|
local df="${NODERED_DIR}/Dockerfile"
|
||||||
if grep -q "${MARKER}" "${df}"; then
|
if grep -q "${MARKER}" "${df}"; then
|
||||||
log "Dockerfile redan patchad"
|
log "Dockerfile already patched"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
log "Patchar Dockerfile"
|
log "Patching Dockerfile"
|
||||||
cat >> "${df}" <<'EOF'
|
cat >> "${df}" <<'EOF'
|
||||||
|
|
||||||
# nextcloud-collabora-nodered — Collabora/Office-noder (WebDAV + CODE REST)
|
# nextcloud-collabora-nodered — Collabora/Office-noder (WebDAV + CODE REST)
|
||||||
@@ -291,16 +291,16 @@ patch_entrypoint() {
|
|||||||
|
|
||||||
# Rensa trasig tidigare patch (rå cp-rader utan install_nodes)
|
# Rensa trasig tidigare patch (rå cp-rader utan install_nodes)
|
||||||
if grep -q 'cp -a /opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora' "${ep}"; then
|
if grep -q 'cp -a /opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora' "${ep}"; then
|
||||||
log "Rensar trasig collabora-patch i entrypoint.sh"
|
log "Removing broken collabora patch from entrypoint.sh"
|
||||||
sed -i '/cp -a \/opt\/nextcloud-nodes\/node-red-contrib-nextcloud-collabora/d' "${ep}"
|
sed -i '/cp -a \/opt\/nextcloud-nodes\/node-red-contrib-nextcloud-collabora/d' "${ep}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if grep -q 'install_nodes.*Nextcloud Collabora' "${ep}"; then
|
if grep -q 'install_nodes.*Nextcloud Collabora' "${ep}"; then
|
||||||
log "entrypoint.sh redan patchad (Collabora install_nodes)"
|
log "entrypoint.sh already patched (Collabora install_nodes)"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
log "Patchar entrypoint.sh (install_nodes för Collabora)"
|
log "Patching entrypoint.sh (install_nodes for Collabora)"
|
||||||
if grep -q 'install_nodes.*Nextcloud OCS' "${ep}"; then
|
if grep -q 'install_nodes.*Nextcloud OCS' "${ep}"; then
|
||||||
sed -i '/install_nodes.*Nextcloud OCS/a\
|
sed -i '/install_nodes.*Nextcloud OCS/a\
|
||||||
install_nodes "/opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora" "/data/node_modules/node-red-contrib-nextcloud-collabora" "Nextcloud Collabora"' "${ep}"
|
install_nodes "/opt/nextcloud-nodes/node-red-contrib-nextcloud-collabora" "/data/node_modules/node-red-contrib-nextcloud-collabora" "Nextcloud Collabora"' "${ep}"
|
||||||
@@ -317,16 +317,16 @@ EOF
|
|||||||
}
|
}
|
||||||
|
|
||||||
connect_code_network() {
|
connect_code_network() {
|
||||||
log "Ansluter ${NODERED_CONTAINER} till Docker bridge (CODE)"
|
log "Connecting ${NODERED_CONTAINER} to Docker bridge (CODE)"
|
||||||
if docker network inspect bridge --format '{{range .Containers}}{{.Name}} {{end}}' 2>/dev/null | grep -q "${NODERED_CONTAINER}"; then
|
if docker network inspect bridge --format '{{range .Containers}}{{.Name}} {{end}}' 2>/dev/null | grep -q "${NODERED_CONTAINER}"; then
|
||||||
log "Redan ansluten till bridge"
|
log "Already connected to bridge"
|
||||||
else
|
else
|
||||||
docker network connect bridge "${NODERED_CONTAINER}" 2>/dev/null || warn "Kunde inte ansluta bridge — kontrollera manuellt"
|
docker network connect bridge "${NODERED_CONTAINER}" 2>/dev/null || warn "Could not connect bridge — check manually"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
rebuild_nodered() {
|
rebuild_nodered() {
|
||||||
log "Bygger om ${NODERED_CONTAINER} (samma instans, port ${NODERED_PORT})..."
|
log "Rebuilding ${NODERED_CONTAINER} (same instance, port ${NODERED_PORT})..."
|
||||||
fix_nodered_build_permissions
|
fix_nodered_build_permissions
|
||||||
verify_build_context
|
verify_build_context
|
||||||
if [ "${FORCE_REBUILD:-0}" = "1" ]; then
|
if [ "${FORCE_REBUILD:-0}" = "1" ]; then
|
||||||
@@ -338,36 +338,36 @@ rebuild_nodered() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
wait_nodered() {
|
wait_nodered() {
|
||||||
log "Väntar på Node-RED :${NODERED_PORT}..."
|
log "Waiting for Node-RED :${NODERED_PORT}..."
|
||||||
for i in $(seq 1 30); do
|
for i in $(seq 1 30); do
|
||||||
if curl -sf "http://127.0.0.1:${NODERED_PORT}" >/dev/null 2>&1; then
|
if curl -sf "http://127.0.0.1:${NODERED_PORT}" >/dev/null 2>&1; then
|
||||||
log "Node-RED svarar på http://127.0.0.1:${NODERED_PORT}"
|
log "Node-RED responding at http://127.0.0.1:${NODERED_PORT}"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
warn "Node-RED svarade inte inom 60 s"
|
warn "Node-RED did not respond within 60 s"
|
||||||
}
|
}
|
||||||
|
|
||||||
verify_code_from_nodered() {
|
verify_code_from_nodered() {
|
||||||
local code_ip
|
local code_ip
|
||||||
code_ip="$(code_bridge_ip)"
|
code_ip="$(code_bridge_ip)"
|
||||||
[ -n "${code_ip}" ] || code_ip="${COLLABORA_IP}"
|
[ -n "${code_ip}" ] || code_ip="${COLLABORA_IP}"
|
||||||
# CODE lyssnar på HTTPS internt (HTTP ger tom svar)
|
# CODE listens on HTTPS internally (HTTP returns empty reply)
|
||||||
local url="https://${code_ip}:9980/hosting/capabilities"
|
local url="https://${code_ip}:9980/hosting/capabilities"
|
||||||
log "Testar CODE från ${NODERED_CONTAINER}: ${url}"
|
log "Testing CODE from ${NODERED_CONTAINER}: ${url}"
|
||||||
if docker exec "${NODERED_CONTAINER}" curl -sfk "${url}" >/dev/null 2>&1; then
|
if docker exec "${NODERED_CONTAINER}" curl -sfk "${url}" >/dev/null 2>&1; then
|
||||||
log "OK: CODE nås från befintlig Node-RED-container"
|
log "OK: CODE reachable from Node-RED container"
|
||||||
else
|
else
|
||||||
warn "CODE nås inte — kör: docker network connect bridge ${NODERED_CONTAINER}"
|
warn "CODE not reachable — run: docker network connect bridge ${NODERED_CONTAINER}"
|
||||||
warn "nc-collab-config collaboraUrl=https://${code_ip}:9980 (verifyTls=false)"
|
warn "nc-collab-config collaboraUrl=https://${code_ip}:9980 (verifyTls=false)"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
resolve_paths
|
resolve_paths
|
||||||
log "Integrerar Collabora-noder i befintlig nextcloud-node-red"
|
log "Integrating Collabora nodes into existing nextcloud-node-red"
|
||||||
log "Paket: ${PKG_SRC}"
|
log "Package: ${PKG_SRC}"
|
||||||
log "Node-RED: ${NODERED_DIR} (container ${NODERED_CONTAINER})"
|
log "Node-RED: ${NODERED_DIR} (container ${NODERED_CONTAINER})"
|
||||||
|
|
||||||
stop_sidecar_if_any
|
stop_sidecar_if_any
|
||||||
@@ -388,18 +388,18 @@ main() {
|
|||||||
|
|
||||||
cat <<EOF
|
cat <<EOF
|
||||||
|
|
||||||
Integrering klar — samma Node-RED på port ${NODERED_PORT}
|
Integrating done — same Node-RED on port ${NODERED_PORT}
|
||||||
UI: http://${host_ip}:${NODERED_PORT}
|
UI: http://${host_ip}:${NODERED_PORT}
|
||||||
Noder: palett "nextcloud collabora" (6 st + config)
|
Palette: "nextcloud collabora" (6 nodes + config)
|
||||||
|
|
||||||
Skapa config först (kugghjul → nc-collab-config):
|
Create config first (gear → nc-collab-config):
|
||||||
Nextcloud: ${nc_url}
|
Nextcloud: ${nc_url}
|
||||||
Collabora: https://${code_ip}:9980 (verifyTls=false)
|
Collabora: https://${code_ip}:9980 (verifyTls=false)
|
||||||
Publik WOPI: ${nc_url}
|
Public WOPI: ${nc_url}
|
||||||
Auth: användarnamn + app-lösenord
|
Auth: username + app password
|
||||||
|
|
||||||
Testa: collabora-wopi (capabilities) → collabora-bridge (ncFileToPdf)
|
Try: collabora-wopi (capabilities) → collabora-bridge (ncFileToPdf)
|
||||||
Exempelflöde: flows/example-flows.json
|
Example flow: flows/example-flows.json
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
module.exports = {
|
module.exports = {
|
||||||
uiPort: process.env.PORT || 1881,
|
uiPort: process.env.PORT || 1881,
|
||||||
credentialSecret: process.env.NODERED_CREDENTIAL_SECRET || "byt-den-här-hemligheten-vid-produktion",
|
credentialSecret: process.env.NODERED_CREDENTIAL_SECRET || "change-this-secret-in-production",
|
||||||
flowFile: "flows.json",
|
flowFile: "flows.json",
|
||||||
userDir: "/data",
|
userDir: "/data",
|
||||||
logging: {
|
logging: {
|
||||||
|
|||||||
Reference in New Issue
Block a user