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