Добавлены функции для тестирования доступа к API reg.ru и обработки ошибок. Обновлены сообщения об ошибках с рекомендациями по устранению неполадок. Увеличен таймаут для запросов к API.

This commit is contained in:
Dmitriy Fofanov
2025-10-29 22:00:10 +03:00
parent ed4531fa64
commit 3682379d98
3 changed files with 504 additions and 24 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -182,7 +182,7 @@ class RegRuAPI:
try: try:
self.logger.debug(f"Отправка запроса к API: {method}") 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() response.raise_for_status()
result = response.json() result = response.json()
@@ -192,9 +192,45 @@ class RegRuAPI:
return result return result
else: else:
error_msg = result.get("error_text", "Неизвестная ошибка") 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}") 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: except requests.exceptions.RequestException as e:
self.logger.error(f"Ошибка HTTP запроса: {e}") self.logger.error(f"Ошибка HTTP запроса: {e}")
raise raise
@@ -254,6 +290,55 @@ class RegRuAPI:
self.logger.error(f"Не удалось добавить TXT запись: {e}") self.logger.error(f"Не удалось добавить TXT запись: {e}")
return False 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: def remove_txt_record(self, domain: str, subdomain: str, txt_value: str) -> bool:
""" """
Удаление TXT записи Удаление TXT записи
@@ -268,34 +353,38 @@ class RegRuAPI:
""" """
self.logger.info(f"Удаление TXT записи: {subdomain}.{domain}") 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: 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._make_request("zone/remove_record", params)
self.logger.info("TXT запись успешно удалена") self.logger.info("TXT запись успешно удалена")
return True return True
except Exception as e: except Exception as e:
self.logger.error(f"Не удалось удалить TXT запись: {e}") self.logger.error(f"Не удалось удалить TXT запись: {e}")
return False # Для cleanup hook не критично, если не удалось удалить
self.logger.warning("Продолжаем выполнение, несмотря на ошибку удаления")
return True
# ============================================================================== # ==============================================================================
@@ -1219,6 +1308,11 @@ def main():
help="Создать самоподписанный тестовый сертификат (для разработки и тестирования)", help="Создать самоподписанный тестовый сертификат (для разработки и тестирования)",
action="store_true" action="store_true"
) )
parser.add_argument(
"--test-api",
help="Протестировать подключение к API reg.ru",
action="store_true"
)
args = parser.parse_args() args = parser.parse_args()
@@ -1233,6 +1327,41 @@ def main():
# Настройка логирования # Настройка логирования
logger = setup_logging(config["log_file"], args.verbose) 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: if args.test_cert:
logger.info("=" * 80) logger.info("=" * 80)
@@ -1343,6 +1472,17 @@ def main():
logger.info("СКРИПТ УПРАВЛЕНИЯ SSL СЕРТИФИКАТАМИ LET'S ENCRYPT") logger.info("СКРИПТ УПРАВЛЕНИЯ SSL СЕРТИФИКАТАМИ LET'S ENCRYPT")
logger.info("=" * 60) 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: if args.check:
# Только проверка срока действия # Только проверка срока действия