Commit 079af851d8

079af851d813edf0729641ba0bd19d307b7e5ff5

parent: 6f96edd59d

Unsigned

cmc <hello@cleberg.net> · 2024-09-24 02:39 UTC

add self-hosting-transmission post

Layout: unified · split

content/blog/2024-09-23-self-hosting-transmission.org added +182
@@ -0,0 +1,182 @@
1#+date: <2024-09-23 Mon 19:52:20>
2#+title: Self-Hosting Transmission Bittorrent Client
3#+description: Learn how to self-host the Transmission torrent client with an Nginx reverse proxy.
4#+filetags: :self-hosting:
5#+slug: self-hosting-transmission
6
7#+begin_quote
8If you're torrenting anything sensitive, I *highly* recommend you use a VPN.
9Something like mullvad-cli is incredibly simple to use and can be configured to
10have a "killswitch" or "lockdown mode" to ensure that if the VPN disconnects,
11your traffic won't be leaked to your ISP.
12#+end_quote
13
14* Transmission
15
16[[https://transmissionbt.com/][Transmission]] is a cross-platform bittorrent client that supports running a
17[[https://linux.die.net/man/1/transmission-remote][remote control utility]], a [[https://linux.die.net/man/1/transmission-daemon][daemon service]] for running as a background service,
18and a [[https://linux.die.net/man/1/transmission-cli][command-line client]].
19
20Since I love torrenting Linux ISOs and providing them back to the community,
21let's walk through a tutorial of setting up Transmission on a headless server
22and connecting it to a domain name (=transmission.example.com=) so that we can
23manage our torrents remotely.
24
25This tutorial assumes you have a Linux machine, have Nginx installed, and have a
26domain name pointing at your Linux machine.
27
28** Installation
29
30First, let's install a couple Transmission packages on the system. We don't need
31the GUI components, so we'll only install the daemon and command line interface
32utilities.
33
34#+begin_src sh
35sudo apt install transmission-cli transmission-common transmission-daemon
36#+end_src
37
38You will need to run the program to initialize the files before you can edit the
39configurations, so let's run it and end the process.
40
41#+begin_src sh
42# Run the program
43transmission-daemon -e ~/.local/log/transmission.log
44
45# End the program after it finishes running
46transmission-remote --exit
47#+end_src
48
49** Configuration
50
51Now that we've run the program for the first time and initialized the relevant
52files, let's edit those files.
53
54#+begin_quote
55If you edit the files while Transmission is running, your changes won't be
56saved! Make sure to end the service, update the configuration files, and restart
57the service.
58#+end_quote
59
60To start, let's edit the main configuration file.
61
62#+begin_src sh
63nano ~/.config/transmission-daemon/settings.json
64#+end_src
65
66Within this file, I suggesting skimming *every* option and determining if you
67want to change any of those options.
68
69For remote access, we will focus on the following =rpc= options. This
70configuration will not require authentication, will allow any device with access
71(I suggest that you have a firewall restricting access) to access the service
72(="rpc-bind-access": "0.0.0.0"=), will open the service on port =9091=, and will
73whitelist a few LAN IPs (="rpc-whitelist":
74"127.0.0.1,::1,192.168.0.98,192.168.0.97"=).
75
76#+begin_src json
77{
78 ...
79 "rpc-authentication-required": false,
80 "rpc-bind-address": "0.0.0.0",
81 "rpc-enabled": true,
82 "rpc-host-whitelist": "",
83 "rpc-host-whitelist-enabled": true,
84 "rpc-password": "{7fc02520b97e054f7a15274c7cfafe3cd7330169.OQUAUS4",
85 "rpc-port": 9091,
86 "rpc-socket-mode": "0750",
87 "rpc-url": "/transmission/",
88 "rpc-username": "",
89 "rpc-whitelist": "127.0.0.1,::1,192.168.0.98,192.168.0.97",
90 "rpc-whitelist-enabled": true,
91 ...
92}
93#+end_src
94
95Once you've finished configuring the service, start the service up again.
96
97#+begin_src sh
98transmission-daemon -e ~/.local/log/transmission.log
99#+end_src
100
101At this point, you should be able to access the website at =localhost:9091= (if
102you're browsing on the machine where Transmission is running) or
103=$server_ip:9091= (if you're browsing from a different LAN device).
104
105If you want to make further changes to Transmission's configuration, I suggest
106doing so now. Once you start working on remote access via a reverse proxy,
107you'll be adding an additional layer of complexity that bring in more confusion
108when errors occur.
109
110* Reverse Proxy
111
112Now that the service is running and configured properly, let's work on remote
113access.
114
115This tutorial will use Nginx, but you can use any reverse proxy or something
116like Cloudflare Tunnels if that's your thing.
117
118** Configuration
119
120If you have Nginx installed, you should have either the =/etc/nginx/conf.d= or
121=/etc/nginx/sites-available= directories available to create website
122configuration files. This tutorial assumes the =conf.d= structure, but it's
123essentially the same except using the =sites-available= structure requires you
124to symlink your files into the =sites-enabled= directory.
125
126Let's start by creating the website configuration file.
127
128#+begin_src sh
129sudo nano /etc/nginx/conf.d/transmission.conf
130#+end_src
131
132Within the file, you will need a configuration similar to the code below. Note
133that this uses SSL and requires a valid TLS/SSL certificate. You can use [[https://letsencrypt.org/][Let's
134Encrypt]] if you don't have a certificate yet.
135
136#+begin_src conf
137server {
138 listen 443 ssl;
139 listen [::]:443 ssl;
140 http2 on;
141 server_name transmission.example.com;
142
143 # SSL
144 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
145 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
146 ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
147
148 # reverse proxy
149 location / {
150 set $upstream_transmission http://localhost:9091;
151 proxy_pass $upstream_transmission;
152 proxy_pass_header X-Transmission-Session-Id;
153 }
154}
155
156# HTTP redirect
157server {
158 listen 80;
159 listen [::]:80;
160 server_name transmission.example.com;
161
162 if ($host ~ ^[^.]+\.example\.com) {
163 return 301 https://$host$request_uri;
164 }
165}
166#+end_src
167
168Once you've saved the configuration file, restart the Nginx web server to enable
169the remote access connection.
170
171#+begin_src sh
172sudo systemctl restart nginx.service
173#+end_src
174
175At this point, Transmission should now be available at
176=transmission.example.com=, same as it's available on the LAN.
177
178#+begin_quote
179Pro Tip: If you dislike something about the website UI, you can edit the
180website's files in the =/usr/share/transmission/public_html/= directory. You can
181modify the HTML, CSS, and JS files in this directory.
182#+end_quote
theme/templates/index.html +4 −6
@@ -8,6 +8,10 @@ uid [ultimate] Christian Cleberg &lt;hello@cleberg.net&gt;</pre>
8<section> 8<section>
9 <h2>Recent Blog Posts</h2> 9 <h2>Recent Blog Posts</h2>
10 10
11 <div class="post>
12 <time datetime="2024-09-23 19:52:20">2024-09-23</time>
13 <a href="/blog/self-hosting-transmission.html">Self-Hosting Transmission Bittorrent Client</a>
14 </div>
11 <div class="post"> 15 <div class="post">
12 <time datetime="2024-09-20 13:38:52">2024-09-20</time> 16 <time datetime="2024-09-20 13:38:52">2024-09-20</time>
13 <a href="/blog/prometheus-grafana-cloud.html" 17 <a href="/blog/prometheus-grafana-cloud.html"
@@ -20,12 +24,6 @@ uid [ultimate] Christian Cleberg &lt;hello@cleberg.net&gt;</pre>
20 >Email Sentiment Analysis With n8n</a 24 >Email Sentiment Analysis With n8n</a
21 > 25 >
22 </div> 26 </div>
23 <div class="post">
24 <time datetime="2024-08-11 20:18:15">2024-08-11</time>
25 <a href="/blog/org-mode-features.html"
26 >My Top 8 Most Used Org-Mode Features</a
27 >
28 </div>
29 27
30 <br /> 28 <br />
31 <a href="/blog/">All Posts →</a> 29 <a href="/blog/">All Posts →</a>