summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--content/basic/nginx.md14
-rw-r--r--content/git.md2
-rw-r--r--content/mumble.md134
-rw-r--r--content/radicale.md6
-rw-r--r--content/transmission.md844
-rw-r--r--content/wireguard.md15
-rw-r--r--static/pix/mumble.svg127
-rw-r--r--static/pix/mumble/mumble-1.pngbin0 -> 33792 bytes
-rw-r--r--static/pix/mumble/mumble-2.pngbin0 -> 33810 bytes
-rw-r--r--static/pix/transmission-web-interface.pngbin0 -> 10792 bytes
-rw-r--r--static/pix/transmission.pngbin0 -> 16039 bytes
11 files changed, 1128 insertions, 14 deletions
diff --git a/content/basic/nginx.md b/content/basic/nginx.md
index 3ec3af7..db41937 100644
--- a/content/basic/nginx.md
+++ b/content/basic/nginx.md
@@ -51,7 +51,7 @@ apt install nginx
The first command checks for packages that can be updated and the second
command installs any updates.
-The third command installs `nginx` (pronounced Engine-X) which is the
+The third command installs `nginx` (pronounced Engine-X), which is the
web server we\'ll be using, along with some other programs.
### Our nginx configuration file
@@ -115,7 +115,7 @@ in `/var/www/`. Name the directory in that whatever you want.
a website, say `landchad.net`, you are actually going to a file at
`landchad.net/index.html`. That\'s all that is. Note that that this in
concert with the line above mean that `/var/www/landchad/index.html`, a
-file on our computer that we\'ll create will be the main page of our
+file on our computer that we\'ll create, will be the main page of our
website.
Lastly, the `location` block is really just telling the server how to
@@ -125,14 +125,14 @@ powerful, but this is all we need them for now.
### Create the directory and index for the site
We\'ll actually start making a \"real\" website later, but let\'s go
-ahead and create a little page that will appear on when someone looks up
+ahead and create a little page that will appear when someone looks up
the domain.
```sh
mkdir /var/www/{{<hl>}}mysite{{</hl>}}
```
-Now let\'s create and index file inside of that directory which will
+Now let\'s create an index file inside of that directory, which will
appear when the website is accessed:
```sh
@@ -167,7 +167,7 @@ systemctl reload nginx
## The Firewall {#firewall}
-Vultr and some other VPS automatically install and enable `ufw`, a
+Vultr and some other VPSes automatically install and enable `ufw`, a
firewall program. This will block basically everything by default, so we
have to change that. If you don\'t have `ufw` installed, you can skip
this section.
@@ -185,7 +185,7 @@ encrypted connections. We will certainly need that for the next page.
<aside>
As you add more services to your website, they might need you to open more ports, but that will be mentioned on individual articles.
-(It should be noted that some local services only running for other services on your machine, so you *don't* need to open ports for every process running locally, *only* those that directly interact with the internet, although it's common to run those through NginX for simplicity and security.)
+(It should be noted that some local services run only for other services on your machine, so you *don't* need to open ports for every process running locally, *only* those that directly interact with the internet, although it's common to run those through Nginx for simplicity and security.)
</aside>
@@ -201,7 +201,7 @@ Uncomment it, and reload Nginx.
Remember to [keep your server software up to
date](maintenance.html#update) to get the latest security fixes!
-## We now have running website!
+## We now have a running website!
At this point you can now type in your website in your browser and this
webpage will appear!
diff --git a/content/git.md b/content/git.md
index f11d79d..7cb0121 100644
--- a/content/git.md
+++ b/content/git.md
@@ -100,7 +100,7 @@ chown git:git -R /var/git/.ssh # Make the created directory and contents to be o
### Syncing a new repository with your server
-How that we've set that up, we can push a repository we have on our computer to
+Now that we've set that up, we can push a repository we have on our computer to
that newly created bare repo. First, on our local computer, we run a command like this:
```sh
diff --git a/content/mumble.md b/content/mumble.md
new file mode 100644
index 0000000..2c475b6
--- /dev/null
+++ b/content/mumble.md
@@ -0,0 +1,134 @@
+---
+title: "Mumble"
+icon: 'mumble.svg'
+tags: ['service']
+date: 2023-07-2
+short_desc: 'Open Source, Low Latency, High Quality Voice Chat.'
+---
+
+[Mumble](https://mumble.info) is an open source, low latency and high quality voice chat software, being the best open source alternative to TeamSpeak.
+VoIP communications are mandatory encrypted by default using OCB-AES128, it has integrations for gamers (like overlays), it's stable and it's resource friendly.
+
+The server can also be run [behind Tor](https://gitlab.torproject.org/legacy/trac/-/wikis/doc/TorifyHOWTO/Mumble) without any issue.
+
+## Installation
+
+Mumble has a Debian repository for client and server, however it's very outdated so we are going to build the server instead.
+
+**I suggest to build both binaries on your local machine and [transfer the `mumble-server` to your remote server using `spc`](#extra).**
+
+
+Install dependencies:
+```sh
+apt install build-essential cmake pkg-config qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools qttools5-dev qttools5-dev-tools libqt5svg5-dev libboost-dev libssl-dev libprotobuf-dev protobuf-compiler libprotoc-dev libcap-dev libxi-dev libasound2-dev libogg-dev libsndfile1-dev libspeechd-dev libavahi-compat-libdnssd-dev libxcb-xinerama0 libzeroc-ice-dev libpoco-dev g++-multilib
+```
+
+Git clone the repo.
+
+```sh
+git clone https://github.com/mumble-voip/mumble.git && cd mumble
+```
+
+Initialize all the submodules.
+
+```
+git submodule update --init
+```
+
+Create a build directory and run `cmake`.
+Cmake will create all the necessary files to build the mumble-server and client.
+
+```sh
+mkdir build && cd build && cmake ..
+```
+
+Build using `cmake`.
+
+```sh
+cmake
+```
+
+After the build you will now find a file named `mumble-server`, one `mumble` (which is the client) and a file named `mumble-server.ini` (aka the config file).
+
+## Running your Mumble server
+
+If you built it on local machine you can check out [how to move it to your remote server](#extra) first.
+
+After that, start with making your `mumble-server` executable and move it in `/usr/bin`.
+
+```sh
+chmod +x mumble-server && mv mumble-server /usr/bin
+```
+
+Create a folder in `/etc/` move your config files there.
+
+```sh
+mkdir /etc/mumble && mv mumble-server.ini /etc/mumble
+```
+
+Now we can run the server passing the config and a superuser password that can be used to connect and authenticate as an administrator from any client
+
+```sh
+mumble-server -ini mumble-server.ini -supw <your_password>
+```
+
+Check if it's running in the backgroud with `ps aux`.
+
+```sh
+ps aux | grep mumble-server
+```
+
+You will have an output like this.
+
+```sh
+root 127181 0.1 0.1 261064 21640 ? Sl 19:18 0:01 ./mumble-server
+root 127689 0.0 0.1 112956 22572 ? Sl 19:19 0:00 ./mumble-server
+```
+
+## Connecting to your mumble-server as a SuperUser
+
+You will probably will be left with your `mumble` binary in the build folder on your local machine.
+
+Now you should make it executable and move it in the `/usr/bin` folder.
+
+```sh
+chmod +x mumble && mv mumble /usr/bin
+```
+
+Run it the GUI with one command.
+
+```sh
+mumble
+```
+
+You will have something like this opening up.
+
+{{< img src="/pix/mumble/mumble-1.png" alt="connect window" >}}
+
+Click on the button `Add New...` and fill out the information need to connect to your server.
+
+{{< img src="/pix/mumble/mumble-2.png" alt="add server window" >}}
+
+If you haven't edited the port, `64738` will be default one.
+
+Click on `Ok`, select your server from the list and click `Connect`.
+
+**Now you are connected to your very own Mumble server as a SuperUser!**
+
+---
+
+## Extra
+
+### Move binary with scp
+
+Move your binary to the folder `~` of your remote server.
+
+```sh
+spc <your_binary> root@<your_server_ip>:~
+```
+
+---
+
+Written by [NotMtth](https://notmtth.xyz) (Tor access warning)
+
+Donate Monero at: `donate.notmtth.xyz` ([OpenAlias](https://openalias.org/)) \ No newline at end of file
diff --git a/content/radicale.md b/content/radicale.md
index b24f8ef..c37f22c 100644
--- a/content/radicale.md
+++ b/content/radicale.md
@@ -49,6 +49,12 @@ Execute the following command to add a new user to Radicale.
htpasswd -B -c /etc/radicale/users username
```
+To create additional users, htpasswd is used again but without the additional modifier.
+
+```sh
+htpasswd -B /etc/radicale/users username2
+```
+
As Radicale stands now it is fully functional and after starting it by
executing its binary, can be accessed under example.org:5232. But there
are two additional things we can do to make using and managing Radicale
diff --git a/content/transmission.md b/content/transmission.md
new file mode 100644
index 0000000..4930661
--- /dev/null
+++ b/content/transmission.md
@@ -0,0 +1,844 @@
+---
+title: "Transmission"
+date: 2023-07-22
+icon: "transmission.png"
+tags: ["service"]
+short_desc: "Decentralized file-sharing with BitTorrent."
+---
+
+[Transmission] allows you to send and receive files via the BitTorrent
+protocol. This tutorial shows you how to use Transmission to run a
+"seedbox" - a server for downloading and seeding torrents.
+
+(For an explanation of BitTorrent, see [Appendix 1].)
+
+[Transmission]: https://transmissionbt.com/
+[Appendix 1]: #appendix-1-what-is-bittorrent
+
+## Installation
+
+The Transmission daemon is available in the Debian repositories:
+
+```sh
+apt install transmission-daemon
+```
+
+Besides installing Transmission, this command creates:
+* A user for running the service (`debian-transmission`)
+* A default configuration file
+ (`/var/lib/transmission-daemon/info/settings.json`)
+* A default service file
+ (`/etc/systemd/system/multi-user.target.wants/transmission-daemon.service`)
+
+## Configuration
+
+### Transmission-Daemon
+
+Any time you need to modify Transmission\'s configuration, you must stop
+the `transmission-daemon` service. Otherwise, Transmission will
+overwrite your changes.
+
+```sh
+service transmission-daemon stop
+```
+
+Open `/var/lib/transmission-daemon/info/settings.json` to view
+Transmission\'s configuration. The file should look something like this:
+
+```json
+{
+ "alt-speed-down": 50,
+ "alt-speed-enabled": false,
+ "alt-speed-time-begin": 540,
+ "alt-speed-time-day": 127,
+ "alt-speed-time-enabled": false,
+ "alt-speed-time-end": 1020,
+ "alt-speed-up": 50,
+ "bind-address-ipv4": "0.0.0.0",
+ "bind-address-ipv6": "::",
+ "blocklist-enabled": false,
+ "blocklist-url": "http://www.example.com/blocklist",
+ "cache-size-mb": 4,
+ "dht-enabled": true,
+ "download-dir": "/var/lib/transmission-daemon/downloads",
+ "download-limit": 100,
+ "download-limit-enabled": 0,
+ "download-queue-enabled": true,
+ "download-queue-size": 5,
+ "encryption": 1,
+ "idle-seeding-limit": 30,
+ "idle-seeding-limit-enabled": false,
+ "incomplete-dir": "/var/lib/transmission-daemon/Downloads",
+ "incomplete-dir-enabled": false,
+ "lpd-enabled": false,
+ "max-peers-global": 200,
+ "message-level": 1,
+ "peer-congestion-algorithm": "",
+ "peer-id-ttl-hours": 6,
+ "peer-limit-global": 200,
+ "peer-limit-per-torrent": 50,
+ "peer-port": 51413,
+ "peer-port-random-high": 65535,
+ "peer-port-random-low": 49152,
+ "peer-port-random-on-start": false,
+ "peer-socket-tos": "default",
+ "pex-enabled": true,
+ "port-forwarding-enabled": false,
+ "preallocation": 1,
+ "prefetch-enabled": true,
+ "queue-stalled-enabled": true,
+ "queue-stalled-minutes": 30,
+ "ratio-limit": 2,
+ "ratio-limit-enabled": false,
+ "rename-partial-files": true,
+ "rpc-authentication-required": true,
+ "rpc-bind-address": "0.0.0.0",
+ "rpc-enabled": true,
+ "rpc-host-whitelist": "",
+ "rpc-host-whitelist-enabled": true,
+ "rpc-password": "{224c4b5e26569d0baa8a161a68263253bbc69c26dnhxDeWg",
+ "rpc-port": 9091,
+ "rpc-url": "/transmission/",
+ "rpc-username": "transmission",
+ "rpc-whitelist": "127.0.0.1",
+ "rpc-whitelist-enabled": true,
+ "scrape-paused-torrents-enabled": true,
+ "script-torrent-done-enabled": false,
+ "script-torrent-done-filename": "",
+ "seed-queue-enabled": false,
+ "seed-queue-size": 10,
+ "speed-limit-down": 100,
+ "speed-limit-down-enabled": false,
+ "speed-limit-up": 100,
+ "speed-limit-up-enabled": false,
+ "start-added-torrents": true,
+ "trash-original-torrent-files": false,
+ "umask": 18,
+ "upload-limit": 100,
+ "upload-limit-enabled": 0,
+ "upload-slots-per-torrent": 14,
+ "utp-enabled": true
+}
+```
+
+Here are the options you should definitely look at:
+1. `download-dir` specifies where Transmission should save downloaded
+ torrents. (You can probably leave this at the default of
+ `/var/lib/transmission-daemon/downloads`.) If you change this, make
+ sure `debian-transmission` has permissions to use the directory.
+2. `peer-port` specifies what port Transmission should listen on to
+ connect to peers. (You can probably leave this at the default of
+ `51413`.)
+3. `rpc-password` specifies the password required to control
+ Transmission. Change this by typing it in as plaintext. When the
+ Transmission service starts, it will be hashed and prefixed with a
+ left curly bracket (`{`).
+4. `rpc-port` specifies the port Transmission will listen on for remote
+ commands. (You can probably leave this at the default of `9091`,
+ unless you have another service listening on this port for some
+ reason.)
+5. `rpc-username` specifies the username required to control
+ Transmission. The default is `transmission`, but feel free to change
+ this.
+
+### Firewall
+
+If `peer-port-random-on-start` is set to the default of `false`, your
+firewall must allow TCP and UDP traffic on the `peer-port`. Assuming you
+are using `ufw`, and `peer-port` is at the default of `51413`, enter:
+
+```sh
+ufw allow 51413
+```
+
+#### Note on Port Randomization
+
+If you set `peer-port-random-on-start` to `true`, your firewall must
+allow both TCP and UDP traffic on the port range specified by
+`peer-port-random-low` and `peer-port-random-high`.
+
+Assuming you are using `ufw`, and `peer-port-random-high` is `65535`,
+and `peer-port-random-low` is `49152`, enter:
+
+```sh
+ufw allow 49152:65535/tcp
+ufw allow 49152:65535/udp
+```
+
+### Starting the Service
+
+After modifying and saving the `transmission-daemon` configuration,
+start the service:
+
+```sh
+service transmission-daemon start
+```
+
+Transmission will hash your password in the configuration. You should be
+able to connect to the daemon with `transmission-remote` locally on the
+server using your credentials as shown next.
+
+## Controlling Transmission Locally
+
+`transmission-daemon` runs your torrent session in the background. It is
+controlled by an HTTP API that it serves on the `rpc-port` at
+`localhost`. `transmission-remote` is the command line utility you can
+use to control the daemon, and it was installed automatically when you
+installed `transmission-daemon`.
+
+### Authentication
+
+You first need to authenticate `transmission-remote` using the username
+and password you set up in `settings.json`. There are 2 basic ways you
+can do this.
+
+#### .netrc File
+
+The first method is via a `.netrc` file in your home directory. The
+advantage of this method is that you do not need to provide your
+credentials every time you run a `transmission-remote` command. The
+disadvantage is that your Transmission password is stored in your home
+folder as plaintext.
+
+To add the necessary record to your `.netrc` file, run the following
+command, where `<username>` is the `rpc-username`, and `<password>` is
+the plaintext version of `rpc-password` in `settings.json`:
+
+```sh
+echo "machine localhost login <username> password <password>" >> ~/.netrc
+```
+
+Then, to authenticate, run:
+
+```sh
+transmission-remote --netrc
+```
+
+Subsequent `transmission-remote` commands will not require entering your
+credentials.
+
+#### \-\-auth Flag
+
+The second method to authenticate is to include an `auth` flag in every
+`transmission-remote` command you execute. Substituting your credentials
+for `username` and `password`, you can enter the following command to
+list your torrents:
+
+```sh
+transmission-remote --auth=username:password --list
+```
+
+At this point, you should be able to use `transmission-remote` on your
+server to manage your torrents.
+
+### Hosting Torrents
+
+Here is a cookbook of common `transmission-remote` commands for hosting
+torrents.
+
+Add a torrent via a magnet link:
+
+```sh
+transmission-remote --add "magnet:link"
+```
+
+Add a torrent via a .torrent file:
+
+```sh
+transmission-remote --add "your.torrent"
+```
+
+List the status of your torrents (and get their numerical IDs):
+
+```sh
+transmission-remote --list
+```
+
+Get information about a specific torrent (where `ID` is the torrent ID
+from the prior command):
+
+```sh
+transmission-remote --torrent=ID --info
+```
+
+Remove a torrent and keep its data (where `ID` is the torrent ID):
+
+```sh
+transmission-remote --torrent=ID --remove
+```
+
+Remove a torrent and delete its data (where `ID` is the torrent ID):
+
+```sh
+transmission-remote --torrent=ID --remove-and-delete
+```
+
+Get information about the current Transmission session:
+
+```sh
+transmission-remote --session-info
+```
+
+Get statistics about the current Transmission session:
+
+```sh
+transmission-remote --session-stats
+```
+
+### Downloading Completed Torrents via Secure Shell
+
+Completed torrent downloads will be saved in the directory indicated by
+`download-dir` in your configuration. (This is
+`/var/lib/transmission-daemon/downloads` by default.)
+
+You should be able to download those files and directories from your
+seedbox using tools like [`rsync`], `(s)ftp`, and `scp`.
+
+[`rsync`]: ../rsync/
+
+If this is sufficient for you, you do not need to configure Transmission
+for remote access.
+
+## Creating New Torrents
+
+`transmission-create` is used to create torrents. It was installed
+automatically on your server when you installed `transmission-daemon`.
+You can use it on any machine that has it installed and has a copy of
+the file or directory you want to share.
+
+(`transmission-edit` is also available to edit .torrent files. It can do
+things like add and delete tracker urls. However, this tool tends to be
+more useful when working with other\'s .torrent files and less so when
+creating torrents from scratch.)
+
+### Creating the .torrent File
+
+Here is a template command for creating a .torrent file:
+
+```sh
+transmission-create --outfile "my.torrent" \
+ --comment "My cool torrent" \
+ --tracker "https://tracker1.example.org/announce" \
+ --tracker "https://tracker2.example.org/announce" \
+ "path/to/my/file/or/directory"
+```
+
+* `outfile` specifies where to write the .torrent file.
+* `comment` specifies a comment for the torrent.
+* `tracker` specifies a torrent tracker to use. You can have multiple of
+ these. `udp://open.tracker.cl:1337/announce` is usually a good choice,
+ but there are many others.
+* The path indicates the file or directory you want to make a torrent
+ of.
+
+### Generating the Magnet Link
+
+`transmission-show` is used to generate magnet links from .torrent
+files, and it was installed when you installed `transmission-daemon`.
+Given any .torrent file, you can run:
+
+```sh
+transmission-show --magnet "my.torrent"
+```
+
+### Seeding Your New Torrent
+
+First, copy the file or directory that you are hosting to the download
+directory (`download-dir`) specified in the `transmission-daemon`
+configuration. If the `download-dir` is at the default, you could write:
+
+```sh
+cp "the-file-or-directory-to-share" \
+ "/var/lib/transmission-daemon/downloads/"
+```
+
+Then, add your torrent to Transmission via your .torrent file or magnet
+link:
+
+```sh
+transmission-remote --add "the-torrent-file-or-magnet-link"
+```
+
+Your server should begin seeding your torrent, and you can share it via
+the .torrent file or magnet link.
+
+**Warning:** Make sure you copy the file or directory you are seeding to
+the `download-dir` directory *before* adding the torrent to
+Transmission. If you copy the source file/directory into your download
+directory *after* adding the torrent, run `transmission-remote` to get
+the ID of your torrent:
+
+```sh
+transmission-remote --list
+```
+
+Then, where `ID` is the ID of the torrent, run this command so
+Transmission will know it already has the data:
+
+```sh
+transmission-remote --torrent=ID --verify
+```
+
+The torrent should then begin seeding.
+
+## Controlling Transmission Remotely
+
+At this point, you should be able to manage your seedbox locally by
+using `transmission-remote` on your server via secure shell. However, it
+may be convenient to also configure the box for remote access. You can
+do this by exposing Transmission\'s HTTP API, which includes a web app.
+
+The Transmission web app acts as a graphical stand-in for
+`transmission-remote`. You can manage your torrents and the daemon with
+it.
+
+Similar to `transmission-remote` itself, however, you cannot download
+completed torrents via the web app. (That requires serving the files via
+a different channel, whether that be `rsync`, `sftp`, `scp`, `http(s)`,
+etc. Serving completed torrents via `http(s)` is explained later.)
+
+Exposing Transmission\'s HTTP interface to the internet additionally
+allows you to control your seedbox from a different machine using
+`transmission-remote`.
+
+### Configuring Remote Access
+
+By default, `transmission-daemon` only allows RPC commands from
+`localhost`. For remote access, it must allow connections from the IP
+addresses you want to access the daemon from. The most direct way of
+doing this is by disabling the whitelist, which allows all IP addresses,
+but you can specify a whitelist if you like.
+
+Stop `transmission-daemon`:
+
+```sh
+service transmission-daemon stop
+```
+
+Then, set `rpc-whitelist-enabled` to `false` in your configuration. This
+makes it so that any IP address can connect and control
+`transmission-daemon`. (You will just need your `rpc-username` and the
+plaintext version of your `rpc-password` to authenticate.)
+
+Alternatively, if you want to use the whitelist, set
+`rpc-whitelist-enabled` to `true`, and set `rpc-whitelist` to a
+comma-separated list of IP addresses. (Asterisks are used as wildcards.)
+For example, you could write:
+
+```
+101.125.137.168,89.72.*.221
+```
+
+While you have the configuration open, take note of the value of
+`rpc-port`, which is 9091 by default. This value will be necessary for
+configuring remote access.
+
+After saving your configuration, start `transmission-daemon`:
+
+```sh
+service transmission-daemon start
+```
+
+### Running Nginx as a Reverse Proxy
+
+It is possible to open remote access to `transmission-daemon` simply by
+opening its `rpc-port` in the firewall, 9091 by default. This connection
+will be run over insecure HTTP, so your username and password will be
+sent unencrypted. While this may be acceptable when testing a system, it
+is generally preferable to use a web server with TLS as a reverse proxy
+to Transmission\'s HTTP interface.
+
+If you are already running nginx with working TLS, allowing access to
+Transmission\'s web interface simply requires adding a `location` block
+to your `server` block in your nginx configuration. Assuming `rpc-port`
+is 9091, and `rpc-url` is `/transmission/` in your `transmission-daemon`
+configuration, add the following block to your nginx configuration:
+
+```nginx
+location /transmission/ {
+ proxy_pass http://localhost:9091/transmission/ ;
+}
+```
+
+Reload nginx so your changes takes effect:
+
+```sh
+nginx -s reload
+```
+
+At this point, if `example.org` is your domain, and you are connected
+from a permitted IP address:
+* The Transmission web app will be available at
+ `https://example.org/transmission/web/`.
+* `transmission-remote` will be able to connect to
+ `https://example.org/transmission`. (Note the omission of the trailing
+ forward slash.)
+
+#### Serving Transmission at a Different Path
+
+By default, Transmission serves it\'s interface at the path
+`/transmission/`. You can change this in the configuration, but note
+that your chosen path must start and end with a forward slash.
+
+For example, to serve Transmission\'s interface at `/~luke/torrents/`:
+
+1. Stop the `transmission-daemon` service.
+2. Set `rpc-url` in the configuration to your chosen path. That is
+ `/~luke/torrents/` in this example.
+3. Modify the `location` block\'s path pattern and `proxy_pass` url in
+ your nginx configuration to use the new path (and the correct
+ `rpc-port`). For this example, that is:
+
+```nginx
+location /~luke/torrents/ {
+ proxy_pass http://localhost:9091/~luke/torrents/ ;
+}
+```
+
+4. Start the `transmission-daemon` service.
+5. Reload nginx.
+
+The Transmission web app will then be accessible at
+`https://example.org/~luke/torrents/web/`. `transmission-remote` will be
+able to connect to `https://example.org/~luke/torrents`.
+
+### Connecting via a Browser
+
+Where `example.org` is your website, and `/transmission/` is the
+`rpc-url` in your `transmission-daemon` configuration, point your web
+browser to `https://example.org/transmission/web/`. After entering your
+credentials into the login (using your `rpc-username` and plaintext
+`rpc-password`), you will be greeted by the web interface with a list of
+your torrents.
+
+Here is a Transmission instance that is downloading one torrent:
+
+{{<img src="/pix/transmission-web-interface.png"
+ alt="A screenshot of the Transmission web interface" >}}
+
+### Connecting via Transmission-Remote
+
+You can control `transmission-daemon` on your server from other machines
+that have `transmission-remote` installed. You do this by calling
+`transmission-remote` with a url consisting of the domain name (or IP),
+the `rpc-port`, and the path specified by `rpc-url` in the configuration
+(`/transmission/` by default) with the trailing forward slash omitted.
+For example, after inserting your credentials for `username` and
+`password`, assuming the `rpc-url` is at the default of
+`/transmission/`, you could invoke the following command on your local
+machine to list the status of the torrents on your server:
+
+```sh
+transmission-remote https://example.org/transmission \
+ --auth=username:password \
+ --list
+```
+
+Note how the `rpc-url` is `/transmission/`, but `/transmission` is
+specified in the command.
+
+**Warning:** The Transmission web app and `transmission-remote` both
+allow you to make changes to Transmission\'s port settings. Be careful
+change these, because you might also need to update your server\'s
+firewall configuration.
+
+## Serving Complete Torrent Downloads via HTTP(S)
+
+The Transmission web interface and `transmission-remote` do not allow
+you to download completed torrents from your seedbox via HTTP(S).
+However, in some scenarios, downloading via HTTP(S) may be preferable
+where shell access and other supporting tools (`rsync`, `scp`, `sftp`,
+`ftp`, etc.) are unavailable on the client machine. Serving completed
+torrent downloads involves configuring nginx to serve the `download-dir`
+of `transmission-daemon`.
+
+(Serving completed torrent downloads via HTTP(S) does not require
+exposing Transmission\'s HTTP API and web app.)
+
+**Warning:** The Transmission interfaces give you the option of saving
+completed torrent downloads to directories other than the `download-dir`
+specified in your `transmission-daemon` configuration. Downloading a
+torrent to a different directory and not serving that directory with
+nginx will prevent that completed torrent from being served to clients
+via the static file server shown here.
+
+Assuming you wish to serve your completed torrents from the directory
+`/downloads/` on your web server, and `download-dir` is at the default
+of `/var/lib/transmission-daemon/downloads/`, you can add this
+`location` block into the `server` block of your nginx configuration:
+
+```nginx
+location /downloads {
+ root /var/lib/transmission-daemon/downloads ;
+ proxy_max_temp_file_size 0 ;
+ autoindex on ;
+}
+```
+
+Note how the trailing forward slash has been omitted in both the
+`location` pattern and the `root` path.
+
+The `proxy_max_temp_file_size` option prevents disk caching that would
+potentially break nginx\'s ability to serve files larger than a few
+gigabytes.
+
+If you omit the `autoindex` option or set it to `off`, nginx will not
+show a directory listing of your downloaded torrents. (You will need the
+direct link to download a given torrent.)
+
+After saving the configuration, reload nginx.
+
+Where `example.org` is your website, and assuming `autoindex` is `on`,
+opening `https://example.org/downloads/` in a web browser should show a
+list of links to download your completed torrents.
+
+While downloading via HTTP(S) can be convenient, resuming interrupted
+downloads can be a nuisance. See [Appendix 2] for tips on how to combat
+this.
+
+[Appendix 2]: #appendix-2-reliable-downloading-via-https
+
+### Preventing Unauthorized Downloading
+
+If you want to prevent others from downloading completed torrents via
+HTTP(S) from your seedbox, you have a few options:
+1. When defining the nginx `location` block, you can use some random
+ string for the path match pattern, like `/DJRmdL8HPn`. Only those who
+ know the path will able to download your completed torrents.
+2. You can protect the directory with a username and password using
+ [HTTP basic authentication].
+
+[HTTP basic authentication]: ../auth/
+
+## Troubleshooting
+
+`journalctl` can be used to view the logs of `transmission-daemon`. For
+example, you could run:
+
+```sh
+journalctl | grep transmission-daemon
+```
+
+Transmission\'s [documentation] contains help and answers to common
+questions.
+
+[documentation]:
+ https://github.com/transmission/transmission/blob/main/docs/README.md
+
+## Appendix 1: What is BitTorrent?
+
+Many protocols for sending files over the internet, such as Hypertext
+Transfer Protocol (HTTP) and File Transfer Protocol (FTP), operate on a
+\"client-server\" (or \"server-client\") model. A server will store a
+file. A client will send a request for the file from the server. If the
+request is accepted, the server will respond with the file.
+
+In contrast, BitTorrent is a decentralized, peer-to-peer, file-sharing
+protocol. Instead of relying on a dedicated server, a file will be
+assembled by downloading it in chunks from many different hosts. Anyone
+who has the file (or pieces of it) can then help serve the file to
+others. This makes file-sharing via BitTorrent much less susceptible to
+data loss and downtime than the client-server model since the file can
+be replicated and shared across a potentially large number of
+independent hosts.
+
+The individual hosts are called \"peers\". The process of a host
+offering their copy of the file for download to others is called
+\"seeding\". The set of peers collectively hosting the file is called a
+\"swarm\".
+
+The peers usually find out about each other using \"trackers\",
+dedicated servers that help peers find those who possess or want a
+specific file. Trackers are identified by URLs. A peer can \"announce\"
+to a tracker that it possesses a specific file. If a peer wants to
+download a file, the peer can ask the tracker for peers that possess the
+file. Trackers do not actually transfer the torrent between peers. They
+simply facilitate peer-discovery.
+
+The BitTorrent network also uses other mechanisms for peer-discovery,
+including a \"DHT\", or Distributed Hash Table. Similar to trackers,
+these help peers find each other. Unlike trackers, a DHT is entirely
+peer-to-peer as it is based on a distributed data structure rather than
+a dedicated server. The DHT that BitTorrent uses is called the Mainline
+DHT. Most modern torrent clients will give you the option of using it to
+help you find peers. (Transmission supports it.)
+
+Before downloading a desired file or directory, you will need its
+.torrent file or magnet link. These are usually distributed via
+webpages, and they contain metadata and other information required for
+downloading the file, including:
+* The cryptographic hash of the file for validating its integrity. (A
+ .torrent file will also include hashes for individual chunks of the
+ file.)
+* The name of the torrent.
+* A list of tracker URLs to use for finding peers.
+
+Once the .torrent file or magnet link has been imported into a torrent
+client, the client will query the network to discover peers that possess
+the file. The swarm will then work together to send the user the file in
+chunks. The chunks will be cryptographically validated and assembled to
+create the final file. After the user has downloaded the file (or even
+if they only have pieces of it), they also can be part of the swarm by
+helping to seed the file to others who want it.
+
+\"Leeching\" is when a user downloads torrents and does not seed them to
+others. This practice hurts the overall functioning of the swarm and
+will also usually reduce the bandwidth that other peers are willing to
+dedicate to you in the future. Always reseed. 🌱
+
+## Appendix 2: Reliable Downloading via HTTP(S)
+
+Downloading via HTTP(S) can be very convenient when shell access is
+unavailable. It can also be very troublesome with large files due to
+interrupted or corrupted downloads. Thankfully, utilities like `wget`
+and `zsync` can help combat this.
+
+### wget
+
+`wget` supports resuming interrupted downloads. It isn\'t as robust for
+this use case as other utilities (like `zsync`), but it can be
+convenient because:
+* It doesn\'t require any extra setup on your server.
+* It comes preinstalled on most \*nix systems.
+
+Supposing you want to download a very large file from your web server
+and save it to your current directory, you might run:
+
+```sh
+wget https://example.org/downloads/large.file
+```
+
+If this command is stopped or interrupted, running it again with the
+`--continue` flag will cause `wget` to resume your download:
+
+```sh
+wget --continue https://example.org/downloads/large.file
+```
+
+If your network connection is particularly poor, you can also specify
+the `--tries=0` flag. `wget` will retry connecting indefinitely, so you
+don\'t need to run the command multiple times if it disconnects.
+
+One major downside of using `wget` is that the resumption of the
+download is based on the difference between the file length on the
+server and the length of the partial file on your disk. No cryptography
+or checksum is used to validate the file's integrity.
+
+`wget` also supports downloading directories, but this can be finicky.
+You might need to experiment with the arguments depending on the
+contents of the directory. For example, assuming directory listing is
+enabled in the relevant directory on your web server, you might run a
+command like:
+
+```sh
+wget --recursive --no-parent \
+ https://example.org/downloads/large-directory/
+```
+
+The `--recursive` flag indicates that `wget` should download the
+contents of the directory as well as its subdirectories up to 5 levels
+deep.
+
+The `--no-parent` flag indicates that `wget` should not download any
+files at higher levels in the directory hierarchy.
+
+**Note:** Enabling `autoindex` for a directory in nginx implicitly
+creates `index.html` files in the directory and its subdirectories from
+the perspective of HTTP(S) clients like `wget`. However, the `--reject
+index.html` flag is omitted in the above command because `wget` needs
+the links in those index files to download all of the files in the
+target directory. (In fact, for this reason, the above command might
+potentially fail to download all the files in the directory if the
+target directory contains `index.html` files.) Once the directory has
+been downloaded to your disk, you would then need to delete the
+`index.html` files that were created by the web server's directory
+listing in your downloaded copy. Additionally, the actual directory
+structure created on your disk with this example would be
+`example.org/downloads/large-directory/`, not `large-directory/`.
+
+### zsync
+
+`zsync` is another option for more reliable HTTP(S) downloading.
+
+The advantages of `zsync` include:
+* It offers significantly more data validation than `wget` by using
+ hashes and checksums.
+* By using the `-i` flag, you can specify file chunks you have on disk
+ from the same or similar downloads to potentially accelerate the
+ current download.
+
+The disadvantages of `zsync` include:
+* It does not usually come pre-installed on *nix systems.
+* Unlike `wget`, it does not support downloading directories. It only
+ supports files.
+* It must be installed on the client-side.
+* It requires additional setup on the server-side.
+
+`zsync` is available in the Debian repositories. Install it on your
+server by running:
+
+```sh
+apt install zsync
+```
+
+(You will also need to install it on your client machine.)
+
+On your server, change your directory to your torrent download
+directory, `/var/lib/transmission-daemon/downloads/` by default. Then,
+run `zsyncmake` by providing the url and name of the file you want to
+use `zsync` on:
+
+```sh
+zsyncmake -u "https://example.org/downloads/large.file" large.file
+```
+
+This will create a new file with the same name as your original file but
+with the `.zsync` extension added: `large.file.zsync` in this case.
+(Note that if the file you are sharing changes, you need to regenerate
+the `.zsync` file.)
+
+If you view your torrent download directory in a browser, and nginx has
+`autoindex` turned `on`, you should notice the addition of the `.zsync`
+file in the directory.
+
+On your HTTP(S) client, where the provided url is the link to the new
+`.zsync` file, run:
+
+```sh
+zsync "https://example.org/downloads/large.file.zsync"
+```
+
+If your download is interrupted, just run the command again, and `zsync`
+will read your partial download, resume it, checksum it, and cleanly
+assemble the target file, `large.file`.
+
+If your downloads directory is protected with HTTP basic authentication,
+you can specify your credentials by adding an `-A` flag before the URL:
+
+```sh
+zsync -A example.org=username:password \
+ "https://example.org/downloads/large.file.zsync"
+```
+
+If you have a piece of the file with a different name or a different
+version of the file, you can specify those pieces with the `-i` flag to
+potentially reduce what `zsync` needs to fetch over the network:
+
+```sh
+zsync -i "large.file.piece" -i "large.file.old" \
+ "https://example.org/downloads/large.file.zsync"
+```
+
+`zsync` will attempt to look for file chunks in `large.file.piece` and
+`large.file.old` that can be used to help assemble `large.file`.
+
+For example, if you have a Linux ISO on your computer, and you want to
+download an updated version from your seedbox, there\'s a good chance
+that only certain sections of the ISO changed from the version you
+already have. You can specify the old version of the ISO you have with
+the `-i` flag to potentially reuse chunks from the old version when
+downloading the new ISO.
+
+---
+
+*Written by: Luke Hamann*
diff --git a/content/wireguard.md b/content/wireguard.md
index 93e722f..3e7d571 100644
--- a/content/wireguard.md
+++ b/content/wireguard.md
@@ -1,8 +1,9 @@
---
-title: "Wireguard"
-date: 2022-07-26
-icon: 'wireguard.svg'
-tags: ['service']
+title: Wireguard
+date: 2022-07-26T00:00:00.000Z
+icon: wireguard.svg
+tags:
+ - service
short_desc: "Fast, Modern, Secure VPN Tunnel"
---
@@ -16,6 +17,7 @@ As an example, we'll be using a virtual 172.16.0.0/24 network, but any private i
## Installation
### On the Server
+
Install the WireGuard management tools:
apt install wireguard
@@ -29,6 +31,7 @@ Run the following command to apply the change:
sysctl -w net.ipv4.ip_forward=1
### On the Client
+
Use your package manager to install the WireGuard Management Tools.
On Arch and Fedora based distros the package is `wireguard-tools`. For Debian based, it's listed above.
@@ -37,7 +40,6 @@ Create the public and private keys for your machine:
sudo bash -c "umask 077 ; wg genkey > /etc/wireguard/client_priv.key"
sudo bash -c "wg pubkey < /etc/wireguard/client_priv.key > /etc/wireguard/client_pub.key"
-
### Back to the Server
Generate the public and private keys for your server:
@@ -106,6 +108,7 @@ there's a good chance you're behind a corporate firewall. Read on.
## WebSocket Tunnel
#### Note on TLS
+
If your server hosts a website with https, you won't be able to use port 443 to
obfuscate your WireGuard packets as TLS traffic. You may use some other innocuous
port, but there's no guarantee you'll punch through the picky firewall.
@@ -145,7 +148,7 @@ Download and install wstunnel and a helper script:
wget https://github.com/erebe/wstunnel/releases/download/v4.0/wstunnel-x64-linux
sudo mv wstunnel-x64-linux /usr/local/bin/wstunnel
sudo chmod +x /usr/local/bin/wstunnel
- wget https://codeberg.org/onasaft/sbx/raw/branch/main/vpn/wstunnel.sh
+ wget https://raw.githubusercontent.com/jnsgruk/wireguard-over-wss/master/wstunnel.sh
sudo mv wstunnel.sh /etc/wireguard/wstunnel.sh
sudo chmod +x /etc/wireguard/wstunnel.sh
diff --git a/static/pix/mumble.svg b/static/pix/mumble.svg
new file mode 100644
index 0000000..263b86a
--- /dev/null
+++ b/static/pix/mumble.svg
@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="400" height="400" id="svg2" sodipodi:version="0.32" inkscape:version="0.91 r13725" version="1.0" sodipodi:docname="mumble.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" style="display:inline">
+ <title id="title3169">Mumble logo</title>
+ <defs id="defs4">
+ <linearGradient id="linearGradient4117">
+ <stop style="stop-color:#000000;stop-opacity:0;" offset="0" id="stop4119"/>
+ <stop id="stop4125" offset="0.81720757" style="stop-color:#000000;stop-opacity:0.01960784;"/>
+ <stop style="stop-color:#000000;stop-opacity:0.14509804;" offset="0.89931339" id="stop4127"/>
+ <stop id="stop4129" offset="0.91198522" style="stop-color:#000000;stop-opacity:0.20784314;"/>
+ <stop style="stop-color:#000000;stop-opacity:0.25098039;" offset="0.95598048" id="stop4131"/>
+ <stop style="stop-color:#000000;stop-opacity:0.33333334;" offset="1" id="stop4121"/>
+ </linearGradient>
+ <linearGradient inkscape:collect="always" id="linearGradient3972">
+ <stop style="stop-color:#b3b3b3;stop-opacity:1;" offset="0" id="stop3974"/>
+ <stop style="stop-color:#b3b3b3;stop-opacity:0;" offset="1" id="stop3976"/>
+ </linearGradient>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient1125-2" id="radialGradient1131-6" cx="333.52826" cy="217.58252" fx="333.52826" fy="217.58252" r="29.875" gradientTransform="matrix(-0.95122439,-0.37973408,-0.79004638,1.9790465,561.77552,-104.77634)" gradientUnits="userSpaceOnUse"/>
+ <linearGradient inkscape:collect="always" id="linearGradient1125-2">
+ <stop style="stop-color:#e6e6e6;stop-opacity:1;" offset="0" id="stop1127-4"/>
+ <stop style="stop-color:#e6e6e6;stop-opacity:0;" offset="1" id="stop1129-5"/>
+ </linearGradient>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient961-9" id="radialGradient967-9" cx="172.61411" cy="303.20566" fx="172.61411" fy="303.20566" r="22.630014" gradientTransform="matrix(1,0,0,0.63328545,0,119.49923)" gradientUnits="userSpaceOnUse"/>
+ <linearGradient inkscape:collect="always" id="linearGradient961-9">
+ <stop style="stop-color:#999999;stop-opacity:1;" offset="0" id="stop963-8"/>
+ <stop style="stop-color:#999999;stop-opacity:0;" offset="1" id="stop965-3"/>
+ </linearGradient>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient1125-6" id="radialGradient1131-8" cx="335.08649" cy="219.03677" fx="335.08649" fy="219.03677" r="29.875" gradientTransform="matrix(0.54659184,-0.27740671,0.6404924,1.2620022,11.607646,18.444794)" gradientUnits="userSpaceOnUse"/>
+ <linearGradient id="linearGradient1125-6">
+ <stop style="stop-color:#969696;stop-opacity:1;" offset="0" id="stop1127-9"/>
+ <stop style="stop-color:#e6e6e6;stop-opacity:0;" offset="1" id="stop1129-8"/>
+ </linearGradient>
+ <radialGradient r="38.624973" fy="25.979427" fx="250.46019" cy="25.979427" cx="250.46019" gradientTransform="matrix(-1.1864466,0.79500993,0.21180507,0.31609089,435.38812,-174.97097)" gradientUnits="userSpaceOnUse" id="radialGradient1193-8" xlink:href="#linearGradient1117-8-2" inkscape:collect="always"/>
+ <linearGradient id="linearGradient1117-8-2">
+ <stop style="stop-color:#afafaf;stop-opacity:1;" offset="0" id="stop1119-1-6"/>
+ <stop style="stop-color:#e6e6e6;stop-opacity:0;" offset="1" id="stop1121-2-2"/>
+ </linearGradient>
+ <linearGradient id="linearGradient1284-7">
+ <stop style="stop-color:#bebebe;stop-opacity:1;" offset="0" id="stop1286-8"/>
+ <stop style="stop-color:#b3b3b3;stop-opacity:0;" offset="1" id="stop1288-0"/>
+ </linearGradient>
+ <radialGradient r="103.51558" fy="230.12292" fx="458.02847" cy="230.12292" cx="458.02847" gradientTransform="matrix(0.41734111,-0.01064379,0.00887794,0.34810258,9.439031,55.321448)" gradientUnits="userSpaceOnUse" id="radialGradient1847" xlink:href="#linearGradient1284-7" inkscape:collect="always"/>
+ <linearGradient id="linearGradient1117-8-2-0">
+ <stop style="stop-color:#afafaf;stop-opacity:1;" offset="0" id="stop1119-1-6-8"/>
+ <stop style="stop-color:#e6e6e6;stop-opacity:0;" offset="1" id="stop1121-2-2-9"/>
+ </linearGradient>
+ <radialGradient r="38.624973" fy="25.979427" fx="250.46019" cy="25.979427" cx="250.46019" gradientTransform="matrix(1.1864466,0.79500993,-0.21180507,0.31609089,-32.887133,-175.8174)" gradientUnits="userSpaceOnUse" id="radialGradient2262" xlink:href="#linearGradient1117-8-2-0" inkscape:collect="always"/>
+ <linearGradient id="linearGradient1125-6-2">
+ <stop style="stop-color:#969696;stop-opacity:1;" offset="0" id="stop1127-9-0"/>
+ <stop style="stop-color:#e6e6e6;stop-opacity:0;" offset="1" id="stop1129-8-5"/>
+ </linearGradient>
+ <radialGradient r="29.875" fy="219.03677" fx="335.08649" cy="219.03677" cx="335.08649" gradientTransform="matrix(-0.54659184,-0.27740671,-0.6404924,1.2620022,394.97125,17.340932)" gradientUnits="userSpaceOnUse" id="radialGradient2300" xlink:href="#linearGradient1125-6-2" inkscape:collect="always"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient3972" id="radialGradient3978" cx="9.0" cy="10.0" fx="1.0" fy="10.0" r="10.0" gradientUnits="userSpaceOnUse"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient3972" id="radialGradient3980" cx="212.03125" cy="217.67747" fx="212.03125" fy="217.67747" r="16.494078" gradientTransform="matrix(1,0,0,1.5166132,0,-112.45505)" gradientUnits="userSpaceOnUse"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient3972" id="radialGradient3982" cx="248.85938" cy="217.67747" fx="248.85938" fy="217.67747" r="16.697203" gradientTransform="matrix(1,0,0,1.4981632,0,-108.43892)" gradientUnits="userSpaceOnUse"/>
+ <radialGradient inkscape:collect="always" xlink:href="#linearGradient4117" id="radialGradient4123" cx="206.64375" cy="214.43469" fx="206.64375" fy="214.43469" r="190.25014" gradientTransform="matrix(0.97267227,0.01617535,-0.01665626,0.97473856,9.2187856,2.0743911)" gradientUnits="userSpaceOnUse"/>
+ </defs>
+ <sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="1.8075" inkscape:cx="200.0" inkscape:cy="200.0" inkscape:document-units="px" inkscape:current-layer="layer3" showgrid="false" inkscape:snap-page="false" inkscape:snap-global="false" inkscape:window-width="1920" inkscape:window-height="996" inkscape:window-x="-8" inkscape:window-y="-8" inkscape:window-maximized="1" inkscape:snap-object-midpoints="true" inkscape:snap-nodes="true" inkscape:snap-grids="false" inkscape:snap-to-guides="false" inkscape:snap-center="true" inkscape:snap-bbox="true" inkscape:bbox-nodes="true" inkscape:snap-bbox-edge-midpoints="true" inkscape:snap-bbox-midpoints="true" inkscape:bbox-paths="true"/>
+ <metadata id="metadata7">
+ <rdf:RDF>
+ <cc:Work rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
+ <dc:title>Mumble logo</dc:title>
+ <dc:date>2009.08.17</dc:date>
+ <dc:creator>
+ <cc:Agent>
+ <dc:title>Martin Skilnand</dc:title>
+ </cc:Agent>
+ </dc:creator>
+ <dc:rights>
+ <cc:Agent>
+ <dc:title>Martin Skilnand</dc:title>
+ </cc:Agent>
+ </dc:rights>
+ <dc:publisher>
+ <cc:Agent>
+ <dc:title>Mumble team</dc:title>
+ </cc:Agent>
+ </dc:publisher>
+ <dc:identifier>mumble.svg</dc:identifier>
+ <dc:source>https://github.com/mumble-voip/mumble/</dc:source>
+ <dc:description>Logo for voice chat program mumble</dc:description>
+ <cc:license rdf:resource="BSD"/>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g inkscape:label="Circle" inkscape:groupmode="layer" id="layer1" transform="translate(0,-652.36218)" style="display:inline" sodipodi:insensitive="true">
+ <path sodipodi:type="arc" style="fill:#1a1a1a;stroke:#000000;stroke-width:4.57597017;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" id="path26" sodipodi:cx="206.64375" sodipodi:cy="214.43469" sodipodi:rx="178.98123" sodipodi:ry="174.04742" d="M 385.62498,214.43469 A 178.98123,174.04742 0 0 1 206.64375,388.48212 178.98123,174.04742 0 0 1 27.662521,214.43469 178.98123,174.04742 0 0 1 206.64375,40.387268 178.98123,174.04742 0 0 1 385.62498,214.43469 Z" transform="matrix(1.0811038,0,0,1.1043488,-22.437604,617.97608)"/>
+ <path sodipodi:type="arc" style="opacity:0;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" id="path26-9-9-8-6" sodipodi:cx="206.64375" sodipodi:cy="214.43469" sodipodi:rx="178.98123" sodipodi:ry="174.04742" d="M 385.62498,214.43469 A 178.98123,174.04742 0 0 1 206.64375,388.48212 178.98123,174.04742 0 0 1 27.662521,214.43469 178.98123,174.04742 0 0 1 206.64375,40.387268 178.98123,174.04742 0 0 1 385.62498,214.43469 Z" transform="matrix(1.070643,0,0,1.1009928,-22.08154,583.61968)"/>
+ <path sodipodi:type="arc" style="opacity:0.9;fill:#ffffff;stroke:none;display:inline" id="path26-9-0" sodipodi:cx="206.64375" sodipodi:cy="214.43469" sodipodi:rx="178.98123" sodipodi:ry="174.04742" d="M 385.62498,214.43469 A 178.98123,174.04742 0 0 1 206.64375,388.48212 178.98123,174.04742 0 0 1 27.662521,214.43469 178.98123,174.04742 0 0 1 206.64375,40.387268 178.98123,174.04742 0 0 1 385.62498,214.43469 Z" transform="matrix(1.0422741,0,0,1.0695007,-13.735541,622.74462)"/>
+ <path sodipodi:type="arc" style="fill:#ffffff;stroke:#333333;stroke-width:1.41267002;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" id="path26-9" sodipodi:cx="206.64375" sodipodi:cy="214.43469" sodipodi:rx="178.98123" sodipodi:ry="174.04742" d="M 385.62498,214.43469 A 178.98123,174.04742 0 0 1 206.64375,388.48212 178.98123,174.04742 0 0 1 27.662521,214.43469 178.98123,174.04742 0 0 1 206.64375,40.387268 178.98123,174.04742 0 0 1 385.62498,214.43469 Z" transform="matrix(1.0641261,0,0,1.0786838,-20.794262,620.64438)"/>
+ <path sodipodi:type="arc" style="fill:none;stroke:#000000;stroke-width:1.83038807;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline" id="path26-8" sodipodi:cx="206.64375" sodipodi:cy="214.43469" sodipodi:rx="178.98123" sodipodi:ry="174.04742" d="M 385.62498,214.43469 A 178.98123,174.04742 0 0 1 206.64375,388.48212 178.98123,174.04742 0 0 1 27.662521,214.43469 178.98123,174.04742 0 0 1 206.64375,40.387268 178.98123,174.04742 0 0 1 385.62498,214.43469 Z" transform="matrix(1.0856629,0,0,1.109006,-24.345467,616.20735)"/>
+ </g>
+ <g inkscape:groupmode="layer" id="layer6" inkscape:label="Effects" style="display:inline" sodipodi:insensitive="true">
+ <path sodipodi:type="arc" style="opacity:0.75;fill:url(#radialGradient4123);fill-opacity:1;stroke:none;display:inline" id="path26-9-5" sodipodi:cx="206.64375" sodipodi:cy="214.43469" sodipodi:rx="178.98123" sodipodi:ry="174.04742" d="m 385.62498,214.43469 a 178.98123,174.04742 0 1 1 -357.962459,0 178.98123,174.04742 0 1 1 357.962459,0 z" transform="matrix(1.0764906,0,0,1.1009349,-20.513668,-34.695518)"/>
+ </g>
+ <g inkscape:groupmode="layer" id="layer4" inkscape:label="Headstrap" style="display:inline" sodipodi:insensitive="true">
+ <path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff" d="m 152.40625,31.610002 c -24.65159,-0.615413 -49.62289,15.704618 -55.852503,40.126444 -1.451111,5.920437 -2.042948,11.533344 -2.147497,17.25104 0,21.207504 0,42.415014 0,63.622514 8.33333,0 16.66667,0 25,0 0.0881,-22.3821 -0.12668,-44.64411 0.1701,-67.071988 0.76858,-14.243077 11.77335,-29.258147 27.0486,-29.08431 0.11203,22.668722 -0.22918,45.351398 0.18004,68.010988 1.30284,18.42605 18.76217,33.67641 37.24339,32.11401 11.54558,-0.2802 23.17762,0.67313 34.64753,-0.72475 17.46577,-3.27442 29.55308,-21.06252 27.92904,-38.4493 0,-20.285732 0,-40.571465 0,-60.857198 15.88808,-1.160259 27.93757,14.263321 28.64235,29.08431 0.29501,22.427208 0.0825,44.692338 0.1701,67.071988 8.33333,0 16.66667,0 25,0 0,-22.5 0,-45 0,-67.499998 -0.81797,-7.276075 -1.9718,-16.180186 -5.9149,-23.198476 -10.22889,-20.751216 -34.15317,-31.947919 -56.71743,-30.261229 -6.591,-0.83713 -13.68143,3.619737 -15.48689,9.866559 0.10876,26.738504 0.18577,53.486212 -0.015,80.219854 -0.75343,11.19988 -11.79041,19.76398 -22.80523,18.34204 -7.79212,0.33854 -16.59364,0.0136 -21.90827,-6.68171 -7.16232,-7.57045 -4.76318,-18.40537 -5.18362,-27.81167 0.0193,-21.718966 -0.0713,-43.418377 0.1249,-65.100368 -3.25934,-6.591257 -10.50309,-9.993605 -17.67905,-8.911927 l -1.18772,-0.01641 -1.25823,-0.04042 2.5e-4,0 z" id="rect1019" transform="matrix(1.05,0,0,1.05,-5.3555131,0.50955272)"/>
+ <path style="opacity:0.96660007;fill:url(#radialGradient1131-6);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" d="m 107.26989,156.26167 0,177.84375 c -35.128105,-3.85349 -62.737498,-42.18816 -62.737498,-88.92187 0,-46.73372 27.609393,-85.06839 62.737498,-88.92188 z" id="path833-1-4"/>
+ </g>
+ <g inkscape:groupmode="layer" id="layer2" inkscape:label="Headphones" style="display:inline" sodipodi:insensitive="true">
+ <path style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff" d="m 290.42422,313.15625 c -0.69916,-0.007 -3.31052,-0.57507 -3.94043,-0.16697 0,0 -1.03559,3.01675 -4.60424,5.67254 -3.13272,2.33137 -6.10765,4.56617 -9.29463,6.66254 -2.86157,1.88231 -5.93275,3.91773 -8.80984,5.30245 -2.26396,1.08961 -4.11397,1.24819 -4.11397,1.24819 l -32.21955,0 c -2.01273,0 -3.66178,1.58716 -3.66178,3.5625 l 0,0.875 c 0,1.97534 1.64905,3.59375 3.66178,3.59375 l 33.87945,0 c 0.77968,0 3.59712,-0.82022 5.27249,-1.55528 4.17684,-1.83257 6.89898,-4.16602 11.7099,-7.02744 5.11436,-3.27118 14.57263,-10.88603 14.57263,-10.88603 1.67973,-1.08826 2.12779,-3.28897 1.01893,-4.9375 l -0.47763,-0.75 c -0.69304,-1.03033 -1.82785,-1.58241 -2.99311,-1.59375 z" id="rect134" sodipodi:nodetypes="ccsasccccccaccccc" transform="matrix(1.05,0,0,1.05,-5.3555131,0.50955272)"/>
+ <path style="opacity:0.96660007;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff" d="m 288.25,148.4375 0,169.375 C 321.70534,314.14251 348,277.6333 348,233.125 c 0,-44.5083 -26.29466,-81.01751 -59.75,-84.6875 z" id="path833" transform="matrix(1.05,0,0,1.05,-5.3555131,0.50955272)"/>
+ <path style="opacity:0.96660007;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;display:inline" d="m 106.22355,149.3374 0,169.375 c -33.455343,-3.66999 -59.750003,-40.1792 -59.750003,-84.6875 0,-44.5083 26.29466,-81.01751 59.750003,-84.6875 z" id="path833-2" transform="matrix(1.05,0,0,1.05,-5.3555131,0.50955272)"/>
+ <path sodipodi:type="arc" style="opacity:0.96660007;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff" id="path906" sodipodi:cx="172.61411" sodipodi:cy="325.86444" sodipodi:rx="22.130014" sodipodi:ry="13.831259" d="m 194.74412,325.86444 a 22.130014,13.831259 0 1 1 -44.26003,0 22.130014,13.831259 0 1 1 44.26003,0 z" transform="matrix(1.304789,0,0,1.21464,-20.460693,-43.799678)"/>
+ <rect style="opacity:0.96660007;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.05377054;display:inline" id="rect908-1" width="13.329355" height="171.94623" x="274.71799" y="146.09026" rx="3.8877287" ry="3.5400696" transform="matrix(1.0433338,0,0,1.0500168,-4.6562937,0.09487302)"/>
+ <rect style="opacity:0.96660007;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.04323161;display:inline" id="rect908-1-6" width="13.063269" height="171.95677" x="106.56075" y="147.08498" rx="3.8101201" ry="3.5402865" transform="matrix(1.0433338,0,0,1.0500168,-3.8347589,0.09487302)"/>
+ </g>
+ <g inkscape:groupmode="layer" id="layer3" inkscape:label="Sign" style="display:inline" sodipodi:insensitive="true">
+ <rect style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none" id="rect287" width="140.83455" height="111.88522" x="131.63644" y="188.83058"/>
+ <path id="path1297-8" style="fill:url(#radialGradient3978);fill-rule:evenodd;fill-opacity:1;stroke:none" d="M 4.4,18.6 h -4.4 v -18.6 h 4.5 c 5.6 0.0 4.3 8 2 8.5 c 3.5 0.0 4.0 9.4 -1 10.1 z M 2.8,7.4 v -3.9 h 1.2 a 0.8 1.0 0 0 1 0 3.9 z M 2.8,15.2 v -4.6 h 1.7 a 0.8 1.0 0 0 1 0 4.6 z" transform="translate(144,198) scale(4.4, 5)"/>
+ <path id="path1297" style="fill:#ffffff;fill-rule:evenodd;fill-opacity:1;stroke:none" d="M 4.4,18.6 h -4.4 v -18.6 h 4.5 c 5.6 0.0 4.3 8 2 8.5 c 3.5 0.0 4.0 9.4 -1 10.1 z M 2.8,7.4 v -3.9 h 1.2 a 0.8 1.0 0 0 1 0 3.9 z M 2.8,15.2 v -4.6 h 1.7 a 0.8 1.0 0 0 1 0 4.6 z" transform="translate(140,198) scale(4.4, 5)" inkscape:connector-curvature="0"/>
+ <path id="path1299-8" style="font-size:64px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:url(#radialGradient3980);fill-opacity:1;stroke:none;display:inline;font-family:Tahoma;-inkscape-font-specification:Tahoma Bold" d="m 227.5625,240.9431 l -31.0625,0 l 0,-46.53125 l 11.6875,0 l 0,37.65625 l 19.375,0 z" transform="matrix(1.100722,0,0,2.0000717,-23.811797,-190.28066)"/>
+ <path style="fill:#ffffff;fill-opacity:1;stroke:none" d="m 187.3125,197.5625 l 0,94.53125 l 14.125,0 l 0.0625,0 l 21.375,0 l 0,-19.25 l -21.375,0 l 0,-75.28125 l -14.1875,0 z" id="rect3178"/>
+ <path id="path1301-2" style="font-size:64px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;text-anchor:middle;fill:url(#radialGradient3982);fill-opacity:1;stroke:none;display:inline;font-family:Tahoma;-inkscape-font-specification:Tahoma Bold" d="m 233.125,240.9431 l 0,-46.53125 l 31.46875,0 l 0,8.875 l -19.84375,0 l 0,8.15625 l 18.28125,0 l 0,8.875 l -18.28125,0 l 0,11.75 l 19.84375,0 l 0,8.875 z" transform="matrix(1.100722,0,0,2.0000717,-23.811797,-190.28066)"/>
+ <path style="fill:#ffffff;fill-opacity:1;stroke:none;display:inline" d="m 227.8125,197.5 l 0,94.53125 l 14.1875,0 l 21.375,0 l 0,-19.25 l -21.375,0 L 242,250.5 l 19.65625,0 l 0,-18.65625 l -19.65625,0 L 242,216.75 l 21.375,0 l 0,-19.25 l -21.375,0 l -0.0625,0 l -14.125,0 z" id="rect3178-7"/>
+ </g>
+ <g inkscape:groupmode="layer" id="layer5" inkscape:label="Shadow-Glows" style="display:inline" sodipodi:insensitive="true">
+ <path style="fill:url(#radialGradient1847);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" d="m 155.36979,33.010124 c -25.88417,-0.646184 -52.10402,16.489853 -58.645119,42.132764 -1.523665,6.216465 -2.145097,12.11002 -2.254875,18.113595 0,22.267867 0,44.535757 0,66.803627 8.750004,0 17.499994,0 26.249994,0 0.0925,-23.5012 -0.13301,-46.87631 0.17861,-70.425571 0.807,-14.955237 12.36201,-30.72106 28.40103,-30.538528 0.11763,23.802159 -0.24064,47.618949 0.18905,71.411529 1.36798,19.34735 19.70027,35.36023 39.10555,33.71971 12.12286,-0.29421 24.3365,0.70678 36.37991,-0.76099 18.33906,-3.43814 31.03074,-22.11565 29.32549,-40.37177 0,-21.30001 0,-42.600022 0,-63.900042 16.68248,-1.218273 29.33444,14.976486 30.07447,30.538529 0.30976,23.548553 0.0866,46.926943 0.17861,70.425573 8.74998,0 17.5,0 26.25,0 0,-23.625 0,-47.25 0,-70.874984 -0.85887,-7.639884 -2.07039,-16.989202 -6.21065,-24.358407 -10.74033,-21.788774 -35.86083,-33.545313 -59.5533,-31.774288 -6.92055,-0.878987 -14.3655,3.800724 -16.26123,10.359887 0.1142,28.075433 0.19506,56.160521 -0.0157,84.230832 -0.7911,11.75988 -12.37993,20.75218 -23.94549,19.25915 -8.18173,0.35546 -17.42333,0.0143 -23.00369,-7.0158 -7.52043,-7.94897 -5.00134,-19.32564 -5.4428,-29.20225 0.0203,-22.804904 -0.0749,-45.589287 0.13115,-68.355379 -3.42231,-6.92082 -11.02825,-10.493285 -18.56301,-9.357523 l -1.2471,-0.01723 -1.32114,-0.04244 2.6e-4,0 z" id="rect1019-2"/>
+ <path style="fill:url(#radialGradient1193-8);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" d="m 154.53194,34.268657 c -31.65505,0 -56.16894,21.233495 -59.981238,48.759372 l 26.971868,0 c 3.64479,-12.426072 13.11379,-21.517343 24.51094,-22.574997 0.74035,-0.69976 1.77197,-1.148438 2.92031,-1.148438 l 26.61094,0 0.0984,-15.61875 c 0,0 -2.37838,-3.725289 -4.29844,-5.479687 -2.17544,-1.987733 -5.11175,-3.428347 -8.00625,-3.740625 -2.4252,-0.261648 -5.19957,-0.04115 -8.82656,-0.196875 z" id="rect1019-7-4-1"/>
+ <path sodipodi:type="arc" style="opacity:0.96660007;fill:url(#radialGradient967-9);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" id="path906-4" sodipodi:cx="172.61411" sodipodi:cy="325.86444" sodipodi:rx="22.130014" sodipodi:ry="13.831259" d="m 194.74412,325.86444 a 22.130014,13.831259 0 1 1 -44.26003,0 22.130014,13.831259 0 1 1 44.26003,0 z" transform="matrix(1.304789,0,0,1.21464,-20.43351,-43.907478)"/>
+ <path style="opacity:0.96660007;fill:url(#radialGradient1131-8);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" d="m 298.65695,157.25586 0,177.84375 c 35.12811,-3.85349 62.7375,-42.18816 62.7375,-88.92188 0,-46.73371 -27.60939,-85.06838 -62.7375,-88.92187 z" id="path833-1"/>
+ <path style="fill:url(#radialGradient2262);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" d="m 247.96904,33.42223 c 31.65505,0 56.16894,21.233495 59.98124,48.759372 l -26.97187,0 C 277.33362,69.75553 267.86462,60.664259 256.46748,59.606605 c -0.74036,-0.69976 -1.77197,-1.148438 -2.92032,-1.148438 l -26.61093,0 -0.0984,-15.61875 c 0,0 2.37838,-3.725289 4.29844,-5.479687 2.17544,-1.987733 5.11176,-3.428347 8.00625,-3.740625 2.4252,-0.261648 5.19957,-0.04115 8.82656,-0.196875 z" id="rect1019-7-4-1-2"/>
+ <path style="opacity:0.96660007;fill:url(#radialGradient2300);fill-opacity:1;fill-rule:evenodd;stroke:none;display:inline" d="m 107.92195,156.152 0,177.84375 c -35.128104,-3.85349 -62.737497,-42.18816 -62.737497,-88.92187 0,-46.73372 27.609393,-85.06839 62.737497,-88.92188 z" id="path833-1-5"/>
+ </g>
+</svg> \ No newline at end of file
diff --git a/static/pix/mumble/mumble-1.png b/static/pix/mumble/mumble-1.png
new file mode 100644
index 0000000..8679301
--- /dev/null
+++ b/static/pix/mumble/mumble-1.png
Binary files differ
diff --git a/static/pix/mumble/mumble-2.png b/static/pix/mumble/mumble-2.png
new file mode 100644
index 0000000..a3fb8ae
--- /dev/null
+++ b/static/pix/mumble/mumble-2.png
Binary files differ
diff --git a/static/pix/transmission-web-interface.png b/static/pix/transmission-web-interface.png
new file mode 100644
index 0000000..8b305dd
--- /dev/null
+++ b/static/pix/transmission-web-interface.png
Binary files differ
diff --git a/static/pix/transmission.png b/static/pix/transmission.png
new file mode 100644
index 0000000..6514c24
--- /dev/null
+++ b/static/pix/transmission.png
Binary files differ