Proxmox
January 28

Сервер Transmission в Proxmox

Тут я хочу описать способ создания сервера ВМ для штатной торрентокачалки, на мой взгляд, одной из самых удобных. Изначально я познакомился с Transmission благодаря Keenetic и загружал всё на подключенный к роутеру диск. Мне стало интересно, как его можно развернуть самостоятельно на хосте Proxmox с остальными ВМ и снять эту задачу с Keenetic.

Transmission по умолчанию имеет простенький веб интерфейс, который мы затюним, а так же клиенты под большинство ОС.

Перед написанием этой статьи я так же пробовал выполнить трюк в LXC контейнере, где для:

  • Привелигированного контейнера не совсем безопасно для ядра;
  • В непривилегированном контейнере нельзя выполнять операции, требующие прямого доступа к ядру, в том числе монтирование, а если и обходить , то нужно учитывать особенности работы с ID-сдвигами (UID/GID mapping). Сначала нужно монтировать шару на хосте, а затем привязать её к контейнеру. Это добавляет дополнительный уровень сложности.

В данном случае остается выбор ВМ. Изолированно от хоста. Просто разворачивается. Показываю с создания ВМ до самого конца.

В этой статье не описано создание хоста, на который будут загружаться файлы, поэтому сетевой диск и пользователя, у которого будут права на запись по SMB нужно подготовить самостоятельно.

TL:DR

Создание ВМ для Transmission

Выбор образа, установка параметров, подключение к хосту.

Установка и настройка Transmission

Обновление списка пакетов, установка Transmission, CIFS, nano. Создание каталога downloads, добавление записи о монтировании в /etc/fstab, настройка параметров в settings.json.

Тюнинг интерфейса Transmission

Установка веб-интерфейса с GitHub, настройка параметров для работы через веб-интерфейс.

Описание переменных в settings.json

Создаём ВМ для Transmission

Находим линк для закачки iso образа в releases.ubuntu.com и копируем. Я выбрал ubuntu-22.04.5-live-server-amd64

Идем на наш хост и выбираем local -> ISO Images -> Download from URL.

У меня этот образ ранее был загружен

Вставляем ссылку из буфера в полеURL и выбираем Query URL. В File name отобразится имя образа. Жмем Download.

После загрузки образа выбираем Create VM и создаем ВМ с минимально доступными параметрами по железу.

Задаем Name в General.

В OS находим загруженный образ, который ранее закинули в local.

Во вкладке System оставляем параметры по умолчанию.

Во вкладке Disks выделяем минимальный Disk size 8 GiB и указываем Storage.

По CPU и Memory, по моим тестам, одновременно на 5 активных загрузок достаточно 2 cores и 2048 MiB. Больше не пробовал.

В Network снимаем маркер с Firewall если он настроен на хосте, либо настраиваем самостоятельно под свои нужды.

Общий конфиг ВМ может выглядеть так. Ставим маркер Start after created и Finish.

Проходим в Console и выполняем стандартную процедуру установки. На первом этапе я выбираю English.

В Installer update available выбираем Continue without updating.

В Keyboard configuration оставляем как есть -> Done.

В Chose the type of installation оставляем по умолчанию Ubuntu Server (minimized) -> Done.

Сэкономим немного дискового пространства

Далее Network configuration, ну тут уж сами. У меня раздаётDHCP.

Позже задам статику на роутере.

ВProxy configuration мне ничего не нужно, оставляю пустым.

Ждем прогрузки зеркала вUbuntu archive mirror configuration -> Done

В Guided storage configuration оставляю по умолчанию -> Done -> Done -> Continue

В Profile Configuration - указываем своё имя для входа, имя сервера и пароль.

В Upgrade to Ubuntu Pro ничего не меняя, выбираем Continue.

В SSH Configuration я ставлю маркер на Instal OpenSSH Server чтобы в дальнейшем подключаться через терминал, мне так удобнее, а как вам - решайте сами.

В Featured server snaps ничего не меняя, выбираем Done.

После завершения установки отправляем ВМ в перезагрузку -> Reboot now

Так же может потребоваться нажать Enter, что якобы failed unmounting /cdrom. Отмонтировать для этого ничего не нужно.

После загрузки авторизуемся в системе и проверяем, какой адрес был выдан хосту чтобы потом не возникло вопросов, почему по SSH не доступен или не выполняется apt update. Выполняем ip a.

В сетевой карте ens18, где строка inet находим выданный адрес.

Установка и настройка Transmission

Далее я подключаюсь к свежеустановленному хосту по SSH и начинаю установку пакетов.

