Интеграции · Средний

Настройка прокси для git, npm, pip, Docker, apt и других инструментов разработчика

Большинство консольных инструментов читают одни и те же три переменные окружения, а у остальных есть по одной документированной настройке. Здесь собраны и те и другие — с ловушками, на которые уходит полдня.

3 минуты чтения 8 разделов Обновлено Опубликовано

Переменные окружения#

Shell (bash, zsh)
export HTTP_PROXY="http://USER:PASS@res.hodlproxy.com:9000"
export HTTPS_PROXY="$HTTP_PROXY"
export NO_PROXY="localhost,127.0.0.1,.internal,.local"
# Некоторые инструменты читают только имена в нижнем регистре
export http_proxy="$HTTP_PROXY" https_proxy="$HTTPS_PROXY" no_proxy="$NO_PROXY"
  • HTTPS_PROXY — это прокси для HTTPS-адресатов; его значение всё равно URL вида http://, потому что инструмент общается с прокси по обычному HTTP и туннелирует через него TLS.
  • NO_PROXY перечисляет хосты, которые не должны идти через прокси: внутренние реестры, сервисы метаданных, localhost.
  • Спецсимволы в пароле нужно кодировать для URL (@ становится %40, : — %3A), иначе URL разберётся неправильно.

git#

git по HTTPS
git config --global http.proxy http://USER:PASS@res.hodlproxy.com:9000
# Только для одного хоста
git config --global http.https://github.com.proxy http://USER:PASS@res.hodlproxy.com:9000
# SOCKS5 с удалённым DNS
git config --global http.proxy socks5h://USER:PASS@res.hodlproxy.com:9001
# Отключить
git config --global --unset http.proxy

Эти настройки действуют только для HTTPS-репозиториев. Для SSH-репозиториев нужен ProxyCommand, например ncat --proxy-type socks5 --proxy res.hodlproxy.com:9001 --proxy-auth USER:PASS %h %p в ~/.ssh/config.

npm и yarn#

npm, yarn 1 и yarn 2+
npm config set proxy http://USER:PASS@res.hodlproxy.com:9000
npm config set https-proxy http://USER:PASS@res.hodlproxy.com:9000

# yarn 1
yarn config set proxy http://USER:PASS@res.hodlproxy.com:9000
yarn config set https-proxy http://USER:PASS@res.hodlproxy.com:9000

# yarn 2 и новее
yarn config set httpProxy http://USER:PASS@res.hodlproxy.com:9000
yarn config set httpsProxy http://USER:PASS@res.hodlproxy.com:9000

pip#

pip
pip install --proxy http://USER:PASS@res.hodlproxy.com:9000 requests

# Постоянно: в pip.conf (Linux/macOS) или pip.ini (Windows)
[global]
proxy = http://USER:PASS@res.hodlproxy.com:9000

pip принимает SOCKS5-прокси только при установленном пакете PySocks, иначе завершится ошибкой об отсутствующей зависимости. На чистой машине используйте HTTP-порт.

Docker#

У Docker две разные настройки прокси, и их путаница — главная ловушка. Демон скачивает образы и не видит переменных вашей оболочки; клиент передаёт настройки прокси в сборки и контейнеры.

Демон (Linux, systemd)
# /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://USER:PASS@res.hodlproxy.com:9000"
Environment="HTTPS_PROXY=http://USER:PASS@res.hodlproxy.com:9000"
Environment="NO_PROXY=localhost,127.0.0.1"

# затем
sudo systemctl daemon-reload && sudo systemctl restart docker
Сборки и контейнеры (~/.docker/config.json)
{
  "proxies": {
    "default": {
      "httpProxy": "http://USER:PASS@res.hodlproxy.com:9000",
      "httpsProxy": "http://USER:PASS@res.hodlproxy.com:9000",
      "noProxy": "localhost,127.0.0.1"
    }
  }
}

В Docker Desktop настройка демона находится в Settings → Resources → Proxies.

apt#

/etc/apt/apt.conf.d/95proxy
Acquire::http::Proxy "http://USER:PASS@res.hodlproxy.com:9000/";
Acquire::https::Proxy "http://USER:PASS@res.hodlproxy.com:9000/";

Go#

Инструменты Go учитывают HTTPS_PROXY и NO_PROXY. GOPROXY — совсем другое: адрес зеркала модулей, а не сетевой прокси, и его смена не направляет трафик через выход.

Какой выход использовать#

  • Реестрам пакетов и git-хостингам не нужно доверие как к домашнему IP: серверный адрес от $0.70 в месяц с общим пулом 100 ГБ на IP — самый дешёвый стабильный вариант.
  • Если вы используете резидентский пул с ротацией, держите закреплённую сессию (-sid-build1-ttl-30m), чтобы крупная загрузка не сменила выход посередине.
  • На серверах лучше белый список IP: никаких учётных данных в переменных окружения и конфигах, которые могут прочитать другие пользователи и процессы.

Частые вопросы#

Почему значение HTTPS_PROXY начинается с http://?

Потому что оно описывает, как инструмент общается с прокси, а не с адресатом. Инструмент отправляет запрос CONNECT по обычному HTTP, а затем согласует TLS с адресатом через туннель.

Использует ли Docker HTTP_PROXY из моей оболочки?

Клиент — да, для сборок, которые его передают, а демон, скачивающий образы, — нет: настройте его в systemd drop-in или в настройках прокси Docker Desktop.

Что делает NO_PROXY?

Перечисляет хосты, к которым нужно обращаться напрямую, минуя прокси: localhost, внутренние реестры и адреса метаданных облака. Записи, начинающиеся с точки, охватывают весь домен.

GOPROXY — это прокси-сервер?

Нет. GOPROXY указывает инструментам Go зеркало модулей. Чтобы направить сетевой трафик Go через прокси, задайте HTTPS_PROXY.

Можно начинать

Попробуйте на практике.

Создайте аккаунт, пополните баланс на $20 и вставьте конечную точку из этого руководства в свой инструмент. Срок действия оплаченного трафика не ограничен.