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

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


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

```bash
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

```bash
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

```bash
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

```bash
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 две разные настройки прокси, и их путаница — главная ловушка. **Демон** скачивает образы и не видит переменных вашей оболочки; **клиент** передаёт настройки прокси в сборки и контейнеры.

```ini
# /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
```

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

```text
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: [серверный](https://hodlproxy.com/ru/datacenter-proxies) адрес от $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.

Источник: https://hodlproxy.com/ru/guides/developer-tools-proxy-settings
