Облачная платформаEvolution

Развертывание Wiki-сервиса Outline на виртуальной машине


С помощью этого руководства вы развернете Wiki-сервис для командной работы на виртуальной машине.

Вы создадите виртуальную машину Ubuntu 22.04, настроите для нее публичный IP-адрес, создадите бакет в Object Storage и настроите CORS для него.

На виртуальной машине настроите Docker и Docker Compose, развернете сервис Outline, подключите его к Object Storage и GitLab и опубликуете на сервере nginx, выпустите SSL-сертификат в сервисе Let’s Encrypt.

В итоге получится надежная схема, где файлы хранятся в Object Storage, а клиентский трафик шифруется HTTPS.

Вы будете использовать следующие сервисы:

  • «Виртуальные машины» — сервис, в рамках которого предоставляется виртуальная машина.

  • «Публичные IP» — сервис для организации доступа к сервису через интернет.

  • Object Storage — объектное S3-хранилище с бесплатным хранением файлов объемом до 15 ГБ.

  • Docker — система контейнеризации.

  • Docker Compose — инструмент для запуска и управления Docker-контейнерами.

  • Outline — open-source система вики.

  • Бесплатный сервис nip.io для получения публичного доменного имени и сертификата. Вы также можете использовать собственное зарегистрированное доменное имя и SSL-сертификат для организации доступа.

  • Nginx — веб-сервер для проксирования запросов и организации защищенного HTTPS-доступа к приложению.

  • Let’s Encrypt — сервис для автоматического получения бесплатного SSL-сертификата.

  • GitLab — как провайдер для авторизации. Список других доступных провайдеров можно найти в документе по аутентификации Outline.

Шаги:

  1. Разверните необходимые ресурсы в облаке.

  2. Настройте окружение на виртуальной машине.

  3. Настройте Nginx и HTTPS.

  4. Настройте приложение в GitLab.

  5. Разверните приложение.

  6. Настройте CORS в |s3e|.

  7. Удалите доступ по SSH для виртуальной машины.

Перед началом работы

  1. Зарегистрируйтесь в личном кабинете Cloud.ru.

    Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Сгенерируйте ключевую пару и загрузите публичный ключ в Cloud.ru Evolution.

  3. Получите ключи доступа сервисного аккаунта. Запишите Key ID (логин) и Key Secret (пароль), они будут нужны для выполнения дальнейших шагов.

1. Разверните ресурсы в облаке

В этом шаге вы создадите группу безопасности, виртуальную машину и бакет в Object Storage.

Создайте новую группу безопасности со следующими параметрами:

  1. Укажите Название группы безопасности, например outline-wiki.

  2. Добавьте правила входящего и исходящего трафика.

    Трафик

    Протокол

    Порт

    Тип источника/адресата

    Источник/Адресат

    Входящий

    TCP

    443

    IP-адрес

    0.0.0.0/0

    Входящий

    TCP

    80

    IP-адрес

    0.0.0.0/0

    Исходящий

    Любой

    IP-адрес

    0.0.0.0/0

  3. Убедитесь, что в личном кабинете на странице сервиса «Группы безопасности»:

    • отображается группа безопасности outline-wiki;

    • статус группы безопасности — «Создана».

  4. Создайте виртуальную машину со следующими параметрами:

    • Названиеoutline-wiki.

    • Образ — публичный образ Ubuntu 22.04.

    • Сетевой интерфейс — выберите тип Публичный IP.

    • Группы безопасности — добавьте outline-wiki.

    • Логин — оставьте имя пользователя по умолчанию или укажите новое, например outline.

    • Метод аутентификацииПубличный ключ и Пароль.

    • Публичный ключ — укажите ключ, созданный ранее.

    • Пароль — задайте пароль пользователя.

    • Остальные параметры оставьте по умолчанию или выберите на свое усмотрение.

  5. Убедитесь, что в личном кабинете на странице сервиса «Виртуальные машины»:

    • отображается виртуальная машина outline-wiki;

    • статус виртуальной машины — «Запущена».

  6. Создайте бакет в Object Storage со следующими параметрами:

    • Доменное имя — например outline-wiki.

    • Название — такое же, как доменное имя.

    • Глобальное название — такое же, как доменное имя.

    • Класс хранения по умолчаниюСтандартный.

    • Максимальный размер — 10 ГБ.

  7. Перейдите на вкладку Object Storage API.

  8. Скопируйте и сохраните значения параметров ID тенанта и Регион.

  9. Убедитесь, что в личном кабинете на странице сервиса Object Storage отображается бакет outline-wiki.

