SSD Nodes Learn 8GB RAM — 연 $66
가이드 Matt Connor작성자 Matt Connor · 업데이트됨 2026-08-01

BookStack, Wiki.js, Outline 비교: 어떤 위키가 맞을까

BookStack, Wiki.js, Outline을 설치 부담, 편집 방식, 로그인 옵션, 검색 기능으로 비교합니다. 1인 관리자는 BookStack, 팀은 Outline을 우선 검토할 이유를 확인할 수 있습니다.

어떤 self-hosted wiki를 운영해야 하는가

self-hosted wiki를 사용하면 팀 문서를 사용자가 관리하는 서버의 검색 가능한 한곳에 모을 수 있습니다. BookStack, Wiki.js, Outline은 모두 이 작업을 수행합니다. 가장 큰 차이는 첫 페이지를 표시하기 전에 얼마나 많은 구성을 직접 조합해야 하는지와 로그인을 허용할 사용자를 어떻게 관리하는지입니다.

BookStack은 가장 쉽게 구축할 수 있으며 구조를 엄격하게 적용합니다. Wiki.js는 하나의 페이지 트리에서 사용할 편집기를 가장 폭넓게 선택할 수 있습니다. Outline은 세 제품 중 작성 환경이 가장 뛰어나지만, 외부 identity provider를 연결하기 전에는 누구도 로그인할 수 없습니다.

아래 내용은 각 프로젝트의 공식 문서와 공개된 configuration file을 바탕으로 정리했습니다. 이는 benchmark가 아니라 기능 비교입니다. 세 제품 모두 계속 변경되므로 버전 번호와 요구 사항에는 기준 날짜가 표시되어 있습니다.

구조가 실제 선택 기준이다

BookStack은 콘텐츠의 구조를 고정합니다. 페이지는 책 안에 있고, 책에는 장이 포함될 수 있으며, 선반은 책을 그룹화합니다. 다섯 번째 수준을 새로 만들 수는 없습니다. 이러한 제한이 바로 이 제품의 핵심입니다. 페이지가 들어갈 수 있는 위치가 하나뿐이므로 새 작성자도 페이지를 어디에 배치해야 하는지 알 수 있습니다. 대신 이 구조에 맞지 않는 콘텐츠도 구조에 억지로 맞춰야 합니다.

Wiki.js는 디스크의 폴더와 같은 경로 트리를 사용합니다. ops/backup/restic의 페이지는 원하는 위치에 배치할 수 있으며, 깊이도 직접 선택합니다. 두 사람이 같은 주제를 서로 다른 브랜치에 저장하는 것을 막을 수 없으므로 Wiki.js 인스턴스에는 트리를 관리하는 담당자가 한 명 필요합니다.

Outline은 컬렉션을 사용하며, 문서 안에 다른 문서를 중첩할 수 있습니다. 문서를 이동할 때는 마우스로 끌어 놓으면 됩니다. 세 제품 중 가장 유연하지만, 구조가 쉽게 흐트러질 수 있다는 단점도 있습니다.

BookStack: 최소 설치

BookStack은 MySQL을 백엔드로 사용하는 PHP 애플리케이션입니다. 2026년 7월 기준으로 문서에 명시된 요구 사항은 PHP 8.2 이상, MySQL 8.0 또는 MariaDB 10.6 이상입니다. 소스에서 설치하는 경우 Composer 2.2 이상도 필요합니다. 현재 릴리스 계열은 26.05입니다.

프로젝트는 Ubuntu 릴리스마다 설치 스크립트를 하나씩 제공합니다. 24.04 스크립트는 Apache, MySQL 8.0 및 PHP 8.3을 자동으로 설치합니다.

wget https://codeberg.org/bookstack/devops/raw/branch/main/scripts/installation-ubuntu-24.04.sh
chmod a+x installation-ubuntu-24.04.sh
sudo ./installation-ubuntu-24.04.sh

