시놀로지 NAS Outline 셀프 호스팅 구축 가이드 (Portainer 활용)
시놀로지 NAS 환경에서 Portainer를 활용하여 오픈소스 문서 도구 Outline을 구축하는 상세 절차. Slack OAuth 연동, 파일 권한 설정 및 Docker Compose 구성을 포함함.
1. 개요 및 비교 분석
Outline은 팀 협업을 위한 고성능 지식 베이스(Knowledge Base) 및 위키 도구임. 직관적인 UI와 실시간 동시 편집, 강력한 검색 기능을 제공함. 클라우드 버전(SaaS) 이용 시 사용자당 비용이 발생하나, 셀프 호스팅을 통해 비용 절감이 가능함.

1.1 Outline vs Notion
Notion은 올인원 워크스페이스로 기능이 방대하지만, 문서 로딩 속도가 느려지는 단점이 존재함. 반면 Outline은 다음과 같은 강점이 있음.
- 속도: 매우 가볍고 빠른 페이지 로딩 및 전환 속도 보장.
- Markdown: 마크다운 문법을 완벽하게 지원하며 깔끔한 구조 유지.
- 오픈소스: 데이터 주권 확보 및 커스터마이징 가능.
- 비용: 셀프 호스팅 시 하드웨어 유지비 외 추가 라이선스 비용 없음.
설치
2. Slack OAuth 인증 설정
Outline은 이메일 로그인 외에 소셜 로그인을 권장하며, 팀 단위 관리에 유리한 Slack OAuth 연동이 가장 용이함.
- Slack API 접속: https://api.slack.com/apps 이동.
- App 생성: 'Create New App' 클릭 후 'From scratch' 선택.
- 앱 이름 및 워크스페이스 선택: App Name 설정 및 연동할 워크스페이스 지정.
- Client ID / Secret 확보: Basic Information 탭에서
Client ID와Client Secret복사 (추후.env설정에 사용). - Redirect URLs 설정:
OAuth & Permissions탭 이동.- Redirect URLs에
https://<나의-도메인>/auth/slack.callback추가.





왼쪽메뉴 상단에 "Basic Information" 으로 이동

Client Id & Client Secret 를 기록해둡니다.
3. 시놀로지 NAS 파일 시스템 구성
Docker 컨테이너 구동에 필요한 데이터 영속성(Persistence)을 위해 폴더 및 파일을 사전 생성해야 함.
3.1 폴더 및 파일 생성
File Station을 통해 아래 구조로 디렉토리 및 파일을 생성함.
- 경로:
/docker/outline(상위 폴더 예시) - 폴더:
database-data(PostgreSQL 데이터 저장)storage-data(MinIO 파일 저장)
- 파일:
redis.conf(빈 파일 생성 후 업로드)
3.2 권한 설정 (작업 스케줄러 활용)
MinIO 및 Redis 컨테이너의 정상 작동을 위해 특정 UID/GID 권한 및 파일 모드 변경이 필수적임. SSH 접속이 번거로운 경우 시놀로지 '작업 스케줄러'를 활용하여 일회성 스크립트로 처리 가능함.
sudo chown root:root /volume1/docker/outline/redis.conf
sudo chmod 644 /volume1/docker/outline/redis.confstorage-data의 권한을 1001사용자로 만들기
방법은 2가지입니다.
1.ssh를 이용 chown 1001 위에서 폴더만든곳의 위치/storage-data
2.작업스케줄러를 이용해서 root 작업으로 chown 1001 위에서 폴더만든곳의 위치/storage-data
ps ssh를 잘모르는 사용자를 위해서 "작업스케줄러"를 이용하시면 편합니다.
응용가능 방법은 링크 : https://kage2kapp.org/synology_filestation_chmod755/
Portainer -> stack
services:
outline:
image: docker.getoutline.com/outlinewiki/outline:latest
container_name: outline-app
hostname: outline-app
ports:
- 6710:3000
volumes:
- /volume1/docker/outline/storage-data:/var/lib/outline/data
depends_on:
- postgres
- redis
environment:
NODE_ENV: production
FORCE_HTTPS: ${FORCE_HTTPS:-true}
PGSSLMODE: disable
SECRET_KEY: ${SECRET_KEY}
UTILS_SECRET: ${UTILS_SECRET}
DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@outline-postgres:5432/${POSTGRES_DB}
REDIS_URL: redis://outline-redis:6379
URL: ${URL}
PORT: ${PORT:-3000}
FILE_STORAGE: local
FILE_STORAGE_LOCAL_ROOT_DIR: /var/lib/outline/data
FILE_STORAGE_UPLOAD_MAX_SIZE: 26214400
SLACK_CLIENT_ID: ${SLACK_CLIENT_ID}
SLACK_CLIENT_SECRET: ${SLACK_CLIENT_SECRET}
SLACK_SIGNING_SECRET: ${SLACK_SIGNING_SECRET}
restart: unless-stopped
networks:
- outline-network
redis:
container_name: outline-redis
hostname: outline-redis
image: redis
volumes:
- /volume1/docker/outline/redis.conf:/redis.conf
command:
- redis-server
- /redis.conf
healthcheck:
test:
- CMD
- redis-cli
- PING
interval: 10s
timeout: 30s
retries: 3
restart: unless-stopped
networks:
- outline-network
postgres:
image: postgres
container_name: outline-postgres
hostname: outline-postgres
volumes:
- /volume1/docker/outline/database-data:/var/lib/postgresql/data
healthcheck:
test:
- CMD-SHELL
- pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}
interval: 10s
timeout: 5s
retries: 3
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
restart: unless-stopped
networks:
- outline-network
networks:
outline-network:
driver: bridge
stack 아래 env 부분에 넣자.
POSTGRES_USER='user'
POSTGRES_PASSWORD='pass'
POSTGRES_DB='outline'
SERVICE_PASSWORD_64_REDIS=#token만들기
SECRET_KEY=#token만들기
UTILS_SECRET=#token만들기
URL=https://도메인
PORT=3000
FORCE_HTTPS=true
SLACK_CLIENT_ID=
SLACK_CLIENT_SECRET=
SLACK_SIGNING_SECRET=이상입니다.