From 02cf39c8837a7ed13758b02eb4fbe4a82e6bd1a5 Mon Sep 17 00:00:00 2001 From: erjemin Date: Fri, 6 Mar 2026 19:07:56 +0300 Subject: [PATCH] =?UTF-8?q?add:=20=D0=9F=D1=80=D0=BE=D0=B7=D1=80=D0=B0?= =?UTF-8?q?=D1=87=D0=BD=D1=8B=D0=B9=20=D0=BF=D1=80=D0=BE=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=B9=D0=BD=D0=B5=D1=80=D0=B0?= =?UTF-8?q?=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Shadowsocks=20=D0=B8=20tun2?= =?UTF-8?q?socks=20(04)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...container-via-shadowsocks-and-tun2socks.md | 52 ++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/docker/docker-proxy-container-via-shadowsocks-and-tun2socks.md b/docker/docker-proxy-container-via-shadowsocks-and-tun2socks.md index 7066373..a37f354 100644 --- a/docker/docker-proxy-container-via-shadowsocks-and-tun2socks.md +++ b/docker/docker-proxy-container-via-shadowsocks-and-tun2socks.md @@ -164,7 +164,7 @@ services: # [3] Audiobookshelf, использующий Privoxy для доступа к интернету audiobookshelf: - image: advplyr/audiobookshelf:2.28.0 + image: advplyr/audiobookshelf:latest container_name: audiobookshelf restart: always network_mode: "service:tun2socks" @@ -182,7 +182,7 @@ services: Что тут происходит: -**Первым стартует** контейнер `ss-ru`. Он ни от кого не зависит. Он подключается к моему Outline-серверу и предоставляет +*Первым стартует** контейнер `ss-ru`. Он ни от кого не зависит. Он подключается к моему Outline-серверу и предоставляет SOCKS5-прокси на порту `1080`. Где брать параметры для подключения к Outline/VPS? В панели Outline Manager "Add new Key". Она предоставит строку вида: @@ -200,7 +200,7 @@ services: **Вторым стартует** контейнер `tun2socks`. Он зависит от `ss-ru`, так что гарантированно запустится после него. Он использует `ss-ru` как SOCKS5-прокси и создает TUN-интерфейс `tun0` внутри контейнера. Так же он предоставляет HTTP-интерфейс на порту 80 внутри нашего проекта Docker Station (с него будет отвечать Audiobookshelf) который - проброшен наружу как 8000). + проброшен наружу как 8000 (его отпроксирует Nginx на хосте Orange Pi 5 Plus). Контейнер tun2socks использует системный TUN-интерфейс Synology (`/dev/net/tun`). Поэтому контейнеру нужны права и доступ к этому устройству. Это достигается через: @@ -219,16 +219,16 @@ ls /dev/net/tun sudo modprobe tun # И снова проверить, что устройство появилось ls /dev/net/tun -# Должно вывести: /dev/net/tun +# Должно вывести: "/dev/net/tun" ``` | Заметим | | ------- | | Я пробовал други решения: (1) `Privoxy` -- Проблемы: axios внутри Audiobookshelf плохо работает с proxy, ломаются редиректы,SSRF фильтр, сами RSS загружаются, но SSRF будет блокировать запросы к iTunes, а, значит, не будут получаться метаданные, а без метаданных и mp3-файлы не скачиваются. (2) `redsocks` -- Проблемы: нестабильный iptables redirect (на Synology это вообще не работает, похоже), падение самого redsocks, сложная настройка NAT внутри Docker. -**Третьим стартует** контейнер `audiobookshelf`. В нем почти все по старому. Но теперь он зависит от `tun2socks`, - так что гарантированно запустится после него. Кроме того у него теперь нет проброса портов `8000:80` (они у нас - теперь в контейнере tun2socks). Вместо этого у него `network_mode: "service:tun2socks"`. Это значит, что он будет +**Третьим стартует** контейнер `audiobookshelf`. В нём почти все по старому. Но теперь он зависит от `tun2socks`, + так что гарантированно запустится после него. Кроме того, у него нет проброса портов `8000:80` (они у нас теперь + в контейнере tun2socks). Вместо этого у него `network_mode: "service:tun2socks"`. Это значит, что он будет использовать сетевой стек контейнера tun2socks. В результате весь его трафик будет идти через TUN-интерфейс Дальше уже `tun2socks` определит что с ним делать. Если трафик пришел снаружи, с порта 8000, то он попадёт в Audiobookshelf, как и раньше. Если же сам Audiobookshelf начнет что-то скачивать, то запрос уйдет через @@ -237,3 +237,41 @@ ls /dev/net/tun ## Запуск и проверка +Конечно, первым делом проверить в интерфейсе Docker Station, что проект "зелененький" и все контейнеры тоже +"зелененькие". Ну или выполнить: +```bash +sudo docker ps +``` + +И увидим что-то типа: +```text +CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES +8599f59103eb advplyr/audiobookshelf:2.28.0 "tini -- node index.…" 16s ago Up 17s audiobookshelf +038ea5878848 xjasonlyu/tun2socks "/entrypoint.sh -dev…" 16s ago Up 16s 0.0.0.0:8000->80/tcp, :::8000->80/tcp tun2socks +3bdb3269ed77 shadowsocks/shadowsocks-libev "ss-local -s 90.156.…" 16s ago Up 16s ss-ru +``` + +Для проверки, что тоннель работает и подкасты скачиваются выполним в терминале на Synology: +```bash +sudo docker exec -it audiobookshelf sh -c " node -e \"const https=require('https');const fs=require('fs');const file=fs.createWriteStream('/podcasts/test.mp3');https.get('https://aerostats.getmobileup.com/music/1074.mp3',res=>{res.pipe(file);file.on('finish',()=>console.log('Done'))})\"" +``` + +Audiobookshelf работает на Node.js, а внутри контейнера нет ни `curl`. ни `wget`. Так что придется запустить такой + заковыристый js-скрипт для проверки скачивания файла. + +В результате должен получим `test.mp3` в папке `/podcasts/` (а она у нас снаружи контейнера +в `/volume1/music/_podcasts`). Это выпуск №1074 подкаста "Аэростат" с альбомом Аквариума "Странные Новости с + Далёкой Звезды" (2026 год, очень рекомендую послушать). Этот подкаст размещен на DigitalOcean, так что если + он скачался, значит туннель работает и обход блокировок провайдера сработал. + +Проверить что метаданные из iTunes тоже подгружаются, можно проверить только настроив автообновление подкастов + в интерфейсе Audiobookshelf (например через ять минут). К получение метаданных происходит "под капотом" + и иначе никак не диагностируется. + +Должно все работать. Но если не работает, то "курите логи" контейнера `audiobookshelf`: +```bash +sudo docker logs audiobookshelf --tail 100 +``` + +...и Google и ИИ-ассистенты в помощь. Node.js -- это не самая простая среда для отладки. +