실행하기 전에 해당 스크립트의 경고를 읽습니다. 문서에는 이 스크립트가 "ONLY FOR A FRESH OS, it will install Apache, MySQL 8.0 & PHP 8.3 and could OVERWRITE any existing web setup on the machine"이라고 명시되어 있습니다. 이미 port 80에서 요청에 응답하는 서버에서는 이 스크립트가 해당 포트를 차지하고 Apache 설정을 다시 작성합니다. 이러한 환경에서는 컨테이너를 사용하거나, Ubuntu 24.04의 기존 LAMP 스택 위에 BookStack 수동 설치 방법을 사용합니다.

컨테이너 방식은 LinuxServer.io 이미지를 사용합니다. BookStack 문서에서 권장하는 방식도 이것입니다. BookStack은 세션 암호화 키가 필요하며 키가 없으면 페이지를 제공하지 않습니다. 따라서 먼저 키를 생성합니다.

docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkey

출력된 값을 APP_KEY에 복사한 다음 서비스를 작성합니다.

services:
  bookstack:
    image: lscr.io/linuxserver/bookstack:latest
    container_name: bookstack
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Etc/UTC
      - APP_URL=https://wiki.example.com
      - APP_KEY=paste_the_generated_key_here
      - DB_HOST=bookstack_db
      - DB_PORT=3306
      - DB_USERNAME=bookstack
      - DB_PASSWORD=change_me
      - DB_DATABASE=bookstackapp
    volumes:
      - ./config:/config
    ports:
      - 6875:80
    restart: unless-stopped

APP_URL는 사용자가 실제로 입력하는 주소와 일치해야 합니다. 여기에는 scheme과 port도 포함해야 합니다. 이를 http://localhost으로 설정한 다음 사이트를 HTTPS로 제공하면 생성된 링크와 리디렉션이 잘못된 호스트를 가리킵니다. 그러면 사용자는 로그인 페이지가 다시 자기 자신으로 리디렉션되는 현상을 보게 됩니다. Compose 파일이 익숙하지 않다면 이 문서보다 먼저 VPS에서 Docker Compose 기초를 확인합니다.

서비스를 시작한 뒤 컨테이너가 실행 중인지뿐 아니라 애플리케이션이 응답하는지도 확인합니다.

docker compose up -d
docker compose ps
curl -sI http://127.0.0.1:6875/login

200 OK은 PHP 애플리케이션이 시작되고 데이터베이스에 연결되었다는 뜻입니다. 500는 거의 항상 APP_KEY이 비어 있거나 데이터베이스 자격 증명이 일치하지 않는다는 뜻입니다. docker compose logs bookstack는 두 경우 중 어느 경우인지 출력합니다.

Wiki.js: 하나의 트리, 여러 편집기

Wiki.js는 Node.js 애플리케이션입니다. 문서에 설명된 Docker 설정은 PostgreSQL과 함께 사용하지만, 이 소프트웨어는 MySQL, MariaDB, MSSQL 및 SQLite도 지원합니다. 다음은 프로젝트의 자체 Docker 페이지에 있는 compose 파일입니다.

services:
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: wiki
      POSTGRES_PASSWORD: wikijsrocks
      POSTGRES_USER: wikijs
    logging:
      driver: none
    restart: unless-stopped
    volumes:
      - db-data:/var/lib/postgresql/data
  wiki:
    image: ghcr.io/requarks/wiki:2
    depends_on:
      - db
    init: true
    environment:
      DB_TYPE: postgres
      DB_HOST: db
      DB_PORT: 5432
      DB_USER: wikijs
      DB_PASS: wikijsrocks
      DB_NAME: wiki
    restart: unless-stopped
    ports:
      - "80:3000"
volumes:
  db-data:

실행하기 전에 POSTGRES_PASSWORDDB_PASS을 함께 변경해야 합니다. 두 값이 하나의 자격 증명을 구성하며, 예시 값은 공개되어 있기 때문입니다. 태그는 의도적으로 ghcr.io/requarks/wiki:2에 고정되어 있습니다. 문서에서는 latest을 사용하지 말 것을 권장합니다. 주요 버전이 변경되면 실행 중인 인스턴스의 데이터베이스 스키마도 변경되기 때문입니다.