2. Настройте окружение виртуальной машины

На этом шаге вы установите необходимые пакеты и подготовите среду.

  1. Подключитесь к виртуальной машине по SSH.

  2. Обновите систему и установите необходимые зависимости:

    sudo apt update && sudo apt upgrade -y
    sudo apt install unzip gnupg software-properties-common apt-transport-https ca-certificates python3-pip nginx snapd -y
    sudo snap install core; sudo snap refresh core
    sudo snap install --classic certbot
    sudo ln -s /snap/bin/certbot /usr/bin/certbot
  3. Установите Docker и Docker Compose:

    # Add Docker's GPG key
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    # Add Docker repository
    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
    # Install Docker
    sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose
    # Add user to docker group
    sudo usermod -aG docker $USER
    newgrp docker
  4. Проверьте, что Docker установлен корректно:

    docker --version
    docker compose version

3. Настройте Nginx и HTTPS

На этом шаге вы зарегистрируете доменное имя, настроите Nginx в качестве защищенного прокси, получите SSL-сертификат и ограничите доступ через межсетевой экран.

  1. В терминале подключения к виртуальной машине настройте межстетевой экран:

    sudo ufw allow OpenSSH
    sudo ufw allow 'Nginx Full'
    sudo ufw enable
  2. Создайте конфигурационный файл:

    sudo nano /etc/nginx/sites-available/outline.conf
  3. Вставьте конфигурацию, заменив <ip_address> на IP-адрес вашей виртуальной машины.

    server {
    listen 80;
    server_name wiki.<ip_address>.nip.io www.wiki.<ip_address>.nip.io;
    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 X-Real-IP $remote_addr;
    proxy_set_header X-Scheme $scheme;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_redirect off;
    }
    }
  4. Активируйте конфигурацию и перезапустите Nginx:

    sudo ln -sf /etc/nginx/sites-available/outline.conf /etc/nginx/sites-enabled/outline.conf
    sudo rm -f /etc/nginx/sites-enabled/default
    sudo nginx -t
    sudo systemctl reload nginx
  5. Проверьте, что Nginx работает:

    sudo systemctl status nginx

    Cервис Nginx должен быть в статусе «active (running)».

  6. Запустите команду для выпуска SSL-сертификата.

    sudo certbot --nginx -d wiki.<ip_address>.nip.io --redirect --agree-tos -m <email>

    Где:

    • <ip_address> — публичный IP-адрес виртуальной машины.

    • <email> — email для регистрации сертификата.

    Внимание

    При выпуске сертификата через nip.io может возникнуть ошибка «too many certificates (25000) already issued for «nip.io»». Это происходит из-за популярности сервиса nip.io. При возникновении ошибки повторите команду выпуска сертификата. Если ошибка сохраняется, рассмотрите использование собственного доменного имени.

  7. Перейдите по адресу https://wiki.<ip_address>.nip.io и убедитесь, что браузер отмечает соединение как безопасное.

4. Настройте приложение в GitLab

На этом шаге вы настроите приложение в GitLab-инстансе для интеграции с Outline.

  1. В собственном или облачном GitLab-инстансе перейдите в Настройки → Приложения.

  2. Создайте новое приложение со следующими настройками:

    • ИмяOutline.

    • Redirect URIhttps://wiki.<ip_address>.nip.io/auth/oidc.callback, где <ip_address> — публичный IP-адрес вашей виртуальной машины.

    • Scopesopenid, profile и email.

  3. Сохраните приложение.

  4. Сохраните значения Application ID и Secret, они понадобятся в дальнейшем.

