diff --git a/docs/en/API_TROUBLESHOOTING_EN.md b/docs/en/API_TROUBLESHOOTING_EN.md new file mode 100644 index 0000000..3ad310c --- /dev/null +++ b/docs/en/API_TROUBLESHOOTING_EN.md @@ -0,0 +1,170 @@ +# 🔧 reg.ru API Troubleshooting Guide + +## ❌ Issue: "Access to API from this IP denied" + +This error occurs when reg.ru API is blocked for your IP address due to security settings. + +### 🔍 Diagnostics + +First, determine your current IP address: + +```bash +# Method 1: Using script's built-in function +sudo letsencrypt-regru --test-api + +# Method 2: Using curl +curl -s https://ipinfo.io/ip + +# Method 3: Using website +# Open https://whatismyipaddress.com/ +``` + +### ✅ Solution + +#### Method 1: Add IP to whitelist (recommended) + +1. **Login to reg.ru control panel** + - Open https://www.reg.ru/ + - Login to your account + +2. **Navigate to API settings** + - Menu → "Settings" (Настройки) + - Section "Security" (Безопасность) + - Subsection "API" + +3. **Configure IP access** + - Find "IP Restrictions" section + - Click "Add IP address" + - Enter your current IP address + - Save settings + +4. **Test settings** + ```bash + sudo letsencrypt-regru --test-api + ``` + +#### Method 2: Disable IP restrictions (less secure) + +⚠️ **WARNING**: This reduces your account security! + +1. In reg.ru API settings find "IP Restrictions" +2. Disable "Allow access only from specified IPs" option +3. Save settings + +### 🔒 Security Recommendations + +1. **Use static IP** + - If you have dynamic IP, consider purchasing static IP + - Or regularly update allowed IP list + +2. **Limit API access** + - Add only necessary IP addresses + - Regularly review and clean up the list + +3. **Use strong passwords** + - Complex password for reg.ru account + - Two-factor authentication if available + +## ❌ Issue: "Invalid username or password" + +### ✅ Solution + +1. **Check credentials** + ```bash + sudo nano /etc/letsencrypt-regru/config.json + ``` + + Make sure you have correct: + - `regru_username` - reg.ru login + - `regru_password` - reg.ru password + +2. **Check file permissions** + ```bash + sudo chmod 600 /etc/letsencrypt-regru/config.json + sudo chown root:root /etc/letsencrypt-regru/config.json + ``` + +3. **Test connection** + ```bash + sudo letsencrypt-regru --test-api + ``` + +## ❌ Issue: Connection timeout + +### ✅ Solution + +1. **Check internet connection** + ```bash + ping -c 4 api.reg.ru + curl -I https://api.reg.ru/api/regru2 + ``` + +2. **Check firewall** + ```bash + # Temporarily disable firewall for testing + sudo ufw status + sudo iptables -L + ``` + +3. **Check proxy settings** + - Ensure `HTTP_PROXY`, `HTTPS_PROXY` environment variables don't interfere + +## 🧪 API Testing + +Always test API before use: + +```bash +# Full API test +sudo letsencrypt-regru --test-api + +# Test with verbose output +sudo letsencrypt-regru --test-api -v + +# Check configuration +sudo letsencrypt-regru --check +``` + +## 📞 Getting Help + +### reg.ru Technical Support + +- **Email**: support@reg.ru +- **Phone**: 8 (495) 580-11-11 +- **Online chat**: on reg.ru website + +### Documentation + +- **reg.ru API**: https://www.reg.ru/support/api +- **Usage examples**: https://www.reg.ru/support/api/examples +- **API FAQ**: https://www.reg.ru/support/api/faq + +### Diagnostic Logs + +Always include logs when contacting support: + +```bash +# Enable verbose logs +sudo letsencrypt-regru --test-api -v + +# View recent logs +sudo tail -n 50 /var/log/letsencrypt-regru/letsencrypt_regru.log + +# Certbot logs +sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log +``` + +## 🔄 Alternative DNS Providers + +If reg.ru API issues are critical, consider alternatives: + +1. **Cloudflare** - excellent API, free DNS +2. **Route53** (AWS) - powerful but paid +3. **DigitalOcean DNS** - simple and reliable +4. **Google Cloud DNS** - GCP integration + +These require script modification or other certbot plugins. + +--- + +**Last Updated**: October 29, 2025 +**Document Version**: 1.0 \ No newline at end of file diff --git a/docs/ru/API_TROUBLESHOOTING.md b/docs/ru/API_TROUBLESHOOTING.md new file mode 100644 index 0000000..5dc6fd8 --- /dev/null +++ b/docs/ru/API_TROUBLESHOOTING.md @@ -0,0 +1,170 @@ +# 🔧 Решение проблем с API reg.ru + +## ❌ Проблема: "Access to API from this IP denied" + +Эта ошибка возникает, когда API reg.ru заблокирован для вашего IP адреса из соображений безопасности. + +### 🔍 Диагностика + +Сначала определите ваш текущий IP адрес: + +```bash +# Способ 1: Через встроенную функцию скрипта +sudo letsencrypt-regru --test-api + +# Способ 2: Через curl +curl -s https://ipinfo.io/ip + +# Способ 3: Через веб-сайт +# Откройте https://whatismyipaddress.com/ +``` + +### ✅ Решение + +#### Метод 1: Добавить IP в белый список (рекомендуется) + +1. **Войдите в личный кабинет reg.ru** + - Откройте https://www.reg.ru/ + - Войдите в личный кабинет + +2. **Перейдите в настройки API** + - Меню → "Настройки" + - Раздел "Безопасность" + - Подраздел "API" + +3. **Настройте доступ по IP** + - Найдите раздел "Ограничения по IP" + - Нажмите "Добавить IP адрес" + - Введите ваш текущий IP адрес + - Сохраните настройки + +4. **Проверьте настройки** + ```bash + sudo letsencrypt-regru --test-api + ``` + +#### Метод 2: Отключить ограничения по IP (менее безопасно) + +⚠️ **ВНИМАНИЕ**: Это снижает безопасность вашего аккаунта! + +1. В настройках API reg.ru найдите "Ограничения по IP" +2. Отключите опцию "Разрешить доступ только с указанных IP" +3. Сохраните настройки + +### 🔒 Рекомендации по безопасности + +1. **Используйте статический IP** + - Если у вас динамический IP, рассмотрите покупку статического + - Или регулярно обновляйте список разрешенных IP + +2. **Ограничьте доступ к API** + - Добавляйте только необходимые IP адреса + - Регулярно проверяйте и очищайте список + +3. **Используйте сильные пароли** + - Сложный пароль для аккаунта reg.ru + - Двухфакторная аутентификация если доступна + +## ❌ Проблема: "Invalid username or password" + +### ✅ Решение + +1. **Проверьте учетные данные** + ```bash + sudo nano /etc/letsencrypt-regru/config.json + ``` + + Убедитесь что указаны правильные: + - `regru_username` - логин от reg.ru + - `regru_password` - пароль от reg.ru + +2. **Проверьте права на файл** + ```bash + sudo chmod 600 /etc/letsencrypt-regru/config.json + sudo chown root:root /etc/letsencrypt-regru/config.json + ``` + +3. **Протестируйте подключение** + ```bash + sudo letsencrypt-regru --test-api + ``` + +## ❌ Проблема: Таймаут подключения + +### ✅ Решение + +1. **Проверьте интернет соединение** + ```bash + ping -c 4 api.reg.ru + curl -I https://api.reg.ru/api/regru2 + ``` + +2. **Проверьте брандмауэр** + ```bash + # Временно отключите firewall для теста + sudo ufw status + sudo iptables -L + ``` + +3. **Проверьте прокси настройки** + - Убедитесь что переменные окружения `HTTP_PROXY`, `HTTPS_PROXY` не мешают + +## 🧪 Тестирование API + +Всегда тестируйте API перед использованием: + +```bash +# Полный тест API +sudo letsencrypt-regru --test-api + +# Тест с подробным выводом +sudo letsencrypt-regru --test-api -v + +# Проверка конфигурации +sudo letsencrypt-regru --check +``` + +## 📞 Получение помощи + +### Техподдержка reg.ru + +- **Email**: support@reg.ru +- **Телефон**: 8 (495) 580-11-11 +- **Онлайн чат**: на сайте reg.ru + +### Документация + +- **API reg.ru**: https://www.reg.ru/support/api +- **Примеры использования**: https://www.reg.ru/support/api/examples +- **FAQ по API**: https://www.reg.ru/support/api/faq + +### Логи для диагностики + +Всегда включайте логи при обращении в поддержку: + +```bash +# Включить подробные логи +sudo letsencrypt-regru --test-api -v + +# Посмотреть последние логи +sudo tail -n 50 /var/log/letsencrypt-regru/letsencrypt_regru.log + +# Логи certbot +sudo tail -n 50 /var/log/letsencrypt/letsencrypt.log +``` + +## 🔄 Альтернативные DNS провайдеры + +Если проблемы с reg.ru API критичны, рассмотрите альтернативы: + +1. **Cloudflare** - отличный API, бесплатный DNS +2. **Route53** (AWS) - мощный, но платный +3. **DigitalOcean DNS** - простой и надежный +4. **Google Cloud DNS** - интеграция с GCP + +Для них потребуется модификация скрипта или использование других плагинов certbot. + +--- + +**Дата обновления**: 29.10.2025 +**Версия документа**: 1.0 \ No newline at end of file diff --git a/letsencrypt_regru_api.py b/letsencrypt_regru_api.py index 856aa33..b50b19e 100644 --- a/letsencrypt_regru_api.py +++ b/letsencrypt_regru_api.py @@ -182,7 +182,7 @@ class RegRuAPI: try: self.logger.debug(f"Отправка запроса к API: {method}") - response = self.session.post(url, data=params) + response = self.session.post(url, data=params, timeout=30) response.raise_for_status() result = response.json() @@ -192,9 +192,45 @@ class RegRuAPI: return result else: error_msg = result.get("error_text", "Неизвестная ошибка") - self.logger.error(f"Ошибка API: {error_msg}") + error_code = result.get("error_code", "unknown") + + # Обработка специфических ошибок + if "Access to API from this IP denied" in error_msg or error_code == "IP_DENIED": + self.logger.error("=" * 80) + self.logger.error("🚫 ОШИБКА ДОСТУПА К API REG.RU") + self.logger.error("=" * 80) + self.logger.error("❌ Доступ к API заблокирован для текущего IP адреса") + self.logger.error("") + self.logger.error("🔧 РЕШЕНИЕ ПРОБЛЕМЫ:") + self.logger.error("1. Войдите в личный кабинет reg.ru") + self.logger.error("2. Перейдите в 'Настройки' → 'Безопасность' → 'API'") + self.logger.error("3. Добавьте текущий IP адрес в список разрешенных") + self.logger.error("4. Или отключите ограничение по IP (менее безопасно)") + self.logger.error("") + self.logger.error("🌐 Текущий IP можно узнать командой:") + self.logger.error(" curl -s https://ipinfo.io/ip") + self.logger.error(" или на сайте: https://whatismyipaddress.com/") + self.logger.error("") + self.logger.error("📚 Документация API: https://www.reg.ru/support/api") + self.logger.error("=" * 80) + elif "Invalid username or password" in error_msg: + self.logger.error("=" * 80) + self.logger.error("🔐 ОШИБКА АУТЕНТИФИКАЦИИ") + self.logger.error("=" * 80) + self.logger.error("❌ Неверные учетные данные") + self.logger.error("🔧 Проверьте username и password в конфигурации") + self.logger.error("=" * 80) + else: + self.logger.error(f"Ошибка API reg.ru: {error_msg} (код: {error_code})") + raise Exception(f"API Error: {error_msg}") + except requests.exceptions.Timeout: + self.logger.error("Таймаут при обращении к API reg.ru (30 сек)") + raise + except requests.exceptions.ConnectionError: + self.logger.error("Ошибка соединения с API reg.ru. Проверьте интернет подключение") + raise except requests.exceptions.RequestException as e: self.logger.error(f"Ошибка HTTP запроса: {e}") raise @@ -254,6 +290,55 @@ class RegRuAPI: self.logger.error(f"Не удалось добавить TXT запись: {e}") return False + def get_current_ip(self) -> str: + """ + Получение текущего публичного IP адреса + + Returns: + IP адрес или 'Неизвестно' + """ + try: + response = requests.get("https://ipinfo.io/ip", timeout=10) + if response.status_code == 200: + return response.text.strip() + except: + try: + response = requests.get("https://api.ipify.org", timeout=10) + if response.status_code == 200: + return response.text.strip() + except: + pass + return "Неизвестно" + + def test_api_access(self) -> bool: + """ + Проверка доступности API reg.ru + + Returns: + True если API доступен + """ + # Получаем текущий IP + current_ip = self.get_current_ip() + self.logger.info(f"Текущий IP адрес: {current_ip}") + self.logger.info("Проверка доступности API reg.ru...") + + try: + # Простой запрос для проверки доступа + params = {} + result = self._make_request("user/get_balance", params) + + if result and result.get("result") == "success": + balance = result.get("answer", {}).get("prepay", "Неизвестно") + self.logger.info(f"✅ API reg.ru доступен. Баланс: {balance} руб.") + return True + else: + self.logger.error("❌ API reg.ru недоступен") + return False + + except Exception as e: + self.logger.error(f"❌ Не удалось подключиться к API reg.ru: {e}") + return False + def remove_txt_record(self, domain: str, subdomain: str, txt_value: str) -> bool: """ Удаление TXT записи @@ -268,34 +353,38 @@ class RegRuAPI: """ self.logger.info(f"Удаление TXT записи: {subdomain}.{domain}") - # Сначала получаем список всех записей - records = self.get_zone_records(domain) - - # Ищем нужную TXT запись - record_id = None - for record in records: - if (record.get("rectype") == "TXT" and - record.get("subdomain") == subdomain and - record.get("text") == txt_value): - record_id = record.get("id") - break - - if not record_id: - self.logger.warning("TXT запись для удаления не найдена") - return False - - params = { - "domain": domain, - "record_id": record_id - } - try: + # Сначала получаем список всех записей + records = self.get_zone_records(domain) + + # Ищем нужную TXT запись + record_id = None + for record in records: + if (record.get("rectype") == "TXT" and + record.get("subdomain") == subdomain and + record.get("text") == txt_value): + record_id = record.get("id") + break + + if not record_id: + self.logger.warning("TXT запись для удаления не найдена") + # Не считаем это критической ошибкой + return True + + params = { + "domain": domain, + "record_id": record_id + } + self._make_request("zone/remove_record", params) self.logger.info("TXT запись успешно удалена") return True + except Exception as e: self.logger.error(f"Не удалось удалить TXT запись: {e}") - return False + # Для cleanup hook не критично, если не удалось удалить + self.logger.warning("Продолжаем выполнение, несмотря на ошибку удаления") + return True # ============================================================================== @@ -1219,6 +1308,11 @@ def main(): help="Создать самоподписанный тестовый сертификат (для разработки и тестирования)", action="store_true" ) + parser.add_argument( + "--test-api", + help="Протестировать подключение к API reg.ru", + action="store_true" + ) args = parser.parse_args() @@ -1233,6 +1327,41 @@ def main(): # Настройка логирования logger = setup_logging(config["log_file"], args.verbose) + # Тестирование API + if args.test_api: + logger.info("=" * 80) + logger.info("ТЕСТИРОВАНИЕ ПОДКЛЮЧЕНИЯ К API REG.RU") + logger.info("=" * 80) + + api = RegRuAPI(config["regru_username"], config["regru_password"], logger) + + # Тест подключения + if api.test_api_access(): + logger.info("") + logger.info("=" * 80) + logger.info("🧪 ДОПОЛНИТЕЛЬНЫЕ ТЕСТЫ") + logger.info("=" * 80) + + # Тест получения DNS записей + try: + records = api.get_zone_records(config["domain"]) + logger.info(f"✅ Получение DNS записей: успешно ({len(records)} записей)") + except Exception as e: + logger.error(f"❌ Получение DNS записей: ошибка - {e}") + + logger.info("") + logger.info("=" * 80) + logger.info("✅ ВСЕ ТЕСТЫ ЗАВЕРШЕНЫ") + logger.info("=" * 80) + logger.info("API reg.ru готов к использованию!") + return 0 + else: + logger.error("=" * 80) + logger.error("❌ ТЕСТЫ НЕ ПРОЙДЕНЫ") + logger.error("=" * 80) + logger.error("Исправьте проблемы с API перед использованием скрипта") + return 1 + # Генерация тестового сертификата if args.test_cert: logger.info("=" * 80) @@ -1343,6 +1472,17 @@ def main(): logger.info("СКРИПТ УПРАВЛЕНИЯ SSL СЕРТИФИКАТАМИ LET'S ENCRYPT") logger.info("=" * 60) + # Проверка доступности API reg.ru (кроме режимов только проверки) + if not args.check: + if not api.test_api_access(): + logger.error("=" * 80) + logger.error("❌ КРИТИЧЕСКАЯ ОШИБКА: API reg.ru недоступен") + logger.error("=" * 80) + logger.error("Скрипт не может продолжить работу без доступа к API") + logger.error("Исправьте проблему и запустите скрипт заново") + return 1 + logger.info("") + # Выполнение действий if args.check: # Только проверка срока действия