#!/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"