Развертывание Wiki-сервиса Outline на виртуальной машине
В этой лабораторной работе вы развернете Wiki-сервис для командной работы на бесплатной виртуальной машине в облаке Cloud.ru Evolution.
Вы создадите виртуальную машину 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 — хранилище для файлов.
-
Docker — система контейнеризации.
-
Docker Compose — инструмент для запуска и управления Docker-контейнерами.
-
Outline — open-source система вики.
-
Бесплатный сервис nip.io для получения публичного доменного имени и сертификата. Вы также можете использовать собственное зарегистрированное доменное имя и SSL-сертификат для организации доступа.
-
Nginx — для проксирования запросов и организации защищённого HTTPS-доступа к приложению.
-
Let’s Encrypt — для автоматического получения бесплатного SSL-сертификата.
-
GitLab — как провайдер для авторизации. Список других доступных провайдеров можно найти в документе по аутентификации Outline.
Шаги:
Перед началом работы
-
Если вы уже зарегистрированы, войдите под своей учетной записью.
-
Сгенерируйте SSH-ключ по инструкции.
-
Загрузите публичную часть SSH-ключа в облако Cloud.ru Evolution по инструкции.
1. Разверните необходимые ресурсы в облаке
В этом шаге вы создадите группу безопасности, виртуальную машину и бакет в Object Storage.
Создайте группу безопасности со следующими параметрами:
-
В поле Название укажите outline-wiki.
-
Добавьте правила входящего трафика:
-
Протокол: TCP
-
Порт: 443
-
Тип источника: IP-адрес
-
Источник: 0.0.0.0/0
-
Протокол: TCP
-
Порт: 80
-
Тип источника: IP-адрес
-
Источник: 0.0.0.0/0
-
-
Добавьте правила исходящего трафика:
-
Протокол: Любой
-
Тип адресата: IP-адрес
-
Адресат: 0.0.0.0/0
-
Убедитесь, что в личном кабинете на странице сервиса «Группы безопасности»:
отображается группа безопасности outline-wiki;
статус группы безопасности — «Создана».
Создайте бесплатную виртуальную машину со следующими параметрами:
-
В поле Название укажите outline-wiki.
-
В разделе Образ выберите Маркетплейс → Ubuntu 22.04.
-
Заполните поле Имя пользователя, например outline.
-
В разделе Метод аутентификации выберите публичный ключ и пароль.
-
Укажите публичный ключ и ваш пароль для создаваемого пользователя.
-
В поле Имя хоста укажите outline-wiki.
-
В поле Название загрузочного диска укажите outline-wiki-disk.
-
Включите опцию Подключить публичный IP.
-
В группе Тип IP-адреса выберите Прямой.
-
Выберите группы безопасности SSH-access_ru.AZ-1, outline-wiki.
Убедитесь, что в личном кабинете на странице сервиса «Виртуальные машины»:
отображается виртуальная машина outline-wiki;
статус виртуальной машины — «Запущена».
Создайте бакет в Object Storage со следующими параметрами:
-
В поле Доменное имя укажите outline-wiki (должно быть уникальным, замените на своё уникальное значение).
-
В поле Название укажите outline-wiki (совпадает с доменным именем).
-
В поле Глобальное название укажите outline-wiki (совпадает с доменным именем).
-
В поле Класс хранения по умолчанию выберите стандартный.
-
В поле Максимальный размер укажите 10 ГБ.
Перейдите в раздел Object Storage API. Сохраните значения ID тенанта и Регион.
Убедитесь, что в личном кабинете на странице сервиса «Object Storage» отображается бакет outline-wiki.
Создайте сервисный аккаунт администратора со следующими параметрами:
-
В поле Название укажите outline-object-storage-admin.
-
В поле Описание укажите «Аккаунт администратора Object Storage».
-
В поле Проект выберите Пользователь сервисов.
-
Оставьте список Сервисы пустым.
-
В разделе Evolution Object Storage Роли выберите s3e.admin.
Следуя аналогичной инструкции, создайте сервисный аккаунт пользователя со следующими параметрами:
-
В поле Название укажите outline-object-storage.
-
В поле Описание укажите «Аккаунт пользователя Object Storage».
-
В поле Проект выберите Пользователь сервисов.
-
Оставьте список Сервисы пустым.
-
В поле Evolution Object Storage Роли выберите s3e.viewer, s3e.editor.
Сгенерируйте ключи доступа для обоих аккаунтов. Сохраните Secret ID и Secret Key для обоих ключей.
2. Настройте окружение на виртуальной машине
Настройте систему и установите необходимые пакеты на виртуальной машине.
-
Подключитесь к виртуальной машине outline-wiki через серийную консоль или по SSH .
-
Обновите систему и установите необходимые зависимости:
sudo apt update && sudo apt upgrade -ysudo apt install unzip gnupg software-properties-common apt-transport-https ca-certificates python3-pip nginx snapd -ysudo snap install core; sudo snap refresh coresudo snap install --classic certbotsudo ln -s /snap/bin/certbot /usr/bin/certbot -
Установите Docker и Docker Compose:
# Add Docker's GPG keycurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg# Add Docker repositoryecho "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 Dockersudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin docker-compose# Add user to docker groupsudo usermod -aG docker $USERnewgrp docker -
Проверьте, что Docker установлен корректно:
docker --versiondocker compose version
3. Настройте Nginx и HTTPS
Настройте службу Nginx и обеспечьте доступ по HTTPS.
-
Подключитесь к виртуальной машине outline-wiki через серийную консоль или по SSH .
-
Сконфигурируйте файрвол:
sudo ufw allow OpenSSHsudo ufw allow 'Nginx Full'sudo ufw enable -
Создайте конфигурационный файл:
sudo nano /etc/nginx/sites-available/outline.conf -
Вставьте конфигурацию, заменив <IP-адрес> на IP-адрес вашей виртуальной машины.
server {listen 80;server_name wiki.<IP-адрес>.nip.io www.wiki.<IP-адрес>.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;}} -
Примените конфигурацию и перезапустите nginx:
sudo ln -sf /etc/nginx/sites-available/outline.conf /etc/nginx/sites-enabled/outline.confsudo rm -f /etc/nginx/sites-enabled/defaultsudo nginx -tsudo systemctl reload nginx -
Проверьте, что nginx работает:
sudo systemctl status nginxCервис nginx должен быть в статусе «active (running)».
-
Перейдите по адресу http://wiki.<IP-адрес>.nip.io.
Откроется страница с текстом 502 Bad Gateway.
-
Запустите команду для выпуска SSL-сертификата.
sudo certbot --nginx -d wiki.<IP-адрес>.nip.io --redirect --agree-tos -m <EMAIL>Где:
-
<IP-адрес> — IP-адрес вашей виртуальной машины.
-
<EMAIL> — ваш email.
-
-
После успешного выпуска сертификата, перейдите по адресу https://wiki.<IP-адрес>.nip.io.
Откроется страница с текстом 502 Bad Gateway. В свойствах сайта браузер отметит соединение как безопасное.
4. Настройте приложение в GitLab
Создайте приложение в вашем GitLab-инстансе для интеграции с Outline.
-
Перейдите в Настройки → Приложения в собственном или облачном GitLab-инстансе.
-
Создайте новое приложение со следующими настройками:
-
Имя: Outline
-
Redirect URI: https://wiki.<IP-адрес>.nip.io/auth/oidc.callback (замените значения IP-адрес)
-
Scopes: Выберите openid, profile и email
-
-
Сохраните приложение.
-
Сохраните значения Application ID и Secret, они понадобятся в дальнейшем.
5. Разверните приложение
Разверните серверное приложение Outline с помощью Docker Compose.
-
Подключитесь к виртуальной машине outline-wiki через серийную консоль или по SSH .
-
Создайте структуру проекта:
mkdir -p $HOME/outlinecd $HOME/outline -
Сгенерируйте уникальные ключи и сохраните их, они понадобятся в дальнейшем:
# Generate two random secrets for Outlineopenssl rand -hex 32 # Save this as SECRET_KEYopenssl rand -hex 32 # Save this as UTILS_SECRET# Generate database passwordopenssl rand -base64 15 # Save this as POSTGRES_PASSWORD -
Создайте файл docker-compose.yml:
nano docker-compose.yml -
Вставьте содержимое в файл docker.env, заменив переменные на значения:
services:outline:image: flameshikari/outline-ru:latestenv_file: ./docker.envports:- "3000:3000"volumes:- storage-data:/var/lib/outline/datadepends_on:- postgres- redisenvironment:PGSSLMODE: disableredis:image: redis:7-alpineports:- "6379:6379"command: ["redis-server", "--bind", "0.0.0.0", "--port", "6379"]healthcheck:test: ["CMD", "redis-cli", "ping"]interval: 10stimeout: 30sretries: 3postgres:image: postgres:15env_file: ./docker.envports:- "5432:5432"volumes:- database-data:/var/lib/postgresql/datahealthcheck:test: ["CMD", "pg_isready", "-d", "outline", "-U", "user"]interval: 30stimeout: 20sretries: 3environment:POSTGRES_USER: 'user'POSTGRES_PASSWORD: <POSTGRES_PASSWORD>POSTGRES_DB: 'outline'volumes:storage-data:database-data:Где <POSTGRES_PASSWORD> — пароль от базы данных, сгенерированный ранее.
-
Создайте конфигурацию Redis:
nano redis.conf -
Вставьте содержимое в файл:
bind 127.0.0.1port 6379timeout 0save 900 1save 300 10save 60 10000dbfilename dump.rdbdir ./ -
Создайте файл docker.env:
nano docker.env -
Вставьте содержимое в файл, заменив переменные на значения:
NODE_ENV=production# Application URLURL=https://wiki.<IP-адрес>.nip.ioPORT=3000# Secrets (use the generated values from Step 6)SECRET_KEY=<SECRET_KEY>UTILS_SECRET=<UTILS_SECRET># Database configurationDATABASE_URL=postgres://user:<POSTGRES_PASSWORD>@postgres:5432/outlinePGSSLMODE=disable# Redis configurationREDIS_URL=redis://redis:6379# File storage (using AWS S3)FILE_STORAGE=s3AWS_ENDPOINT_URL_S3=https://s3.cloud.ruAWS_SDK_LOAD_CONFIG=1AWS_USE_GLOBAL_ENDPOINT=falseAWS_S3_ADDRESSING_STYLE=pathAWS_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.ruAWS_S3_ENDPOINT=https://<BUCKET_NAME>.s3.cloud.ruAWS_S3_UPLOAD_BUCKET_URL=https://<BUCKET_NAME>.s3.cloud.ruAWS_S3_UPLOAD_BUCKET_NAME=<BUCKET_NAME>AWS_S3_FORCE_PATH_STYLE=falseAWS_S3_ACL=privateFILE_STORAGE_UPLOAD_MAX_SIZE=26214400AWS_S3_SIGNATURE_VERSION=v4# GitLab OIDC AuthenticationOIDC_CLIENT_ID=<GITLAB_APP_ID>OIDC_CLIENT_SECRET=<GITLAB_CLIENT_SECRET>OIDC_AUTH_URI=https://<GITLAB_DOMAIN>/oauth/authorizeOIDC_TOKEN_URI=https://<GITLAB_DOMAIN>/oauth/tokenOIDC_USERINFO_URI=https://<GITLAB_DOMAIN>/oauth/userinfoOIDC_USERNAME_CLAIM=usernameOIDC_DISPLAY_NAME=GitLabOIDC_SCOPES=openid email profile# SSL ConfigurationFORCE_HTTPS=true# Rate limitingRATE_LIMITER_ENABLED=trueRATE_LIMITER_REQUESTS=1000RATE_LIMITER_DURATION_WINDOW=60# UpdatesENABLE_UPDATES=true# LoggingDEBUG=httpLOG_LEVEL=infoГде:
-
<SECRET_KEY>, <UTILS_SECRET> — секреты, сгенерированные на шаге 5.
-
<POSTGRES_PASSWORD> — пароль от базы данных, сгенерированный ранее.
-
<TENANT_ID> — ID тенанта сервиса Object Storage.
-
<REGION> — регион Object Storage.
-
<SECRET_KEY_ID>, <SECRET_KEY> — ID ключа и секретный ключ доступа к Object Storage. Используйте ключи от аккаунта outline-object-storage.
-
<BUCKET_NAME> — название бакета Object Storage.
-
<GITLAB_APP_ID>, <GITLAB_CLIENT_SECRET> — ID и секретный ключ доступа к приложению GitLab.
-
<GITLAB_DOMAIN> — адрес сервиса GitLab. Может быть собственный или https://gitlab.com/.
-
-
Запустите сервис:
docker compose up -d -
Проверьте, что сервисы запущены:
docker compose ps -
Перейдите по адресу https://wiki.<IP-адрес>.nip.io. Откроется страница Outline, и вы будете перенаправлены в GitLab для авторизации.
-
Авторизуйтесь в GitLab, и вы будете автоматически перенаправлены на страницу Outline.