Напоминаю, что основная цель этого хоста загружать торренты по SMB на примонтированный диск, поэтому нужно заранее создать пользователя на хосте с файловой шарой, у которого будут права на запись в назначенную сетевую папку.

# Обновляем список пакетов
sudo apt update
# Устанавливаем Transmission, CIFS для монтирования по SMB, nano (по умолчанию в minimized отсутствует)
sudo apt install transmission-cli transmission-daemon transmission-common cifs-utils nano -y
# Создаем каталог downloads в mnt, в которую будем монтировать папку
sudo mkdir -p /mnt/downloads
# Открываем /etc/fstab для добавления записи о монтировании:
sudo nano /etc/fstab

Добавляем в конец файла и меняем под себя

Список длинный и прокручивается. Выдели триплкликом ЛКМ ниже.
//192.168.1.x/downloads /mnt/downloads cifs username=transmission,password=YoUrPaSSw0rd,uid=fonwa,gid=fonwa,file_mode=0777,dir_mode=0777,iocharset=utf8,_netdev 0 0

Пояснение:

  • //192.168.1.x/downloads — путь к SMB-ресурсу на целевом хосте, куда будут загружаться файлы.
  • /mnt/torrents — папка на только что созданном сервере Ubuntu, куда будет монтироваться сетевое хранилище.
  • username=transmission,password=YoUrPaSSw0rd — учетные данные для доступа к SMB-ресурсу.
  • uid=fonwa,gid=fonwa — задаёт владельцем и группой для всех файлов в этой папке пользователя fonwa.
  • file_mode=0777,dir_mode=0777 — устанавливает права на файлы и каталоги, чтобы они были доступны для записи.
  • iocharset=utf8 — кодировка.
  • _netdev указывает, что это сетевое устройство, и монтирование должно происходить после запуска сети.

Сохраняем изменения и закрываем файл: Ctrl+X, Y, Enter.

# Применяем настройки монтирования
sudo mount -a
# Проверяем, что диск смонтирован правильно
df -h

Убедитесь, что у папки /mnt/torrents есть права для пользователя fonwa (поскольку именно этот пользователь будет использовать Transmission):

ls -ld /mnt/downloads/
Вывод должен показывать, что владельцем папки является fonwa, и группа тоже должна быть fonwa.

Теперь нужно настроить Transmission так, чтобы он использовал смонтированную папку /mnt/torrents для сохранения скачиваемых торрентов.

# Останавливаем сервис transmission-daemon
sudo systemctl stop transmission-daemon

Перед внесением изменений в settings.json, демон должен быть закрыт и остановлен, что мы и сделали выше, в противном случае параметры будут возвращены в предыдущее состояние.
# Открываем файл конфигурации Transmission:
sudo nano /etc/transmission-daemon/settings.json

Далее меняем параметры. Я лишь опишу некоторые из них, необходимые для первоначального запуска и показать, что всё работает.

1. Найдите параметр "download-dir" и замените его на путь к смонтированной папке:

  • "download-dir": "/mnt/downloads",

2. Отключаем whitelist, иначе на WEB морду не пустит:

  • "rpc-whitelist-enabled": false,

3. Выставляем логин/пароль с которыми будем заходить на WEB GUI, по умолчанию transmission/transmission

rpc-password шифрует пароль после сохранения конфига, не удивляемся длинному шифру
  • "rpc-password": "transmission",
  • "rpc-username": "transmission",

Сохраняем изменения и закрываем файл: Ctrl+X, Y, Enter.

# Запускаем сервис transmission-daemon
sudo systemctl start transmission-daemon
# Проверяем, что сервис активен
sudo systemctl status transmission-daemon

Открываем веб-интерфейс Transmission. Он обычно доступен на порту 9091, вводим в браузере:

http://192.168.1.X:9091 и введите свои логин/пароль, указанные в settings.json.

На этом этапе мы увидим скудный интерфейс Transmission.

Настройка задержки монтирования

Если сеть не успевает инициализироваться до попытки монтирования, контейнер продолжал работу, а хост с сетевой папкой перезагрузился, создадим сервис для монтирования:

# Создаем файл сервиса 
sudo nano /etc/systemd/system/mnt-downloads.mount

Добавляем в него содержимое и меняем под свои данные:

[Unit]
Description=Mount CIFS Share 
Requires=network-online.target 
After=network-online.target

[Mount] 
What=//192.168.1.x/downloads 
Where=/mnt/downloads 
Type=cifs
Options=username=transmission,password=YoUrPaSSw0rd,uid=fonwa,gid=fonwa,file_mode=0777,dir_mode=0777,iocharset=utf8,_netdev 

