office-bridge.sh 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #!/bin/sh
  2. # 让 Cloudreve 与 OnlyOffice 两个容器都用 127.0.0.1 互相访问。
  3. # 容器重启后 docker exec 里的转发会消失,再执行一次本脚本即可。
  4. set -eu
  5. if ! docker exec cloudreve wget -qO- http://127.0.0.1/healthcheck >/dev/null 2>&1; then
  6. docker exec -d cloudreve python3 -c '
  7. import socket, threading
  8. def pipe(a, b):
  9. try:
  10. while True:
  11. d = a.recv(65536)
  12. if not d:
  13. break
  14. b.sendall(d)
  15. except Exception:
  16. pass
  17. try:
  18. a.close()
  19. except Exception:
  20. pass
  21. try:
  22. b.close()
  23. except Exception:
  24. pass
  25. def handle(c):
  26. try:
  27. s = socket.create_connection(("host.docker.internal", 80), 5)
  28. except Exception:
  29. c.close()
  30. return
  31. threading.Thread(target=pipe, args=(c, s), daemon=True).start()
  32. pipe(s, c)
  33. srv = socket.socket()
  34. srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  35. srv.bind(("0.0.0.0", 80))
  36. srv.listen(50)
  37. while True:
  38. c, _ = srv.accept()
  39. threading.Thread(target=handle, args=(c,), daemon=True).start()
  40. '
  41. fi
  42. if ! docker exec onlyoffice-docs curl -sf -o /dev/null --max-time 3 http://127.0.0.1:5212/; then
  43. docker exec -d onlyoffice-docs python3 -c '
  44. import socket, threading
  45. def pipe(a, b):
  46. try:
  47. while True:
  48. d = a.recv(65536)
  49. if not d:
  50. break
  51. b.sendall(d)
  52. except Exception:
  53. pass
  54. try:
  55. a.close()
  56. except Exception:
  57. pass
  58. try:
  59. b.close()
  60. except Exception:
  61. pass
  62. def handle(c):
  63. try:
  64. s = socket.create_connection(("host.docker.internal", 5212), 5)
  65. except Exception:
  66. c.close()
  67. return
  68. threading.Thread(target=pipe, args=(c,), daemon=True).start()
  69. pipe(s, c)
  70. srv = socket.socket()
  71. srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  72. srv.bind(("0.0.0.0", 5212))
  73. srv.listen(50)
  74. while True:
  75. c, _ = srv.accept()
  76. threading.Thread(target=handle, args=(c,), daemon=True).start()
  77. '
  78. fi
  79. docker exec -i onlyoffice-docs python3 - << 'PY'
  80. import json
  81. p = "/etc/onlyoffice/documentserver/local.json"
  82. d = json.load(open(p))
  83. rules = d.setdefault("services", {}).setdefault("CoAuthoring", {}).setdefault("ipfilter", {}).setdefault("rules", [])
  84. have = {r.get("address") for r in rules}
  85. for addr in ("127.0.0.1", "::1", "localhost", "host.docker.internal"):
  86. if addr not in have:
  87. rules.append({"address": addr, "allowed": True})
  88. wopi = d.setdefault("wopi", {})
  89. wopi["enable"] = True
  90. json.dump(d, open(p, "w"), indent=2)
  91. print("ipfilter", [r.get("address") for r in rules])
  92. PY
  93. echo "bridge ready"