Nextcloud + OnlyOffice + Draw.io 를 한 번에 올리는 Stack YAML

Nextcloud + OnlyOffice + Draw.io 를 한 번에 올리는 Stack YAML


0. 왜 이 조합인가? (시놀로지 → 미니 PC로 옮긴 배경)

Nextcloud는

  • 파일 저장소
  • 인사·그룹웨어
  • 캘린더/업무 관리

까지 다 되는 꽤 묵직한 솔루션입니다.

하지만 저는 이 중에서도 특히 두 가지 때문에 Nextcloud를 선택했습니다.

  1. Draw.io(다이어그램 편집)
    • 네트워크 구성도, 홈랩 아키텍처, VLAN 설계도 등을 브라우저에서 바로 그릴 수 있습니다.
  2. OnlyOffice(문서/엑셀/프레젠테이션 편집)
    • 로컬 오피스 없이도, 팀원이 어디서든 웹으로 문서 협업이 가능합니다.

처음에는 이 구성을 시놀로지 NAS의 Docker 위에 올려봤습니다.
하지만,

  • CPU·RAM이 빠듯하고,
  • Nextcloud + OnlyOffice가 생각보다 무거워서

조금만 사용자가 몰리면 웹 UI가 버벅거렸습니다.

그래서 최종 구조를 다음처럼 바꿨습니다.

  • 서비스 실행: 미니PC(우분투) + Docker + Portainer Stack
  • 스토리지: 시놀로지 NAS(or 대용량 스토리지)를 NFS로 마운트해서 /mnt/nextcloud/data 로 사용

즉, 연산은 미니PC, 용량은 NAS를 쓰는 구조입니다.
이 글에서는 이 구성을 그대로 재현할 수 있도록, docker-compose.yml과 튜닝 포인트를 단계별로 설명합니다.


1. 전체 아키텍처 한눈에 보기

이번 스택은 크게 네 가지 컨테이너로 구성됩니다.

  1. MariaDB
    • Nextcloud의 모든 메타데이터(계정, 권한, 파일 목록)를 관리하는 DB
  2. Redis
    • 세션·캐시를 담당해서 Nextcloud 응답 속도를 크게 끌어올리는 역할
    • 캐시 용도라서, 컨테이너가 재시작되면서 데이터가 날아가도 서비스에는 지장이 없습니다.
  3. Nextcloud (Apache 이미지)
    • 실제 웹 UI와 API를 제공하는 본체
  4. OnlyOffice DocumentServer
    • 브라우저 오피스 편집 엔진 (Nextcloud와 연동해서 문서를 열고 편집)

그리고 Nextcloud의 정기 작업(CRON) 을 위해 동일 이미지를 사용하는 cron 컨테이너를 따로 둡니다.

데이터 배치 전략은 다음과 같습니다.

  • DB, Nextcloud 코드, OnlyOffice 데이터 → 미니PC 로컬 SSD (/opt/...)
  • 실제 사용자 파일(대용량) → NAS NFS 마운트 (/mnt/nextcloud/data)

DB와 앱은 SSD에 두고, 대용량 파일만 NAS에 두는 게 성능/안정성 모두에서 최선입니다.


2. Portainer에서 Stack으로 배포하는 방법

Portainer 기준으로는 다음 순서로 진행하면 됩니다.

  1. 미니PC 우분투에 Docker · Portainer 설치 (생략)
  2. NAS 공유 폴더를 미니PC에 NFS로 마운트
    • 예: NAS에서 /volume1/nextcloud-data 공유 →
      우분투에서 /mnt/nextcloud/data 로 마운트
  3. /opt/nextcloud, /opt/onlyoffice 디렉터리 생성
  4. Portainer → StacksAdd stack
  5. 아래 docker-compose.yml 전체를 복사해 붙여 넣기
  6. your_* 로 되어있는 부분들을 본인 환경에 맞게 수정
  7. Deploy the stack 클릭

이제 서비스별로 무엇을 하는지, 어떤 포인트를 조정해야 하는지 하나씩 짚어보겠습니다.


