Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
У нас обновление в маркетплейсе: теперь вы можете заказать VPS-сервер с предустановленным OpenCart.
Вместо того, чтобы рассказывать, что такое OpenCart, давайте лучше порассуждаем о расширениях: в каком случае стоит покупать готовое, как их проверять?
Мы подготовили краткий список вопросов, которые стоит себе задать, прежде чем вынимать кровные шекели на готовый плагин.
На что смотреть, принимая решение о покупке расширения?
Качество кода
Первое, на что надо смотреть перед принятием решения — качество кода в расширении, которое вы собираетесь покупать. Иначе можно легко включить кусок мусора прямо в своей проект.
Хороший плагин должен быть написан в соотвествии со стандартами W3C, а также быть аккуратным и чистым, чтобы не грузить сервер. Еще один признак качественного плагина — подробная документация про установку и использования.
Такие плагины не обязательно платные, среди хорошо написанных расширений есть и много бесплатных — поэтому ищите чуть дольше, найдите несколько вариантов и делайте нагрузочные тестирования.
Если стоит выбор между качественный платным и некачественным, но бесплатным, лучше все же заплатить. Так что переходим к цене.
Стоимость
Иногда кажется, что сэкономив на дешевом или бесплатном плагине, вы удешевляете проект для заказчика.
Это может быть ложным ощущением, если доработка расширения или самостоятельное написание функционала выйдет клиенту дороже (в ваших оплачиваемых часах, как специалиста), чем просто купить готовый код.
Даже если вы работаете с фиксированным бюджетом, а покупка плагина освободит ваше время для следующих проектов и вы заработаете больше за меньшее время — покупать готовое расширение получается выгоднее.
Возможность использования плагина в будущем
Прежде чем покупать расширение, подумайте:
- Можно ли его использовать в других проектах повторно?
- Идет ли он в связке с каким-то другим плагином или может работать солоо?
- Обновляется ли плагин регулярно?
Если проект, который вы сейчас пишете будет качественно поддерживаться в будущем, плагины в нем должны обновляться вместе с версией CMS. Не только ради безопасности, но ради эффективности — в них будут появляться новые фишки и удобства.
Многие бесплатные расширения хорошо поддерживаются, а многие платные — нет.
Есть разные схемы, кто платит за платное расширение: заказчик или разработчик. Чаще всего, если разработчик использует какие-то расширениям постоянно и во многих проектах, то платит он сам, а за специфичные расширения конкретно под свой сайт уже покупает клиент. Объяснить затраты клиенту просто: сообщаете, что написать такой плагин с нуля будет куда дороже, чем купить готовый и клиент, обычно, соглашается.
Но вернемся к OpenCart.
Как мы создавали образ для OpenCart в нашем маркетплейсе
Готовый образ в нашем Маркетплейс
Требования к серверу
Для использования Opencart 3 рекомендуется использовать 2 Гб RAM и 2 ядра CPU.
Основные файлы Opencart занимают около 50 Мб, дополнительно вам понадобится место для хранения базы данных, резервных копий, и данных сайта, которое будет зависить от объема опубликованной информации.
Opencart может использовать Apache или Nginx с PHP 7.3+, а в качестве базы данных MySQL.
Мы будем создавать образ с использованием Nginx и MySQL.
Подготовка образа
Обновим установленные пакеты до последней версии:
dnf update -y
Добавим постоянное разрешение для входящего трафика на http/80 и https/443 порты:
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
Применим новые правила файрвола:
systemctl reload firewalld
Установим Nginx:
dnf install nginx -y
Запустим и включим сервер Nginx:
systemctl start nginx
systemctl enable nginx
Так как на данный момент в основном репозитории Centos используется версия PHP 7.2, добавим репозиторий REMI с PHP 7.4.
Для этого добавим репозиторий EPEL (требуется репозиторием REMI):
rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
Добавим репозиторий REMI:
sudo dnf install -y https://rpms.remirepo.net/enterprise/remi-release-8.rpm
Включим модуль php:remi-7.4 для установки php 7.4:
sudo dnf module enable php:remi-7.4 -y
Установим php-fpm и php-cli:
sudo dnf install -y php-fpm php-cli
Установим модули PHP требуемые для Opencart:
dnf install php-mysqlnd php-date php-dom php-filter php-gd php-hash php-json php-pcre php-pdo php-session php-simplexml php-spl php-tokenizer php-xml php-zip -y
Так же установим модули PHP mbstring, opcache:
dnf install php-mbstring php-opcache -y
Установим сервер MySQL:
dnf install mysql-server -y
Включим и запустим сервер MySQL:
systemctl start mysqld
systemctl enable mysqld
Так как мы делаем шаблон для VDS, а они могут быть медленными, добавим задержку старта mysqld 30 секунд, иначе могут быть проблемы со стартом сервера при первоначальной загрузке системы:
sudo sed -i '/Group=mysql/a \
ExecStartPre=/bin/sleep 30
' /usr/lib/systemd/system/mysqld.service
Изменим группу и пользователя из под которого будет работать nginx внеся изменения в
/etc/php-fpm.d/www.conf
:sudo sed -i --follow-symlinks 's/user = apache/user = nginx/g' /etc/php-fpm.d/www.conf
sudo sed -i --follow-symlinks 's/group = apache/group = nginx/g' /etc/php-fpm.d/www.conf
Изменим владельца каталога сессий PHP так же соответственно на nginx:
sudo chown -R nginx. /var/lib/php/session
Удалим строки с коментариями из файла конфигурации /etc/nginx/nginx.conf (что бы не было двойных срабатываний для sed):
sudo sed -i -e '/^[ \t]*#/d' /etc/nginx/nginx.conf
Добавим в
/etc/nginx/nginx.conf
настройки компрессии gzipsudo sed -i '/types_hash_max_size 2048;/a \
\
gzip on;\
gzip_static on;\
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript image/x-icon image/svg+xml application/x-font-ttf;\
gzip_comp_level 9;\
gzip_proxied any;\
gzip_min_length 1000;\
gzip_disable "msie6";\
gzip_vary on; \
' /etc/nginx/nginx.conf
Добавим в /etc/nginx/nginx.conf настройки индексного файла index.php:
sudo sed -i '/ root \/usr\/share\/nginx\/html;/a \
index index.php index.html index.htm;\
' /etc/nginx/nginx.conf
Добавим настройки для дефолтного сервера обработку php через сокет php-fpm, отключим лог для статических файлов, увеличим время expire, отключим лог доступа и ошибок для favicon.ico и robots.txt и запретим доступ к файлам .ht для всех:
sudo sed -i '/ location \/ {/a \
try_files $uri $uri/ /index.php?q=$uri&$args;\
}\
\
location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico|woff)$ {\
access_log off;\
expires max;\
}\
\
location ~ \.php$ {\
try_files $uri =404;\
fastcgi_pass unix:/run/php-fpm/www.sock;\
fastcgi_index index.php;\
include fastcgi_params;\
fastcgi_intercept_errors on;\
fastcgi_ignore_client_abort off;\
fastcgi_connect_timeout 60;\
fastcgi_send_timeout 180;\
fastcgi_read_timeout 180;\
fastcgi_buffer_size 128k;\
fastcgi_buffers 4 256k;\
fastcgi_busy_buffers_size 256k;\
fastcgi_temp_file_write_size 256k;\
}\
\
location = /favicon.ico {\
log_not_found off;\
access_log off;\
}\
\
location = /robots.txt {\
allow all;\
log_not_found off;\
access_log off;\
}\
\
location ~ /\.ht {\
deny all;' /etc/nginx/nginx.conf
Установим wget требуемый для установки certbot:
sudo dnf install wget -y
Скачаем исполняемый файл certbot с оффсайта:
cd ~
wget https://dl.eff.org/certbot-auto
Переместим certbot в /usr/local/bin/:
mv certbot-auto /usr/local/bin/certbot-auto
И назначим права и владельцем root:
chown root /usr/local/bin/certbot-auto
chmod 0755 /usr/local/bin/certbot-auto
Установим зависимости certbot, ответ Y в конвеер на вопрос установки зависимостей, и --install-only, что бы не инициировать установку сертификатов на данном этапе:
yes | certbot-auto --install-only
Удалим файл в каталоге веб-сервера по умолчанию:
rm -f /usr/share/nginx/html/index.html
Скачаем архив с установочными файлами Opencart:
cd ~
wget https://opencart.ru/opencart-3.0.3.2-ru.zip
Распакуем архив в настроенный каталог веб-сервера:
unzip opencart-3.0.3.2-ru.zip "upload-3032-ru/*" -d /usr/share/nginx/html/
Переместим файлы из подкаталога upload-3032-ru в корневой каталог:
mv /usr/share/nginx/html/upload-3032-ru/* /usr/share/nginx/html/
И удалим подкаталог upload-3032-ru:
rm -rf /usr/share/nginx/html/upload-3032-ru/
Так же удалим скачанный архив:
rm -f ~/opencart-3.0.3.2-ru.zip
Создим пустые файлы конфигурации:
touch /usr/share/nginx/html/config.php
touch /usr/share/nginx/html/admin/config.php
Удалим строку $db->query(«SET @@session.sql_mode = 'MYSQL40'»); из install.php, т.к. данный режим не поддерживается в MySQL 8:
sed -i -e '/MYSQL40/d' /usr/share/nginx/html/install/model/install/install.php
Назначим владельцем файлов nginx выше уровнем, т.к. opencart потребуются соответсвующие разрешения для автоматического переноса хранилища за пределы каталога веб-сервера:
chown -R nginx. /usr/share/nginx
Создадим базу данных opencart:
mysql -uroot -e "CREATE DATABASE opencart;"
Создадим пользователя mysql opencart с пустым паролем:
mysql -uroot -e "CREATE USER 'opencart'@'localhost' IDENTIFIED BY '';"
Дадим все привелегии пользователю opencart на базу opencart:
mysql -uroot -e "GRANT ALL PRIVILEGES ON opencart.* TO 'opencart'@'localhost';"
Перезапустим и включим PHP-FPM:
systemctl restart nginx php-fpm
systemctl enable php-fpm
Далее создадим скрипт в домашнем каталоге root который по запросу пользователя сгенерирует и установит пароли для root и zabbix и скорректирует их в файлах конфигурации Opencart.
Воспользуемся перенаправлением heredoc с делимитером POSTINSTALL, что бы записать скрипт «как есть», без раскрытия специальных символов:
cat <<"POSTINSTALL" > /usr/local/bin/secure_mysql
#!/bin/bash
OPENCARTPASS="$(openssl rand -base64 29 | tr -d "=+/" | cut -c1-25)"
ROOTPASS="$(openssl rand -base64 29 | tr -d "=+/" | cut -c1-25)"
mysql -uroot -e "ALTER USER 'opencart'@'localhost' IDENTIFIED BY '$OPENCARTPASS';"
mysql -uroot -e "ALTER USER 'root'@'localhost' IDENTIFIED BY '$ROOTPASS';"
echo "New password for opencart@localhost: $OPENCARTPASS"
echo "New password for root@localhost: $ROOTPASS"
sed -i --follow-symlinks "s/define('DB_PASSWORD', '');/define('DB_PASSWORD', '${OPENCARTPASS}');/g" /usr/share/nginx/html/config.php
sed -i --follow-symlinks "s/define('DB_PASSWORD', '');/define('DB_PASSWORD', '${OPENCARTPASS}');/g" /usr/share/nginx/html/admin/config.php
systemctl restart nginx php-fpm
OPENCARTPASS=
ROOTPASS=
rm -rf /usr/share/nginx/html/install
rm -f /usr/local/bin/secure_mysql
POSTINSTALL
Сделаем скрипт исполняемым:
chmod +x /usr/local/bin/secure_mysql
На данном этапе все настройки выполнены, остается выключить сервер и сделать снапшот:
shutdown -h now
Развертывание Opencart из образа
Развернув новый сервер из образа, мы, в роли пользователя, можем перейти по ссылке с адресом сервера, например:
http://vps_ip_address/
На первом экране установки — выбрать требуемый язык (English/Russian).
На странице конфигурации базы данных, нужно указать пользователя базы данных opencart, пароль оставьте пустым (пароли MySQL будут сгенерированы и настроены чуть позже), имя базы данных укажем opencart (так как мы создали ее ранее), зададим логин, пароль и email учетной записи администратора Opencart.
После завершения установки, мы перейдем в административную часть, и на сообщение «Выберите как вы хотите перенести директорию storage», выберем вариант «Автоматическое перемещение» и нажмем «Переместить».
Opencart переместит свое хранилище автоматически и после сообщения «Хранилище storage успешно изменено!» это сообщение можно закрыть. На этом основная настройка Opencart завершена.
Генерация паролей MySQL
Для того что бы обезопасить сервер, нам осталось подключиться к серверу по SSH и выполнить скрипт, что мы написали ранее на этапе подготовки образа:
secure_mysql
Скрипт сгенерирует пароли для MySQL пользователей root, opencart, выведет их в консоль и пропишет их в конфигурационных файлах opencart.
А так же удалит каталог с установочными файлами opencart: /usr/share/nginx/html/install.
На этом этапе нужно сохранить пароли в надежном месте, так как они выводятся в консоль один раз и нигде больше не сохраняются.
Настройка HTTPS и сертификатов Let's Encrypt
Для настройки HTTPS у VDS должно быть действующее DNS имя, которое мы должны указать в
/etc/nginx/nginx.conf
в разделе server, например:server_name domainname.ru;
Перезапустим nginx:
service nginx restart
Запустим certbot:
sudo /usr/local/bin/certbot-auto --nginx
Введем свой e-mail, cогласимся с условиями сервиса (A), Подписка на рассылку (опционально) (N), выберем доменные имена для которых нужно издать сертификат (Enter для всех).
В случае, если все прошло без ошибок, мы увидим сообщение об успешной выдаче сертификатов и настройке сервера:
Congratulations! You have successfully enabled ...
После этого подключения на 80 порт будут перенаправляться на 443 (https).
Добавим в /etc/crontab для автоматического обновления сертификатов:
# Cert Renewal
30 2 * * * root /usr/local/bin/certbot-auto renew --post-hook "nginx -s reload"
Готово, теперь у нас есть готовый сервер Opencart с настроенными сертификатами Let's Encrypt!
Хотим напомнить, что вы тоже можете сделать для нас образ
Есть три варианта, как поучаствовать.
Подготовьте образ сами и получите 3000 рублей на баланс
Если вы готовы сразу ринуться в бой и самому создать образ, которого вам не хватает, мы зачислим вам 3000 рублей на внутренний баланс — вы сможете потратить на серверы.
Как создать свой образ:
- Создайте аккаунт у нас на сайте
- Сообщите в поддержку, что вы собираетесь создавать и тестировать образы
- Мы зачислим вам 3000 рублей и включим возможность создавать снапшоты
- Закажите виртуальный сервер с чистой операционной системой
- Установите на эту VPS программное обеспечение и настройте его
- Составьте инструкцию или скрипт для развертывания ПО
- Создайте снапшот для настроенного сервера
- Закажите новый виртуальный сервер, выбрав в выпадающем списке «Шаблон сервера» созданный ранее снапшот
- В случае успешного создания сервера, передайте материалы полученные на этапе 6 технической поддержке
- В случае ошибки вы можете уточнить у поддержки причину и повторить настройку
Для владельцев бизнеса: предложите свой софт
Если вы — разработчик софта, который разворачивают и используют на VPS, то мы можем включить вас в маркетплейс. Так мы можем помочь вам привести новых клиентов, трафик и узнаваемость. Пишите нам
Расскажите в комментариях, какого образа вам не хватает?
И мы подготовим его сами