Идём на оффициальный сайт Maxmind и создаём аккаунт. Интересно, что я не смог создать аккаунт через VPN. Сервис распознает ip-адреса хостеров и не даёт создать аккаунт. Уже созданный аккаунт работает через VPN. Поэтому, чтобы создать аккаунт, пришлось воспользоваться реальным ip адресом какого-либо компьютера (либо своего, либо с помощью vpngate+softether).
Ставим модуль geoip https://www.drupal.org/project/geoip
Также пришлось поставить патч на ядро D7.
Патч взял отсюда: https://www.drupal.org/files/issues/2019-05-08/3026443-d7-72.patch
Теперь можно пользоваться API GeoIP. Мне понадобилась только функция geoip_country_code(geoip_ip_address()), которая выдаёт 2х-буквенный код страны.
Например, можно делать проверку условия:
if (geoip_country_code(geoip_ip_address()) == "XX") {
// do something
}
Ставим модуль GeoIP на Drupal 10 || 11:
composer require 'drupal/geoip:^3.0'
./vendor/bin/drush pm-install geoip
Хотя этот модуль от этого же разработчика, он значительно отличается. Отличается и API модуля.
Чтобы им воспользоваться, нужно добавить функцию в кастомный плагин (или же Drupal::service) примерно такого вида:
function is_client_ip_country_code_XX() {
$ip_address = \Drupal::request()->getClientIp();
$user_country_code = \Drupal::service('geoip.geolocation')->geolocate($ip_address);
if (isset($user_country_code)) {
if ($user_country_code == "XX") {
return TRUE;
} elseif ($user_country_code <> "XX") {
return FALSE;
}
}
}
И потом уже в файлах темы добавлять (внутри функции YOURTHEME_preprocess_YOURBLOCK):
// // GeoIP API
if (is_client_ip_country_code_XX()) {
// do something
}
// prevent cache this block
// this code also need Internal Page Cache module disabled
// works with Dynamic Page Cache module enabled
$variables['#cache']['max-age'] = 0;
! Важно учесть, что нужно отключить Internal Page Cache, а Dynamic Page Cache можно включить. Тогда мы можем max-age ставить в "0" и блок будет динамическим. Иначе, Друпал по умолчанию делает кэш страницы первого анонимного пользователя и для всех последующих отображает то же самое. По сути GeoIP API становится бесполезным из-за такого кэширования.
Документация говорит, что должна быть возможность HTTPS подключения с нашего сервера. Можно это сделать так:
curl -I https://mm-prod-geoip-databases.a2649acb697e2c09b632799562c076f2.r2.cloudflarestorage.com
Получим какой-то ответ (скорее всего 400, но это неважно).
Скачаем утилиту geoipupdate
с гитхаба https://github.com/maxmind/geoipupdate/releases (последний пакет для дебиан) и установим в систему.
wget https://github.com/maxmind/geoipupdate/releases/download/v6.1.0/geoipupdate_6.1.0_linux_amd64.deb
Потом установим (пакет не просит никаких зависимостей):
dpkg -i geoipupdate_6.1.0_linux_amd64.deb
Чтобы настроить /etc/GeoIP.conf заходим в личный кабинет https://www.maxmind.com/en/account и через меню "my accounts" - "manage license key" создаём новый licence key и затем ID аккаунта и license key прописываем в конфиг. Также выбираем "EditionIDs" (в моём случае - GeoLite2-Country).
Другие опции не будем менять, но будем учитывать. Например, то, что по-умолчанию база скачивается в папку /usr/share/GeoIP.
Проверим, что в этой папке лежит:
ls -lh /usr/share/GeoIP
total 7.8M
-rw-r--r-- 1 root root 1.6M Nov 8 2018 GeoIP.dat
-rw-r--r-- 1 root root 6.2M Nov 8 2018 GeoIPv6.dat
Какие-то старые базы в старом формате...
Попробуем обновить, просто выполнив в консоли команду
geoipupdate
Проверим снова:
ls -lh /usr/share/GeoIP
total 14M
-rw-r--r-- 1 root root 1.6M Nov 8 2018 GeoIP.dat
-rw-r--r-- 1 root root 6.2M Nov 8 2018 GeoIPv6.dat
-rw-r--r-- 1 root root 6.1M Feb 20 13:15 GeoLite2-Country.mmdb
Осталось набросать небольшой скрипт на bash, который будет по крону выполнять эту команду и копировать в нужные папки сайта или сайтов.
Проверим, где лежит исполняемый файл:
~# whereis geoipupdate
geoipupdate: /usr/bin/geoipupdate /usr/share/man/man1/geoipupdate.1
Теперь сделаем скрипт, который загружает базы с сервиса Maxmind и копирует их в папки, где располагается Drupal:
#!/bin/bash
/usr/bin/geoipupdate
$geoipdb="GeoLite2-Country.mmdb"
D7="/home/user/example.com/www/sites/all/libraries/geoip"
cp /usr/share/GeoIP/$geoipdb $D7/$geoipdb
chown user:www-data $D7/$geoipdb
chmod 644 $D7/$geoipdb
D10="/home/user/example2.com/www/web/sites/default/files"
cp /usr/share/GeoIP/$geoipdb $D10/$geoipdb
chown user:www-data $D10/$geoipdb
chmod 644 $D10/$geoipdb