[Install] 
WantedBy=multi-user.target

# Включаем и запускаем сервис
sudo systemctl enable mnt-downloads.mount 
sudo systemctl start mnt-downloads.mount

Тюним интерфейс Transmission

# Переходим во временный каталог, откуда будем устанавливать веб-интерфейс
cd /var/tmp/
# Загружаем последнюю версию Transmission Web Control с GitHub
wget https://github.com/ronggang/transmission-web-control/raw/master/release/install-tr-control.sh --no-check-certificate
# Запускаем скрипт
sudo bash install-tr-control.sh

Ставим папку по умолчанию, нажав 6 и скопировав путь ниже:

/usr/share/transmission

Устанавливаем последнюю версию, нажав 1

После установки открываем веб-интерфейс по тому же адресу

http://<IP-адрес вашего хоста>:9091

Поздравляю. Вы установили Transmission с человеческим WEB интерфейсом, если придется зайти на него через браузер.

Так же можно:

  • Интуитивно менять настройки через WEB GUI;
  • Переключаться между десктопной и мобильной версиями;
  • Пробросить порты в наружу чтобы ставить на загрузку извне.

Попробуем добавить рандомную magnet ссылку на скачивание.

Как видно, загрузка успешно началась, а это значит, что все выше выполнили корректно и по пути не возникло никаких ошибок. Вы молодцы.

upd. 06.11.2025

Дополнение:

  1. Монтирование CIFS восстанавливается само при обращении;
  2. Система не виснет при старте, если сеть недоступна;
  3. Пароль хранится отдельно в /etc/cifs-credentials;

Вынести учётные данные в защищённый файл.

# Вынести учётные данные в защищённый файл
sudo nano /etc/cifs-credentials

Изменить данные под себя

username=fonwa
password=yourpassword
domain=WORKGROUP # если домена нет, удалить строку

Сохранить и выйти

# Задать права
sudo chmod 600 /etc/cifs-credentials
sudo chown root:root /etc/cifs-credentials

Отредактировать уже существующий mnt-downloads.mount

sudo nano /etc/systemd/system/mnt-downloads.mount

Изменить под себя IP, name и имя папки, если отличается

[Unit]
Description=Mount CIFS Share /mnt/downloads
After=network-online.target
Requires=network-online.target

[Mount]
What=//192.168.1.x/downloads
Where=/mnt/downloads
Type=cifs
Options=credentials=/etc/cifs-credentials,uid=fonwa,gid=fonwa,file_mode=0777,dir_mode=0777,iocharset=utf8,_netdev

Сохранить и выйти

Создать еще 1 systemd юнит mnt-downloads.automount для автомонтирования

sudo nano /etc/systemd/system/mnt-downloads.automount

[Unit]
Description=Automount trigger for /mnt/downloads
After=network-online.target
Requires=network-online.target

[Automount]
Where=/mnt/downloads
TimeoutIdleSec=600

[Install]
WantedBy=multi-user.target

Сохранить и выйти

Удалить или закомментировать последнюю запись в /etc/fstab.

Никаких дубликатов //192.168.1.x/downloads быть не должно. Это будет мешать работе systemd.
sudo nano /etc/fstab

Сохранить и выйти

Перезагрузить конфигурацию и активировать

sudo systemctl daemon-reload
sudo systemctl enable --now mnt-downloads.automount

Проверить работу:

ls /mnt/downloads # вызовет автоматическое монтирование
mount | grep downloads # убедиться, что точка активна
# Временно отключить SMB сервис и запустить через некоторое время
# Убедиться, что автомонтирование отрабатывает самостоятельно

Переменные в settings.json

Файл /etc/transmission-daemon/settings.json содержит все настройки для Transmission, включая параметры для работы веб-интерфейса, настроек сети, пути загрузки и другие. Я расшифрую основные параметры этого конфигурационного файла, чтобы вы могли настроить его под свои нужды.

Основные параметры конфигурации

1. rpc-username

- Описание: Устанавливает имя пользователя для аутентификации на веб-интерфейсе Transmission. Если не требуется аутентификация, оставьте пустым..

- Пример: rpc-username": "fonwa"

2. rpc-password

- Описание: Пароль для веб-интерфейса Transmission.

- Пример: rpc-password": "YoUrPaSSw0rd"

- Описание: Пароль для пользователя, указанного в rpc-username. Пароль сохраняется в виде зашифрованной строки (с использованием хэширования). Не рекомендуется ставить слишком простой пароль, особенно если сервер доступен из внешней сети.

