Создание сайта на базе Joomla с базой данных PostgreSQL с помощью Terraform
Чтобы создать инфраструктуру для сайта на базе Joomla с базой данных PostgreSQL c помощью Terraform:
- Подготовьте облако к работе.
- Создайте инфраструктуру.
- Установите Joomla и дополнительные компоненты.
- Настройте веб-сервер Apache2.
- Настройте Joomla.
- Загрузите файлы веб-сайта.
- Создайте инфраструктуру.
- Проверьте работу сайта.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его и привяжите к нему облако.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Убедитесь, что в выбранном каталоге есть сеть с подсетями в зонах доступности ru-central1-a
, ru-central1-b
и ru-central1-d
. Для этого на странице каталога выберите сервис Virtual Private Cloud. Если в списке есть сеть — нажмите на нее, чтобы увидеть список подсетей. Если нужных подсетей или сети нет, создайте их.
Необходимые платные ресурсы
В стоимость поддержки сайта на Joomla входит:
- плата за постоянно запущенную ВМ (см. тарифы Yandex Compute Cloud);
- плата за использование динамического или статического внешнего IP-адреса (см. тарифы Yandex Virtual Private Cloud);
- плата за кластер БД PostgreSQL (см. тарифы Yandex Managed Service for PostgreSQL);
- плата за исходящий трафик из Yandex Cloud в интернет (см. тарифы Compute Cloud);
- плата за публичные DNS-запросы и зоны DNS, если вы используете Yandex Cloud DNS (см. тарифы Cloud DNS).
Создайте инфраструктуру
Terraform
Terraform распространяется под лицензией Business Source License
Подробную информацию о ресурсах провайдера смотрите в документации на сайте Terraform
Для создания инфраструктуры c помощью Terraform:
-
Установите Terraform и укажите источник для установки провайдера Yandex Cloud (раздел Настройте провайдер, шаг 1).
-
Подготовьте файл с описанием инфраструктуры:
Готовый архивВручную- Создайте папку для файла с описанием инфраструктуры.
- Скачайте архив
(2 КБ). - Разархивируйте архив в папку. В результате в ней должны появиться конфигурационный файл
joomla-postgresql-terraform.tf
и файл с пользовательскими даннымиjoomla-postgresql-terraform.auto.tfvars
.
-
Создайте папку для файла с описанием инфраструктуры.
-
Создайте в папке конфигурационный файл
joomla-postgresql-terraform.tf
:joomla-postgresql-terraform.tf
# Объявление переменных для пользовательских параметров variable "folder_id" { type = string } variable "vm_user" { type = string } variable "ssh_key_path" { type = string } variable "db_user" { type = string } variable "db_password" { type = string sensitive = true } variable "dns_zone" { type = string } variable "dns_recordset_name" { type = string } # Добавление прочих переменных locals { network_name = "example-network" subnet_name1 = "subnet-1" subnet_name2 = "subnet-2" subnet_name3 = "subnet-3" sg_vm_name = "sg-vm" sg_pgsql_name = "sg-pgsql" vm_name = "joomla-pg-tutorial-web" cluster_name = "joomla-pg-tutorial-db-cluster" db_name = "joomla-pg-tutorial-db" dns_zone_name = "example-zone-1" } # Настройка провайдера terraform { required_providers { yandex = { source = "yandex-cloud/yandex" version = ">= 0.47.0" } } } provider "yandex" { folder_id = var.folder_id } # Создание облачной сети resource "yandex_vpc_network" "joomla-pg-network" { name = local.network_name } # Создание подсети в зоне доступности ru-central1-a resource "yandex_vpc_subnet" "joomla-pg-network-subnet-a" { name = local.subnet_name1 zone = "ru-central1-a" v4_cidr_blocks = ["10.128.0.0/24"] network_id = yandex_vpc_network.joomla-pg-network.id } # Создание подсети в зоне доступности ru-central1-b resource "yandex_vpc_subnet" "joomla-pg-network-subnet-b" { name = local.subnet_name2 zone = "ru-central1-b" v4_cidr_blocks = ["10.129.0.0/24"] network_id = yandex_vpc_network.joomla-pg-network.id } # Создание подсети в зоне доступности ru-central1-d resource "yandex_vpc_subnet" "joomla-pg-network-subnet-d" { name = local.subnet_name3 zone = "ru-central1-d" v4_cidr_blocks = ["10.130.0.0/24"] network_id = yandex_vpc_network.joomla-pg-network.id } # Создание группы безопасности для кластера БД PostgreSQL resource "yandex_vpc_security_group" "pgsql-sg" { name = local.sg_pgsql_name network_id = yandex_vpc_network.joomla-pg-network.id ingress { description = "PostgreSQL" port = 6432 protocol = "TCP" v4_cidr_blocks = ["0.0.0.0/0"] } } # Создание группы безопасности для ВМ resource "yandex_vpc_security_group" "vm-sg" { name = local.sg_vm_name network_id = yandex_vpc_network.joomla-pg-network.id egress { protocol = "ANY" description = "ANY" v4_cidr_blocks = ["0.0.0.0/0"] from_port = 0 to_port = 65535 } ingress { description = "HTTP" protocol = "TCP" v4_cidr_blocks = ["0.0.0.0/0"] port = 80 } ingress { description = "HTTPS" protocol = "TCP" v4_cidr_blocks = ["0.0.0.0/0"] port = 443 } ingress { description = "SSH" protocol = "ANY" v4_cidr_blocks = ["0.0.0.0/0"] port = 22 } } # Добавление готового образа ВМ resource "yandex_compute_image" "joomla-pg-vm-image" { source_family = "centos-stream-8" } resource "yandex_compute_disk" "boot-disk" { name = "bootvmdisk" type = "network-hdd" zone = "ru-central1-a" size = "10" image_id = yandex_compute_image.joomla-pg-vm-image.id } # Создание ВМ resource "yandex_compute_instance" "joomla-pg-vm" { name = local.vm_name platform_id = "standard-v3" zone = "ru-central1-a" resources { cores = 2 memory = 1 core_fraction = 20 } boot_disk { disk_id = yandex_compute_disk.boot-disk.id } network_interface { subnet_id = yandex_vpc_subnet.joomla-pg-network-subnet-a.id nat = true security_group_ids = [ yandex_vpc_security_group.vm-sg.id ] } metadata = { user-data = "#cloud-config\nusers:\n - name: ${var.vm_user}\n groups: sudo\n shell: /bin/bash\n sudo: 'ALL=(ALL) NOPASSWD:ALL'\n ssh_authorized_keys:\n - ${file("${var.ssh_key_path}")}" } } # Создание кластера БД PostgreSQL resource "yandex_mdb_postgresql_cluster" "joomla-pg-cluster" { name = local.cluster_name environment = "PRODUCTION" network_id = yandex_vpc_network.joomla-pg-network.id security_group_ids = [ yandex_vpc_security_group.pgsql-sg.id ] config { version = "14" resources { resource_preset_id = "b2.medium" disk_type_id = "network-ssd" disk_size = 10 } } host { zone = "ru-central1-a" subnet_id = yandex_vpc_subnet.joomla-pg-network-subnet-a.id } host { zone = "ru-central1-b" subnet_id = yandex_vpc_subnet.joomla-pg-network-subnet-b.id } host { zone = "ru-central1-d" subnet_id = yandex_vpc_subnet.joomla-pg-network-subnet-d.id } } # Создание БД resource "yandex_mdb_postgresql_database" "joomla-pg-tutorial-db" { cluster_id = yandex_mdb_postgresql_cluster.joomla-pg-cluster.id name = local.db_name owner = var.db_user } # Создание пользователя БД resource "yandex_mdb_postgresql_user" "joomla-user" { cluster_id = yandex_mdb_postgresql_cluster.joomla-pg-cluster.id name = var.db_user password = var.db_password } # Создание зоны DNS resource "yandex_dns_zone" "joomla-pg" { name = local.dns_zone_name zone = var.dns_zone public = true } # Создание ресурсной записи типа А resource "yandex_dns_recordset" "joomla-pg-a" { zone_id = yandex_dns_zone.joomla-pg.id name = var.dns_recordset_name type = "A" ttl = 600 data = [ yandex_compute_instance.joomla-pg-vm.network_interface.0.nat_ip_address ] } # Создание ресурсной записи типа CNAME resource "yandex_dns_recordset" "joomla-pg-cname" { zone_id = yandex_dns_zone.joomla-pg.id name = "www" type = "CNAME" ttl = 600 data = [ var.dns_zone ] }
-
Создайте в папке файл с пользовательскими данными
joomla-postgresql-terraform.auto.tfvars
:joomla-postgresql-terraform.auto.tfvars
folder_id = "<идентификатор_каталога>" vm_user = "<имя_пользователя_ВМ>" ssh_key_path = "<путь_к_публичному_SSH-ключу>" db_user = "<имя_пользователя_БД>" db_password = "<пароль_для_доступа_к_БД>" dns_zone = "<зона_DNS>" dns_recordset_name = "<имя_ресурсной_записи>"
Более подробную информацию о параметрах используемых ресурсов в Terraform см. в документации провайдера:
- Сеть — yandex_vpc_network
. - Подсети — yandex_vpc_subnet
. - Группы безопасности — yandex_vpc_security_group
. - Образ ВМ — yandex_compute_image
. - Диск — yandex_compute_disk
. - Виртуальная машина — yandex_compute_instance
. - Кластер PostgreSQL — yandex_mdb_postgresql_cluster
. - БД PostgreSQL — yandex_mdb_postgresql_database
. - Пользователь БД — yandex_mdb_postgresql_user
. - Зона DNS — yandex_dns_zone
. - Ресурсная запись DNS — yandex_dns_recordset
.
-
В файле
joomla-postgresql-terraform.auto.tfvars
задайте пользовательские параметры:folder_id
— идентификатор каталога.vm_user
— имя пользователя ВМ.ssh_key_path
— путь к файлу с открытым SSH-ключом для аутентификации пользователя на ВМ. Подробнее см. Создание пары ключей SSH.db_user
— имя пользователя БД, напримерjoomla
.
db_password
— пароль для доступа к БД. Длина пароля должна составлять от 8 до 128 символов.dns_zone
— зона DNS. Укажите ваш зарегистрированный домен, напримерexample.com.
.dns_recordset_name
— имя ресурсной записи, напримерexample-recordset
.
Чтобы получить доступ к именам из публичной зоны, вам нужно делегировать домен. Укажите адреса серверовns1.yandexcloud.net
иns2.yandexcloud.net
в личном кабинете вашего регистратора.
-
Создайте ресурсы:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-
После создания инфраструктуры, установите Joomla.
Установите Joomla и дополнительные компоненты
После того как ВМ joomla-pg-tutorial-web
перейдет в статус RUNNING
, выполните:
-
В блоке Сеть на странице ВМ в консоли управления
найдите публичный IP-адрес ВМ. -
Подключитесь к ВМ по протоколу SSH. Для этого можно использовать утилиту
ssh
в Linux и macOS и программу PuTTY для Windows.Рекомендуемый способ аутентификации при подключении по SSH — с помощью пары ключей. Не забудьте настроить использование созданной пары ключей: закрытый ключ должен соответствовать открытому ключу, переданному на ВМ.
-
Скачайте и распакуйте архив с Joomla:
CentOS Streamsudo mkdir -p /var/www/html/ curl https://downloads.joomla.org/cms/joomla3/3-8-7/Joomla_3-8-7-Stable-Full_Package.tar.gz?format=gz --output Joomla_3-8-7-Stable-Full_Package.tar.gz --location sudo mv Joomla_3-8-7-Stable-Full_Package.tar.gz /var/www/html/ (cd /var/www/html/ && sudo tar -zxvf Joomla_3-8-7-Stable-Full_Package.tar.gz) sudo rm /var/www/html/Joomla_3-8-7-Stable-Full_Package.tar.gz sudo mv /var/www/html/htaccess.txt /var/www/html/.htaccess
-
Установите дополнительные компоненты:
CentOS Streamsudo dnf install epel-release sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-8.rpm sudo yum -y install --enablerepo remi-modular httpd php php-pgsql php php-common php-mbstring php-zip php-xml nano wget php-json sudo dnf module enable postgresql:13 sudo dnf install postgresql-server
-
Получите и настройте использование SSL-сертификата:
CentOS Streamsudo mkdir ~apache/.postgresql sudo wget "https://crls.yandex.net/allCLCAs.pem" -O ~apache/.postgresql/root.crt sudo chmod 0600 ~apache/.postgresql/root.crt sudo chown -R apache:apache ~apache/.postgresql
Настройте веб-сервер Apache2
-
Выполните базовую настройку Apache2:
CentOS Streamsudo chown -R apache /var/www/html/
-
Задайте настройки виртуального хоста в конфигурационном файле Apache2. Вы можете отредактировать файл с помощью редактора
nano
:CentOS Streamsudo nano /etc/httpd/conf.d/joomla.conf
Приведите файл к виду:
<VirtualHost *:80 [::]:80> ServerAdmin webmaster@localhost DocumentRoot /var/www/html/ <Directory /var/www/html/> DirectoryIndex index.php index.html DirectorySlash off RewriteEngine on RewriteBase / AllowOverride all </Directory> </VirtualHost>
-
Перезапустите веб-сервер:
CentOS Streamsudo service httpd restart
-
Измените настройки:
CentOS Streamsudo restorecon -R /var/www/html sudo setsebool -P httpd_can_network_connect 1
Настройте Joomla
Настройте Joomla по инструкции
-
Получите адреса хостов кластера БД в консоли управления:
- Откройте каталог, в котором создан кластер БД, и выберите сервис Managed Service for PostgreSQL.
- Выберите кластер
joomla-pg-tutorial-db-cluster
. - Перейдите на вкладку Хосты.
- В поле FQDN хоста скопируйте адреса хостов.
-
На шаге Database в веб-установщике Joomla заполните поля:
-
Тип базы данных —
PostgreSQL
. -
Имя сервера базы данных:
<адрес_хоста_1>,<адрес_хоста_2>,<адрес_хоста_3> port=6432 sslmode=verify-full target_session_attrs=read-write
-
Имя пользователя —
joomla
. -
Пароль — укажите пароль пользователя БД.
-
Имя базы данных —
joomla-pg-tutorial-db
.
-
-
Для проверки безопасности Joomla! может потребовать создать или удалить специальный тестовый файл. На ВМ перейдите в каталог
/var/www/html/installation
и создайте или удалите там указанный файл. -
Создайте пустой файл
configuration.php
для сохранения конфигурации и настройте права для записи в каталог:sudo touch /var/www/html/configuration.php sudo chmod 655 /var/www/html/configuration.php sudo chown -R apache:apache /var/www/html/ sudo restorecon -R /var/www/html
-
После завершения установки удалите директорию
installation
. Это требование безопасности Joomla!:sudo rm -rf /var/www/html/installation
Загрузите файлы веб-сайта
-
В блоке Сеть на странице ВМ в консоли управления
найдите публичный IP-адрес ВМ. -
Подключитесь к ВМ по протоколу SSH.
-
Выдайте права на запись для вашего пользователя на директорию
/var/www/html
:sudo chown -R "$USER":apache /var/www/html
-
Загрузите на ВМ файлы веб-сайта с помощью протокола SCP
.Linux/macOSWindowsИспользуйте утилиту командной строки
scp
:scp -r <путь_до_директории_с_файлами> <имя_пользователя_ВМ>@<IP-адрес_ВМ>:/var/www/html
С помощью программы WinSCP
скопируйте локальную директорию с файлами в директорию/var/www/html
на ВМ.
Проверьте работу сайта
Чтобы проверить работу сайта, введите в браузере его IP-адрес или доменное имя:
http://<публичный_IP-адрес_ВМ>
.http://www.example.com
.
Как удалить созданные ресурсы
Чтобы остановить работу сайта и перестать платить за созданные ресурсы:
-
Откройте конфигурационный файл
joomla-postgresql-terraform.tf
и удалите описание создаваемой инфраструктуры из файла. -
Примените изменения:
-
В терминале перейдите в папку, где вы отредактировали конфигурационный файл.
-
Проверьте корректность конфигурационного файла с помощью команды:
terraform validate
Если конфигурация является корректной, появится сообщение:
Success! The configuration is valid.
-
Выполните команду:
terraform plan
В терминале будет выведен список ресурсов с параметрами. На этом этапе изменения не будут внесены. Если в конфигурации есть ошибки, Terraform на них укажет.
-
Примените изменения конфигурации:
terraform apply
-
Подтвердите изменения: введите в терминале слово
yes
и нажмите Enter.
-