Поиск по сайту:

Как установить вики-базу знаний Outline на Ubuntu с помощью Docker


На этой странице

  1. Предпосылки
  2. Шаг 1. Настройка брандмауэра
  3. Шаг 2. Установите Docker
  4. Шаг 3. Установите Docker Compose
  5. Шаг 4. Создание файла среды для Docker
    1. Настройка аутентификации Slack
    2. Настройка интеграции Slack
    3. Создание учетных данных S3
    4. Создание секретных ключей
    5. Создание и редактирование файла среды

    Outline — это программное обеспечение для совместной работы с базой знаний с открытым исходным кодом. Вы можете использовать его для размещения документации и фан-страниц или даже использовать его для обмена заметками. Он включает в себя редактор уценки и интегрируется с несколькими сервисами, такими как Slack, Figma, Airtable, Google Docs, Trello, Zapier, Codepen, Spotify, Youtube и т. д. Он имеет функции безопасности, такие как группы пользователей с отдельными разрешениями на чтение и запись, позволяет публичный обмен и имеет поддержку RTL с переводами на 13 языков. Он построен с использованием React и Node.js. Существует два способа использования Outline. Одна из них — это облачная версия, или вы можете разместить ее на своем сервере.

    В этом руководстве вы узнаете, как установить Outline Wiki на сервер под управлением Ubuntu с помощью Docker.

    Предпосылки

    • 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. Настройте брандмауэр

    Первым шагом является настройка брандмауэра. Ubuntu по умолчанию поставляется с 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, используя его официальный репозиторий. Добавьте официальный GPG-ключ Dockers.

    $ 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
    

    Выполните следующие команды, чтобы вам не нужно было использовать sudo для запуска команд Docker.

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

    Шаг 3 — Установите Docker Compose

    Выполните следующую команду, чтобы установить Docker compose. Недавно Docker Compose был обновлен до версии 2.0, в которой было внесено множество критических изменений. Мы будем использовать последнюю версию 1.x, доступную на странице релизов Github.

    $ 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-адреса, чтобы продолжить. Прокрутите страницу вниз до раздела User Token Scopes и выберите следующие области в раскрывающемся меню.

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

    Вернитесь на страницу основной информации с левой боковой панели. Скопируйте значения Client ID и Client Secret из соответствующих полей в разделе App Credentials.

    Настройка интеграции Slack

    Посетите опцию Slash Commands на левой боковой панели.

    Нажмите кнопку «Новая команда» на появившейся странице. Введите /outline в качестве команды. Введите https://outline.example.com/api/hooks.slack в качестве URL-адреса запроса. Введите описание для вашей команды и слово в качестве подсказки. Нажмите кнопку Сохранить внизу, когда закончите.

    Откройте меню «Функции» >> «Интерактивность и ярлыки» на левой боковой панели. Включите интерактивность, переключив переключатель и вставив https://outline.example.com/api/hooks.interactive в качестве URL-адреса запроса. Нажмите кнопку Сохранить изменения, чтобы закончить.

    Откройте страницу «Настройки» >> «Установить приложение» на левой боковой панели и нажмите кнопку «Установить в WorkSpace», чтобы установить приложение для рабочей области Slack.

    Посетите страницу «Основная информация» на левой боковой панели и скопируйте значения идентификатора приложения и токена подтверждения для слабой интеграции приложения.

    Создайте учетные данные S3

    Создайте корзину S3 для своей установки Outline на AWS или любом сервисе, совместимом с S3. После создания корзины добавьте следующую политику JSON для настройки совместного использования ресурсов между источниками (CORS). Замените значение AllowedOrigins своим URL-адресом Outline.

    [
        {
            "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
    

    Скопируйте и сохраните эти значения.

    Создайте и отредактируйте файл среды

    Создайте каталог для настроек Docker для Outline.

    $ mkdir ~/outline
    

    Перейдите в каталог.

    $ cd ~/outline
    

    Создайте файл docker.env и откройте его для редактирования. В этом файле будут храниться все переменные среды, необходимые для установки.

    $ nano docker.env
    

    Вставьте в него следующий код. Введите секретный ключ и используйте секрет, созданный ранее. Скопируйте учетные данные Slack, созданные ранее для аутентификации и интеграции приложений. Введите свои учетные данные Amazon S3, как указано ниже.

    Если вы хотите использовать Google Analytics для отслеживания статистики вашего приложения Outline, введите свой идентификатор Analytics в поле ниже. На данный момент Outline не поддерживает теги GA4, поэтому вам придется ввести свой старый идентификатор отслеживания.

    Для переменной WEB_CONCURRENCY разделите оперативную память вашей системы на 512 и введите приблизительное значение. Для переменной FORCE_HTTPS установлено значение false, поскольку мы используем Nginx в качестве прокси-сервера.

    # –––––––––––––––– 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 для Outline

    Создайте файл 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

    Чтобы установить SSL-сертификат с помощью Lets Encrypt, нам нужно загрузить инструмент Certbot. Для этого мы будем использовать установщик пакета Snapd.

    Установите установщик снапа.

    $ sudo apt install snapd
    

    Убедитесь, что ваша версия Snapd обновлена.

    $ sudo snap install core && sudo snap refresh core
    

    Установите Сертбот.

    $ sudo snap install --classic certbot
    

    Используйте следующую команду, чтобы убедиться, что команду Certbot можно запустить, создав символическую ссылку на каталог /usr/bin.

    $ 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 на вашем сервере.

    Создайте групповой сертификат Диффи-Хеллмана.

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

    Создайте корневой каталог вызова для автоматического обновления Lets Encrypt.

    $ sudo mkdir -p /var/lib/letsencrypt
    

    Создайте задание Cron для обновления SSL. Он будет запускаться каждый день, чтобы проверять сертификат и при необходимости обновлять его. Для этого сначала создайте файл /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
    

    Добавьте репозиторий для стабильной версии Nginx.

    $ 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
    

    Установите Нгинкс.

    $ sudo apt install nginx
    

    Проверьте установку.

    $ nginx -v
    nginx version: nginx/1.20.2
    

    Включите службу Nginx.

    $ sudo systemctl enable nginx
    

    Шаг 9 — Настройте Nginx

    До сих пор Shlink работал в локальной системе через порт 8080. Мы будем использовать Nginx в качестве обратного прокси-сервера для работы в его домене.

    Создайте файл конфигурации для сервера Shlink в каталоге /etc/nginx/conf.d.

    $ 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, и вы сможете начать над ней работать.

    Приложение Outline для Slack позволяет искать и вставлять ссылку на любой документ из рабочей области. Для этого откройте рабочее пространство Slack, введите /outline в сообщениях и разместите их.

    Он автоматически найдет документ, связанный с поисковым запросом, и опубликует его в ваших сообщениях.

    Шаг 11 — Обновить контур

    Чтобы обновить вики Outline, выполните следующие команды. Первая команда завершает работу и удаляет контейнеры. Второй извлекает последнюю версию образов Docker для Outline и других инструментов. Вы можете запустить те же команды, если вам нужно внести какие-либо изменения в файл компоновки Docker или файл среды.

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

    Выполните следующую команду, чтобы обновить базу данных.

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

    Запустите новый контейнер со свежими образами, сохранив при этом свои данные.

    $ docker-compose up -d
    

    Заключение

    На этом мы завершаем наше руководство по установке Outline Knowledgebase Wiki на сервер Ubuntu 20.04 с помощью Docker. Если вы хотите узнать больше о Outline, вы можете ознакомиться с его официальной документацией. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.