3. 실제로 사용하는 docker-compose.yml (Portainer Stack용)

아래 코드는 개인정보를 모두 더미 값으로 치환한 버전입니다.
그대로 가져가서 비밀번호·도메인·경로만 수정하시면 됩니다.

services:
mariadb:
image: mariadb:11.4-noble
container_name: nextcloud-db
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW --innodb-read-only-compressed=OFF
security_opt:
- no-new-privileges:false
environment:
- MYSQL_ROOT_PASSWORD=your_root_password # 변경 필요
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=your_db_password # 변경 필요
- TZ=Asia/Seoul
volumes:
# ★ DB는 성능을 위해 반드시 로컬 SSD 사용 (NFS 권장 안 함)
- /opt/nextcloud/db:/var/lib/mysql:rw
restart: on-failure:5
redis:
image: redis:7-alpine
container_name: nextcloud-redis
hostname: nextcloudredis
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
environment:
- TZ=Asia/Seoul
volumes:
- /opt/nextcloud/redis:/data:rw
# 캐시 용도이므로, 영속 저장이 꼭 필요하진 않습니다.
# 필요하다면 --save "" 로 완전히 끄거나 기본 설정을 사용해도 됩니다.
command: ["redis-server", "--save", "60", "1000", "--appendonly", "no"]
restart: on-failure:5
nextcloud:
image: nextcloud:apache
container_name: nextcloud
depends_on:
mariadb:
condition: service_started
redis:
condition: service_healthy
devices:
- /dev/dri:/dev/dri # 하드웨어 가속 필요 시
ports:
- 8080:80 # 포트는 본인 환경에 맞게 변경
environment:
- MYSQL_HOST=mariadb
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=your_db_password # DB 비밀번호와 동일하게
- REDIS_HOST=nextcloudredis
- NEXTCLOUD_ADMIN_USER=admin # 초기 관리자 ID
- NEXTCLOUD_ADMIN_PASSWORD=your_admin_password # 초기 관리자 PW
# 리버스 프록시(Nginx Proxy Manager 등) 사용 시 아래 도메인 설정 필수
- NEXTCLOUD_TRUSTED_DOMAINS=nextcloud.yourdomain.com 192.168.1.100
- TRUSTED_PROXIES=192.168.1.100
- OVERWRITEHOST=nextcloud.yourdomain.com
- OVERWRITEPROTOCOL=https
- TZ=Asia/Seoul
volumes:
# ★ Nextcloud 애플리케이션 및 설정 (로컬 SSD 권장)
- /opt/nextcloud/html:/var/www/html:rw
- /opt/nextcloud/custom_apps:/var/www/html/custom_apps:rw
- /opt/nextcloud/config:/var/www/html/config:rw
- /opt/nextcloud/themes:/var/www/html/themes:rw
# ★ 실제 사용자 데이터 (대용량 처리를 위해 NFS 마운트 경로 사용)
- /mnt/nextcloud/data:/var/www/html/data:rw
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:80/"]
interval: 30s
timeout: 10s
retries: 5
restart: on-failure:5
cron:
image: nextcloud:apache
container_name: nextcloud-cron
depends_on:
mariadb:
condition: service_started
redis:
condition: service_started
entrypoint: /cron.sh
volumes:
- /opt/nextcloud/html:/var/www/html:rw
- /opt/nextcloud/custom_apps:/var/www/html/custom_apps:rw
- /opt/nextcloud/config:/var/www/html/config:rw
- /mnt/nextcloud/data:/var/www/html/data:rw # 데이터 경로 일치시킬 것
- /opt/nextcloud/themes:/var/www/html/themes:rw
restart: always
onlyoffice:
image: onlyoffice/documentserver:latest
container_name: onlyoffice
hostname: onlyoffice
ports:
- 8081:80 # 포트는 본인 환경에 맞게 변경
environment:
- TZ=Asia/Seoul
- JWT_ENABLED=true
- JWT_SECRET=your_jwt_secret_key # 강력한 난수로 변경 필요
- JWT_HEADER=AuthorizationJwt
volumes:
# OnlyOffice는 편집 엔진이므로 로컬 SSD 권장
- /opt/onlyoffice/logs:/var/log/onlyoffice:rw
- /opt/onlyoffice/data:/var/www/onlyoffice/Data:rw
- /opt/onlyoffice/lib:/var/lib/onlyoffice:rw
- /opt/onlyoffice/fonts:/usr/share/fonts/truetype/custom:rw
- /opt/onlyoffice/database:/var/lib/postgresql:rw
# ★ 중요: 업로드/저장 용량 제한 해제를 위한 설정 파일 마운트
- /opt/onlyoffice/default.json:/etc/onlyoffice/documentserver/default.json:rw
healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost || exit 1"]
interval: 30s
timeout: 10s
retries: 5
start_period: 90s
restart: on-failure:5