실행할 버전은 2 계열입니다. 2026년 7월 기준 최신 version 2 릴리스는 2026년 5월에 나온 2.5.314입니다. Version 3도 있지만, 해당 버전의 문서에는 다음과 같이 명시되어 있습니다. "이 사이트는 불안정한 beta release of Wiki.js 3.0을 위한 것입니다. 이 버전을 production 환경에 설치하면 안 됩니다." :3 태그는 preview로 취급해야 합니다.

처음 로드하면 Wiki.js가 브라우저 내 설정 과정을 안내하고 administrator account를 생성합니다. 설정을 완료할 때까지 해당 port에 연결할 수 있는 모든 사용자가 이 마법사에 접근할 수 있습니다. 따라서 firewall을 열기 전에 서비스를 reverse proxy와 TLS(transport layer security) 뒤에 배치해야 합니다. 서버에서 이 서비스 외에 여러 서비스를 호스팅한다면, 자체 hostname을 사용하는 wiki는 여러 Docker 앱 앞에 Traefik 배치 구성 뒤에 자연스럽게 배치할 수 있습니다.

사람들이 Wiki.js를 선택하는 이유는 편집기 선택에 있습니다. 하나의 인스턴스에서 Markdown 페이지, visual editor 페이지, raw HTML 페이지 및 AsciiDoc 페이지를 나란히 관리할 수 있습니다. 변환하고 싶지 않은 형식의 기존 콘텐츠를 가져올 때 유용합니다. 반대로 하나의 wiki에 네 가지 내부 문서 스타일이 생길 수도 있으므로, 첫날에 기본 편집기를 결정하고 그 결정을 문서로 남겨야 합니다.

Outline: 가장 좋은 편집기, 가장 무거운 사전 요구 사항

Outline은 상용 노트 도구와 비슷한 사용 경험을 원하는 사람들이 보통 의미하는 제품입니다. Node.js 애플리케이션이며, 2026년 7월 기준 최신 릴리스는 1.9.2입니다. 샘플 환경 파일에는 필요한 항목이 나열되어 있습니다. DATABASE_URL을 통한 PostgreSQL, REDIS_URL을 통한 Redis, 무작위 시크릿 2개, 외부에서 연결할 수 있는 URL입니다.

openssl rand -hex 32
openssl rand -hex 32

이 명령을 2번 실행하고 두 값을 모두 보관합니다. 첫 번째 값은 SECRET_KEY이 되고 두 번째 값은 UTILS_SECRET가 됩니다. 그러면 환경 파일의 핵심 부분은 다음과 같습니다.

NODE_ENV=production
URL=https://docs.example.com
PORT=3000
SECRET_KEY=<first openssl value>
UTILS_SECRET=<second openssl value>
DATABASE_URL=postgres://outline:change_me@postgres:5432/outline
PGSSLMODE=disable
REDIS_URL=redis://redis:6379
FILE_STORAGE=local
FILE_STORAGE_LOCAL_ROOT_DIR=/var/lib/outline/data

데이터베이스가 같은 머신이나 같은 Docker 네트워크에 있을 때만 PGSSLMODE=disable가 올바릅니다. 네트워크를 통해 연결하는 데이터베이스에는 이 값을 생략해야 합니다. 그렇지 않으면 연결이 평문으로 전송됩니다. 첨부 파일을 저장하기 위해 더 이상 object storage를 반드시 사용할 필요는 없습니다. FILE_STORAGE=local은 업로드 파일을 위의 디렉터리에 저장합니다. 이 디렉터리는 컨테이너가 쓸 수 있는 volume이어야 하며 백업 대상에도 포함되어야 합니다. 파일을 S3 호환 bucket에 저장하려면 AWS_* 값을 사용해 FILE_STORAGE=s3을 설정합니다.