5. Разверните приложение

На этом шаге вы развернете серверное приложение Outline с помощью Docker Compose.

  1. В терминале подключения к виртуальной машине создайте структуру проекта:

    mkdir -p $HOME/outline
    cd $HOME/outline
  2. Сгенерируйте уникальные ключи и сохраните их, они понадобятся в дальнейшем:

    # Generate two random secrets for Outline
    openssl rand -hex 32 # Save this as SECRET_KEY
    openssl rand -hex 32 # Save this as UTILS_SECRET
    # Generate database password
    openssl rand -base64 15 # Save this as POSTGRES_PASSWORD
  3. Создайте файл docker-compose.yml:

    nano docker-compose.yml
  4. Вставьте содержимое в файл, заменив переменные на значения:

    services:
    outline:
    image: flameshikari/outline-ru:0.86.0
    env_file: ./docker.env
    ports:
    - "3000:3000"
    volumes:
    - storage-data:/var/lib/outline/data
    depends_on:
    - postgres
    - redis
    environment:
    PGSSLMODE: disable
    redis:
    image: redis:7-alpine
    ports:
    - "6379:6379"
    command: ["redis-server", "--bind", "0.0.0.0", "--port", "6379"]
    healthcheck:
    test: ["CMD", "redis-cli", "ping"]
    interval: 10s
    timeout: 30s
    retries: 3
    postgres:
    image: postgres:15
    env_file: ./docker.env
    ports:
    - "5432:5432"
    volumes:
    - database-data:/var/lib/postgresql/data
    healthcheck:
    test: ["CMD", "pg_isready", "-d", "outline", "-U", "user"]
    interval: 30s
    timeout: 20s
    retries: 3
    environment:
    POSTGRES_USER: 'user'
    POSTGRES_PASSWORD: <your_postgress_password>
    POSTGRES_DB: 'outline'
    volumes:
    storage-data:
    database-data:

    Где <your_postgress_password> — пароль от базы данных, сгенерированный ранее.

  5. Создайте конфигурацию Redis:

    nano redis.conf
  6. Вставьте содержимое в файл:

    bind 127.0.0.1
    port 6379
    timeout 0
    save 900 1
    save 300 10
    save 60 10000
    dbfilename dump.rdb
    dir ./
  7. Создайте файл docker.env:

    nano docker.env
  8. Вставьте содержимое в файл, заменив переменные на значения:

    NODE_ENV=production
    # Application URL
    URL=https://wiki.<ip_address>.nip.io
    PORT=3000
    # Secrets (use the generated values from Step 6)
    SECRET_KEY=<secret_key>
    UTILS_SECRET=<utils_secret>
    # Database configuration
    DATABASE_URL=postgres://user:<your_postgress_password>@postgres:5432/outline
    PGSSLMODE=disable
    # Redis configuration
    REDIS_URL=redis://redis:6379
    # File storage (using AWS S3)
    FILE_STORAGE=s3
    AWS_ENDPOINT_URL_S3=https://s3.cloud.ru
    AWS_SDK_LOAD_CONFIG=1
    AWS_USE_GLOBAL_ENDPOINT=false
    AWS_S3_ADDRESSING_STYLE=path
    AWS_ACCESS_KEY_ID=<tenant_id>:<secret_key_id>
    AWS_SECRET_ACCESS_KEY=<secret_key>
    AWS_REGION=<region>
    AWS_S3_CUSTOM_DOMAIN=<BUCKET_NAME>.s3.cloud.ru
    AWS_S3_ENDPOINT=https://<BUCKET_NAME>.s3.cloud.ru
    AWS_S3_UPLOAD_BUCKET_URL=https://<BUCKET_NAME>.s3.cloud.ru
    AWS_S3_UPLOAD_BUCKET_NAME=<bucket_name>
    AWS_S3_FORCE_PATH_STYLE=false
    AWS_S3_ACL=private
    FILE_STORAGE_UPLOAD_MAX_SIZE=26214400
    AWS_S3_SIGNATURE_VERSION=v4
    # GitLab OIDC Authentication
    OIDC_CLIENT_ID=<gitlab_app_id>
    OIDC_CLIENT_SECRET=<gitlab_client_secret>
    OIDC_AUTH_URI=https://<gitlab_domain>/oauth/authorize
    OIDC_TOKEN_URI=https://<gitlab_domain>/oauth/token
    OIDC_USERINFO_URI=https://<gitlab_domain>/oauth/userinfo
    OIDC_USERNAME_CLAIM=username
    OIDC_DISPLAY_NAME=GitLab
    OIDC_SCOPES=openid email profile
    # SSL Configuration
    FORCE_HTTPS=true
    # Rate limiting
    RATE_LIMITER_ENABLED=true
    RATE_LIMITER_REQUESTS=1000
    RATE_LIMITER_DURATION_WINDOW=60
    # Updates
    ENABLE_UPDATES=true
    # Logging
    DEBUG=http
    LOG_LEVEL=info

    Где:

    • <ip_address> — публичный IP‑адрес виртульной машины.

    • <secret_key>, <utils_secret> — секреты, сгенерированные на шаге 5.

    • <your_postgress_password> — пароль от базы данных, сгенерированный ранее.

    • <tenant_id> — ID тенанта сервиса Object Storage.

    • <region> — регион Object Storage.

    • <secret_key_id>, <secret_key> — ID ключа и секретный ключ доступа к Object Storage.

    • <bucket_name> — название бакета Object Storage.

    • <gitlab_app_id>, <gitlab_client_secret> — ID и секретный ключ доступа к приложению GitLab.

    • <gitlab_domain> — адрес сервиса GitLab. Может быть собственный или https://gitlab.com/.

  9. Запустите сервис:

    docker compose up -d
  10. Проверьте, что сервисы запущены:

    docker compose ps
  11. Перейдите по адресу https://wiki.<ip_address>.nip.io.

    Откроется страница Outline.

  12. Авторизуйтесь в сервисе через GitLab.

