Skip to main content

Установка Psiphon (psiphon-docker) на Ubuntu

Прокси-туннель для обхода блокировок на базе psiphon-tunnel-core — swarupsengupta2007/psiphon-docker. Поднимает HTTP- и SOCKS5-прокси с выбором региона выхода.

Каждый блок кода ниже рассчитан на копирование целиком.

Предполагается, что Docker и Docker Compose plugin уже установлены (см. страницу «Установка Docker и Docker Compose на Ubuntu»).

1. Подготовка каталога

sudo mkdir -p /opt/psiphon/config && sudo chown -R 1000:1000 /opt/psiphon && cd /opt/psiphon

/opt/psiphon выбран как каталог для стороннего софта по FHS — не привязан к домашней директории конкретного пользователя. Каталог config монтируется в контейнер и хранит psiphon.config — должен быть доступен на запись пользователю с указанными ниже PUID/PGID (в примере — 1000:1000, при других значениях chown нужно поправить соответственно).

2. docker-compose.yml

nano docker-compose.yml

Содержимое:

services:
  psiphon:
    image: swarupsengupta2007/psiphon:latest
    container_name: psiphon
    environment:
      - PUID=1000
      - PGID=1000
      - HTTP_PORT=8080
      - SOCKS_PORT=1080
      - DEVICE_REGION=RU
      - EGRESS_REGION=SG
    volumes:
      - ./config:/config
    ports:
      - 127.0.0.1:1080:1080
      - 127.0.0.1:8080:8080
    restart: unless-stopped

Docker и UFW. Как отмечено на странице первоначальной настройки сервера, Docker прописывает правила ports: напрямую в iptables в обход UFW. Публикация на 127.0.0.1:... вместо 0.0.0.0 (голого порта) не даёт достучаться до прокси снаружи — открывайте наружу только если это осознанное решение.

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

Применяются только при первом запуске, пока в /config ещё нет psiphon.config:

Переменная Описание По умолчанию
PUID UID процесса psiphon 1000
PGID GID процесса psiphon 1000
HTTP_PORT Порт HTTP-прокси 8080
SOCKS_PORT Порт SOCKS-прокси 1080
DEVICE_REGION Регион устройства RU
EGRESS_REGION Регион выхода трафика SG

PUID/PGID текущего пользователя:

id -u && id -g

Какой EGRESS_REGION выбрать из RU

Psiphon не публикует официальный актуальный список стран, где у него сейчас подняты серверы выхода — набор доступных EGRESS_REGION может отличаться от билда к билду и меняться со временем. Но по географии для пользователя из России логика простая: чем ближе сервер выхода, тем обычно ниже пинг. Кандидаты, которые чаще всего оказываются рабочими и близкими по задержке:

Приоритет Код Регион
1 FI Финляндия
2 EE Эстония
3 LV Латвия
4 LT Литва
5 PL Польша
6 DE Германия
7 NL Нидерланды

Если ни один код не подходит (сервер в этом регионе недоступен) или нужен более общий обход — оставьте EGRESS_REGION="" (пустая строка), тогда клиент сам выберет наименее нагруженный доступный сервер, без привязки к региону.

Замерить фактическую задержку для конкретного региона после запуска контейнера:

curl -x socks5h://127.0.0.1:1080 -o /dev/null -s -w 'time_total: %{time_total}s\n' https://ifconfig.me

Меняя EGRESS_REGION и пересоздавая контейнер (docker compose up -d --force-recreate), можно сравнить время ответа по разным кандидатам и оставить самый быстрый из реально работающих.

3. Запуск

docker compose up -d

4. Проверка

Статус контейнера и логи:

docker compose ps && docker logs -f psiphon

Healthcheck:

docker inspect --format='{{json .State.Health}}' psiphon

Ожидаемый статус — "Status":"healthy".

Проверка прокси:

curl -x socks5h://127.0.0.1:1080 https://ifconfig.me
curl -x http://127.0.0.1:8080 https://ifconfig.me

Вернувшийся IP должен соответствовать выбранному EGRESS_REGION.

5. Управление сервисом

docker compose restart   # перезапуск
docker compose down      # остановка и удаление контейнера
docker compose pull && docker compose up -d   # обновление образа

6. Несколько регионов одновременно

EGRESS_REGION — это одно значение на один запущенный контейнер. Чтобы иметь под рукой сразу несколько регионов выхода — поднимают отдельный контейнер на каждый, с уникальными container_name, каталогом config и внешними портами:

services:
  psiphon-fi:
    image: swarupsengupta2007/psiphon:latest
    container_name: psiphon-fi
    environment:
      - PUID=1000
      - PGID=1000
      - HTTP_PORT=8080
      - SOCKS_PORT=1080
      - DEVICE_REGION=RU
      - EGRESS_REGION=FI
    volumes:
      - ./config-fi:/config
    ports:
      - 127.0.0.1:1080:1080
      - 127.0.0.1:8080:8080
    restart: unless-stopped

  psiphon-de:
    image: swarupsengupta2007/psiphon:latest
    container_name: psiphon-de
    environment:
      - PUID=1000
      - PGID=1000
      - HTTP_PORT=8080
      - SOCKS_PORT=1080
      - DEVICE_REGION=RU
      - EGRESS_REGION=DE
    volumes:
      - ./config-de:/config
    ports:
      - 127.0.0.1:1081:1080
      - 127.0.0.1:8081:8080
    restart: unless-stopped

  psiphon-nl:
    image: swarupsengupta2007/psiphon:latest
    container_name: psiphon-nl
    environment:
      - PUID=1000
      - PGID=1000
      - HTTP_PORT=8080
      - SOCKS_PORT=1080
      - DEVICE_REGION=RU
      - EGRESS_REGION=NL
    volumes:
      - ./config-nl:/config
    ports:
      - 127.0.0.1:1082:1080
      - 127.0.0.1:8082:8080
    restart: unless-stopped

Что важно не перепутать:

  • Разные container_name — иначе Docker откажется поднимать второй сервис.
  • Разные каталоги в volumes (config-fi, config-de и т. д.) — каждый регион хранит свой psiphon.config, смешивать их в одной папке нельзя.
  • Разные внешние порты — внутри контейнера порты одинаковые (1080/8080), наружу пробрасываются на разные (1080/8080, 1081/8081, ...), иначе конфликт портов на хосте.
  • Каталоги под каждый регион создаются заранее, как в шаге 1: sudo mkdir -p /opt/psiphon/config-fi /opt/psiphon/config-de /opt/psiphon/config-nl && sudo chown -R 1000:1000 /opt/psiphon.

Дальше в приложении просто выбираете локальный порт, соответствующий нужному региону выхода.

Что стоит сделать дополнительно

  • Не менять переменные окружения после первого запуска без ручной правки/удаления config/psiphon.config — на уже созданный конфиг они не влияют.
  • Если прокси должен быть доступен с других машин — не публиковать порт на 0.0.0.0 без дополнительного контроля доступа (файрвол/аутентификация на уровне прокси).
  • Настроить бэкап каталога config.