3. rpc-port

- Описание: Это порт, через который вы будете подключаться к веб-интерфейсу. Обычно используется порт 9091, но вы можете изменить его на любой другой, если требуется.

- Пример: rpc-port": 9091

4. rpc-bind-address

- Описание: Указывает, на какой IP-адрес веб-интерфейс должен слушать. Если значение установлено в 0.0.0.0, веб-интерфейс будет доступен на всех интерфейсах сервера. Если вы хотите ограничить доступ только локальной сети или конкретному интерфейсу, укажите IP этого интерфейса.

- Пример: "rpc-bind-address": "0.0.0.0"

5. rpc-authentication-required

- Описание: Указывает, требуется ли ввод имени пользователя и пароля для доступа к веб-интерфейсу. Если установлено в false, веб-интерфейс будет доступен без авторизаци.

- Пример: "rpc-authentication-required": true

6. rpc-whitelist

- Описание: Указывает, какие IP-адреса могут получить доступ к веб-интерфейсу. Используйте * для указания диапазонов (например, 192.168.1.* для разрешения всем в локальной сети).

- Пример: rpc-whitelist": ["127.0.0.1", "192.168.1.*"]

- Описание: Указывает, какие IP-адреса могут получить доступ к веб-интерфейсу. Используйте * для указания диапазонов (например, 192.168.1.* для разрешения всем в локальной сети).

7. rpc-whitelist-enabled

- Описание: Если установлено в true, Transmission будет проверять белый список rpc-whitelist. Если в белом списке не указан IP, доступ будет заблокирован.

- Пример: "rpc-whitelist-enabled": true

8. download-dir

- Описание: Папка для сохранения загруженных файлов.

- Пример: "download-dir": "/mnt/omv_share"

- Описание: Указывает, где будет храниться контент, загружаемый через Transmission. Убедитесь, что у пользователя, под которым работает Transmission, есть права на запись в эту директорию.

9. incomplete-dir

- Описание: Указывает место для хранения неполных файлов до завершения загрузки. Если параметр не установлен, все файлы загружаются в директорию, указанную в download-dir.

- Пример: incomplete-dir": "/mnt/omv_share/incomplete"

10. incomplete-dir-enabled

- Описание: Если установлено в true, файлы, находящиеся на стадии загрузки, будут сохраняться в директории, указанной в incomplete-dir

- Пример: "incomplete-dir-enabled": true

- Описание: Если установлено в true, файлы, находящиеся на стадии загрузки, будут сохраняться в директории, указанной в incomplete-dir.

11. download-queue-size

- Описание: Определяет максимальное количество загрузок, которые могут быть активными одновременно. Если вы запускаете больше загрузок, чем указано, они будут ставиться в очередь.

- Пример: "download-queue-size": 5

12. upload-queue-size

- Описание: Определяет максимальное количество раздач, которые могут быть активными одновременно. Если вы начинаете больше раздач, чем указано, они будут ставиться в очередь.

- Пример: "upload-queue-size": 10

13. peer-port

- Описание: Указывает порт для P2P-соединений. Если вы хотите, чтобы Transmission работал с определенным портом, укажите его здесь.

- Пример: "peer-port": 51413

14. peer-port-random-high

- Описание: Верхний предел диапазона для случайного выбора порта для P2P-соединений.

- Пример: "peer-port-random-high": 65535

15. peer-port-random-low

- Описание: Нижний предел диапазона для случайного выбора порта для P2P-соединений.

- Пример: "peer-port-random-low": 49152

16. ratio-limit

- Описание: Если соотношение раздачи к загрузке превышает это значение, Transmission завершит торрент.

- Пример: ratio-limit": 2.0

17. ratio-limit-enabled

- Описание: Если установлено в true, соотношение раздачи/загрузки будет учитываться при завершении торрент-сессий.

- Пример: "ratio-limit-enabled": true

- Описание: Если установлено в true, соотношение раздачи/загрузки будет

18. blocklist-enabled

- Описание: Если установлено в true, Transmission будет использовать блок-лист для блокировки нежелательных IP-адресов.

- Пример: "blocklist-enabled": false

19. blocklist-url

- Описание: Указывает URL для загрузки блок-листа IP-адресов. Transmission будет скачивать и использовать его для блокировки вредоносных или нежелательных пиров.

- Пример: "blocklist-url": "http://www.example.com/blocklist"

Мне помогли:

https://evs.msk.ru/transmission-on-debian/

https://tweenpath.net/installing-transmission-torrent-client-debian/

https://habr.com/ru/articles/658463/