Инструкция по развёртыванию · Honest Flowers

Разворачивание сайта на новом сервере

Полная последовательность действий для переноса сайта «Honest Flowers» с нуля — от покупки домена до рабочего HTTPS-сайта с базой данных. Каждый шаг — с точными командами для копирования и пояснением, зачем он нужен. Отдельно отмечены места, где на предыдущем похожем сайте были реальные затруднения.

Ubuntu 22.04 / 24.04 LTS Apache + PHP 8.x + MariaDB ~60–90 минут
00

Что нужно на руках перед началом

Прежде чем начинать, соберите четыре вещи — без любой из них какой-то из шагов дальше не пройдёт.

  • Сервер — арендованная виртуальная машина с чистой Ubuntu 22.04 или 24.04 и root-доступом по SSH (IP-адрес, логин, пароль или SSH-ключ).
  • Домен — свой или уже купленный (если ещё нет — шаг 1 объясняет, где и как купить).
  • Исходники сайта — архив с папкой сайта (все .php-файлы, assets/, файл schema.sql) и SSH/SFTP-доступом для их загрузки на сервер.
  • SSH-клиент — на macOS/Linux терминал уже умеет это делать; на Windows — Windows Terminal (там тоже есть команда ssh) или программа PuTTY.
Обозначения в командах

Всё в угловых скобках вида <ваш-домен> — нужно заменить на своё значение. Команды со значком терминала выполняются на сервере после подключения по SSH.

01

Домен: регистрация и DNS

Если домен уже куплен — переходите сразу к настройке DNS-записи ниже.

Где купить домен

Подойдёт любой регистратор доменных имён — например reg.ru, timeweb.com или Cloudflare Registrar. Процесс везде одинаковый: вводите желаемое имя (например honestflowers.ru), сервис проверяет свободно ли оно, вы оплачиваете регистрацию на 1 год и получаете доступ к панели управления этим доменом.

Настройка DNS-записи

В панели управления доменом нужно создать одну A-запись, которая говорит интернету «по этому имени — вот этот сервер»:

ПолеЗначение
Тип записиA
Имя / хост@ (для корня домена) или www
ЗначениеIP-адрес вашего сервера, например 64.188.64.226
TTL300 (или значение по умолчанию)
Сколько ждать

DNS-запись распространяется по интернету не мгновенно — обычно от 5 минут до часа. Проверить, заработала ли она, можно командой dig +short <ваш-домен> — если в ответ пришёл IP-адрес сервера, можно двигаться дальше.

02

Первое подключение к серверу

Подключение по SSH — это защищённый удалённый доступ к консоли сервера, всё управление сервером дальше происходит через неё.

терминал (на вашем компьютере)
ssh root@<IP-адрес-сервера>

При первом подключении терминал спросит, доверяете ли вы этому серверу — введите yes. Дальше введите пароль (или, если настроен SSH-ключ, вход произойдёт автоматически). После входа вы увидите приглашение вида root@имя-сервера:~# — это значит, что вы работаете в консоли сервера.

03

Установка веб-сервера, PHP и базы данных

Один блок команд ставит весь необходимый стек: веб-сервер Apache, СУБД MariaDB, интерпретатор PHP с нужными расширениями и утилиту для SSL-сертификатов.

на сервере
apt update
apt install -y apache2 mariadb-server php php-mysql php-mbstring \
  php-xml php-curl php-zip php-gd unzip curl certbot python3-certbot-apache
systemctl enable --now apache2 mariadb

Проверить, что всё встало, можно так — все три команды должны вывести номер версии, а не ошибку:

на сервере
php -v
mysql --version
apache2 -v
04

База данных и пользователь

Сайт не подключается к MySQL под пользователем root — для него создаётся отдельная база и отдельный пользователь с доступом только к ней.

на сервере
mysql -u root <<'SQL'
CREATE DATABASE honest_flowers CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'flowers_admin'@'localhost' IDENTIFIED BY 'придумайте_свой_пароль';
GRANT ALL PRIVILEGES ON honest_flowers.* TO 'flowers_admin'@'localhost';
FLUSH PRIVILEGES;
SQL
Важно

Придумайте новый пароль именно для этого сервера — не берите пароль от старого сайта. Запишите его: он понадобится ещё дважды — в файле config.php (шаг 8) и при входе в phpMyAdmin (шаг 9).