4. OnlyOffice 용량 제한 해제 튜닝(default.json 마운트)

OnlyOffice DocumentServer는 기본 설정 상태에서

  • 업로드 가능한 문서 크기
  • 변환/편집 가능한 최대 파일 크기

제한(2MB)이 걸려 있습니다.
대용량 PPT나 PDF를 다루다 보면 “파일이 너무 큽니다” 오류가 뜨는 이유가 바로 이 설정입니다.

이를 해결하기 위해 위 YAML에서 다음 라인이 들어가 있습니다.

- /opt/onlyoffice/default.json:/etc/onlyoffice/documentserver/default.json:rw
- /opt/onlyoffice/default.json:/etc/onlyoffice/documentserver/default.json:rw

의미는 다음과 같습니다.

  1. 호스트(미니PC)의 /opt/onlyoffice/default.json 파일을
  2. 컨테이너 내부의 설정 파일 위치인
    /etc/onlyoffice/documentserver/default.json직접 덮어쓰기(mount) 하겠다.

즉, 설정 파일을 우리 쪽에서 컨트롤하는 구조입니다.

4-1. default.json 수정 예시

공식 default.json을 한 번 복사해온 뒤,
아래와 같이 업로드 제한 관련 값을 증가시켜 줍니다.

  • 위 예시는 uploadMaxFileSize2GB 로 올린 것입니다.
  • 실제로는 팀의 문서 크기에 맞춰 100MB, 1GB 등으로 조정하시면 됩니다.

이렇게 수정한 default.json/opt/onlyoffice/default.json 에 저장한 뒤
컨테이너를 재시작하면, OnlyOffice의 용량 제한이 풀린 상태로 동작합니다.


5. NFS 마운트로 Nextcloud 데이터 분리하기 (VLAN 기반 구성 추천)

Nextcloud의 사용자 데이터는 용량이 가장 크고, IO도 많이 발생합니다.
그래서 /var/www/html/data 를 아래처럼 NFS 마운트 경로로 분리했습니다.

- /mnt/nextcloud/data:/var/www/html/data:rw
- /mnt/nextcloud/data:/var/www/html/data:rw

사전에 우분투에서 다음처럼 NFS를 마운트해 두어야 합니다.

sudo mkdir -p /mnt/nextcloud/data

# 예시: 시놀로지 NAS 192.168.1.10:/volume1/nextcloud-data 를 마운트
sudo mount -t nfs 192.168.1.10:/volume1/nextcloud-data /mnt/nextcloud/data
sudo mkdir -p /mnt/nextcloud/data
# 예시: 시놀로지 NAS 192.168.1.10:/volume1/nextcloud-data 를 마운트
sudo mount -t nfs 192.168.1.10:/volume1/nextcloud-data /mnt/nextcloud/data

여기서 권장하는 구조는 다음과 같습니다.

  • 전용 VLAN + NFS 전용 네트워크
    • 홈랩이라도, 서비스용 트래픽과 NFS 트래픽을 분리하면
      • 안정적인 속도
      • 보안 측면(내부망 분리)
        에서 이점이 큽니다.
  • 가능하면 NFS v4 기준으로 설정하고, 마운트 옵션에 noatime, nfsvers=4 등을 함께 넣어 튜닝해 주면 더 좋습니다.

