Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save AlcibiadesCleinias/af8e976aed1a536854e0145417f3b16e to your computer and use it in GitHub Desktop.
Save AlcibiadesCleinias/af8e976aed1a536854e0145417f3b16e to your computer and use it in GitHub Desktop.
Решение проблемы подключения Telegram бота к API: socket.gaierror: [Errno -3] Temporary failure in name resolution

🚨 Проблема

Telegram бот в Docker контейнере не мог подключиться к API с ошибкой:

socket.gaierror: [Errno -3] Temporary failure in name resolution
aiohttp.client_exceptions.ClientConnectorError: Cannot connect to host api.telegram.org:443 ssl:default [Temporary failure in name resolution]

Что означала ошибка:

  • Бот не мог преобразовать доменное имя api.telegram.org в IP-адрес
  • DNS (Domain Name System) не работал в контейнере
  • Интернет подключение было, но разрешение имён - нет

🔍 Диагностика

1. Проверили базовое подключение:

ping -c 3 8.8.8.8
# ✅ Работало - интернет есть

2. Проверили DNS разрешение:

nslookup api.telegram.org
# ❌ Ошибка: ;; communications error to 127.0.0.53#53: timed out

3. Проверили DNS с внешним сервером:

nslookup api.telegram.org 8.8.8.8
# ✅ Работало - проблема в локальном DNS

4. Проверили конфигурацию DNS:

cat /etc/resolv.conf
# Проблема: nameserver 127.0.0.53 (systemd-resolved) не отвечал

5. Проверили статус systemd-resolved:

systemctl status systemd-resolved
# Служба работала, но выдавала ошибки "Got packet on unexpected connection"

🔧 Решение

Шаг 1: Остановили проблемную службу

systemctl stop systemd-resolved

Шаг 2: Заменили DNS конфигурацию

echo -e "nameserver 8.8.8.8\nnameserver 1.1.1.1" > /etc/resolv.conf

Шаг 3: Проверили что DNS работает

nslookup api.telegram.org
# ✅ Успех: Name: api.telegram.org, Address: 149.154.167.220

Шаг 4: Проверили подключение к Telegram API

curl -s -o /dev/null -w "%{http_code}" https://api.telegram.org/
# ✅ Результат: 302 (нормальный редирект)

📋 Итоговое решение

Проблема: systemd-resolved не работал корректно в Docker окружении Решение: Заменили на прямое использование внешних DNS серверов

DNS серверы которые используем:

  • 8.8.8.8 - Google Public DNS
  • 1.1.1.1 - Cloudflare DNS

Файл /etc/resolv.conf после исправления:

nameserver 8.8.8.8
nameserver 1.1.1.1

🎯 Результат

После исправления DNS:

  • ✅ Telegram API доступен
  • ✅ Бот может подключаться к серверам Telegram
  • ✅ Разрешение доменных имён работает
  • ✅ Проблема с "name resolution" решена

🔄 Для постоянного исправления

ВАЖНО: Мы решили проблему на уровне хоста, но есть разные подходы:

Вариант 1: Настройка DNS в Docker Compose (ЛУЧШИЙ для production)

services:
  your-bot:
    dns:
      - 8.8.8.8
      - 1.1.1.1

Плюсы:

  • Решает проблему только для контейнера
  • Не влияет на хост-систему
  • Легко управлять через код

Вариант 2: Исправление на уровне хоста (то что мы сделали)

systemctl stop systemd-resolved
echo -e "nameserver 8.8.8.8\nnameserver 1.1.1.1" > /etc/resolv.conf

Плюсы:

  • Быстрое решение
  • Работает для всей системы

Минусы:

  • Влияет на весь сервер
  • Может сломаться при обновлении системы

Вариант 3: В Dockerfile

RUN echo "nameserver 8.8.8.8" > /etc/resolv.conf

Какой вариант лучше?

  • Для production: Docker Compose DNS настройки
  • Для быстрого фикса: настройки хоста (как мы сделали)
  • Для новых образов: Dockerfile
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment