Инструкция: Настройка SOCKS5 прокси в MODX3 для работы с репозиторием
Проблема: замедления Cloudflare (rest.modx.com) на серверах в РФ, не возможность нормально скачивать и обновлять компоненты.
Решение: Модификация системных классов для принудительного использования SOCKS5 прокси.
ДЛЯ MODX 3.1.2 !!!
Для сайтов, которые на VDS, на shared-хостинге работать не будет
Для работы, нужен рабочий прокси, пишите в телегу @isk_douglas_quaid скину ссылку, где покупал, если надо.
Шаг 1: Настройка в админке
Заполните данные своего прокси в «Системных настройках» (раздел «Прокси»):
proxy_host: IP вашего прокси
proxy_port: Порт
proxy_username: Логин
proxy_password: Пароль
Шаг 2:
Файл: core/src/Revolution/modX.php
Найдите метод buildHttpClientOptions (в конце файла) и замени его полностью:
Этот файл отвечает за физическое скачивание .zip архивов пакетов на ваш сервер.
Файл: core/src/Revolution/Transport/modTransportPackage.php
Найдите блок cURL внутри метода transferPackage (район 453-й строки) и замени его:
Удалите папку core/cache/ полностью через FTP или файловый менеджер хостинга.
Решение: Модификация системных классов для принудительного использования SOCKS5 прокси.
ДЛЯ MODX 3.1.2 !!!
Для сайтов, которые на VDS, на shared-хостинге работать не будет
Для работы, нужен рабочий прокси, пишите в телегу @isk_douglas_quaid скину ссылку, где покупал, если надо.
Шаг 1: Настройка в админке
Заполните данные своего прокси в «Системных настройках» (раздел «Прокси»):
proxy_host: IP вашего прокси
proxy_port: Порт
proxy_username: Логин
proxy_password: Пароль
Шаг 2:
Файл: core/src/Revolution/modX.php
Найдите метод buildHttpClientOptions (в конце файла) и замени его полностью:
private function buildHttpClientOptions() {
$opts = [
'verify' => false,
'timeout' => 120,
];
$proxyHost = $this->getOption('proxy_host', null, '');
if (!empty($proxyHost)) {
$proxyPort = $this->getOption('proxy_port', null, '9858');
$proxyUser = $this->getOption('proxy_username', null, '');
$proxyPass = $this->getOption('proxy_password', null, '');
// Формируем строку прокси
$auth = !empty($proxyUser) ? "{$proxyUser}:{$proxyPass}@" : "";
$opts['proxy'] = "socks5h://{$auth}{$proxyHost}:{$proxyPort}";
// Принудительно задаем тип SOCKS5 для cURL
$opts['curl'] = [
CURLOPT_PROXYTYPE => CURLPROXY_SOCKS5_HOSTNAME,
CURLOPT_HTTPPROXYTUNNEL => true,
];
}
return $opts;
}Шаг 3: Правка ТранспортаЭтот файл отвечает за физическое скачивание .zip архивов пакетов на ваш сервер.
Файл: core/src/Revolution/Transport/modTransportPackage.php
Найдите блок cURL внутри метода transferPackage (район 453-й строки) и замени его:
/* if not, try curl */
if (empty($content) && function_exists('curl_init')) {
$ch = curl_init();
$proxyHost = $this->xpdo->getOption('proxy_host', null, '');
if (!empty($proxyHost)) {
$proxyPort = $this->xpdo->getOption('proxy_port', null, '9858');
$proxyUsername = $this->xpdo->getOption('proxy_username', null, '');
$proxyPassword = $this->xpdo->getOption('proxy_password', null, '');
curl_setopt($ch, CURLOPT_PROXY, $proxyHost);
curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5_HOSTNAME);
curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
if (!empty($proxyUsername)) {
$up = $proxyUsername . (!empty($proxyPassword) ? ':' . $proxyPassword : '');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, $up);
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
}
}
curl_setopt($ch, CURLOPT_URL, $source);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 180);
$openBasedir = @ini_get('open_basedir');
if (empty($openBasedir)) {
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
}
$content = curl_exec($ch);
curl_close($ch);
}Шаг 3: Очистка кэша Удалите папку core/cache/ полностью через FTP или файловый менеджер хостинга.
Комментарии: 24
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Как перестанет работать без впн, так мой метод пригодится)
MODX обращается к репозиторию не через ваш впн! обращение идет от сервера, где у вас установлен MODX!!! Использование впн на вашем локальном компьютере не подменит ip сервера, где находится MODX.
Репозиторий MODX за Cloudflare — вы жмете «скачать компонент» идет обращение СЕРВЕРА где MODX к серверам Cloudflare, ip у них динамические, один раз нажмете попадете на тот который замедляется второй раз на тот, что еще не замедляют.
Ваше решение действительно работает, это главное. Но если позволите, поделюсь замечаниями по коду (не критика, а предложения по улучшению безопасности):
- `verify => false` — отключает проверку SSL сертификатов (потенциально небезопасно);
- `CURLOPT_SSL_VERIFYPEER` внутри блока прокси — без прокси SSL работает, с прокси отключен;
- Порт 9858 захардкожен, хотя стандартный SOCKS5 — 1080;
- Нет обработки ошибок cURL и логирования для диагностики;
- Нет timeout на подключение к прокси.
Это не баги, просто можно сделать код более универсальным и безопасным.По Amnezia WG — она тоже работает и обходит блокировки благодаря обфускации. Главное отличие — она поднимает VPN для всей системы, а не только для MODX.
Плюсы SOCKS5 (ваш подход):
- Более стабильное решение;
- Работает точечно для MODX.
Плюсы Amnezia (мой подход):- Проще для неопытных пользователей;
- Работает для всех приложений;
- Не требует правки системных файлов.
Минусы обоих:- SOCKS5 — требует платную подписку.
- Amnezia — периодически блокируется, нужно обновлять конфиги.
Вывод: ваше решение идеально для тех, кто хочет минимального вмешательства в систему и готов платить за стабильность. Мое — для тех, кому нужен VPN для всего сразу.Спасибо, что поделились инструкцией, она реально полезна.
По Amnezia WG: не у всех работает, возможно только у вас)
Подход с прокси: будет работать у всех!
Вот правильное заключение)
Но по сути согласен:
- SOCKS5 — работает у ВСЕХ (проверено)
- Amnezia — у меня работает, но регионально блокируется
Ваше решение объективно стабильнее для публичной инструкции.Моё больше как «лайфхак»
На этом спор думаю можно завершить. Каждый сам выберет то что ему ближе)
А в целом можно конечно скачивать пакет из репозитория на свой комп, потом загружать вручную на сайт и оттуда устанавливать, но это же не удобно :)
Поэтому инструкция кажется очень полезной. Спасибо @Ivan K. что поделился!
А я правильно понимаю, что это какая-то недоработка со стороны MODX? Настройки прокси стоковые (есть и в MODX v2.8.x который у меня оказался под рукой), но выходит, они не используются ядром для установки пакета (а для чего тогда используются...?!), т.е. это похоже на баг?
Настройки прокси в MODX изначально проектировались под протокол HTTP. Поля в админке есть, но ядро системы по умолчанию «под капотом» говорит библиотеке cURL: «Используй это как HTTP-прокси». Когда вы подсовываете системе SOCKS5, она просто не понимает, что с ним делать, потому что в интерфейсе отсутствует переключатель «Тип прокси».
Отсутствие поддержки удаленного DNS (SOCKS5h): Cloudflare, за которым стоит репозиторий MODX требуют, чтобы DNS-запрос тоже шел через прокси. Обычные настройки MODX этого не умеют — они пытаются разрешить адрес сервера локально, получают блокировку и соединение обрывается.
Кстати говоря, я пока не встречал проблем скачивания на своих сайтах. Кроме случаев, когда изредка лагает репозиторий, и повторная попытка через пару минут пока помогает.
У меня на шаред-хостингах тоже все нормально скачивается, а вот на VDS один за другим перестает.
И мой метод скорее всего на шаред-хостинге работать не будет, на шареде порты закрыты и не дают законектиться
В принципе накидал решение под шаред хостинг (сработало, причем с бесплатным неанонимным прокси без логина и пароля, но надо еще потом протестить на другом хостинге) и можно будет выложить
Кстати говоря, я пока не встречал проблем скачивания на своих сайтах. Кроме случаев, когда изредка лагает репозиторий, и повторная попытка через пару минут пока помогает.
У меня регулярно такие проблемы, в основном с большими пакетами типа TinyMCE RTE.
Я понимаю, что это чушь и не сработает, но попробовал.
Есть ВПН (мой, сервер за рубежом), есть сайт у хостера в Москве. Сайт не может ни обновить компоненты, ни загрузить для них обновления (и таких сайтов у меня — тьма).
Включил у себя ВПН, полез в админку сайта установить CKEditor и, о чудо — ничего не случилось, ничего не установилось ))).
Фуууух, сетевые протоколы и правила обмена пакетами не изменились )))