이 부분은 별도의 글에서 자세히 다뤘습니다.
네트워크 설계까지 한 번에 이해하고 싶다면 아래 글을 먼저 읽고 오시는 것을 권장합니다.

👉 [필독] 시놀로지 NAS + 미니PC VLAN 기반 NFS 완벽 설정 가이드 (Ubuntu 24 + Synology DS923+)](https://itcontainer.co.kr/2025/10/22/시놀로지-nas-미니pc-vlan-기반-nfs-완벽-설정-가이드-ubuntu-24-synology-ds923/)

/etc/fstab 에 등록해서 재부팅 후 자동 마운트되도록 설정해 두는 것도 잊지 마세요.
저의 경우는 아래와 같이 mount되어 있으니 참조바랍니다.


6. Nextcloud, OnlyOffice, Draw.io 연동 설정

컨테이너가 모두 떠 있으면, 브라우저에서 http://미니PCIP:8080 으로 접속해 초기 설정을 마칩니다.

6-1. OnlyOffice 플러그인 설정 + JWT 헤더 맞추기

  1. Nextcloud 관리자 계정으로 로그인
  2. 앱(Apps)Office & text 카테고리에서 ONLYOFFICE 앱 설치
  3. 설치 후 관리자 설정 → ONLYOFFICE 메뉴로 이동
  4. ONLYOFFICE Docs address 에 DocumentServer URL 입력
    • 예) http://onlyoffice:80 (동일 도커 네트워크 내)
    • 리버스 프록시를 써서 https://onlyoffice.yourdomain.com 으로 노출한 경우 그 주소 사용
  5. JWT 시크릿your_jwt_secret_key 와 동일하게 맞춰줍니다.
  6. 그리고 중요한 부분 하나,
    우리가 compose에서 다음과 같이 설정했기 때문에: – JWT_HEADER=AuthorizationJwt- JWT_HEADER=AuthorizationJwt Nextcloud의 ONLYOFFICE 설정 화면에 있는
    고급 설정 → “Authorization header” 항목도 반드시 AuthorizationJwt 로 변경해 줘야 합니다.
    이 값이 서로 다르면 JWT 인증이 실패해서 문서가 열리지 않습니다.

이제 Nextcloud에서 DOCX/XLSX/PPTX 파일을 클릭하면
브라우저 상에서 바로 OnlyOffice 에디터가 열립니다.

6-2. Draw.io(다이어그램) 앱 설치

  1. 앱(Apps) → 검색창에 draw.io 또는 diagrams 검색
  2. “Draw.io / Diagrams” 앱 설치
  3. 설치 완료 후, 새 파일 만들기 → 다이어그램 선택

이제 네트워크 구성도, 홈랩 토폴로지, 시퀀스 다이어그램 등을
Nextcloud 내에서 바로 그릴 수 있습니다.


7. 마무리 – 구글 드라이브 부럽지 않은 나만의 협업 툴

정리해 보면, 이 구성의 핵심은 다음 세 줄로 요약할 수 있습니다.

  1. 미니PC(연산) + NAS(NFS 스토리지) 로 역할을 분리해 성능과 확장성을 동시에 잡고,
  2. Nextcloud + OnlyOffice + Draw.io 를 한 UI 안에 통합해 문서·다이어그램·파일을 한 곳에서 관리하고,
  3. OnlyOffice 용량 제한 해제 + VLAN 기반 NFS 로 실사용에 필요한 튜닝까지 끝낸다.

이 세팅 하나면,

구글 드라이브 · 구글 문서 부럽지 않은
“나만의 프라이빗 협업 플랫폼”이 완성
됩니다.

여기에 Immich, Jellyfin, Joplin 같은 컨테이너를 추가로 얹으면
진짜 의미의 홈랩 포털이 되니, 차근차근 확장해 보셔도 좋겠습니다.