6. Настройте CORS в Object Storage
Настройте CORS для бакета в Object Storage, чтобы разрешить безопасное взаимодействие с вашим приложением.
-
Подключитесь к виртуальной машине outline-wiki через серийную консоль или по SSH .
-
Установите зависимости командой:
pip install boto3 -
Создайте файл configure_cors.py и добавьте в него код:
nano configure_cors.py -
Вставьте содержимое в файл конфигурации:
import sysimport boto3from botocore.client import ConfigBUCKET = sys.argv[1]ENDPOINT = sys.argv[2]AK = sys.argv[3]SK = sys.argv[4]REGION = sys.argv[5]FRONTEND_URL = sys.argv[6]s3 = boto3.client(service_name='s3',aws_access_key_id=AK,aws_secret_access_key=SK,endpoint_url=ENDPOINT,region_name=REGION,verify=False,config=Config(s3={'addressing_style': 'virtual'}))cors_configuration = {'CORSRules': [{'AllowedMethods': ['PUT', 'POST'],'AllowedOrigins': [FRONTEND_URL],'ExposeHeaders': ['ETag'],'AllowedHeaders': ['*'],'MaxAgeSeconds': 60}]}s3.put_bucket_cors(Bucket=BUCKET, CORSConfiguration=cors_configuration) -
Запустите команду для обновления CORS правил:
python3 configure_cors.py <BUCKET_NAME> https://s3.cloud.ru <TENANT_ID>:<SECRET_KEY_ID> <SECRET_KEY> <REGION> https://wiki.<IP-адрес>.nip.ioГде:
-
<BUCKET_NAME> — название бакета Object Storage.
-
<TENANT_ID> — ID тенанта сервиса Object Storage.
-
<REGION> — регион Object Storage.
-
<SECRET_KEY_ID>, <SECRET_KEY> — ID ключа и секретный ключ доступа к Object Storage. Используйте ключи от аккаунта outline-object-storage-admin.
-
-
Перейдите по адресу http://<IP-адрес>.nip.io. Откроется страница Outline.
-
Создайте новую заметку и загрузите в нее изображение.
7. Удалите доступ по SSH для виртуальной машины
Обеспечьте безопасность, удалив доступ по SSH для вашей виртуальной машины, поскольку он больше не требуется.
-
Перейдите в раздел Сетевые параметры.
-
Нажмите изменить группы безопасности для публичного IP-адреса.
-
Удалите группу SSH-access_ru.
-
Нажмите Сохранить.
-
Убедитесь, что доступа нет — попробуйте подключиться к виртуальной машине по SSH.
Что дальше
В этой лабораторной работе вы развернули Wiki-сервис для командной работы в облаке Cloud.ru с надежной сетевой изоляцией и публикацией по HTTPS.
Полученные навыки помогут вам создавать сервисы с использованием облачного хранилища и безопасной инфраструктурой.
Узнавайте больше о работе с сервисами и получайте практические навыки управления облаком, выполняя лабораторные работы.
- Перед началом работы
- 1. Разверните необходимые ресурсы в облаке
- 2. Настройте окружение на виртуальной машине
- 3. Настройте Nginx и HTTPS
- 4. Настройте приложение в GitLab
- 5. Разверните приложение
- 6. Настройте CORS в Object Storage
- 7. Удалите доступ по SSH для виртуальной машины
- Что дальше