../_images/img__outline_wiki.webp

6. Настройте CORS в Object Storage

На этом шаге вы настроите CORS для бакета в Object Storage, чтобы разрешить безопасное взаимодействие с вашим приложением.

  1. В личном кабинете перейдите в сервис Хранение данных → Object Storage.

  2. Откройте бакет outline-wiki.

  3. Перейдите на вкладку Правила CORS.

  4. Нажмите Добавить правило.

  5. В поле Источники укажите https://wiki.<ip_address>.nip.io, где <ip_address> — это публичный IP-адрес виртуальной машины.

  6. В поле HTTP-методы выберите GET, PUT, POST, DELETE.

7. Отключите SSH-доступ

Когда вы развернули и настроили сервис, закройте доступ по SSH для повышения безопасности.

  1. В личном кабинете на верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Инфраструктура → Виртуальные машины.

  2. В списке виртуальных машин выберите outline-wiki.

  3. Перейдите на вкладку Сетевые параметры.

  4. В блоке сетевого интерфейса нажмите Горизонтальное меню и выберите Изменить группы безопасности.

  5. Удалите группу SSH-access_ru и сохраните изменения.

  6. Убедитесь, что доступа нет — попробуйте подключиться к виртуальной машине по SSH.

    После отключения доступа по SSH, администрирование сервиса будет доступно через серийную консоль виртуальной машины.

Результат

Вы развернули Wiki-сервис для командной работы в облаке Cloud.ru с сетевой изоляцией и публикацией по HTTPS.

Полученные навыки помогут вам создавать сервисы с использованием облачного хранилища и безопасной инфраструктурой.