웹사이트 검색

Docker를 사용하여 Ubuntu에 Outline Knowledgebase Wiki를 설치하는 방법


이 페이지에서

  1. 전제 조건
  2. 1단계 - 방화벽 구성\n
  3. 2단계 - Docker 설치
  4. 3단계 - Docker Compose 설치
  5. 4단계 - Docker용 환경 파일 만들기\n
    1. Slack 인증 구성
    2. Slack 통합 구성\n
    3. S3 자격 증명 생성
    4. 비밀 키 만들기
    5. 환경 파일 생성 및 편집\n

    Outline은 오픈 소스 협업 지식 기반 소프트웨어입니다. 문서 및 팬 페이지를 호스팅하거나 메모 공유에 사용할 수도 있습니다. 여기에는 마크다운 편집기가 포함되어 있으며 Slack, Figma, Airtable, Google Docs, Trello, Zapier, Codepen, Spotify, Youtube 등과 같은 여러 서비스와 통합됩니다. 별도의 읽기 및 쓰기 권한이 있는 사용자 그룹과 같은 보안 기능이 있으며 공개 공유가 가능합니다. 13개 언어 번역으로 RTL을 지원합니다. React와 Node.js를 사용하여 빌드되었습니다. 아웃라인을 사용하는 방법에는 두 가지가 있습니다. 하나는 클라우드 호스팅 버전이거나 서버에서 호스팅할 수 있습니다.

    이 튜토리얼에서는 Docker를 사용하여 Ubuntu 기반 서버에 Outline Wiki를 설치하는 방법을 설명합니다.

    전제 조건

    • A server running Ubuntu 20.04 with a minimum of 1GB of RAM.

    • A non-root user with sudo privileges.

    • A domain name pointing to the server. We will use https://outline.example.com for our tutorial.

    • Few essential apps to get started.

      $ sudo apt install nano curl wget unzip gnupg
      

    1단계 - 방화벽 구성

    첫 번째 단계는 방화벽을 구성하는 것입니다. 우분투는 기본적으로 ufw(복잡하지 않은 방화벽)와 함께 제공됩니다.

    방화벽이 실행 중인지 확인하십시오.

    $ sudo ufw status
    

    다음 출력을 얻어야 합니다.

    Status: inactive
    

    방화벽이 활성화 시 현재 연결을 끊지 않도록 SSH 포트를 허용합니다.

    $ sudo ufw allow OpenSSH
    

    HTTP 및 HTTPS 포트도 허용합니다.

    $ sudo ufw allow 80
    $ sudo ufw allow 443
    

    방화벽을 활성화합니다.

    $ sudo ufw enable
    Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
    Firewall is active and enabled on system startup
    

    방화벽의 상태를 다시 확인하십시오.

    $ sudo ufw status
    

    비슷한 출력이 표시되어야 합니다.

    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    80                         ALLOW       Anywhere
    443                        ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    80 (v6)                    ALLOW       Anywhere (v6)
    443 (v6)                   ALLOW       Anywhere (v6)
    

    2단계 - 도커 설치

    공식 리포지토리를 사용하여 Docker를 설치해야 합니다. Dockers 공식 GPG 키를 추가합니다.

    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    

    시스템에 Docker 리포지토리를 추가합니다.

    $ echo \
    "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    APT 리포지토리 목록을 업데이트하고 Docker를 설치합니다.

    $ sudo apt update
    $ sudo apt install docker-ce
    

    Docker 엔진이 올바르게 설치되었는지 확인하십시오.

    $ docker --version
    Docker version 20.10.14, build a224086
    

    Docker 명령을 실행하기 위해 sudo를 사용할 필요가 없도록 다음 명령을 실행합니다.

    $ sudo usermod -aG docker ${USER}
    $ su - ${USER}
    

    3단계 - Docker Compose 설치

    다음 명령을 실행하여 Docker Compose를 설치합니다. Docker Compose는 최근 v2.0으로 업데이트되어 많은 주요 변경 사항이 도입되었습니다. Github 릴리스 페이지에서 제공되는 최신 1.x 버전을 사용합니다.

    $ sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
    

    Docker Compose 바이너리에 실행 권한을 적용합니다.

    $ sudo chmod +x /usr/local/bin/docker-compose
    

    Docker Compose가 올바르게 설치되었는지 확인합니다.

    $ docker-compose --version
    docker-compose version 1.29.2, build 5becea4c
    

    Docker Compose용 명령 완성을 설치합니다.

    $ sudo curl \
    	-L https://raw.githubusercontent.com/docker/compose/1.29.2/contrib/completion/bash/docker-compose \
        -o /etc/bash_completion.d/docker-compose
    $ source ~/.bashrc
    

    이것으로 자습서의 Docker 및 Docker Compose 설치 섹션이 완료되었습니다.

    4단계 - Docker용 환경 파일 생성

    Slack 인증 구성

    Outline에서는 인증 공급자를 구성해야 합니다. 자습서에서는 Slack 기반 로그인을 구성합니다.

    Slack 계정으로 로그인하고 Slacks API 앱 페이지를 방문하세요.

    계속하려면 앱 만들기 버튼을 클릭하십시오. From Scratch 링크를 클릭하여 앱을 만듭니다.

    앱 이름을 선택하고 앱을 표시할 작업 공간을 선택합니다. 앱을 기존 작업 영역과 연결하지 않으려면 다른 작업 영역을 만들고 이 단계로 돌아올 수 있습니다.

    완료되면 앱 만들기 버튼을 클릭합니다. 그런 다음 페이지 하단으로 스크롤하여 앱에 설명, 아이콘 및 배경색을 지정합니다.

    완료되면 변경 사항 저장 버튼을 클릭하십시오. 왼쪽 사이드바에서 OAuth 및 권한 옵션을 선택합니다.

    제공된 상자에 리디렉션 URL https://outline.example.com/auth/slack.callback을 추가하고 추가 버튼을 클릭합니다.

    계속하려면 URL 저장 버튼을 클릭하십시오. 페이지의 사용자 토큰 범위 섹션까지 아래로 스크롤하고 드롭다운 메뉴에서 다음 범위를 선택합니다.

    • identity.avatar
    • identity.basic
    • identity.email
    • identity.team

    왼쪽 사이드바에서 기본 정보 페이지로 돌아갑니다. App Credentials 아래의 상자에서 Client ID 및 Client Secret 값을 복사합니다.

    Slack 통합 구성

    왼쪽 사이드바에서 슬래시 명령 옵션을 방문하십시오.

    결과 페이지에서 새 명령 버튼을 클릭합니다. 명령으로 /outline을 입력합니다. 요청 URL로 https://outline.example.com/api/hooks.slack을 입력합니다. 명령에 대한 설명과 힌트로 단어를 입력합니다. 완료되면 하단의 저장 버튼을 클릭합니다.

    왼쪽 사이드바에서 기능 >> 상호 작용 및 바로 가기 메뉴를 엽니다. 토글 버튼을 전환하여 상호 작용을 활성화하고 https://outline.example.com/api/hooks.interactive를 요청 URL로 붙여넣습니다. 변경 사항 저장 버튼을 클릭하여 완료합니다.

    왼쪽 사이드바에서 설정 >> 앱 설치 페이지를 열고 WorkSpace에 설치 버튼을 클릭하여 Slack 워크스페이스용 앱을 설치합니다.

    왼쪽 사이드바에서 기본 정보 페이지를 방문하여 Slack 앱 통합을 위한 앱 ID 및 확인 토큰 값을 복사합니다.

    S3 자격 증명 생성

    AWS 또는 모든 S3 호환 서비스에서 Outline 설치를 위한 S3 버킷을 생성합니다. 버킷을 생성한 후 CORS(Cross-origin Resource Sharing) 구성을 위해 다음 정책 JSON을 추가합니다. AllowedOrigins 값을 개요 URL로 바꿉니다.

    [
        {
            "AllowedHeaders": [
                "*"
            ],
            "AllowedMethods": [
                "PUT",
                "POST"
            ],
            "AllowedOrigins": [
                "https://docs.mycompany.com"
            ],
            "ExposeHeaders": []
        },
        {
            "AllowedHeaders": [],
            "AllowedMethods": [
                "GET"
            ],
            "AllowedOrigins": [
                "*"
            ],
            "ExposeHeaders": []
        }
    ]
    

    다음 정책으로 IAM 사용자를 생성합니다. my-bucket-name을 Outline S3 버킷의 실제 이름으로 바꿉니다.

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "VisualEditor",
                "Effect": "Allow",
                "Action": [
                    "s3:GetObjectAcl",
                    "s3:DeleteObject",
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:PutObjectAcl"
                ],
                "Resource": "arn:aws:s3:::my-bucket-name/*"
            }
        ]
    }
    

    이제 IAM 사용자를 생성했으므로 버킷 사용자에 대한 액세스 키와 암호를 생성합니다.

    비밀 키 생성

    환경 파일에는 비밀 키와 유틸리티 비밀이 필요합니다. 다음 명령을 두 번 실행하여 두 키를 모두 생성합니다.

    $ openssl rand -hex 32
    

    이 값을 복사하고 저장하십시오.

    환경 파일 생성 및 편집

    Outline의 Docker 설정을 위한 디렉터리를 만듭니다.

    $ mkdir ~/outline
    

    디렉터리로 전환합니다.

    $ cd ~/outline
    

    docker.env 파일을 만들고 편집을 위해 엽니다. 이 파일은 설치에 필요한 모든 환경 변수를 저장합니다.

    $ nano docker.env
    

    다음 코드를 붙여넣습니다. 이전에 생성한 비밀 키와 utils 비밀을 입력합니다. 인증 및 앱 통합을 위해 이전에 만든 Slack 자격 증명을 복사합니다. 아래 지정된 대로 Amazon S3 자격 증명을 입력합니다.

    Google 애널리틱스를 사용하여 Outline 애플리케이션의 통계를 추적하려면 아래 필드에 애널리틱스 ID를 입력하세요. 현재 Outline은 GA4 태그를 지원하지 않으므로 이전 추적 ID를 입력해야 합니다.

    WEB_CONCURRENCY 변수의 경우 시스템 램을 512로 나누고 대략적인 값을 입력합니다. Nginx를 프록시 서버로 사용하고 있으므로 FORCE_HTTPS 변수는 false로 설정됩니다.

    # –––––––––––––––– REQUIRED ––––––––––––––––
    SECRET_KEY=generate_a_new_key
    UTILS_SECRET=generate_a_new_key
    
    POSTGRES_USER=outlinepg
    POSTGRES_PASSWORD=yourpassword
    POSTGRES_DB=outline
    DATABASE_URL=postgres://outlinepg::5432/outline
    DATABASE_URL_TEST=postgres://outlinepg::5432/outline-test
    PGSSLMODE=disable
    REDIS_URL=redis://localhost:6379
    
    URL=https://docs.example.com
    PORT=3000
    
    AWS_ACCESS_KEY_ID=get_a_key_from_aws
    AWS_SECRET_ACCESS_KEY=get_the_secret_of_above_key
    AWS_REGION=us-east-2
    AWS_S3_UPLOAD_BUCKET_URL=https://my-bucket-name.s3.us-east-2.amazonaws.com
    AWS_S3_UPLOAD_BUCKET_NAME=my-bucket-name
    AWS_S3_UPLOAD_MAX_SIZE=26214400
    AWS_S3_FORCE_PATH_STYLE=true
    
    # –––––––––––––– AUTHENTICATION ––––––––––––––
    SLACK_KEY=<slackclientid>
    SLACK_SECRET=<slackclientsecret>
    
    # –––––––––––––––– OPTIONAL ––––––––––––––––
    GOOGLE_ANALYTICS_ID=UA-XXXXXXX-1
    
    SLACK_VERIFICATION_TOKEN=your_token
    SLACK_APP_ID=A0XXXXXXX
    SLACK_MESSAGE_ACTIONS=true
    
    FORCE_HTTPS=false
    ENABLE_UPDATES=true
    WEB_CONCURRENCY=2
    

    위 파일은 Outlines Github 저장소의 샘플 파일을 기반으로 합니다. 추가 설정을 구성해야 하는 경우 여기에서 파일로 복사할 수 있습니다.

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    5단계 - 아웃라인용 Docker Compose 파일 생성

    docker-compose.yml 파일을 만들고 편집을 위해 엽니다.

    $ nano docker-compose.yml
    

    다음 코드를 붙여넣습니다.

    version: "3"
    services:
    
      outline:
        image: outlinewiki/outline:latest
        restart: always
        command: sh -c "yarn sequelize:migrate --env=production-ssl-disabled && yarn start --env=production-ssl-disabled"
        env_file: ./docker.env
        ports:
          - "3000:3000"
        depends_on:
          - postgres
          - redis
    
      redis:
        image: redis
        restart: always
        env_file: ./docker.env
        ports:
          - "6379:6379"
        volumes:
          - ./redis.conf:/redis.conf
        command: ["redis-server", "/redis.conf"]
    
      postgres:
        image: postgres
        restart: always
        env_file: ./docker.env
        ports:
          - "5432:5432"
        volumes:
          - database-data:/var/lib/postgresql/data
    
    volumes:
      database-data:
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    6단계 - 아웃라인 설치

    컨테이너를 시작하여 Outline을 설치합니다.

    $ docker-compose up -d
    

    컨테이너의 상태를 확인합니다.

    $ docker ps
    

    7단계 - SSL 설치

    Lets Encrypt를 사용하여 SSL 인증서를 설치하려면 Certbot 도구를 다운로드해야 합니다. 이를 위해 Snapd 패키지 설치 프로그램을 사용합니다.

    스냅 인스톨러를 설치합니다.

    $ sudo apt install snapd
    

    Snapd 버전이 최신인지 확인하세요.

    $ sudo snap install core && sudo snap refresh core
    

    Certbot을 설치합니다.

    $ sudo snap install --classic certbot
    

    다음 명령을 사용하여 /usr/bin 디렉토리에 대한 심볼릭 링크를 생성하여 Certbot 명령을 실행할 수 있는지 확인하십시오.

    $ sudo ln -s /snap/bin/certbot /usr/bin/certbot
    

    SSL 인증서를 생성합니다.

    $ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m  -d outline.example.com
    

    위의 명령은 서버의 /etc/letsencrypt/live/outline.example.com 디렉토리에 인증서를 다운로드합니다.

    Diffie-Hellman 그룹 인증서를 생성합니다.

    $ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
    

    Lets Encrypt 자동 갱신을 위한 챌린지 웹루트 디렉터리를 만듭니다.

    $ sudo mkdir -p /var/lib/letsencrypt
    

    SSL을 갱신하기 위해 Cron 작업을 생성합니다. 인증서를 확인하고 필요한 경우 갱신하기 위해 매일 실행됩니다. 이를 위해 먼저 /etc/cron.daily/certbot-renew 파일을 생성하고 편집을 위해 엽니다.

    $ sudo nano /etc/cron.daily/certbot-renew
    

    다음 코드를 붙여넣습니다.

    #!/bin/sh
    certbot renew --cert-name outline.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    실행 가능하도록 태스크 파일에 대한 권한을 변경하십시오.

    $ sudo chmod +x /etc/cron.daily/certbot-renew
    

    8단계 - Nginx 설치

    Ubuntu는 이전 버전의 Nginx와 함께 제공됩니다. 최신 버전을 설치하려면 공식 Nginx 저장소를 다운로드해야 합니다.

    Nginxs 서명 키를 가져옵니다.

    $ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
    	| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
    

    Nginxs 안정 버전용 리포지토리를 추가합니다.

    $ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
    http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
        | sudo tee /etc/apt/sources.list.d/nginx.list
    

    시스템 리포지토리를 업데이트합니다.

    $ sudo apt update
    

    Nginx를 설치합니다.

    $ sudo apt install nginx
    

    설치를 확인하십시오.

    $ nginx -v
    nginx version: nginx/1.20.2
    

    Nginx 서비스를 활성화합니다.

    $ sudo systemctl enable nginx
    

    9단계 - Nginx 구성

    지금까지 Shlink는 포트 8080을 통해 로컬 시스템에서 실행되었습니다. 우리는 Nginx를 사용하여 해당 도메인에서 실행하기 위한 리버스 프록시 역할을 할 것입니다.

    /etc/nginx/conf.d 디렉터리에 Shlink 서버에 대한 구성 파일을 만듭니다.

    $ sudo nano /etc/nginx/conf.d/outline.conf
    

    다음 코드를 붙여넣습니다.

    server {
            server_name outline.example.com;
    
            listen 443 ssl http2;
            listen [::]:443 ssl http2;
    
            access_log /var/log/nginx/outline.access.log;
            error_log /var/log/nginx/outline.error.log;
    
            ssl_certificate /etc/letsencrypt/live/outline.example.com/fullchain.pem;
            ssl_certificate_key /etc/letsencrypt/live/outline.example.com/privkey.pem;
            ssl_trusted_certificate /etc/letsencrypt/live/outline.example.com/chain.pem;
            ssl_session_timeout 1d;
            ssl_session_cache shared:MozSSL:10m;
            ssl_session_tickets off;
    
            ssl_protocols TLSv1.2 TLSv1.3;
            ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    
            ssl_stapling on;
            ssl_stapling_verify on;
            ssl_dhparam /etc/ssl/certs/dhparam.pem;
     
            location / {
                    proxy_pass http://localhost:3000;
                    
                    proxy_set_header Upgrade $http_upgrade;
                    proxy_set_header Connection "Upgrade";
                    proxy_set_header Host $host;
            
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host;
                    proxy_set_header Host $http_host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Scheme $scheme;
                    proxy_set_header X-Forwarded-Proto $scheme;
                    proxy_redirect off;
            }
    }
    
    ## HTTPS Redirect
    server {
            listen 80; 
            listen [::]:80;
            server_name outline.example.com;
            return 301 https://$host$request_uri;
    }
    

    완료되면 Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    편집을 위해 /etc/nginx/nginx.conf 파일을 엽니다.

    $ sudo nano /etc/nginx/nginx.conf
    

    include /etc/nginx/conf.d/*.conf; 줄 앞에 다음 줄을 추가합니다.

    server_names_hash_bucket_size  64;
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다. Nginx를 다시 확인합니다.

    Nginx 구성 파일 구문을 확인합니다.

    $ sudo nginx -t
    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
    

    Nginx 서버를 시작합니다.

    $ sudo systemctl start nginx
    

    10단계 - 액세스 개요

    브라우저에서 https://outline.example.com 도메인을 시작하면 다음 페이지가 표시됩니다.

    Slack으로 계속하기 버튼을 클릭하여 Slack에 로그인하고 워크스페이스를 연결합니다.

    로그인하면 Outline 홈페이지가 열리고 작업을 시작할 수 있습니다.

    Slack용 Outline 앱을 사용하면 워크스페이스 내에서 모든 문서에 대한 링크를 검색하고 붙여넣을 수 있습니다. 이렇게 하려면 Slack 작업 공간을 열고 메시지에 /outline 를 입력하고 게시합니다.

    검색어와 관련된 문서를 자동으로 찾아 메시지에 게시합니다.

    11단계 - 개요 업데이트

    Outline 위키를 업데이트하려면 다음 명령어를 실행하세요. 첫 번째 명령은 컨테이너를 종료하고 제거합니다. 두 번째는 아웃라인 및 기타 도구용 Docker 이미지의 최신 버전을 가져옵니다. Docker Compose 파일 또는 환경 파일을 변경해야 하는 경우 동일한 명령을 실행할 수 있습니다.

    $ docker-compose down --remove-orphans
    $ docker-compose pull 
    

    다음 명령을 실행하여 데이터베이스를 업그레이드하십시오.

    $ docker-compose run --rm outline yarn db:migrate --env=production-ssl-disabled
    

    데이터를 그대로 유지하면서 새로운 이미지로 새 컨테이너를 시작하십시오.

    $ docker-compose up -d
    

    결론

    이것으로 Docker를 사용하여 Ubuntu 20.04 서버에 Outline Knowledgebase Wiki를 설치하는 방법에 대한 자습서를 마칩니다. Outline에 대해 자세히 알아보려면 공식 문서를 참조하세요. 질문이 있으시면 아래 의견에 게시하십시오.