Проверка, что пользователь работает — команда должна показать список из одной базы данных, без ошибок доступа:

на сервере
mysql -u flowers_admin -pпридумайте_свой_пароль -e "SHOW DATABASES;"
05

Перенос файлов сайта на сервер

Сначала создаём на сервере папку под сайт, затем копируем туда файлы с вашего компьютера.

на сервере
mkdir -p /var/www/<ваш-домен>/public_html

Дальше — с вашего компьютера, не с сервера, командой scp (она копирует файлы по тому же защищённому каналу, что и SSH):

терминал (на вашем компьютере)
scp -r ./site/* root@<IP-адрес-сервера>:/var/www/<ваш-домен>/public_html/

Если консоль непривычна — то же самое можно сделать в бесплатной программе FileZilla: подключение по протоколу SFTP, хост — IP сервера, логин root, порт 22, дальше — перетащить файлы мышкой в папку /var/www/<ваш-домен>/public_html/.

После переноса — назначить владельца файлов веб-серверу:

на сервере
chown -R www-data:www-data /var/www/<ваш-домен>/public_html
06

Виртуальный хост Apache

Виртуальный хост — это конфигурация, которая говорит Apache «запросы на этот домен обслуживать вот из этой папки».

Создайте файл конфигурации:

на сервере
nano /etc/apache2/sites-available/<ваш-домен>.conf

И вставьте в него (замените домен на свой, сохраните — Ctrl+O, выйти — Ctrl+X):

/etc/apache2/sites-available/<ваш-домен>.conf
<VirtualHost *:80>
    ServerName <ваш-домен>
    DocumentRoot /var/www/<ваш-домен>/public_html
    <Directory /var/www/<ваш-домен>/public_html>
        AllowOverride All
        Require all granted
    </Directory>
    Alias /phpmyadmin /usr/share/phpmyadmin
    ErrorLog ${APACHE_LOG_DIR}/<ваш-домен>_error.log
    CustomLog ${APACHE_LOG_DIR}/<ваш-домен>_access.log combined
</VirtualHost>

Включите сайт и модуль перезаписи ссылок, отключите заглушку по умолчанию, перезагрузите Apache:

на сервере
a2dissite 000-default.conf
a2ensite <ваш-домен>.conf
a2enmod rewrite
apache2ctl configtest
systemctl reload apache2

apache2ctl configtest должен ответить Syntax OK — если нет, Apache подскажет строку с ошибкой в конфиге.

07

Импорт структуры базы данных

Файл schema.sql из исходников сайта создаёт все таблицы и заполняет каталог начальными товарами.

Известная проблема

Если просто выполнить mysql ... < schema.sql, консольный клиент MySQL по умолчанию работает не в кодировке utf8mb4 — а в файле есть эмодзи-иконки. В результате команда падает с ошибкой Invalid default value for 'icon'. Лечится одним флагом, он уже добавлен в команду ниже — просто не убирайте его.

на сервере
mysql --default-character-set=utf8mb4 -u flowers_admin -pпароль_из_шага_4 \
  honest_flowers < /var/www/<ваш-домен>/public_html/schema.sql

Проверка — должно быть 5 категорий и 11 товаров:

на сервере
mysql --default-character-set=utf8mb4 -u flowers_admin -pпароль_из_шага_4 \
  honest_flowers -e "SELECT COUNT(*) FROM categories; SELECT COUNT(*) FROM products;"
08

Подключение сайта к базе и учётка администратора

Сайт узнаёт, как подключаться к базе данных, из одного файла — его нужно привести в соответствие с паролем, который вы придумали на шаге 4.

на сервере
nano /var/www/<ваш-домен>/public_html/includes/config.php

Проверьте четыре константы вверху файла — DB_HOST, DB_NAME, DB_USER, DB_PASS — и впишите туда пароль из шага 4, если он ещё старый.

Создание первого администратора

Пароль администратора хранится в базе в виде хеша, а не открытым текстом, поэтому его нельзя просто вписать в таблицу — сначала нужно посчитать хеш:

на сервере
php -r "echo password_hash('пароль_админки', PASSWORD_DEFAULT);"

Команда выведет длинную строку вида $2y$10$... — скопируйте её целиком и вставьте в команду ниже вместо плейсхолдера:

на сервере
mysql --default-character-set=utf8mb4 -u flowers_admin -pпароль_из_шага_4 \
  honest_flowers -e "INSERT INTO admins (username, password_hash) VALUES ('admin', 'вставленный_хеш');"
09

phpMyAdmin — администрирование базы данных

phpMyAdmin — веб-интерфейс для просмотра и редактирования базы данных без командной строки.

на сервере
apt install -y phpmyadmin

Во время установки появится синий экран настройки:

  1. «Configure database for phpmyadmin with dbconfig-common?» — выбрать Yes.
  2. Веб-сервер для настройки — отметить пробелом apache2, нажать Enter.
  3. Пароль администратора приложения — можно оставить пустым (Enter), система сгенерирует сама.
на сервере
systemctl restart apache2
Ключевой момент

Именно здесь в прошлый раз всё остановилось. phpMyAdmin — это ещё один сайт на PHP, и заходить в него нужно под тем же пользователем и паролем базы данных, что указаны в config.php самого сайта (в нашем случае — flowers_admin и пароль из шага 4). Это не пользователь Linux/SSH и не отдельный «пароль от phpMyAdmin» — это ровно та же учётная запись MySQL.

Проверка: откройте https://<ваш-домен>/phpmyadmin/, введите логин flowers_admin и пароль из шага 4. Если вход прошёл и слева видна база honest_flowers с семью таблицами — связка настроена верно.

10

SSL-сертификат (HTTPS)

Без этого шага браузер будет показывать сайт как «небезопасный». Сертификат бесплатный и продлевается автоматически.

Условие

DNS-запись из шага 1 уже должна указывать на этот сервер — иначе Let's Encrypt не сможет подтвердить, что домен ваш.

на сервере
certbot --apache -d <ваш-домен> --agree-tos -m ваш-email@example.com --redirect

Certbot сам допишет конфигурацию Apache под HTTPS и настроит редирект с http:// на https://. Автопродление уже включено по умолчанию — проверить, что оно сработает, когда придёт время, можно так:

на сервере
certbot renew --dry-run
11

Приёмочная проверка

Отметьте пункты по мере прохождения — состояние сохраняется в этом браузере, можно закрыть вкладку и вернуться позже.

Пройдено 0 из 8
А

Типичные ошибки и их причины

СимптомПричинаРешение
Белая страница вместо сайта Ошибка в PHP-коде не выводится на экран Смотреть лог: tail -f /var/log/apache2/<домен>_error.log
Invalid default value при импорте schema.sql Клиент mysql не в кодировке utf8mb4 Добавить флаг --default-character-set=utf8mb4 (см. шаг 7)
«Отказано в доступе» при входе в phpMyAdmin Введены не те логин/пароль, что в config.php Использовать пользователя БД из шага 4, не системный пароль сервера
Сайт открывается по HTTP, но не по HTTPS Сертификат не выпущен или DNS не указывал на сервер в момент выпуска Проверить dig +short <домен>, повторить шаг 10
403 Forbidden на всех страницах Неверные права доступа к файлам сайта Повторить chown -R www-data:www-data ... из шага 5
Certbot не может подтвердить домен DNS-запись ещё не распространилась Подождать и повторить dig +short <домен>, затем шаг 10
Б

Что обязательно сменить в новой копии

Это чужой сервер и чужой запуск сайта — переиспользовать старые пароли нельзя.

  • Пароль пользователя базы данных flowers_admin (шаг 4) — свой, не от старого сайта.
  • Пароль администратора сайта admin (шаг 8) — свой.
  • При желании — переименовать папку админки: она называется admflo намеренно непредсказуемо, чтобы её не находили автоматическим перебором. Переименовать на своё — можно так (замените newpath на своё название):
на сервере
cd /var/www/<ваш-домен>/public_html
mv admflo newpath
grep -rl "/admflo/" newpath | xargs sed -i "s#/admflo/#/newpath/#g"
В

Резервное копирование базы данных

Короткая команда для выгрузки всей базы в один файл — полезно перед любыми экспериментами с сайтом.

на сервере
mysqldump --default-character-set=utf8mb4 -u flowers_admin -pпароль_из_шага_4 \
  honest_flowers > backup_$(date +%F).sql

Восстановление из такого файла делается той же командой, что и в шаге 7, только вместо schema.sql указывается файл резервной копии.