Что нужно на руках перед началом
Прежде чем начинать, соберите четыре вещи — без любой из них какой-то из шагов дальше не пройдёт.
- Сервер — арендованная виртуальная машина с чистой 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.
Домен: регистрация и DNS
Если домен уже куплен — переходите сразу к настройке DNS-записи ниже.
Где купить домен
Подойдёт любой регистратор доменных имён — например reg.ru, timeweb.com или Cloudflare Registrar.
Процесс везде одинаковый: вводите желаемое имя (например honestflowers.ru),
сервис проверяет свободно ли оно, вы оплачиваете регистрацию на 1 год и получаете доступ к панели
управления этим доменом.
Настройка DNS-записи
В панели управления доменом нужно создать одну A-запись, которая говорит интернету «по этому имени — вот этот сервер»:
| Поле | Значение |
|---|---|
| Тип записи | A |
| Имя / хост | @ (для корня домена) или www |
| Значение | IP-адрес вашего сервера, например 64.188.64.226 |
| TTL | 300 (или значение по умолчанию) |
DNS-запись распространяется по интернету не мгновенно — обычно от 5 минут до часа. Проверить,
заработала ли она, можно командой dig +short <ваш-домен> — если в
ответ пришёл IP-адрес сервера, можно двигаться дальше.
Первое подключение к серверу
Подключение по SSH — это защищённый удалённый доступ к консоли сервера, всё управление сервером дальше происходит через неё.
ssh root@<IP-адрес-сервера>
При первом подключении терминал спросит, доверяете ли вы этому серверу — введите
yes. Дальше введите пароль (или, если настроен SSH-ключ, вход произойдёт
автоматически). После входа вы увидите приглашение вида root@имя-сервера:~# —
это значит, что вы работаете в консоли сервера.
Установка веб-сервера, 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
База данных и пользователь
Сайт не подключается к 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;"
Перенос файлов сайта на сервер
Сначала создаём на сервере папку под сайт, затем копируем туда файлы с вашего компьютера.
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
Виртуальный хост Apache
Виртуальный хост — это конфигурация, которая говорит Apache «запросы на этот домен обслуживать вот из этой папки».
Создайте файл конфигурации:
nano /etc/apache2/sites-available/<ваш-домен>.conf
И вставьте в него (замените домен на свой, сохраните — Ctrl+O, выйти — Ctrl+X):
<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 подскажет строку с ошибкой в конфиге.
Импорт структуры базы данных
Файл 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;"
Подключение сайта к базе и учётка администратора
Сайт узнаёт, как подключаться к базе данных, из одного файла — его нужно привести в соответствие с паролем, который вы придумали на шаге 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', 'вставленный_хеш');"
phpMyAdmin — администрирование базы данных
phpMyAdmin — веб-интерфейс для просмотра и редактирования базы данных без командной строки.
apt install -y phpmyadmin
Во время установки появится синий экран настройки:
- «Configure database for phpmyadmin with dbconfig-common?» — выбрать Yes.
- Веб-сервер для настройки — отметить пробелом apache2, нажать Enter.
- Пароль администратора приложения — можно оставить пустым (Enter), система сгенерирует сама.
systemctl restart apache2
Именно здесь в прошлый раз всё остановилось. phpMyAdmin — это ещё один сайт на PHP, и заходить в
него нужно под тем же пользователем и паролем базы данных, что указаны в
config.php самого сайта (в нашем случае —
flowers_admin и пароль из шага 4). Это не пользователь Linux/SSH и не
отдельный «пароль от phpMyAdmin» — это ровно та же учётная запись MySQL.
Проверка: откройте https://<ваш-домен>/phpmyadmin/, введите логин
flowers_admin и пароль из шага 4. Если вход прошёл и слева видна база
honest_flowers с семью таблицами — связка настроена верно.
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
Приёмочная проверка
Отметьте пункты по мере прохождения — состояние сохраняется в этом браузере, можно закрыть вкладку и вернуться позже.
Типичные ошибки и их причины
| Симптом | Причина | Решение |
|---|---|---|
| Белая страница вместо сайта | Ошибка в 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 указывается файл резервной копии.