0. 왜 이 조합인가? (시놀로지 → 미니 PC로 옮긴 배경)
Nextcloud는
- 파일 저장소
- 인사·그룹웨어
- 캘린더/업무 관리
까지 다 되는 꽤 묵직한 솔루션입니다.
하지만 저는 이 중에서도 특히 두 가지 때문에 Nextcloud를 선택했습니다.
- Draw.io(다이어그램 편집)
- 네트워크 구성도, 홈랩 아키텍처, VLAN 설계도 등을 브라우저에서 바로 그릴 수 있습니다.
- OnlyOffice(문서/엑셀/프레젠테이션 편집)
- 로컬 오피스 없이도, 팀원이 어디서든 웹으로 문서 협업이 가능합니다.
처음에는 이 구성을 시놀로지 NAS의 Docker 위에 올려봤습니다.
하지만,
- CPU·RAM이 빠듯하고,
- Nextcloud + OnlyOffice가 생각보다 무거워서
조금만 사용자가 몰리면 웹 UI가 버벅거렸습니다.
그래서 최종 구조를 다음처럼 바꿨습니다.
- 서비스 실행: 미니PC(우분투) + Docker + Portainer Stack
- 스토리지: 시놀로지 NAS(or 대용량 스토리지)를 NFS로 마운트해서
/mnt/nextcloud/data로 사용
즉, 연산은 미니PC, 용량은 NAS를 쓰는 구조입니다.
이 글에서는 이 구성을 그대로 재현할 수 있도록, docker-compose.yml과 튜닝 포인트를 단계별로 설명합니다.
1. 전체 아키텍처 한눈에 보기
이번 스택은 크게 네 가지 컨테이너로 구성됩니다.
- MariaDB
- Nextcloud의 모든 메타데이터(계정, 권한, 파일 목록)를 관리하는 DB
- Redis
- 세션·캐시를 담당해서 Nextcloud 응답 속도를 크게 끌어올리는 역할
- 캐시 용도라서, 컨테이너가 재시작되면서 데이터가 날아가도 서비스에는 지장이 없습니다.
- Nextcloud (Apache 이미지)
- 실제 웹 UI와 API를 제공하는 본체
- OnlyOffice DocumentServer
- 브라우저 오피스 편집 엔진 (Nextcloud와 연동해서 문서를 열고 편집)
그리고 Nextcloud의 정기 작업(CRON) 을 위해 동일 이미지를 사용하는 cron 컨테이너를 따로 둡니다.
데이터 배치 전략은 다음과 같습니다.
- DB, Nextcloud 코드, OnlyOffice 데이터 → 미니PC 로컬 SSD (
/opt/...) - 실제 사용자 파일(대용량) → NAS NFS 마운트 (
/mnt/nextcloud/data)
DB와 앱은 SSD에 두고, 대용량 파일만 NAS에 두는 게 성능/안정성 모두에서 최선입니다.
2. Portainer에서 Stack으로 배포하는 방법
Portainer 기준으로는 다음 순서로 진행하면 됩니다.
- 미니PC 우분투에 Docker · Portainer 설치 (생략)
- NAS 공유 폴더를 미니PC에 NFS로 마운트
- 예: NAS에서
/volume1/nextcloud-data공유 →
우분투에서/mnt/nextcloud/data로 마운트
- 예: NAS에서
/opt/nextcloud,/opt/onlyoffice디렉터리 생성- Portainer → Stacks → Add stack
- 아래
docker-compose.yml전체를 복사해 붙여 넣기 your_*로 되어있는 부분들을 본인 환경에 맞게 수정- 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
의미는 다음과 같습니다.
- 호스트(미니PC)의
/opt/onlyoffice/default.json파일을 - 컨테이너 내부의 설정 파일 위치인
/etc/onlyoffice/documentserver/default.json에 직접 덮어쓰기(mount) 하겠다.
즉, 설정 파일을 우리 쪽에서 컨트롤하는 구조입니다.
4-1. default.json 수정 예시
공식 default.json을 한 번 복사해온 뒤,
아래와 같이 업로드 제한 관련 값을 증가시켜 줍니다.

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

이제 Nextcloud에서 DOCX/XLSX/PPTX 파일을 클릭하면
브라우저 상에서 바로 OnlyOffice 에디터가 열립니다.
6-2. Draw.io(다이어그램) 앱 설치
- 앱(Apps) → 검색창에
draw.io또는diagrams검색 - “Draw.io / Diagrams” 앱 설치
- 설치 완료 후, 새 파일 만들기 → 다이어그램 선택
이제 네트워크 구성도, 홈랩 토폴로지, 시퀀스 다이어그램 등을
Nextcloud 내에서 바로 그릴 수 있습니다.
7. 마무리 – 구글 드라이브 부럽지 않은 나만의 협업 툴
정리해 보면, 이 구성의 핵심은 다음 세 줄로 요약할 수 있습니다.
- 미니PC(연산) + NAS(NFS 스토리지) 로 역할을 분리해 성능과 확장성을 동시에 잡고,
- Nextcloud + OnlyOffice + Draw.io 를 한 UI 안에 통합해 문서·다이어그램·파일을 한 곳에서 관리하고,
- OnlyOffice 용량 제한 해제 + VLAN 기반 NFS 로 실사용에 필요한 튜닝까지 끝낸다.
이 세팅 하나면,
구글 드라이브 · 구글 문서 부럽지 않은
“나만의 프라이빗 협업 플랫폼”이 완성됩니다.
여기에 Immich, Jellyfin, Joplin 같은 컨테이너를 추가로 얹으면
진짜 의미의 홈랩 포털이 되니, 차근차근 확장해 보셔도 좋겠습니다.

