Nextcloud 에서 문서를 편집하려면 문서 서버가 따로 필요하다. 선택지는 Collabora Online(CODE) 과 ONLYOFFICE Document Server 둘이다. 두 제품 모두 브라우저가 Nextcloud 와 문서 서버 양쪽에 직접 접속하는 구조라, 리버스 프록시 뒤에 둘 때 실패하는 지점이 정해져 있다. WebSocket, TLS 종단 위치, 그리고 문서 서버가 허용할 Nextcloud 도메인 세 가지다.
브라우저는 Nextcloud 화면을 받은 뒤 문서 편집 영역을 문서 서버 주소로 직접 연다. 즉 문서 서버도 외부에서 접근 가능한 이름과 인증서를 가져야 한다. 서버끼리만 통신하는 구조가 아니다.
| 구성 요소 | 예시 주소 | 역할 |
|---|---|---|
| Nextcloud | https://cloud.example.com |
파일 저장과 공유 |
| 문서 서버 | https://office.example.com |
편집 세션 처리 |
| 리버스 프록시 | 두 이름 모두 처리 | TLS 종단 |
컨테이너로 올리고 TLS 는 프록시가 끊는다.
docker run -d --name collabora \
-p 9980:9980 \
-e "aliasgroup1=https://cloud\.example\.com:443" \
-e "server_name=office.example.com" \
-e "extra_params=--o:ssl.enable=false --o:ssl.termination=true" \
-e "username=admin" -e "password=${ADMIN_PASSWORD}" \
--restart always \
collabora/code
핵심은 세 가지다.
aliasgroup1 에 이 문서 서버를 쓸 Nextcloud 주소를 정규식으로 적는다. 점을 이스케이프해야 한다. 여기에 없는 도메인에서 오면 문서 서버가 거부한다. 예전 이미지에서는 같은 역할을 domain 환경변수가 했고 지금 이미지는 aliasgroup 계열을 쓰므로, 쓰는 이미지 태그의 문서를 확인한다.server_name 에 외부에서 보이는 문서 서버 이름을 적는다. 이 값이 비면 CODE 가 프록시 뒤에서 자기 주소를 잘못 만들어 낸다.ssl.enable=false 와 ssl.termination=true 는 "내가 TLS 를 끊지 않고 앞단이 이미 끊었다" 는 뜻이다. 둘 중 하나만 주면 무한 리다이렉트나 혼합 콘텐츠가 된다.extra_params 는 환경변수 하나에 옵션을 모두 넣는다. 같은 이름으로 여러 번 주면 마지막 것만 남는다.
docker run -d --name onlyoffice \
-p 8080:80 \
-e JWT_ENABLED=true \
-e JWT_SECRET=${JWT_SECRET} \
--restart always \
onlyoffice/documentserver
ONLYOFFICE 는 JWT 로 요청을 검증한다. 컨테이너에 준 JWT_SECRET 과 Nextcloud 의 ONLYOFFICE 앱 설정에 넣는 비밀 값이 글자 단위로 같아야 한다. 다르면 편집 화면에서 다운로드 실패 계열의 오류만 보이고 원인은 로그에만 남는다.
| 항목 | 이유 |
|---|---|
| WebSocket 허용 | 편집 세션이 WebSocket 으로 유지된다. 끄면 문서가 열리다 멈춘다 |
proxy_read_timeout 을 넉넉히 |
큰 문서 변환이 기본 타임아웃을 넘긴다 |
client_max_body_size 상향 |
첨부와 이미지 업로드가 막힌다 |
X-Forwarded-Proto 전달 |
문서 서버가 자기 주소를 http 로 만들어 혼합 콘텐츠가 된다 |
Nginx Proxy Manager 를 쓴다면 프록시 호스트의 Websockets Support 를 켜고, Advanced 탭에 타임아웃과 본문 크기를 직접 적는다.
Nextcloud 가 프록시 뒤에 있으면 config.php 에 신뢰할 프록시와 도메인을 알려 줘야 한다. 이게 빠지면 생성되는 링크가 내부 주소가 되어 문서 서버가 파일을 받아 오지 못한다.
'trusted_domains' => ['cloud.example.com'],
'trusted_proxies' => ['192.168.0.0/24'],
'overwrite.cli.url' => 'https://cloud.example.com',
'overwriteprotocol' => 'https',
그다음 Nextcloud 관리자 화면의 Office 설정에서 문서 서버 URL 을 https://office.example.com 으로 지정한다.
curl -sI https://office.example.com/hosting/discovery | head -n 1
docker logs -f collabora
Collabora 는 /hosting/discovery 가 XML 을 돌려주면 외부에서 도달 가능한 상태다. 문서가 열리지 않으면 브라우저 개발자 도구의 네트워크 탭에서 어느 요청이 막히는지부터 본다. 대개 WebSocket 업그레이드가 401 이나 502 로 끝난다.