Развертывание CRM-сервиса Twenty на виртуальной машине
В этой лабораторной работе вы развернете CRM‑сервис Twenty на бесплатной виртуальной машине в облаке Cloud.ru Evolution. Вы создадите инфраструктуру, развернете сервис CRM и опубликуете его на сервере Nginx, обеспечив безопасный доступ по HTTPS. Вы создадите резервную копию виртуальной машины в сервисе «Резервное копирование» для сохранности данных. В результате вы получите работающее окружение Twenty, развернутое из фиксированного тега образа и готовое к использованию.
Вы будете использовать следующие сервисы:
-
Виртуальные машины — виртуальная машина в облаке для размещения приложения.
-
Публичный IP-адрес — для доступа к приложению через интернет.
-
Резервное копирование — для создания резервных копий.
-
Docker — система контейнеризации.
-
Docker Compose — инструмент для запуска и управления Docker-контейнерами.
-
Twenty CRM — CRM-сервис с открытым исходным кодом.
-
nip.io — бесплатный сервис динамического DNS для получения публичного доменного имени и сертификата. Вы также можете использовать собственное зарегистрированное доменное имя и SSL-сертификат для организации доступа.
-
Nginx — для проксирования запросов и организации защищенного HTTPS-доступа к приложению.
-
Let’s Encrypt — для автоматического получения бесплатного SSL-сертификата.
Шаги:
Перед началом работы
-
Если вы уже зарегистрированы, войдите под своей учетной записью.
-
Сгенерируйте ключевую пару и загрузите публичный ключ в Cloud.ru Evolution.
1. Разверните необходимые ресурсы в облаке
В этом шаге вы создадите группу безопасности и виртуальную машину.
-
Создайте группу безопасности с названием 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: оставьте прямой IP-адрес.
-
Группы безопасности: SSH-access_ru.AZ-1 и crm-service.
-
Логин: crm.
-
Метод аутентификации: Публичный ключ и Пароль.
-
Публичный ключ: укажите ключ, созданный ранее.
-
Пароль: задайте пароль.
-
Имя хоста: crm-service.
На странице Инфраструктура → Виртуальные машины убедитесь, что отображается виртуальная машина crm-service со статусом «Запущена».
-
2. Настройте окружение на виртуальной машине
На этом шаге вы установите необходимые пакеты и настроите систему на виртуальной машине.
-
Подключитесь к виртуальной машине crm-service через серийную консоль или по SSH .
-
Обновите систему и установите необходимые зависимости:
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 start nginxsudo systemctl enable nginx -
Установите Let’s Encrypt и плагин для Nginx:
sudo apt install certbot python3-certbot-nginx -y
3. Настройте Nginx и HTTPS
На этом шаге вы настроите службу Nginx и обеспечите доступ по HTTPS.
-
Подключитесь к виртуальной машине crm-service через серийную консоль или по SSH .
-
Настройте межсетевой экран:
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 nginxCервис Nginx должен быть в статусе «active (running)».
-
Перейдите по адресу http://crm.<IP-ADDRESS>.nip.io.
Откроется страница с текстом «502 Bad Gateway».
-
Запустите команду для выпуска SSL-сертификата.
sudo certbot --nginx -d crm.<IP-ADDRESS>.nip.io --redirect --agree-tos -m <EMAIL>Где:
-
<IP-ADDRESS> — IP-адрес вашей виртуальной машины.
-
<EMAIL> — email для регистрации сертификата.
-
-
После выпуска сертификата перейдите по адресу https://crm.<IP-ADDRESS>.nip.io.
Откроется страница с текстом «502 Bad Gateway». В свойствах сайта браузер отметит соединение как безопасное.
4. Разверните приложение
Разверните серверное приложение Twenty CRM с помощью Docker Compose.
-
Подключитесь к виртуальной машине crm-service через серийную консоль или по SSH .
-
Создайте структуру проекта:
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}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}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:--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=localГде:
-
<TAG> — тeг docker-образа Twenty CRM. Для этой лабораторной работы используйте значение v1.3.0. Другие теги могут требовать иной конфигурации. Актуальный список тегов доступен на странице docker-образа Twenty CRM.
-
<APP_SECRET> — уникальный ключ, сгенерированный ранее.
-
<PG_DATABASE_PASSWORD> — пароль от базы данных, сгенерированный ранее.
-
<IP-ADDRESS> — IP-адрес вашей виртуальной машины.
-
-
Запустите сервис:
docker compose up -d -
Проверьте, что сервисы запущены:
docker compose ps -
На компьютере в браузере откройте страницу https://crm.<IP-ADDRESS>.nip.io.
Отобразится страница настройки Twenty CRM.
5. Отключите SSH-доступ
Когда вы развернули и настроили сервис, закройте доступ по SSH для повышения безопасности.
-
В личном кабинете на верхней панели слева нажмите
и выберите Инфраструктура → Виртуальные машины.
-
В списке виртуальных машин выберите crm-service.
-
Перейдите на вкладку Сетевые параметры.
-
В строке подсети нажмите
и выберите Изменить группы безопасности.
-
Удалите группу SSH-access_ru и сохраните изменения.
-
Убедитесь, что доступа нет — попробуйте подключиться к виртуальной машине по SSH. После отключения доступа по SSH, администрирование сервиса будет доступно через серийную консоль виртуальной машины.
6. Обеспечьте сохранность данных приложения
Создайте резервную копию виртуальной машины со следующими параметрами:
-
Тип ресурса: Виртуальная машина.
-
Ресурс: crm-service.
-
Название: crm-service-backup.
-
Описание: Резервная копия CRM.
Убедитесь, что в личном кабинете на странице Инфраструктура → Виртуальные машины отображается резервная копия crm-service-backup со статусом «Создана».
Периодически создавайте резервные копии для сохранности данных.
Результат
Вы развернули CRM-сервис для командной работы на бесплатной виртуальной машине в облаке Cloud.ru с надежной сетевой изоляцией и публикацией по HTTPS. Полученные навыки помогут вам создавать сервисы с использованием облачного хранилища и безопасной инфраструктурой.
Для создания отказоустойчивого и масштабируемого решения с надежным хранением данных вы можете воспользоваться сервисами Managed PostgreSQL®, Managed Redis® и Object Storage.
При необходимости активируйте интеграции с Google, Microsoft и email.
- Перед началом работы
- 1. Разверните необходимые ресурсы в облаке
- 2. Настройте окружение на виртуальной машине
- 3. Настройте Nginx и HTTPS
- 4. Разверните приложение
- 5. Отключите SSH-доступ
- 6. Обеспечьте сохранность данных приложения
- Результат