С помощью этого руководства вы развернете 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.
Шаги:
Зарегистрируйтесь в личном кабинете Cloud.ru.
Если вы уже зарегистрированы, войдите под своей учетной записью.
Сгенерируйте ключевую пару и загрузите публичный ключ в Cloud.ru Evolution.
Получите ключи доступа сервисного аккаунта. Запишите Key ID (логин) и Key Secret (пароль), они будут нужны для выполнения дальнейших шагов.
В этом шаге вы создадите группу безопасности, виртуальную машину и бакет в 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.
Сетевой интерфейс — выберите тип Публичный IP.
Группы безопасности — добавьте outline-wiki.
Логин — оставьте имя пользователя по умолчанию или укажите новое, например outline.
Метод аутентификации — Публичный ключ и Пароль.
Публичный ключ — укажите ключ, созданный ранее.
Пароль — задайте пароль пользователя.
Остальные параметры оставьте по умолчанию или выберите на свое усмотрение.
Убедитесь, что в личном кабинете на странице сервиса «Виртуальные машины»:
отображается виртуальная машина outline-wiki;
статус виртуальной машины — «Запущена».
Создайте бакет в Object Storage со следующими параметрами:
Доменное имя — например outline-wiki.
Название — такое же, как доменное имя.
Глобальное название — такое же, как доменное имя.
Класс хранения по умолчанию — Стандартный.
Максимальный размер — 10 ГБ.
Перейдите на вкладку Object Storage API.
Скопируйте и сохраните значения параметров ID тенанта и Регион.
Убедитесь, что в личном кабинете на странице сервиса Object Storage отображается бакет outline-wiki.
На этом шаге вы установите необходимые пакеты и подготовите среду.
Обновите систему и установите необходимые зависимости:
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
На этом шаге вы зарегистрируете доменное имя, настроите Nginx в качестве защищенного прокси, получите SSL-сертификат и ограничите доступ через межсетевой экран.
В терминале подключения к виртуальной машине настройте межстетевой экран:
sudo ufw allow OpenSSHsudo ufw allow 'Nginx Full'sudo ufw enable
Создайте конфигурационный файл:
sudo nano /etc/nginx/sites-available/outline.conf
Вставьте конфигурацию, заменив <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;}}
Активируйте конфигурацию и перезапустите 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 nginx
Cервис Nginx должен быть в статусе «active (running)».
Запустите команду для выпуска 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. При возникновении ошибки повторите команду выпуска сертификата. Если ошибка сохраняется, рассмотрите использование собственного доменного имени.
Перейдите по адресу https://wiki.<ip_address>.nip.io и убедитесь, что браузер отмечает соединение как безопасное.
На этом шаге вы настроите приложение в GitLab-инстансе для интеграции с Outline.
В собственном или облачном GitLab-инстансе перейдите в Настройки → Приложения.
Создайте новое приложение со следующими настройками:
Имя — Outline.
Redirect URI — https://wiki.<ip_address>.nip.io/auth/oidc.callback, где <ip_address> — публичный IP-адрес вашей виртуальной машины.
Scopes — openid, profile и email.
Сохраните приложение.
Сохраните значения Application ID и Secret, они понадобятся в дальнейшем.
На этом шаге вы развернете серверное приложение Outline с помощью Docker Compose.
В терминале подключения к виртуальной машине создайте структуру проекта:
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
Вставьте содержимое в файл, заменив переменные на значения:
services:outline:image: flameshikari/outline-ru:0.86.0env_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: <your_postgress_password>POSTGRES_DB: 'outline'volumes:storage-data:database-data:
Где <your_postgress_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_address>.nip.ioPORT=3000# Secrets (use the generated values from Step 6)SECRET_KEY=<secret_key>UTILS_SECRET=<utils_secret># Database configurationDATABASE_URL=postgres://user:<your_postgress_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
Где:
<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/.
Запустите сервис:
docker compose up -d
Проверьте, что сервисы запущены:
docker compose ps
Перейдите по адресу https://wiki.<ip_address>.nip.io.
Откроется страница Outline.
Авторизуйтесь в сервисе через GitLab.
На этом шаге вы настроите CORS для бакета в Object Storage, чтобы разрешить безопасное взаимодействие с вашим приложением.
В личном кабинете перейдите в сервис Хранение данных → Object Storage.
Откройте бакет outline-wiki.
Перейдите на вкладку Правила CORS.
Нажмите Добавить правило.
В поле Источники укажите https://wiki.<ip_address>.nip.io, где <ip_address> — это публичный IP-адрес виртуальной машины.
В поле HTTP-методы выберите GET, PUT, POST, DELETE.
Когда вы развернули и настроили сервис, закройте доступ по SSH для повышения безопасности.
В личном кабинете на верхней панели слева нажмите и выберите Инфраструктура → Виртуальные машины.
В списке виртуальных машин выберите outline-wiki.
Перейдите на вкладку Сетевые параметры.
В блоке сетевого интерфейса нажмите и выберите Изменить группы безопасности.
Удалите группу SSH-access_ru и сохраните изменения.
Убедитесь, что доступа нет — попробуйте подключиться к виртуальной машине по SSH.
После отключения доступа по SSH, администрирование сервиса будет доступно через серийную консоль виртуальной машины.
Вы развернули Wiki-сервис для командной работы в облаке Cloud.ru с сетевой изоляцией и публикацией по HTTPS.
Полученные навыки помогут вам создавать сервисы с использованием облачного хранилища и безопасной инфраструктурой.