Files
shanxia2.0/doclib/scripts/office-bridge.sh
T
2026-10-23 02:46:55 +08:00

98 lines
2.6 KiB
Bash
Executable File

#!/bin/sh
# 让 Cloudreve 与 OnlyOffice 两个容器都用 127.0.0.1 互相访问。
# 容器重启后 docker exec 里的转发会消失,再执行一次本脚本即可。
set -eu
if ! docker exec cloudreve wget -qO- http://127.0.0.1/healthcheck >/dev/null 2>&1; then
docker exec -d cloudreve python3 -c '
import socket, threading
def pipe(a, b):
try:
while True:
d = a.recv(65536)
if not d:
break
b.sendall(d)
except Exception:
pass
try:
a.close()
except Exception:
pass
try:
b.close()
except Exception:
pass
def handle(c):
try:
s = socket.create_connection(("host.docker.internal", 80), 5)
except Exception:
c.close()
return
threading.Thread(target=pipe, args=(c, s), daemon=True).start()
pipe(s, c)
srv = socket.socket()
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(("0.0.0.0", 80))
srv.listen(50)
while True:
c, _ = srv.accept()
threading.Thread(target=handle, args=(c,), daemon=True).start()
'
fi
if ! docker exec onlyoffice-docs curl -sf -o /dev/null --max-time 3 http://127.0.0.1:5212/; then
docker exec -d onlyoffice-docs python3 -c '
import socket, threading
def pipe(a, b):
try:
while True:
d = a.recv(65536)
if not d:
break
b.sendall(d)
except Exception:
pass
try:
a.close()
except Exception:
pass
try:
b.close()
except Exception:
pass
def handle(c):
try:
s = socket.create_connection(("host.docker.internal", 5212), 5)
except Exception:
c.close()
return
threading.Thread(target=pipe, args=(c,), daemon=True).start()
pipe(s, c)
srv = socket.socket()
srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
srv.bind(("0.0.0.0", 5212))
srv.listen(50)
while True:
c, _ = srv.accept()
threading.Thread(target=handle, args=(c,), daemon=True).start()
'
fi
docker exec -i onlyoffice-docs python3 - << 'PY'
import json
p = "/etc/onlyoffice/documentserver/local.json"
d = json.load(open(p))
rules = d.setdefault("services", {}).setdefault("CoAuthoring", {}).setdefault("ipfilter", {}).setdefault("rules", [])
have = {r.get("address") for r in rules}
for addr in ("127.0.0.1", "::1", "localhost", "host.docker.internal"):
if addr not in have:
rules.append({"address": addr, "allowed": True})
wopi = d.setdefault("wopi", {})
wopi["enable"] = True
json.dump(d, open(p, "w"), indent=2)
print("ipfilter", [r.get("address") for r in rules])
PY
echo "bridge ready"