이제 많은 사람이 놀라는 부분을 설명하겠습니다. Outline에는 기본 제공 username 및 password 로그인이 없습니다. 자체 샘플 설정에도 타사 로그인 자격 증명이 필요하다고 명시되어 있습니다. "정상적으로 작동하는 설치에는 이 항목 중 최소 1개가 필요하며, 그렇지 않으면 로그인 방법이 없습니다". 문서에 나온 provider에는 Google, Slack, Microsoft Entra, Discord가 있으며, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_AUTH_URI, OIDC_TOKEN_URIOIDC_USERINFO_URI을 사용하면 임의의 일반 OpenID Connect (OIDC) 서버도 연결할 수 있습니다.

따라서 Outline을 운영하는 데 실제로 필요한 구성은 Outline, PostgreSQL, Redis 및 identity provider입니다. 팀에서 이미 Google Workspace 또는 Microsoft Entra로 로그인한다면 마지막 구성 요소를 설정하는 데 10분 정도만 필요하므로 Outline은 매우 매력적인 선택이 됩니다. 그렇지 않다면 Keycloak 또는 Authentik 같은 서비스를 직접 운영해야 합니다. 이 경우 패치와 백업이 필요한 두 번째 서비스가 추가됩니다. 메모리도 이에 맞춰 할당해야 합니다. Outline의 자체 지침에 따르면 웹 프로세스 1개당 대략 512 MB가 필요하며, 이 값은 WEB_CONCURRENCY로 설정합니다. 여기에 데이터베이스와 Redis의 메모리 사용량이 추가됩니다.

각 시스템의 읽기 권한 처리 방식

BookStack은 기본적으로 로컬 이메일 및 비밀번호 계정을 제공하며, 대안으로 LDAP, SAML2 및 OIDC를 지원합니다. 권한은 역할별로 설정할 수 있고, 특정 shelf, book, chapter 또는 page에서 재정의할 수 있습니다. 계층 구조가 고정되어 있으므로 권한이 예측 가능한 방식으로 하위 항목에 상속됩니다.

