시놀로지 NAS Outline 셀프 호스팅 구축 가이드 (Portainer 활용)

시놀로지 NAS 환경에서 Portainer를 활용하여 오픈소스 문서 도구 Outline을 구축하는 상세 절차. Slack OAuth 연동, 파일 권한 설정 및 Docker Compose 구성을 포함함.

시놀로지 NAS Outline 셀프 호스팅 구축 가이드 (Portainer 활용)

1. 개요 및 비교 분석

Outline은 팀 협업을 위한 고성능 지식 베이스(Knowledge Base) 및 위키 도구임. 직관적인 UI와 실시간 동시 편집, 강력한 검색 기능을 제공함. 클라우드 버전(SaaS) 이용 시 사용자당 비용이 발생하나, 셀프 호스팅을 통해 비용 절감이 가능함.

Outline Pricing Page showing monthly costs

1.1 Outline vs Notion

Notion은 올인원 워크스페이스로 기능이 방대하지만, 문서 로딩 속도가 느려지는 단점이 존재함. 반면 Outline은 다음과 같은 강점이 있음.

  • 속도: 매우 가볍고 빠른 페이지 로딩 및 전환 속도 보장.
  • Markdown: 마크다운 문법을 완벽하게 지원하며 깔끔한 구조 유지.
  • 오픈소스: 데이터 주권 확보 및 커스터마이징 가능.
  • 비용: 셀프 호스팅 시 하드웨어 유지비 외 추가 라이선스 비용 없음.

설치

2. Slack OAuth 인증 설정

Outline은 이메일 로그인 외에 소셜 로그인을 권장하며, 팀 단위 관리에 유리한 Slack OAuth 연동이 가장 용이함.

  1. Slack API 접속: https://api.slack.com/apps 이동.
  2. App 생성: 'Create New App' 클릭 후 'From scratch' 선택.
  3. 앱 이름 및 워크스페이스 선택: App Name 설정 및 연동할 워크스페이스 지정.
  4. Client ID / Secret 확보: Basic Information 탭에서 Client IDClient Secret 복사 (추후 .env 설정에 사용).
  5. Redirect URLs 설정:
    • OAuth & Permissions 탭 이동.
    • Redirect URLs에 https://<나의-도메인>/auth/slack.callback 추가.
OAuth & Permissions tab with Redirect URL input
자신의 도메인주소를 넣고 callback 시킨다.

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

Slack API Dashboard showing Client ID and Secret fields

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.conf

storage-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=

#token만들기링크

이상입니다.