С помощью этого руководства вы развернете CRM‑сервис Twenty на виртуальной машине в облаке Cloud.ru Evolution:
Вы создадите инфраструктуру, развернете сервис CRM и опубликуете его на сервере nginx, обеспечив безопасный доступ по HTTPS.
Вы создадите резервную копию виртуальной машины в сервисе «Резервное копирование» для сохранности данных.
В результате вы получите работающее окружение Twenty, развернутое из фиксированного тега образа и готовое к использованию.
Вы будете использовать следующие сервисы:
«Виртуальные машины» — сервис, в рамках которого предоставляется виртуальная машина.
Object Storage — объектное S3-хранилище с бесплатным хранением файлов объемом до 15 ГБ.
«Публичные IP» — сервис для организации доступа к приложению через интернет.
Резервное копирование — для создания резервных копий.
Docker — система контейнеризации.
Docker Compose — инструмент для запуска и управления Docker-контейнерами.
Twenty CRM — CRM-сервис с открытым исходным кодом.
Бесплатный сервис nip.io для получения публичного доменного имени и сертификата. Вы также можете использовать собственное зарегистрированное доменное имя и SSL-сертификат для организации доступа.
Nginx — веб-сервер для проксирования запросов и организации защищенного HTTPS-доступа к приложению.
Let’s Encrypt — сервис для автоматического получения бесплатного SSL-сертификата.
Шаги:
Зарегистрируйтесь в личном кабинете Cloud.ru.
Если вы уже зарегистрированы, войдите под своей учетной записью.
Сгенерируйте ключевую пару и загрузите публичный ключ в Cloud.ru Evolution.
Получите ключи доступа сервисного аккаунта. Запишите Key ID (логин) и Key Secret (пароль), они будут нужны для выполнения дальнейших шагов.
На этом шаге вы подготовите сеть, группу безопасности, виртуальную машину.
Создайте группу безопасности с названием crm-service и добавьте в нее правила:
Трафик | Протокол | Порт | Тип источника/адресата | Источник/Адресат |
|---|---|---|---|---|
Входящий | TCP | 443 | IP-адрес | 0.0.0.0/0 |
Входящий | TCP | 80 | IP-адрес | 0.0.0.0/0 |
Исходящий | — | — | IP-адрес | 0.0.0.0/0 |
На странице Сети → Группы безопасности убедитесь, что отображается группа безопасности crm-service со статусом «Создана».
Создайте виртуальную машину со следующими параметрами:
Название — crm-service.
Образ — публичный образ Ubuntu 22.04.
Публичный IP — оставьте Арендовать новый или выберите IP-адрес из списка арендованных.
Группы безопасности — SSH-access_ru.AZ-1 и crm-service.
Логин — crm-service.
Метод аутентификации — Публичный ключ и Пароль.
Публичный ключ — укажите ключ, созданный ранее.
Пароль — задайте пароль пользователя.
Имя хоста — crm-service.
Остальные параметры оставьте по умолчанию или выберите на свое усмотрение.
На странице Инфраструктура → Виртуальные машины убедитесь, что отображается виртуальная машина crm-service со статусом «Запущена».
Создайте бакет в Object Storage со следующими параметрами:
Название — crm-service.
Максимальный размер — 15 ГБ.
Класс хранения по умолчанию — Стандартный.
Перейдите на вкладку Object Storage API.
Скопируйте и сохраните значения параметров ID тенанта и Регион.
Убедитесь, что в личном кабинете на странице сервиса Object Storage отображается бакет crm-service.
На этом шаге вы установите необходимые пакеты и подготовите среду.
Обновите систему и установите необходимые зависимости:
sudo apt update && sudo apt upgrade -y &&\sudo apt install -y curl apt-transport-https\ca-certificates\software-properties-common\gnupg2\lsb-release
Установите Docker:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpgecho "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/nullsudo apt updatesudo apt install docker-ce docker-ce-cli containerd.io -y
Предоставьте текущему пользователю права на запуск Docker:
sudo usermod -aG docker $USERnewgrp docker
Установите Docker Compose:
sudo apt-get install docker-compose-plugin -y
Проверьте, что Docker и Docker Compose установлены корректно:
docker --versiondocker compose version
Установите и запустите Nginx:
sudo apt install nginx -ysudo systemctl enable nginxsudo systemctl start nginx
Установите Let’s Encrypt и плагин для Nginx:
sudo apt install certbot python3-certbot-nginx -y
На этом шаге вы зарегистрируете доменное имя, настроите Nginx в качестве защищенного прокси, получите SSL-сертификат и ограничите доступ через межсетевой экран.
В терминале подключения к виртуальной машине настройте межстетевой экран:
sudo ufw allow OpenSSHsudo ufw allow 'Nginx Full'sudo ufw enable
Создайте конфигурационный файл:
sudo nano /etc/nginx/sites-available/crm.conf
Вставьте конфигурацию, заменив <ip_address> на публичный IP-адрес вашей виртуальной машины.
server {listen 80;server_name crm.<ip_address>.nip.io www.crm.<ip_address>.nip.io;# Proxy all other requests to Twenty CRMlocation / {proxy_pass http://localhost:3000;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection 'upgrade';proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_cache_bypass $http_upgrade;proxy_read_timeout 300;proxy_connect_timeout 300;proxy_send_timeout 300;}}
Активируйте конфигурацию и перезапустите Nginx:
sudo ln -sf /etc/nginx/sites-available/crm.conf /etc/nginx/sites-enabled/crm.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 crm.<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://sonar.<ip_address>.nip.io и убедитесь, что браузер отмечает соединение как безопасное.
На этом шаге вы развернете серверное приложение Twenty CRM с помощью Docker Compose.
В терминале подключения к виртуальной машине создайте структуру проекта:
mkdir ~/twenty-crmcd ~/twenty-crm
Сгенерируйте уникальный ключ и сохраните его, он понадобится в дальнейшем:
openssl rand -base64 32
Сгенерируйте пароль для базы данных и сохраните его, он понадобится в дальнейшем:
openssl rand -base64 15
Создайте файл docker-compose.yml:
nano docker-compose.yml
Вставьте код:
name: twentyservices:server:image: twentycrm/twenty:${TAG:-latest}volumes:- server-local-data:/app/packages/twenty-server/.local-storageports:- "3000:3000"environment:NODE_PORT: 3000PG_DATABASE_URL: postgres://${PG_DATABASE_USER:-postgres}:${PG_DATABASE_PASSWORD:-postgres}@${PG_DATABASE_HOST:-db}:${PG_DATABASE_PORT:-5432}/defaultSERVER_URL: ${SERVER_URL}REDIS_URL: ${REDIS_URL:-redis://redis:6379}DISABLE_DB_MIGRATIONS: ${DISABLE_DB_MIGRATIONS}DISABLE_CRON_JOBS_REGISTRATION: ${DISABLE_CRON_JOBS_REGISTRATION}STORAGE_TYPE: ${STORAGE_TYPE}STORAGE_S3_REGION: ${STORAGE_S3_REGION}STORAGE_S3_NAME: ${STORAGE_S3_NAME}STORAGE_S3_ENDPOINT: ${STORAGE_S3_ENDPOINT}STORAGE_S3_ACCESS_KEY_ID: ${STORAGE_S3_ACCESS_KEY_ID}STORAGE_S3_SECRET_ACCESS_KEY: ${STORAGE_S3_SECRET_ACCESS_KEY}APP_SECRET: ${APP_SECRET:-replace_me_with_a_random_string}# MESSAGING_PROVIDER_GMAIL_ENABLED: ${MESSAGING_PROVIDER_GMAIL_ENABLED}# CALENDAR_PROVIDER_GOOGLE_ENABLED: ${CALENDAR_PROVIDER_GOOGLE_ENABLED}# AUTH_GOOGLE_CLIENT_ID: ${AUTH_GOOGLE_CLIENT_ID}# AUTH_GOOGLE_CLIENT_SECRET: ${AUTH_GOOGLE_CLIENT_SECRET}# AUTH_GOOGLE_CALLBACK_URL: ${AUTH_GOOGLE_CALLBACK_URL}# AUTH_GOOGLE_APIS_CALLBACK_URL: ${AUTH_GOOGLE_APIS_CALLBACK_URL}# CALENDAR_PROVIDER_MICROSOFT_ENABLED: ${CALENDAR_PROVIDER_MICROSOFT_ENABLED}# MESSAGING_PROVIDER_MICROSOFT_ENABLED: ${MESSAGING_PROVIDER_MICROSOFT_ENABLED}# AUTH_MICROSOFT_ENABLED: ${AUTH_MICROSOFT_ENABLED}# AUTH_MICROSOFT_CLIENT_ID: ${AUTH_MICROSOFT_CLIENT_ID}# AUTH_MICROSOFT_CLIENT_SECRET: ${AUTH_MICROSOFT_CLIENT_SECRET}# AUTH_MICROSOFT_CALLBACK_URL: ${AUTH_MICROSOFT_CALLBACK_URL}# AUTH_MICROSOFT_APIS_CALLBACK_URL: ${AUTH_MICROSOFT_APIS_CALLBACK_URL}# EMAIL_FROM_ADDRESS: ${EMAIL_FROM_ADDRESS:-contact@yourdomain.com}# EMAIL_FROM_NAME: ${EMAIL_FROM_NAME:-"John from YourDomain"}# EMAIL_SYSTEM_ADDRESS: ${EMAIL_SYSTEM_ADDRESS:-system@yourdomain.com}# EMAIL_DRIVER: ${EMAIL_DRIVER:-smtp}# EMAIL_SMTP_HOST: ${EMAIL_SMTP_HOST:-smtp.gmail.com}# EMAIL_SMTP_PORT: ${EMAIL_SMTP_PORT:-465}# EMAIL_SMTP_USER: ${EMAIL_SMTP_USER:-}# EMAIL_SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD:-}depends_on:db:condition: service_healthyhealthcheck:test: curl --fail http://localhost:3000/healthzinterval: 5stimeout: 5sretries: 20restart: alwaysworker:image: twentycrm/twenty:${TAG:-latest}volumes:- server-local-data:/app/packages/twenty-server/.local-storagecommand: ["yarn", "worker:prod"]environment:PG_DATABASE_URL: postgres://${PG_DATABASE_USER:-postgres}:${PG_DATABASE_PASSWORD:-postgres}@${PG_DATABASE_HOST:-db}:${PG_DATABASE_PORT:-5432}/defaultSERVER_URL: ${SERVER_URL}REDIS_URL: ${REDIS_URL:-redis://redis:6379}DISABLE_DB_MIGRATIONS: "true"DISABLE_CRON_JOBS_REGISTRATION: "true"STORAGE_TYPE: ${STORAGE_TYPE}STORAGE_S3_REGION: ${STORAGE_S3_REGION}STORAGE_S3_NAME: ${STORAGE_S3_NAME}STORAGE_S3_ENDPOINT: ${STORAGE_S3_ENDPOINT}STORAGE_S3_ACCESS_KEY_ID: ${STORAGE_S3_ACCESS_KEY_ID}STORAGE_S3_SECRET_ACCESS_KEY: ${STORAGE_S3_SECRET_ACCESS_KEY}APP_SECRET: ${APP_SECRET:-replace_me_with_a_random_string}# MESSAGING_PROVIDER_GMAIL_ENABLED: ${MESSAGING_PROVIDER_GMAIL_ENABLED}# CALENDAR_PROVIDER_GOOGLE_ENABLED: ${CALENDAR_PROVIDER_GOOGLE_ENABLED}# AUTH_GOOGLE_CLIENT_ID: ${AUTH_GOOGLE_CLIENT_ID}# AUTH_GOOGLE_CLIENT_SECRET: ${AUTH_GOOGLE_CLIENT_SECRET}# AUTH_GOOGLE_CALLBACK_URL: ${AUTH_GOOGLE_CALLBACK_URL}# AUTH_GOOGLE_APIS_CALLBACK_URL: ${AUTH_GOOGLE_APIS_CALLBACK_URL}# CALENDAR_PROVIDER_MICROSOFT_ENABLED: ${CALENDAR_PROVIDER_MICROSOFT_ENABLED}# MESSAGING_PROVIDER_MICROSOFT_ENABLED: ${MESSAGING_PROVIDER_MICROSOFT_ENABLED}# AUTH_MICROSOFT_ENABLED: ${AUTH_MICROSOFT_ENABLED}# AUTH_MICROSOFT_CLIENT_ID: ${AUTH_MICROSOFT_CLIENT_ID}# AUTH_MICROSOFT_CLIENT_SECRET: ${AUTH_MICROSOFT_CLIENT_SECRET}# AUTH_MICROSOFT_CALLBACK_URL: ${AUTH_MICROSOFT_CALLBACK_URL}# AUTH_MICROSOFT_APIS_CALLBACK_URL: ${AUTH_MICROSOFT_APIS_CALLBACK_URL}# EMAIL_FROM_ADDRESS: ${EMAIL_FROM_ADDRESS:-contact@yourdomain.com}# EMAIL_FROM_NAME: ${EMAIL_FROM_NAME:-"John from YourDomain"}# EMAIL_SYSTEM_ADDRESS: ${EMAIL_SYSTEM_ADDRESS:-system@yourdomain.com}# EMAIL_DRIVER: ${EMAIL_DRIVER:-smtp}# EMAIL_SMTP_HOST: ${EMAIL_SMTP_HOST:-smtp.gmail.com}# EMAIL_SMTP_PORT: ${EMAIL_SMTP_PORT:-465}# EMAIL_SMTP_USER: ${EMAIL_SMTP_USER:-}# EMAIL_SMTP_PASSWORD: ${EMAIL_SMTP_PASSWORD:-}depends_on:db:condition: service_healthyserver:condition: service_healthyrestart: alwaysdb:image: postgres:16volumes:- db-data:/var/lib/postgresql/dataenvironment:POSTGRES_USER: ${PG_DATABASE_USER:-postgres}POSTGRES_PASSWORD: ${PG_DATABASE_PASSWORD:-postgres}healthcheck:test: pg_isready -U ${PG_DATABASE_USER:-postgres} -h localhost -d postgresinterval: 5stimeout: 5sretries: 10restart: alwaysredis:image: redisrestart: alwayscommand: [ "redis-server", "--maxmemory-policy", "noeviction" ]volumes:db-data:server-local-data:
Файл docker-compose.yml содержит закоментированные секции для включения интеграций с Google, Microsoft и email. Для настройки этих интеграций, раскомментируйте необходимые параметры и добавьте значения в файл .env. Подробнее — в документации Twenty CRM.
Создайте файл .env:
nano .env
Вставьте код в файл:
TAG=<tag>PG_DATABASE_USER=postgresPG_DATABASE_PASSWORD=<pg_database_password>PG_DATABASE_HOST=dbPG_DATABASE_PORT=5432REDIS_URL=redis://redis:6379SERVER_URL=https://crm.<ip_address>.nip.io# Use openssl rand -base64 32 for each secretAPP_SECRET=<app_secret>STORAGE_TYPE=s3STORAGE_S3_NAME=<object_storage_name>STORAGE_S3_REGION=<region>STORAGE_S3_ENDPOINT=https://s3.cloud.ruSTORAGE_S3_ACCESS_KEY_ID=<tenant_id>:<secret_key_id>STORAGE_S3_SECRET_ACCESS_KEY=<secret_key>STORAGE_S3_FORCE_PATH_STYLE=true
Где:
<tag> — тeг docker-образа Twenty CRM. Для этого практического используйте значение v1.3.0. Другие теги могут требовать иной конфигурации. Актуальный список тегов доступен на странице docker-образа Twenty CRM.
<app_secret> — уникальный ключ, сгенерированный ранее.
<pg_database_password> — пароль от базы данных, сгенерированный ранее.
<ip_address> — IP-адрес вашей виртуальной машины.
<object_storage_name> — название бакета Object Storage.
<tenant_id> — ID тенанта сервиса Object Storage.
<region> — регион Object Storage.
<secret_key_id>, <secret_key> — ID ключа и секретный ключ доступа к Object Storage.
<bucket_name> — название бакета Object Storage.
Запустите сервис:
docker compose up -d
Проверьте, что сервисы запущены:
docker compose ps
В браузере откройте страницу https://crm.<ip_address>.nip.io, <ip_address> — публичный IP-адрес вашей виртуальной машины.
Откроется страница настройки Twenty CRM.
Когда вы развернули и настроили сервис, закройте доступ по SSH для повышения безопасности.
В личном кабинете на верхней панели слева нажмите и выберите Инфраструктура → Виртуальные машины.
В списке виртуальных машин выберите crm-service.
Перейдите на вкладку Сетевые параметры.
В блоке сетевого интерфейса нажмите и выберите Изменить группы безопасности.
Удалите группу SSH-access_ru и сохраните изменения.
Убедитесь, что доступа нет — попробуйте подключиться к виртуальной машине по SSH.
После отключения доступа по SSH, администрирование сервиса будет доступно через серийную консоль виртуальной машины.
Создайте резервную копию виртуальной машины со следующими параметрами:
Тип ресурса — Виртуальная машина.
Ресурс — crm-service.
Название — crm-service-backup.
Убедитесь, что в личном кабинете на странице Инфраструктура → Виртуальные машины отображается резервная копия crm-service-backup со статусом «Создана».
Периодически создавайте резервные копии для сохранности данных.
Вы развернули CRM-сервис для командной работы на виртуальной машине в облаке Cloud.ru с надежной сетевой изоляцией и публикацией по HTTPS. Полученные навыки помогут вам создавать сервисы с использованием облачного хранилища и безопасной инфраструктурой.
Для создания отказоустойчивого и масштабируемого решения с надежным хранением данных вы можете воспользоваться сервисами Managed PostgreSQL®, Managed Redis и Object Storage.
При необходимости активируйте интеграции с Google, Microsoft и email.