Wiki.js도 로컬 계정을 제공하며, 관리자 영역에서 활성화할 수 있는 다양한 인증 전략을 추가로 지원합니다. 페이지 규칙은 경로 패턴에 따라 접근을 허용하거나 거부합니다. 이 기능은 강력하지만 잘못 설정하기 쉽습니다. ops/*에 작성한 규칙이 나중에 해당 경로 아래에 배치하는 모든 페이지에 조용히 적용되기 때문입니다.

Outline은 이 문제를 전적으로 외부 시스템에 위임합니다. 멤버십은 identity provider를 따르며, Outline 내부에서는 collection 및 group별로 접근을 제어합니다. 사용자가 회사를 떠나면 로컬 계정이 남지 않습니다. identity provider가 이미 계정 폐기를 수행하는 시스템이라면 이는 실질적인 장점입니다.

각 시스템에서 검색이 작동하는 방식

검색 기능은 위키가 도입할 가치가 있는 시스템이 될지, 잊힌 파일을 모아 둔 폴더가 될지를 결정합니다.

BookStack은 데이터베이스를 검색하고, 독자가 1분 안에 익힐 수 있는 쿼리 언어를 제공합니다. "london meeting"과 같이 구문을 따옴표로 묶으면 해당 문자열과 정확히 일치해야 합니다. 대괄호는 태그를 검색합니다. [location=london]은 태그 이름, 값 또는 둘 다를 기준으로 일치하며, !=, >=like 같은 비교 연산도 지원합니다. 중괄호는 {created_after:2016-12-30}과 같이 메타데이터를 기준으로 필터링합니다. 모든 정확 일치 항, 태그 항 또는 필터 항은 앞에 -을 붙여 제외할 수 있습니다. BookStack은 하나의 쿼리에 포함할 수 있는 각 유형의 항 수에 상한을 둡니다. 따라서 너무 긴 쿼리는 실행되지 않고 잘립니다.

Wiki.js는 검색을 플러그인 방식의 모듈로 처리합니다. 문서에 명시된 엔진은 기본 데이터베이스 엔진, PostgreSQL 엔진, Elasticsearch, Algolia, AWS CloudSearch 및 Azure Search입니다. 기본 엔진은 페이지 수가 수백 개 정도일 때 적합합니다. PostgreSQL을 실행한다면 관리자 영역에서 PostgreSQL 엔진으로 전환해야 합니다. 이 엔진은 단순한 일치 검색 대신 데이터베이스 자체의 전문 검색 인덱스를 사용하기 때문입니다. 두 번째 검색 서비스를 실행하고 패치할 수 있을 만큼 위키 규모가 큰 경우에만 Elasticsearch를 사용합니다.

Outline은 PostgreSQL 전문 검색 인덱스를 검색합니다. 선택할 엔진이 없고 조정할 설정도 없습니다. 업로드한 문서 내부의 텍스트도 검색합니다. 문서 수가 수천 개 이하인 팀 위키라면 세 제품 중 관리 작업이 가장 적습니다. 성능이 더 이상 충분하지 않게 되더라도 조정할 수 있는 설정이 없습니다.

어느 것이 적합한가

오늘 오후에 바로 위키를 운영하고 구조보다 콘텐츠에 대해 논의하고 싶다면 BookStack을 선택합니다. 구성 요소가 가장 적습니다. PHP 애플리케이션 1개와 MySQL 데이터베이스 1개로 구성됩니다. 내부 런북과 고객 문서에 적합하며, 작성자의 대부분이 엔지니어가 아닌 팀에도 적합합니다. 전체 상태가 데이터베이스 덤프 1개와 uploads 디렉터리로 구성되므로 세 제품 중 백업도 가장 쉽습니다.

다른 제품에서 제공하지 않는 특정 편집기나 인증 전략이 필요하거나, 기존 Markdown 또는 AsciiDoc 문서가 많고 경로 구조를 유지한 채 가져오려면 Wiki.js를 선택합니다. 더 무거운 스택을 운영해야 한다는 점을 감수하고, major version tag를 고정합니다.

문서 작성 품질이 가장 중요하고 위키가 공개용이 아니라 팀용이며 이미 identity provider를 운영하고 있다면 Outline을 선택합니다. 이러한 구성에서는 사용자가 실제로 편하게 사용할 수 있는 편집기를 제공합니다. 첫 번째 self-hosted 애플리케이션으로는 선택하지 않는 것이 좋습니다.

세 제품 중 어느 것도 적합하지 않다면, 대개 콘텐츠 유형이 맞지 않는 것입니다. 스캔한 청구서와 계약서는 위키가 아니라 Paperless-ngx와 같은 문서 관리 시스템에 보관해야 합니다. 이러한 문서를 위키에 억지로 넣는 것이 많은 위기가 결국 방치되는 이유입니다. 자체 서버에 어떤 서비스를 추가할 수 있는지 더 넓게 살펴보려면 2026년 self-hosting 후보 목록을 참조합니다.

리소스 산정 및 백업

세 가지 모두 소형 VPS에서 실행할 수 있습니다. 실제 최소 요구 사항은 각 제품의 구성 요소에 따라 다릅니다. BookStack은 하나의 애플리케이션 프로세스와 MySQL로 구성됩니다. Wiki.js는 Node 프로세스와 PostgreSQL로 구성됩니다. Outline은 Node 프로세스, PostgreSQL 및 Redis로 구성되며, 일반적으로 ID 공급자도 함께 사용합니다. 따라서 세 가지 중 Outline에 더 많은 메모리를 할당해야 합니다.

데이터베이스와 업로드 파일을 함께 백업합니다. 해당 백업에 의존하기 전에 두 항목을 임시 인스턴스에 한 번 복원합니다. 복원해 보지 않은 wiki 백업은 추측에 불과합니다. BookStack에서는 mysqldump/config 볼륨이 이에 해당합니다. Wiki.js와 Outline에서는 pg_dump와 데이터 볼륨이 필요하며, Outline에서는 FILE_STORAGE_LOCAL_ROOT_DIR에 저장된 항목도 함께 백업해야 합니다.

FAQ

설치하기 가장 쉬운 자체 호스팅 위키는 무엇입니까?

BookStack입니다. MySQL 데이터베이스를 사용하는 단일 PHP 애플리케이션이며, Ubuntu 24.04에서 Apache, MySQL 8.0 및 PHP 8.3을 한 번에 설정하는 설치 스크립트를 프로젝트에서 제공합니다. 컨테이너 이미지에는 APP_KEY 및 데이터베이스 자격 증명만 필요합니다. Wiki.js는 Node 런타임과 PostgreSQL 서버를 추가로 필요로 합니다. Outline은 여기에 Redis와 외부 ID 공급자를 추가로 필요로 합니다.

Google 또는 다른 SSO 공급자 없이 Outline을 사용할 수 있습니까?

아니요. Outline에는 로컬 사용자 이름 및 비밀번호 로그인이 없습니다. 샘플 구성에 따르면 하나 이상의 타사 로그인 공급자가 필요합니다. 그렇지 않으면 로그인 방법을 전혀 사용할 수 없습니다. Google, Slack, Microsoft Entra, Discord 또는 자체 호스팅 Keycloak이나 Authentik과 같은 일반적인 OpenID Connect 서버를 사용할 수 있습니다. 해당 공급자를 운영하는 비용도 Outline 운영 비용에 포함됩니다.

Wiki.js 3과 Wiki.js 2 중 어느 것을 설치해야 합니까?

버전 2입니다. 2026년 7월 기준으로 최신 버전 2 릴리스는 2026년 5월에 출시된 2.5.314입니다. 버전 3 문서에는 버전 3이 불안정한 베타이므로 프로덕션 환경에 설치하지 말아야 한다고 명시되어 있습니다. latest 대신 이미지를 ghcr.io/requarks/wiki:2로 고정해야 합니다. 주요 버전이 변경되면 실행 중인 인스턴스의 데이터베이스 스키마가 변경되기 때문입니다.

검색 기능이 가장 우수한 것은 무엇입니까?

각 제품은 서로 다른 방식으로 강점을 가집니다. BookStack은 독자에게 정확한 구문 검색을 지원하는 쿼리 언어를 제공합니다. [location=london]과 같은 태그 필터와 {created_after:2016-12-30}과 같은 메타데이터 필터도 제공합니다. 이러한 검색어에는 앞에 -를 붙여 부정 조건으로 만들 수 있습니다. Outline은 별도의 구성이 필요하지 않으며 업로드한 파일 내부의 텍스트를 검색합니다. Wiki.js는 검색 엔진을 직접 선택할 수 있으므로 가장 세밀하게 조정할 수 있습니다. 위키가 수백 페이지를 넘어서면 PostgreSQL 엔진으로 전환할 가치가 있습니다.

나중에 콘텐츠를 한 제품에서 다른 제품으로 옮길 수 있습니까?

부분적으로 가능하지만 수작업이 필요합니다. 세 제품 모두 Markdown을 내보내고 가져올 수 있으므로 페이지 텍스트는 대체로 유지됩니다. 구조는 제대로 유지되지 않습니다. BookStack의 책과 장에 해당하는 구조가 Outline의 중첩 문서에는 없으며, Wiki.js 경로도 BookStack의 고정 계층 구조에 매핑되지 않습니다. 첨부 파일, 권한 및 페이지 기록이 손실될 가능성이 가장 높은 항목입니다. 따라서 마이그레이션을 결정하기 전에 샘플을 내보내 이러한 항목을 확인해야 합니다.

#bookstack#wikijs#outline#wiki#self-hosting#knowledge-base