<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>https://wiki.bretts.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andrew</id>
		<title>Briki - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="https://wiki.bretts.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Andrew"/>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/wiki/Special:Contributions/Andrew"/>
		<updated>2026-05-08T13:40:05Z</updated>
		<subtitle>User contributions</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8609</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8609"/>
				<updated>2026-03-10T16:04:24Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Govee2MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents:/torrents \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Mosquitto ===&lt;br /&gt;
  sudo docker run -d --name mosquitto -e TZ=Europe/London \&lt;br /&gt;
    -p 1883:1883 -p 9001:9001\&lt;br /&gt;
    -v /var/lib/mosquitto:/mosquitto \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    eclipse-mosquitto&lt;br /&gt;
&lt;br /&gt;
=== Govee2MQTT ===&lt;br /&gt;
Note: `--net=host` is needed for LAN API connections&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name govee2mqtt \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    --env-file /var/lib/govee2mqtt/.env \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/wez/govee2mqtt&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8608</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8608"/>
				<updated>2026-03-10T16:03:33Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Govee2MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents:/torrents \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Mosquitto ===&lt;br /&gt;
  sudo docker run -d --name mosquitto -e TZ=Europe/London \&lt;br /&gt;
    -p 1883:1883 -p 9001:9001\&lt;br /&gt;
    -v /var/lib/mosquitto:/mosquitto \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    eclipse-mosquitto&lt;br /&gt;
&lt;br /&gt;
=== Govee2MQTT ===&lt;br /&gt;
Note: `--net=host` is needed for LAN API connections&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name govee2mqtt \&lt;br /&gt;
    --net=host&lt;br /&gt;
    --env-file /var/lib/govee2mqtt/.env \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/wez/govee2mqtt&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8607</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8607"/>
				<updated>2026-03-10T16:02:20Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Govee2MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents:/torrents \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Mosquitto ===&lt;br /&gt;
  sudo docker run -d --name mosquitto -e TZ=Europe/London \&lt;br /&gt;
    -p 1883:1883 -p 9001:9001\&lt;br /&gt;
    -v /var/lib/mosquitto:/mosquitto \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    eclipse-mosquitto&lt;br /&gt;
&lt;br /&gt;
=== Govee2MQTT ===&lt;br /&gt;
  sudo docker run -d --name govee2mqtt \&lt;br /&gt;
    --env-file /var/lib/govee2mqtt/.env \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/wez/govee2mqtt&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8606</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8606"/>
				<updated>2026-03-10T15:42:59Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Govee2MQTT */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents:/torrents \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Mosquitto ===&lt;br /&gt;
  sudo docker run -d --name mosquitto -e TZ=Europe/London \&lt;br /&gt;
    -p 1883:1883 -p 9001:9001\&lt;br /&gt;
    -v /var/lib/mosquitto:/mosquitto \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    eclipse-mosquitto&lt;br /&gt;
&lt;br /&gt;
=== Govee2MQTT ===&lt;br /&gt;
  sudo docker run -d --name govee2mqtt -e TZ=Europe/London \&lt;br /&gt;
    -e CONFIG_PATH=/config/config.yaml \&lt;br /&gt;
    -v /var/lib/govee2mqtt:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/wez/govee2mqtt&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8605</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8605"/>
				<updated>2026-03-10T05:46:23Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents:/torrents \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Mosquitto ===&lt;br /&gt;
  sudo docker run -d --name mosquitto -e TZ=Europe/London \&lt;br /&gt;
    -p 1883:1883 -p 9001:9001\&lt;br /&gt;
    -v /var/lib/mosquitto:/mosquitto \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    eclipse-mosquitto&lt;br /&gt;
&lt;br /&gt;
=== Govee2MQTT ===&lt;br /&gt;
  sudo docker run -d --name govee2mqtt -e TZ=Europe/London \&lt;br /&gt;
    -e CONFIG_PATH=/config/config.yaml \&lt;br /&gt;
    -v /var/lib/govee2mqtt:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    graystorm/govee2mqtt&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Machine_List&amp;diff=8604</id>
		<title>Machine List</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Machine_List&amp;diff=8604"/>
				<updated>2026-01-30T07:03:05Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== History ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-networking ===&lt;br /&gt;
* (1988-1993) 8086 4.2MHz, MS-DOS 3.3&lt;br /&gt;
* (1993-1995) 386SX 16MHz, Windows 3.1 + MS-DOS 5.0&lt;br /&gt;
* (1995-1996) 486DX 50MHz, Windows 3.1 + MS-DOS 5.0/Windows 95&lt;br /&gt;
&lt;br /&gt;
=== indiana ===&lt;br /&gt;
* (1996 - 1999) Fujitsu-ICL Pentium 90, Windows 95 + Windows NT 4.0&lt;br /&gt;
** 1996?: +Orchid Righteous 3D&lt;br /&gt;
&lt;br /&gt;
=== colorado === &lt;br /&gt;
* (1999 - 2001) Homebuilt Celeron 300, Windows 98/Me/XP&lt;br /&gt;
** Matrox Millennium G200?&lt;br /&gt;
* (2001 - 2002) Homebuilt Pentium 3 800, Windows XP&lt;br /&gt;
* (2002 - 2005) Homebuilt Pentium 3 800, Mandriva Linux 8.0/9.0/10.0&lt;br /&gt;
* (2005 - 2008) Dell Dimension 4300 (Pentium 4 1.8), Kubuntu 6.04&lt;br /&gt;
** 2005: +128MB Sparkle GeForce MX4000 AGP &lt;br /&gt;
** 2005: +Hauppauge WinTV-NOVA-T-MCE &lt;br /&gt;
** 2006: +Seagate Barracuda 7200.10 320GB ST3320620A&lt;br /&gt;
** 2006: +NEC-4570 16x DVD±RW/RAM Black &lt;br /&gt;
* (2008 - 2010) Dell Dimension 4300 (Pentium 4 1.8), Ubuntu 8.04&lt;br /&gt;
** 2008: +Seagate Barracuda 7200.10 750GB SATA2 3.5&amp;quot; &lt;br /&gt;
** 2008: +SATA &amp;amp; IDE PCI Controller Card&lt;br /&gt;
&lt;br /&gt;
=== texas ===&lt;br /&gt;
* (2002 - 2005) Dell Dimension 4300 (Pentium 4 1.8), Windows XP&lt;br /&gt;
** GeForce 2 MX400?&lt;br /&gt;
&lt;br /&gt;
=== vermont ===&lt;br /&gt;
* (2004 - 2006) Sony Vaio TR5MP (Pentium M 1.0), Windows XP&lt;br /&gt;
* (2006 - 2008) Sony Vaio TR5MP (Pentium M 1.0), Ubuntu 6.10/7.04/7.10/8.04&lt;br /&gt;
&lt;br /&gt;
=== alaska ===&lt;br /&gt;
* (2005 - 2007) Homebuilt Athlon64 3500+, Windows XP + Ubuntu 7.04 -&amp;gt; 8.04&lt;br /&gt;
** Cooler Master Wave Master TAC-T01-E1C Silver All Aluminum Alloy ATX Mid Tower Computer Case&lt;br /&gt;
** MSI K8N Diamond&lt;br /&gt;
** AMD Athlon 64 3500+&lt;br /&gt;
** 512MB Corsair Value Select 400MHz DDR Memory Stick &lt;br /&gt;
** 128MB Sparkle GeForce 6600GT PCI-E &lt;br /&gt;
** 300Gb Maxtor DiamondMax 10 ATA/133 6L300S0&lt;br /&gt;
** NEC ND-3520 Silver &lt;br /&gt;
** 460W Akasa PaxPower Ultra Quiet &lt;br /&gt;
** 2006: +320GB Seagate Barracuda 7200.10 SATA2 ST3320620AS&lt;br /&gt;
** 2007: +Sapphire X1950PRO 512MB GDDR3 PCI-Express&lt;br /&gt;
* (2008 - 2014) Homebuilt Core 2 Duo 3.0, Windows XP/7 + Ubuntu 8.04 -&amp;gt; 9.10&lt;br /&gt;
** 2008: +Gigabyte GA P35C-DS3R, iP35 Express, S775, PCI-E(x16), DDR2/3 1066/1333/800, SATA II, SATA RAID, ATX&lt;br /&gt;
** 2008: +Intel Core 2 Duo E8400 2 x 3.00Ghz 6Mb Cache 1333 FSB Dual Core&lt;br /&gt;
** 2008: +Corsair XMS6400 4GB DDR2 (2x2GB) 800Mhz Non-ECC&lt;br /&gt;
** 2009: +GeForce GTX 260 Core 216&lt;br /&gt;
** 2012: +Samsung 830 256GB SSD&lt;br /&gt;
* (2014 - ) Homebuilt Core i7-4770, Windows 7/10&lt;br /&gt;
** 2014: +Asus Z87-Plus Motherboard (Socket 1150, 4x DDR3, ATX, 2x PCI Express 3.0/2.0, 6x SATA 6.0 Gb/s, USB 3.0)&lt;br /&gt;
** 2014: +Intel Core i7 4770 Quad Core Retail CPU (Socket 1150, 3.40GHz, 8MB, Haswell)&lt;br /&gt;
** 2014: +Corsair CML16GX3M2A1600C10 Vengeance Low Profile 16GB (2x8GB) DDR3 1600 Mhz CL10 XMP&lt;br /&gt;
** 2014: +Sapphire R9 270X 2GB Vapor-X 1050MHz GDDR 5 PCI Express Graphics Card&lt;br /&gt;
** 2015: +ASUS Z87-A Motherboard&lt;br /&gt;
** 2015: +Cooler Master Hyper 103 92mm Fan&lt;br /&gt;
** 2016: +MSI GeForce GTX 970 GAMING Twin Frozr V 4GB Graphics Card (Maxwell)&lt;br /&gt;
** 2016: +Samsung 850 EVO 500 GB 2.5 inch Solid State Drive&lt;br /&gt;
** 2021: +Corsair RM650x PSU&lt;br /&gt;
&lt;br /&gt;
=== hawaii === &lt;br /&gt;
* (2007 - 2009) Nintendo Wii&lt;br /&gt;
&lt;br /&gt;
=== montana ===&lt;br /&gt;
* (2007 - ) Apple Mac Mini (Mid 2007), Mac OS X Tiger -&amp;gt; Lion&lt;br /&gt;
** Core 2 Duo T7200 @ 2.0GHz&lt;br /&gt;
** 4GB DDR2-667 RAM&lt;br /&gt;
** 120GB HDD&lt;br /&gt;
** Intel GMA 950&lt;br /&gt;
&lt;br /&gt;
=== pennsylvania ===&lt;br /&gt;
* (2008 - 2012) Sony PS3&lt;br /&gt;
&lt;br /&gt;
=== nevada ===&lt;br /&gt;
* (2009 - 2011) Samsung NC20 (VIA Nano 1.6), Windows XP + Ubuntu 9.04 -&amp;gt; 9.10&lt;br /&gt;
&lt;br /&gt;
=== maine ===&lt;br /&gt;
* (2010 - 2023) Homebuilt Core i5 750, Ubuntu 9.10/12.04/14.04/16.04/18.04/20.04/22.04&lt;br /&gt;
** Cooler Master ATCS 840 RC-840-KKN1-GP Black Aluminum ATX Full Tower Computer Case&lt;br /&gt;
*** Front Case Fan failed&lt;br /&gt;
** Gigabyte GA-P55-UD3R LGA 1156 Intel P55 ATX Intel Motherboard&lt;br /&gt;
** Intel Core i5-750 Lynnfield 2.66GHz LGA 1156 95W Quad-Core Processor Model BX80605I5750&lt;br /&gt;
** OCZ Gold 4GB (2 x 2GB) 240-Pin DDR3 SDRAM DDR3 1333 (PC3 10666) Desktop Memory Model OCZ3G1333LV4GK&lt;br /&gt;
** MSI N8400GS-D256H GeForce 8400 GS 256MB 64-bit GDDR2 PCI Express 2.0 x16 HDCP Ready Video Card&lt;br /&gt;
** Seagate Barracuda LP ST31500541AS 1.5TB 5900 RPM SATA 3.0Gb/s 3.5&amp;quot;&lt;br /&gt;
** Nexus NX-5000 R3 530W ATX12V v2.2 80 PLUS BRONZE Certified Modular Active PFC Power Supply&lt;br /&gt;
** 2011 onwards: +Various SATA HDDs&lt;br /&gt;
** 2013: +Crucial Ballistix 16GB (2x8GB) 240-pin DIMM, DDR3 PC3-12800&lt;br /&gt;
** 2019: +Timetec Hynix IC 16GB (2x8GB) DDR3 PC3-12800 1600 MHz Non ECC Unbuffered 1.35V/1.5V Dual Rank 240 Pin UDIMM&lt;br /&gt;
** 2021: +Corsair RM650 PSU&lt;br /&gt;
** 2021: +Cooler Master Hyper 212 CPU Fan&lt;br /&gt;
* (2023 - ) Homebuilt Core i5 13500, Ubuntu 22.04 &lt;br /&gt;
** 2023: +ASRock Z790 PRO RS/D4&lt;br /&gt;
** 2023: +Intel Core i5-13500 Desktop Processor 14 cores (6 P-cores + 8 E-cores) &lt;br /&gt;
** 2023: +Corsair CMK64GX4M2E3200C16 Vengeance LPX 64GB (2 x 32GB) DDR4 3200&lt;br /&gt;
&lt;br /&gt;
=== arizona ===&lt;br /&gt;
* (2010 - ) Apple Macbook Air (Late 2010 13-inch), Mac OS X Snow Leopard -&amp;gt; macOS Sierra&lt;br /&gt;
**  Core 2 Duo SL9400 @ 1.86 GHz&lt;br /&gt;
** 2GB DDR3-1066 RAM&lt;br /&gt;
** 128GB SSD&lt;br /&gt;
** Nvidia GeForce 320M&lt;br /&gt;
&lt;br /&gt;
=== dakota ===&lt;br /&gt;
* (2012 - ) Apple Mac Mini (Mid 2011), Mac OS X Lion -&amp;gt; macOS Sierra&lt;br /&gt;
** Core i5-2520M @ 2.5 GHz&lt;br /&gt;
** 4GB DDR3-1333 RAM&lt;br /&gt;
** 500GB SATA HDD&lt;br /&gt;
** AMD Radeon HD 6630M&lt;br /&gt;
&lt;br /&gt;
=== router ===&lt;br /&gt;
* (2016 - ) Homebuilt Celeron G1840, pfSense&lt;br /&gt;
** IN Win EM050 Matx Black Case&lt;br /&gt;
** MSI H97M-G43 Socket 1150 VGA DVI HDMI DisplayPort mATX Motherboard&lt;br /&gt;
** Intel Celeron G1840 2.80GHz Socket 1150 2MB L3 Cache&lt;br /&gt;
** Corsair 4GB DDR3 1333MHz Memory Module CL9(9-9-9-24) 1.5V Unbuffered Non-ECC&lt;br /&gt;
** Corsair Force Series LS 60GB SATA 2.5inch SSD&lt;br /&gt;
** 2021: +Corsair RM650 PSU&lt;br /&gt;
&lt;br /&gt;
=== oregon ===&lt;br /&gt;
* (2016 - ) Apple MacBook Pro (Late 2016 13-inch Touch Bar), macOS Sierra -&amp;gt; Mojave&lt;br /&gt;
** Core i5-6287U @ 3.1GHz&lt;br /&gt;
** 16GB DDR3-2133 RAM&lt;br /&gt;
** 256GB PCIe SSD&lt;br /&gt;
** Intel Iris Graphics 550&lt;br /&gt;
&lt;br /&gt;
=== virginia ===&lt;br /&gt;
* (2021 - 2025) Homebuilt Ryzen 5 5600X, Windows 10&lt;br /&gt;
** Phanteks Evolv X Antracite Grey Case&lt;br /&gt;
** Gigabyte AMD Ryzen X570 AORUS PRO&lt;br /&gt;
** Ryzen 5 5600X @ 3.7Ghz&lt;br /&gt;
** Corsair Vengeance LPX Black 32GB 3600MHz 2x16GB CAS 18-22-22-42 DDR4&lt;br /&gt;
** NVIDIA RTX 3080 Founders Edition&lt;br /&gt;
** Corsair Force MP600 1TB M.2 PCIe Gen 4 NVMe SSD&lt;br /&gt;
** Corsair RM850 PSU&lt;br /&gt;
** 2021: +Samsung 980 PRO M.2 NVMe SSD 2TB&lt;br /&gt;
* (2025 -) Homebuilt Ryzen 7 9800X3D, Windows 10&lt;br /&gt;
** +MSI MAG X870 Tomahawk&lt;br /&gt;
** +AMD Ryzen 7 9800X3D AM5 @ 4.7Ghz&lt;br /&gt;
** +Corsair Vengeance 64GB (2*32GB) RGB 6000 MHz CAS 30-36-36-76 DDR5&lt;br /&gt;
** +Corsair RM1000x Shift&lt;br /&gt;
&lt;br /&gt;
=== delaware ===&lt;br /&gt;
* (2024 -) Steam Deck 1TB OLED&lt;br /&gt;
&lt;br /&gt;
=== york ===&lt;br /&gt;
* (2026 -) Beelink Mini S12 Pro&lt;br /&gt;
** Intel 12th Gen N100&lt;br /&gt;
** 16GB DDR4 RAM&lt;br /&gt;
** 500GB M.2 SSD&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8603</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8603"/>
				<updated>2026-01-22T15:05:01Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Radarr (Movie Downloads) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents:/torrents \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8602</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8602"/>
				<updated>2026-01-22T15:04:48Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Deluge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents:/torrents \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8601</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8601"/>
				<updated>2026-01-22T15:04:35Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Deluge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents/deluge:/torrents \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8600</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8600"/>
				<updated>2026-01-22T15:04:17Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Deluge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8599</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8599"/>
				<updated>2026-01-22T15:04:00Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Jackett (Torrent Gateway) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8598</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8598"/>
				<updated>2026-01-22T15:03:52Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Tautulli (Plex Monitoring/Notifications) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8597</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8597"/>
				<updated>2026-01-22T15:03:35Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Overseerr (Media Requests) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8596</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8596"/>
				<updated>2026-01-22T15:03:16Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Sonarr (TV Downloads) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8595</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8595"/>
				<updated>2026-01-22T15:02:53Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Radarr (Movie Downloads) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
Note: torrents and movies should both be under /srv to enable import via hard links&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv:/srv \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=SnapRAID_/_MergerFS&amp;diff=8594</id>
		<title>SnapRAID / MergerFS</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=SnapRAID_/_MergerFS&amp;diff=8594"/>
				<updated>2025-12-19T07:18:10Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Identifying/Fixing a bad block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SnapRAID / MergerFS =&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
https://zackreed.me/setting-up-snapraid-on-ubuntu/&lt;br /&gt;
&lt;br /&gt;
Note that if (like me) you use a dedicated snapraid content directory then you'll need to create that by hand for each disk with:&lt;br /&gt;
&lt;br /&gt;
  mkdir /mnt/data/disk1/.snapraid&lt;br /&gt;
&lt;br /&gt;
== Partitioning a new data disk ==&lt;br /&gt;
Note: &amp;quot;-m 2&amp;quot; here reserves 2% of the filesystem for root-owned files (eg. .../.snapraid/content)&lt;br /&gt;
  sudo parted -a optimal -s /dev/sdX -- mklabel gpt mkpart primary 0% 100%&lt;br /&gt;
  sudo mkfs.ext4 -m 2 -T largefile4 /dev/sdX1&lt;br /&gt;
&lt;br /&gt;
== Partitioning a new parity disk ==&lt;br /&gt;
Note: &amp;quot;-m 0&amp;quot; here reserves 0% of the filesystem, ensuring that the parity disks are slightly larger than the data disks&lt;br /&gt;
  sudo parted -a optimal -s /dev/sdX -- mklabel gpt mkpart primary 0% 100%&lt;br /&gt;
  sudo mkfs.ext4 -m 0 -T largefile4 /dev/sdX1&lt;br /&gt;
&lt;br /&gt;
== Adding a new data disk to mergerfs ==&lt;br /&gt;
From: https://zackreed.me/mergerfs-neat-tricks/&lt;br /&gt;
From within the root of the mergerfs filesystem (eg. /srv)&lt;br /&gt;
  xattr -w user.mergerfs.srcmounts '+&amp;gt;/mnt/data/disk4/srv' .mergerfs&lt;br /&gt;
&lt;br /&gt;
== Removing a data disk from mergerfs ==&lt;br /&gt;
From within the root of the mergerfs filesystem (eg. /srv)&lt;br /&gt;
  xattr -w user.mergerfs.srcmounts '-/mnt/data/disk4/srv' .mergerfs&lt;br /&gt;
&lt;br /&gt;
== Forcing a resync ==&lt;br /&gt;
&lt;br /&gt;
  sudo snapraid sync&lt;br /&gt;
&lt;br /&gt;
== Identifying/Fixing a bad block ==&lt;br /&gt;
* Run ddrescue to identify the failing bytes on the disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ddrescue --ask --verbose --binary-prefixes --idirect --force /dev/sdX /dev/null sdX.map &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ddrescue will write out a map file containing start positions and sizes (all in bytes) of good (+) and bad (-) byte ranges&lt;br /&gt;
* Get the block size for the volume with &amp;lt;code&amp;gt;tune2fs -l /dev/sdXY | grep &amp;quot;Block size&amp;quot;&amp;lt;/code&amp;gt; (we'll call this '''B'''). In my case this is 4096.&lt;br /&gt;
* Get the sector size for the disk with &amp;lt;code&amp;gt;fdisk -l /dev/sdX | grep Units&amp;lt;/code&amp;gt; (we'll call this '''S'''). In my case this is 512.&lt;br /&gt;
* Identify the starting sector for the /dev/sdXY volume (eg. /dev/sda1) with &amp;lt;code&amp;gt;fdisk -l /dev/sdX&amp;lt;/code&amp;gt; (we'll call this '''T'''). In my case this is 2048.&lt;br /&gt;
* Calculate the offset to go from disk to volume location with &amp;lt;code&amp;gt;(T * S / B)&amp;lt;/code&amp;gt; (we'll call this '''F'''). In my case this is 256.&lt;br /&gt;
* Run ddrescuelog to list out the bad block locations (using the block size B) and convert to a volume location (by subtracting the offset F):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ddrescuelog -b B --list-blocks=- sdX.map | xargs -n 1 expr -F +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Let's call each of these bad volume blocks '''BB'''&lt;br /&gt;
* Start debugfs for the volume with :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debugfs /dev/sdXY&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* For each '''BB''' run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testb BB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If debugfs returns &amp;quot;Block BB not in use&amp;quot;, then that block isn't part of a file and can safely be overwritten. If it returns &amp;quot;Block BB marked in use&amp;quot; then we need to get an inode number (we'll call it '''I''') and convert that inode number to a file path with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
icheck BB&lt;br /&gt;
ncheck I&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For any unused blocks, we need to do the following:&lt;br /&gt;
* Check with dd that we’ve got the right block IDs. For each one of these reads we expect to see an error (and “0+0 records in”):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b B --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  dd if=/dev/sdX of=/dev/null count=1 bs=B skip=$block&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* For each of the bad blocks, write zeros over the block to force it to be reallocated from spare space on the drive. Be careful here – getting it wrong will destroy data! Also note that when reading, “skip” is used to position the input stream, but here “seek” is used to position the output stream:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b B --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  dd if=/dev/zero of=/dev/sdX count=1 bs=B seek=$block&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* It’s possible that dd will fail to write to the block, in which case try again with hdparm:&lt;br /&gt;
&lt;br /&gt;
** First check that we’ve got the right sectors (we expect to see “SG_IO: bad/missing sense data” for each sector on stderr, so we pipe stdout to /dev/null to avoid noise). Note that we use '''S''' as the block size for ddrescuelog, since hdparm deals in sectors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b S --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  hdparm --read-sector $block /dev/sdX &amp;gt; /dev/null&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** Assuming we’ve seen the expected errors, write zeros over each of the bad sectors. Note that we use '''S''' as the block size for ddrescuelog, since hdparm deals in sectors. Be careful here – getting it wrong will destroy data! You may be asked to add a “—yes-i-know-what-i-am-doing” flag.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b S --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  hdparm --write-sector $block /dev/sdX&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check that the number of failing sectors has decreased:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smartctl -a /dev/sdX | grep Pending&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For any files reported by `debugfs`:&lt;br /&gt;
* Write random data over the bad file, which should force the pending sector to be marked bad and reallocated from spare space on the disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shred -n 1 –v /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check that the number of failing sectors has decreased:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smartctl -a /dev/sdX | grep Pending&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Assuming the number of pending sectors has decreased, it’s then ok to delete the bad file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Restore the deleted file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snapraid fix -f /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More details:&lt;br /&gt;
* https://www.smartmontools.org/wiki/BadBlockHowto&lt;br /&gt;
* [[Mdadm#Repairing_failing_disk_on_degraded_array]]&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8593</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8593"/>
				<updated>2025-11-25T05:55:23Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Automatically */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
Use portainer, or:&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8592</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8592"/>
				<updated>2025-11-23T08:18:02Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Minecraft Servers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
  sudo docker run -d --name brettropolis \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19152 \&lt;br /&gt;
    -p 19152:19152/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettropolis:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8591</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8591"/>
				<updated>2025-11-23T07:52:39Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Minecraft Servers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE -e SERVER_PORT=19142 \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8590</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8590"/>
				<updated>2025-11-23T07:47:12Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Bedrock Connect */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132/udp \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8589</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8589"/>
				<updated>2025-11-23T07:42:17Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Minecraft Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132 \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Servers ===&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8588</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8588"/>
				<updated>2025-11-23T07:41:32Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Minecraft Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132 \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Server ===&lt;br /&gt;
docker run -d -it -e EULA=TRUE -p 19132:19132/udp -v mc-bedrock-data:/data itzg/minecraft-bedrock-server&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE \&lt;br /&gt;
    -p 19142:19142/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8587</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8587"/>
				<updated>2025-11-23T07:29:35Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Bedrock Connect ===&lt;br /&gt;
  sudo docker run -d --name bedrock-connect \&lt;br /&gt;
    -e NODB=true \&lt;br /&gt;
    -p 19132:19132 \&lt;br /&gt;
    -v /var/lib/minecraft/bedrock-connect/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    strausmann/minecraft-bedrock-connect&lt;br /&gt;
&lt;br /&gt;
=== Minecraft Server ===&lt;br /&gt;
docker run -d -it -e EULA=TRUE -p 19132:19132/udp -v mc-bedrock-data:/data itzg/minecraft-bedrock-server&lt;br /&gt;
  sudo docker run -d --name brettopia \&lt;br /&gt;
    -e EULA=TRUE \&lt;br /&gt;
    -p 19133:19133/udp \&lt;br /&gt;
    -v /var/lib/minecraft/brettopia:/data \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    itzg/minecraft-bedrock-server&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=SnapRAID_/_MergerFS&amp;diff=8586</id>
		<title>SnapRAID / MergerFS</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=SnapRAID_/_MergerFS&amp;diff=8586"/>
				<updated>2025-11-19T06:46:44Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Identifying/Fixing a bad block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SnapRAID / MergerFS =&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
https://zackreed.me/setting-up-snapraid-on-ubuntu/&lt;br /&gt;
&lt;br /&gt;
Note that if (like me) you use a dedicated snapraid content directory then you'll need to create that by hand for each disk with:&lt;br /&gt;
&lt;br /&gt;
  mkdir /mnt/data/disk1/.snapraid&lt;br /&gt;
&lt;br /&gt;
== Partitioning a new data disk ==&lt;br /&gt;
Note: &amp;quot;-m 2&amp;quot; here reserves 2% of the filesystem for root-owned files (eg. .../.snapraid/content)&lt;br /&gt;
  sudo parted -a optimal -s /dev/sdX -- mklabel gpt mkpart primary 0% 100%&lt;br /&gt;
  sudo mkfs.ext4 -m 2 -T largefile4 /dev/sdX1&lt;br /&gt;
&lt;br /&gt;
== Partitioning a new parity disk ==&lt;br /&gt;
Note: &amp;quot;-m 0&amp;quot; here reserves 0% of the filesystem, ensuring that the parity disks are slightly larger than the data disks&lt;br /&gt;
  sudo parted -a optimal -s /dev/sdX -- mklabel gpt mkpart primary 0% 100%&lt;br /&gt;
  sudo mkfs.ext4 -m 0 -T largefile4 /dev/sdX1&lt;br /&gt;
&lt;br /&gt;
== Adding a new data disk to mergerfs ==&lt;br /&gt;
From: https://zackreed.me/mergerfs-neat-tricks/&lt;br /&gt;
From within the root of the mergerfs filesystem (eg. /srv)&lt;br /&gt;
  xattr -w user.mergerfs.srcmounts '+&amp;gt;/mnt/data/disk4/srv' .mergerfs&lt;br /&gt;
&lt;br /&gt;
== Removing a data disk from mergerfs ==&lt;br /&gt;
From within the root of the mergerfs filesystem (eg. /srv)&lt;br /&gt;
  xattr -w user.mergerfs.srcmounts '-/mnt/data/disk4/srv' .mergerfs&lt;br /&gt;
&lt;br /&gt;
== Forcing a resync ==&lt;br /&gt;
&lt;br /&gt;
  sudo snapraid sync&lt;br /&gt;
&lt;br /&gt;
== Identifying/Fixing a bad block ==&lt;br /&gt;
* Run ddrescue to identify the failing bytes on the disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ddrescue --ask --verbose --binary-prefixes --idirect --force /dev/sdX /dev/null sdX.map &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ddrescue will write out a map file containing start positions and sizes (all in bytes) of good (+) and bad (-) byte ranges&lt;br /&gt;
* Get the block size for the volume with &amp;lt;code&amp;gt;tune2fs -l /dev/sdXY | grep &amp;quot;Block size&amp;quot;&amp;lt;/code&amp;gt; (we'll call this '''B'''). In my case this is 4096.&lt;br /&gt;
* Get the sector size for the disk with &amp;lt;code&amp;gt;fdisk -l /dev/sdX | grep Units&amp;lt;/code&amp;gt; (we'll call this '''S'''). In my case this is 512.&lt;br /&gt;
* Identify the starting sector for the /dev/sdXY volume (eg. /dev/sda1) with &amp;lt;code&amp;gt;fdisk -l /dev/sdX&amp;lt;/code&amp;gt; (we'll call this '''T'''). In my case this is 2048.&lt;br /&gt;
* Calculate the offset to go from disk to volume location with &amp;lt;code&amp;gt;(T * S / B)&amp;lt;/code&amp;gt; (we'll call this '''O'''). In my case this is 256.&lt;br /&gt;
* Run ddrescuelog to list out the bad block locations (using the block size B) and convert to a volume location (by subtracting the offset O):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ddrescuelog -b B --list-blocks=- sdX.map | xargs -n 1 -O +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Let's call each of these bad volume blocks '''BB'''&lt;br /&gt;
* Start debugfs for the volume with :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debugfs /dev/sdXY&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* For each '''BB''' run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testb BB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If debugfs returns &amp;quot;Block BB not in use&amp;quot;, then that block isn't part of a file and can safely be overwritten. If it returns &amp;quot;Block BB marked in use&amp;quot; then we need to get an inode number (we'll call it '''I''') and convert that inode number to a file path with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
icheck BB&lt;br /&gt;
ncheck I&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For any unused blocks, we need to do the following:&lt;br /&gt;
* Check with dd that we’ve got the right block IDs. For each one of these reads we expect to see an error (and “0+0 records in”):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b B --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  dd if=/dev/sdX of=/dev/null count=1 bs=B skip=$block&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* For each of the bad blocks, write zeros over the block to force it to be reallocated from spare space on the drive. Be careful here – getting it wrong will destroy data! Also note that when reading, “skip” is used to position the input stream, but here “seek” is used to position the output stream:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b B --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  dd if=/dev/zero of=/dev/sdX count=1 bs=B seek=$block&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* It’s possible that dd will fail to write to the block, in which case try again with hdparm:&lt;br /&gt;
&lt;br /&gt;
** First check that we’ve got the right sectors (we expect to see “SG_IO: bad/missing sense data” for each sector on stderr, so we pipe stdout to /dev/null to avoid noise). Note that we use '''S''' as the block size for ddrescuelog, since hdparm deals in sectors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b S --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  hdparm --read-sector $block /dev/sdX &amp;gt; /dev/null&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** Assuming we’ve seen the expected errors, write zeros over each of the bad sectors. Note that we use '''S''' as the block size for ddrescuelog, since hdparm deals in sectors. Be careful here – getting it wrong will destroy data! You may be asked to add a “—yes-i-know-what-i-am-doing” flag.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b S --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  hdparm --write-sector $block /dev/sdX&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check that the number of failing sectors has decreased:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smartctl -a /dev/sdX | grep Pending&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For any files reported by `debugfs`:&lt;br /&gt;
* Write random data over the bad file, which should force the pending sector to be marked bad and reallocated from spare space on the disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shred -n 1 –v /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check that the number of failing sectors has decreased:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smartctl -a /dev/sdX | grep Pending&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Assuming the number of pending sectors has decreased, it’s then ok to delete the bad file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Restore the deleted file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snapraid fix -f /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More details:&lt;br /&gt;
* https://www.smartmontools.org/wiki/BadBlockHowto&lt;br /&gt;
* [[Mdadm#Repairing_failing_disk_on_degraded_array]]&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8585</id>
		<title>Windows 10 Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8585"/>
				<updated>2025-10-22T15:12:44Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Running rsyncd automatically */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Monitor Switcher ==&lt;br /&gt;
https://sourceforge.net/projects/monitorswitcher/&lt;br /&gt;
&lt;br /&gt;
== Monitor Test Patterns ==&lt;br /&gt;
* Limited vs. Full Range: http://www.lagom.nl/lcd-test/img/blacktest.png&lt;br /&gt;
* Chroma Subsampling: https://www.rtings.com/images/test-materials/2017/chroma-444.png&lt;br /&gt;
&lt;br /&gt;
== Setup MPC-BE ==&lt;br /&gt;
* MPC-BE: https://chamconsoft.com/cmc/forums/?w3=dmlld3RvcGljLnBocD90PTE5Nw==&lt;br /&gt;
* madVR: https://forum.kodi.tv/showthread.php?tid=259188&lt;br /&gt;
&lt;br /&gt;
== Rename Network ==&lt;br /&gt;
https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/&lt;br /&gt;
&lt;br /&gt;
== Installing WSL ==&lt;br /&gt;
https://docs.microsoft.com/en-us/windows/wsl/install-win10&lt;br /&gt;
&lt;br /&gt;
Note: If you see Error 0x80370102, you may need to enable virtualization in your motherboard BIOS: https://ourcodeworld.com/articles/read/1283/how-to-enable-amd-virtualization-on-the-aorus-x570-motherboard&lt;br /&gt;
&lt;br /&gt;
=== Running rsyncd automatically (DEPRECATED) ===&lt;br /&gt;
* Set '''RSYNC_ENABLE=true''' in ''/etc/default/rsync''&lt;br /&gt;
* Create ''/etc/rsyncd.conf'' with the contents (for example):&lt;br /&gt;
  [users]&lt;br /&gt;
      path = /mnt/c/Users&lt;br /&gt;
      comment = Users&lt;br /&gt;
      read only = true&lt;br /&gt;
* WSL2 virtual machines run on a separate NATed network, so we need to forward the rsync port from the real LAN to the virtual machine:&lt;br /&gt;
  netsh interface portproxy add v4tov4 listenport=873 listenaddress=0.0.0.0 connectport=873 connectaddress=127.0.0.1&lt;br /&gt;
* Go to Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection -&amp;gt; Advanced Settings -&amp;gt; Inbound Rules -&amp;gt; New Rule...&lt;br /&gt;
** Select &amp;quot;Port&amp;quot;&lt;br /&gt;
** Set &amp;quot;Specific local ports&amp;quot; to 873 &lt;br /&gt;
** Select &amp;quot;Allow the connection&amp;quot;&lt;br /&gt;
** Select only &amp;quot;Private&amp;quot;&lt;br /&gt;
** Set the &amp;quot;Name&amp;quot; to &amp;quot;rsync&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Running rsyncd automatically ==&lt;br /&gt;
* Install DeltaCopy Server from http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp&lt;br /&gt;
** Leave the username/password blank and then follow: http://www.aboutmyip.com/AboutMyXApp/DisplayFAQ.do?fid=22. Simply set the user to &amp;quot;Local System&amp;quot;.&lt;br /&gt;
* Add an application rule for rsync.exe in Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection&lt;br /&gt;
&lt;br /&gt;
== Renaming networks ==&lt;br /&gt;
https://www.ghacks.net/2021/10/25/how-to-change-network-names-on-windows-11/&lt;br /&gt;
&lt;br /&gt;
== Virpil CM3 Throttle ==&lt;br /&gt;
https://www.youtube.com/watch?v=JDSk2oADsZg&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8584</id>
		<title>Windows 10 Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8584"/>
				<updated>2025-10-22T15:12:08Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Running rsyncd automatically */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Monitor Switcher ==&lt;br /&gt;
https://sourceforge.net/projects/monitorswitcher/&lt;br /&gt;
&lt;br /&gt;
== Monitor Test Patterns ==&lt;br /&gt;
* Limited vs. Full Range: http://www.lagom.nl/lcd-test/img/blacktest.png&lt;br /&gt;
* Chroma Subsampling: https://www.rtings.com/images/test-materials/2017/chroma-444.png&lt;br /&gt;
&lt;br /&gt;
== Setup MPC-BE ==&lt;br /&gt;
* MPC-BE: https://chamconsoft.com/cmc/forums/?w3=dmlld3RvcGljLnBocD90PTE5Nw==&lt;br /&gt;
* madVR: https://forum.kodi.tv/showthread.php?tid=259188&lt;br /&gt;
&lt;br /&gt;
== Rename Network ==&lt;br /&gt;
https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/&lt;br /&gt;
&lt;br /&gt;
== Installing WSL ==&lt;br /&gt;
https://docs.microsoft.com/en-us/windows/wsl/install-win10&lt;br /&gt;
&lt;br /&gt;
Note: If you see Error 0x80370102, you may need to enable virtualization in your motherboard BIOS: https://ourcodeworld.com/articles/read/1283/how-to-enable-amd-virtualization-on-the-aorus-x570-motherboard&lt;br /&gt;
&lt;br /&gt;
=== Running rsyncd automatically (DEPRECATED) ===&lt;br /&gt;
* Set '''RSYNC_ENABLE=true''' in ''/etc/default/rsync''&lt;br /&gt;
* Create ''/etc/rsyncd.conf'' with the contents (for example):&lt;br /&gt;
  [users]&lt;br /&gt;
      path = /mnt/c/Users&lt;br /&gt;
      comment = Users&lt;br /&gt;
      read only = true&lt;br /&gt;
* WSL2 virtual machines run on a separate NATed network, so we need to forward the rsync port from the real LAN to the virtual machine:&lt;br /&gt;
  netsh interface portproxy add v4tov4 listenport=873 listenaddress=0.0.0.0 connectport=873 connectaddress=127.0.0.1&lt;br /&gt;
* Go to Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection -&amp;gt; Advanced Settings -&amp;gt; Inbound Rules -&amp;gt; New Rule...&lt;br /&gt;
** Select &amp;quot;Port&amp;quot;&lt;br /&gt;
** Set &amp;quot;Specific local ports&amp;quot; to 873 &lt;br /&gt;
** Select &amp;quot;Allow the connection&amp;quot;&lt;br /&gt;
** Select only &amp;quot;Private&amp;quot;&lt;br /&gt;
** Set the &amp;quot;Name&amp;quot; to &amp;quot;rsync&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Running rsyncd automatically ==&lt;br /&gt;
* Install DeltaCopy Server from http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp&lt;br /&gt;
** For problems with starting the service: http://www.aboutmyip.com/AboutMyXApp/DisplayFAQ.do?fid=22. Simply set the user to &amp;quot;Local System&amp;quot;.&lt;br /&gt;
* Add an application rule for rsync.exe in Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection&lt;br /&gt;
&lt;br /&gt;
== Renaming networks ==&lt;br /&gt;
https://www.ghacks.net/2021/10/25/how-to-change-network-names-on-windows-11/&lt;br /&gt;
&lt;br /&gt;
== Virpil CM3 Throttle ==&lt;br /&gt;
https://www.youtube.com/watch?v=JDSk2oADsZg&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8583</id>
		<title>Windows 10 Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8583"/>
				<updated>2025-10-22T15:11:58Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Running rsyncd automatically */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Monitor Switcher ==&lt;br /&gt;
https://sourceforge.net/projects/monitorswitcher/&lt;br /&gt;
&lt;br /&gt;
== Monitor Test Patterns ==&lt;br /&gt;
* Limited vs. Full Range: http://www.lagom.nl/lcd-test/img/blacktest.png&lt;br /&gt;
* Chroma Subsampling: https://www.rtings.com/images/test-materials/2017/chroma-444.png&lt;br /&gt;
&lt;br /&gt;
== Setup MPC-BE ==&lt;br /&gt;
* MPC-BE: https://chamconsoft.com/cmc/forums/?w3=dmlld3RvcGljLnBocD90PTE5Nw==&lt;br /&gt;
* madVR: https://forum.kodi.tv/showthread.php?tid=259188&lt;br /&gt;
&lt;br /&gt;
== Rename Network ==&lt;br /&gt;
https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/&lt;br /&gt;
&lt;br /&gt;
== Installing WSL ==&lt;br /&gt;
https://docs.microsoft.com/en-us/windows/wsl/install-win10&lt;br /&gt;
&lt;br /&gt;
Note: If you see Error 0x80370102, you may need to enable virtualization in your motherboard BIOS: https://ourcodeworld.com/articles/read/1283/how-to-enable-amd-virtualization-on-the-aorus-x570-motherboard&lt;br /&gt;
&lt;br /&gt;
=== Running rsyncd automatically (DEPRECATED) ===&lt;br /&gt;
* Set '''RSYNC_ENABLE=true''' in ''/etc/default/rsync''&lt;br /&gt;
* Create ''/etc/rsyncd.conf'' with the contents (for example):&lt;br /&gt;
  [users]&lt;br /&gt;
      path = /mnt/c/Users&lt;br /&gt;
      comment = Users&lt;br /&gt;
      read only = true&lt;br /&gt;
* WSL2 virtual machines run on a separate NATed network, so we need to forward the rsync port from the real LAN to the virtual machine:&lt;br /&gt;
  netsh interface portproxy add v4tov4 listenport=873 listenaddress=0.0.0.0 connectport=873 connectaddress=127.0.0.1&lt;br /&gt;
* Go to Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection -&amp;gt; Advanced Settings -&amp;gt; Inbound Rules -&amp;gt; New Rule...&lt;br /&gt;
** Select &amp;quot;Port&amp;quot;&lt;br /&gt;
** Set &amp;quot;Specific local ports&amp;quot; to 873 &lt;br /&gt;
** Select &amp;quot;Allow the connection&amp;quot;&lt;br /&gt;
** Select only &amp;quot;Private&amp;quot;&lt;br /&gt;
** Set the &amp;quot;Name&amp;quot; to &amp;quot;rsync&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Running rsyncd automatically ==&lt;br /&gt;
* Install DeltaCopy Server from http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp&lt;br /&gt;
** For problems with starting the service: http://www.aboutmyip.com/AboutMyXApp/DisplayFAQ.do?fid=22. Simply set the user to &amp;quot;Local System&amp;quot;&lt;br /&gt;
* Add an application rule for rsync.exe in Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection&lt;br /&gt;
&lt;br /&gt;
== Renaming networks ==&lt;br /&gt;
https://www.ghacks.net/2021/10/25/how-to-change-network-names-on-windows-11/&lt;br /&gt;
&lt;br /&gt;
== Virpil CM3 Throttle ==&lt;br /&gt;
https://www.youtube.com/watch?v=JDSk2oADsZg&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8582</id>
		<title>Windows 10 Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8582"/>
				<updated>2025-10-22T15:06:45Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Running rsyncd automatically */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Monitor Switcher ==&lt;br /&gt;
https://sourceforge.net/projects/monitorswitcher/&lt;br /&gt;
&lt;br /&gt;
== Monitor Test Patterns ==&lt;br /&gt;
* Limited vs. Full Range: http://www.lagom.nl/lcd-test/img/blacktest.png&lt;br /&gt;
* Chroma Subsampling: https://www.rtings.com/images/test-materials/2017/chroma-444.png&lt;br /&gt;
&lt;br /&gt;
== Setup MPC-BE ==&lt;br /&gt;
* MPC-BE: https://chamconsoft.com/cmc/forums/?w3=dmlld3RvcGljLnBocD90PTE5Nw==&lt;br /&gt;
* madVR: https://forum.kodi.tv/showthread.php?tid=259188&lt;br /&gt;
&lt;br /&gt;
== Rename Network ==&lt;br /&gt;
https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/&lt;br /&gt;
&lt;br /&gt;
== Installing WSL ==&lt;br /&gt;
https://docs.microsoft.com/en-us/windows/wsl/install-win10&lt;br /&gt;
&lt;br /&gt;
Note: If you see Error 0x80370102, you may need to enable virtualization in your motherboard BIOS: https://ourcodeworld.com/articles/read/1283/how-to-enable-amd-virtualization-on-the-aorus-x570-motherboard&lt;br /&gt;
&lt;br /&gt;
=== Running rsyncd automatically (DEPRECATED) ===&lt;br /&gt;
* Set '''RSYNC_ENABLE=true''' in ''/etc/default/rsync''&lt;br /&gt;
* Create ''/etc/rsyncd.conf'' with the contents (for example):&lt;br /&gt;
  [users]&lt;br /&gt;
      path = /mnt/c/Users&lt;br /&gt;
      comment = Users&lt;br /&gt;
      read only = true&lt;br /&gt;
* WSL2 virtual machines run on a separate NATed network, so we need to forward the rsync port from the real LAN to the virtual machine:&lt;br /&gt;
  netsh interface portproxy add v4tov4 listenport=873 listenaddress=0.0.0.0 connectport=873 connectaddress=127.0.0.1&lt;br /&gt;
* Go to Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection -&amp;gt; Advanced Settings -&amp;gt; Inbound Rules -&amp;gt; New Rule...&lt;br /&gt;
** Select &amp;quot;Port&amp;quot;&lt;br /&gt;
** Set &amp;quot;Specific local ports&amp;quot; to 873 &lt;br /&gt;
** Select &amp;quot;Allow the connection&amp;quot;&lt;br /&gt;
** Select only &amp;quot;Private&amp;quot;&lt;br /&gt;
** Set the &amp;quot;Name&amp;quot; to &amp;quot;rsync&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Running rsyncd automatically ==&lt;br /&gt;
* Install DeltaCopy Server from http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp&lt;br /&gt;
** For problems with starting the service: http://www.aboutmyip.com/AboutMyXApp/DisplayFAQ.do?fid=22&lt;br /&gt;
* Add an application rule for rsync.exe in Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection&lt;br /&gt;
&lt;br /&gt;
== Renaming networks ==&lt;br /&gt;
https://www.ghacks.net/2021/10/25/how-to-change-network-names-on-windows-11/&lt;br /&gt;
&lt;br /&gt;
== Virpil CM3 Throttle ==&lt;br /&gt;
https://www.youtube.com/watch?v=JDSk2oADsZg&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Snapshot_backups_using_rsync&amp;diff=8581</id>
		<title>Snapshot backups using rsync</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Snapshot_backups_using_rsync&amp;diff=8581"/>
				<updated>2025-10-22T14:44:43Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Example 3: Backup of C:\Documents and Settings on alaska */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Intro ==&lt;br /&gt;
The scripts on this page are designed to allow the backup of a set of directories to a defined location, with the backups preserving the state of those directories from a number of different times in the past. They require a linux box with a free disk partition to act as the backup server, and the instructions below are designed for Ubuntu, so other distros may require slightly different steps. In summary, they will give you a snapshot directory with contents would look something like (as of 26th Sept 2006):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Contents of /mnt/snapshot:&lt;br /&gt;
drwxr-xr-x 7 root root  4096 2006-09-26 00:01 daily.0&lt;br /&gt;
drwxr-xr-x 7 root root  4096 2006-09-25 00:00 daily.1&lt;br /&gt;
drwxr-xr-x 7 root root  4096 2006-09-24 00:00 daily.2&lt;br /&gt;
drwxr-xr-x 7 root root  4096 2006-09-23 00:00 daily.3&lt;br /&gt;
drwxr-xr-x 7 root root  4096 2006-09-22 00:00 weekly.0&lt;br /&gt;
drwxr-xr-x 5 root root  4096 2006-09-15 00:00 weekly.1&lt;br /&gt;
drwxr-xr-x 2 root root  4096 2006-09-08 00:00 weekly.2&lt;br /&gt;
drwxr-xr-x 2 root root  4096 2006-09-01 00:00 monthly.0&lt;br /&gt;
drwxr-xr-x 2 root root  4096 2006-08-01 00:00 monthly.1&lt;br /&gt;
drwxr-xr-x 2 root root  4096 2006-01-01 00:00 annual.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note the timestamps of these directories - each one captures the state of the location(s) to be backed up at the time shown.&lt;br /&gt;
The actual backup process uses [http://samba.anu.edu.au/rsync/ rsync] and hard links to ensure that if a file doesn't change between two snapshots, then it doesn't take up any additional space (well, virtually no more space).&lt;br /&gt;
The contents of this page are based on Mike Rubel's instructions at: http://www.mikerubel.org/computers/rsync_snapshots/ - if you find difficulty understanding/using the scripts here, then you may wish to look at his page for additional help.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
* Install '''rsync''' and '''nfs-kernel-server''' with apt-get (eg. ''sudo apt-get install rsync'')&lt;br /&gt;
* http://bretts.org/files/snapshot.tar.bz2&lt;br /&gt;
&lt;br /&gt;
== Instructions ==&lt;br /&gt;
* Unzip the contents of '''snapshot.tar.bz2''' to a temporary directory.&lt;br /&gt;
* As root, copy the files and directories from the temporary directory to the implied filesystem location (eg. snapshot/etc/cron.d/snapshot -&amp;gt; /etc/cron.d/snapshot, snapshot/var/log/snapshot -&amp;gt; /var/log/snapshot etc.)&lt;br /&gt;
* As root, create the directories '''/root/.snapshot''' and '''/mnt/snapshot'''&lt;br /&gt;
* Add the following lines to '''/etc/fstab''', substituting your free disk partition, and it's filesystem type, for '''/dev/hdb1''' and '''ext3''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/hdb1                   /root/.snapshot   ext3          ro              0       2&lt;br /&gt;
localhost:/root/.snapshot   /mnt/snapshot     nfs           ro              0       2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
: (This mounts your backup partition as /root/.snapshot, away from prying eyes, and mounts the NFS exported version of it as /mnt/snapshot. We mount it twice so that non-root users NEVER see a writable version of the backup directory - see Mike Rubels page for more details.)&lt;br /&gt;
* Add the following line to '''/etc/exports''' (or create '''/etc/exports''' with this line if it doesn't already exist):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/root/.snapshot 127.0.0.1(secure,sync,ro,no_root_squash)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
: (This defines the NFS share that we will mount as '''/mnt/snapshot''')&lt;br /&gt;
* Restart nfs-kernel-server (using ''sudo /etc/init.d/nfs-kernel-server restart'').&lt;br /&gt;
&lt;br /&gt;
== Defining areas to be backed up ==&lt;br /&gt;
* For each directory tree to be backed up, create a directory in '''/etc/snapshot''' with a logical name for the backup (the name doesn't matter, as long as it's unique).&lt;br /&gt;
* Within the newly created directory, created a file called '''location''' (eg. '''/etc/snapshot/my-backup/location'''), the contents of which should be a single line defining the head of the directory tree to be backed up. This line may be in one of 3 formats:&lt;br /&gt;
** For a local directory, simply the fully qualified path to the location to back up (eg. '''/home/fred/docs''')&lt;br /&gt;
** For a remote directory accessed via an rsync daemon running on the remote machine, the location in the format ''machinename''::''rsync_module''/''subdirectory'' (eg. '''xp-box::c/Documents and Settings''')&lt;br /&gt;
** For a remote directory accessed via an ssh server running on the remote machine, the location in the format ''machinename'':''path'' (eg. '''other-host:/usr/local/src''')&lt;br /&gt;
: For remote hosts, an rsync daemon is generally preferable, both for performance reasons, and for ease of use. If ssh is to be used, ssh keys will need to be defined to stop the scripts prompting for a password whenever they're run. However, if the data is being transferred between hosts across an insecure network, ssh may be needed for reasons of security (rsync transmits data between hosts unencrypted, and has a simplistic security model).&lt;br /&gt;
* Also within the directory, create a file called '''filters''' (eg. '''/etc/snapshot/my-backup/filters'''), which may contain multiple lines prefixed with a '''-''' to specify locations to exclude from the backup. This file is simply in rsync filters file format (see the rsync man page for more details).&lt;br /&gt;
&lt;br /&gt;
Each one of the locations specified within '''/etc/snapshot''' will end up as a subdirectory of '''/mnt/snapshot''' (eg. this morning's backup of /home/fred will end up in '''/mnt/snapshot/daily.0/home/fred''').&lt;br /&gt;
&lt;br /&gt;
=== Example 1: Backup of /home ===&lt;br /&gt;
'''/etc/snapshot/home/location''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''/etc/snapshot/home/filters''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- /andrew/Download/&lt;br /&gt;
- /andrew/svn/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Example 2: Backup of /etc ===&lt;br /&gt;
'''/etc/snapshot/etc/location''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''/etc/snapshot/etc/filters''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Note that filters file is empty, since no subdirectories of /etc are excluded from the backup.&lt;br /&gt;
&lt;br /&gt;
=== Example 3: Backup of C:\Documents and Settings on alaska ===&lt;br /&gt;
Note that alaska is an XP box running an [[Windows_10_Tips#Running_rsyncd_automatically|rsync daemon]].&amp;lt;br&amp;gt;&lt;br /&gt;
'''/etc/snapshot/alaska-home/location''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
alaska::c/Documents and Settings&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
'''/etc/snapshot/alaska-home/filters''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- /*/Local Settings/Temp&lt;br /&gt;
- /*/Local Settings/Temporary Internet Files&lt;br /&gt;
- /Andrew/My Documents/Downloads&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Further Examples ===&lt;br /&gt;
These and other examples can be found in http://bretts.org/files/snapshot-examples.tar.bz2&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
* The partition used for /root/.snapshot should ideally be on a different disk to the files being backed up, to reduce the risk of a disk failure destroying both the data and the backups.&lt;br /&gt;
* The scripts can be used without defining /root/.snapshot as a separate partition, subject to the caveat about separate disks directly above. To do this, simply:&lt;br /&gt;
** Don't add the first of the two lines above to '''/etc/fstab'''&lt;br /&gt;
** In each of the snapshot scripts within '''/usr/local/sbin''' remove the calls near the beginning and end of the file to remount the /root/.snapshot partition (the beginning of each script remounts this partition as read/write, and the end remounts it as read).&lt;br /&gt;
&lt;br /&gt;
== Setting up a machine with an rsync daemon ==&lt;br /&gt;
* Edit /etc/xinetd.d/rsync and add:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
service rsync&lt;br /&gt;
{&lt;br /&gt;
        disable         = no&lt;br /&gt;
        socket_type     = stream&lt;br /&gt;
        wait            = no&lt;br /&gt;
        user            = root&lt;br /&gt;
        server          = /usr/bin/rsync&lt;br /&gt;
        server_args     = --daemon&lt;br /&gt;
        log_on_failure  += USERID&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Edit /etc/rsyncd.conf and add (for example):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
use chroot = false&lt;br /&gt;
strict modes = false&lt;br /&gt;
hosts allow = 192.168.1.0/24&lt;br /&gt;
&lt;br /&gt;
[root]&lt;br /&gt;
    path = /&lt;br /&gt;
    comment = Root&lt;br /&gt;
    read only = true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Restart rsync&lt;br /&gt;
&lt;br /&gt;
== Future Development ==&lt;br /&gt;
* It would be nice to have the latest backup burnt to a DVD-RW which could be left in a dedicated DVD-RW drive attached to the backup server. This would help both because DVDs are more robust than hard drives in certain situations (eg. mechanical shock) in case of a problem (eg. power surge) which for some reason destroyed multiple drives on the machine. In addition, the DVD disk could be swapped out periodically to provide an off-site backup copy.&lt;br /&gt;
* Some companies provide free or low cost disk space online - this could be used to store a copy of the latest backup for even greater robustness. In addition, since the process uses rsync, unless large numbers of backed up files were changing on a daily basis, there would be relatively little network traffic once the initial backup was rsynced across to the remote site.&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8580</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8580"/>
				<updated>2025-09-19T15:35:02Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Overseerr (Media Requests) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
  sudo docker run -d --name overseerr --user=127:138 -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
    -e PORT=5055 `#optional` \&lt;br /&gt;
    -p 5055:5055 \&lt;br /&gt;
    -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8579</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8579"/>
				<updated>2025-09-19T15:33:37Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Overseerr (Media Requests) ===&lt;br /&gt;
sudo docker run -d --name overseerr --user=torrent:torrent -e LOG_LEVEL=debug -e TZ=Europe/London \&lt;br /&gt;
  -e PORT=5055 `#optional` \&lt;br /&gt;
  -p 5055:5055 \&lt;br /&gt;
  -v /var/lib/torrent/overseerr/config:/app/config \&lt;br /&gt;
  --restart unless-stopped \&lt;br /&gt;
  sctx/overseerr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=SnapRAID_/_MergerFS&amp;diff=8578</id>
		<title>SnapRAID / MergerFS</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=SnapRAID_/_MergerFS&amp;diff=8578"/>
				<updated>2025-08-21T05:28:46Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Identifying/Fixing a bad block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SnapRAID / MergerFS =&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
https://zackreed.me/setting-up-snapraid-on-ubuntu/&lt;br /&gt;
&lt;br /&gt;
Note that if (like me) you use a dedicated snapraid content directory then you'll need to create that by hand for each disk with:&lt;br /&gt;
&lt;br /&gt;
  mkdir /mnt/data/disk1/.snapraid&lt;br /&gt;
&lt;br /&gt;
== Partitioning a new data disk ==&lt;br /&gt;
Note: &amp;quot;-m 2&amp;quot; here reserves 2% of the filesystem for root-owned files (eg. .../.snapraid/content)&lt;br /&gt;
  sudo parted -a optimal -s /dev/sdX -- mklabel gpt mkpart primary 0% 100%&lt;br /&gt;
  sudo mkfs.ext4 -m 2 -T largefile4 /dev/sdX1&lt;br /&gt;
&lt;br /&gt;
== Partitioning a new parity disk ==&lt;br /&gt;
Note: &amp;quot;-m 0&amp;quot; here reserves 0% of the filesystem, ensuring that the parity disks are slightly larger than the data disks&lt;br /&gt;
  sudo parted -a optimal -s /dev/sdX -- mklabel gpt mkpart primary 0% 100%&lt;br /&gt;
  sudo mkfs.ext4 -m 0 -T largefile4 /dev/sdX1&lt;br /&gt;
&lt;br /&gt;
== Adding a new data disk to mergerfs ==&lt;br /&gt;
From: https://zackreed.me/mergerfs-neat-tricks/&lt;br /&gt;
From within the root of the mergerfs filesystem (eg. /srv)&lt;br /&gt;
  xattr -w user.mergerfs.srcmounts '+&amp;gt;/mnt/data/disk4/srv' .mergerfs&lt;br /&gt;
&lt;br /&gt;
== Removing a data disk from mergerfs ==&lt;br /&gt;
From within the root of the mergerfs filesystem (eg. /srv)&lt;br /&gt;
  xattr -w user.mergerfs.srcmounts '-/mnt/data/disk4/srv' .mergerfs&lt;br /&gt;
&lt;br /&gt;
== Forcing a resync ==&lt;br /&gt;
&lt;br /&gt;
  sudo snapraid sync&lt;br /&gt;
&lt;br /&gt;
== Identifying/Fixing a bad block ==&lt;br /&gt;
* Run ddrescue to identify the failing bytes on the disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ddrescue --ask --verbose --binary-prefixes --idirect --force /dev/sdX /dev/null sdX.map &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ddrescue will write out a map file containing start positions and sizes (all in bytes) of good (+) and bad (-) byte ranges&lt;br /&gt;
* Get the block size for the volume with &amp;lt;code&amp;gt;tune2fs -l /dev/sdXY | grep &amp;quot;Block size&amp;quot;&amp;lt;/code&amp;gt; (we'll call this '''B'''). In my case this is 4096.&lt;br /&gt;
* Get the sector size for the disk with &amp;lt;code&amp;gt;fdisk -l /dev/sdX | grep Units&amp;lt;/code&amp;gt; (we'll call this '''S'''). In my case this is 512.&lt;br /&gt;
* Identify the starting sector for the /dev/sdXY volume (eg. /dev/sda1) with &amp;lt;code&amp;gt;fdisk -l /dev/sdX&amp;lt;/code&amp;gt; (we'll call this '''T'''). In my case this is 2048.&lt;br /&gt;
* Run ddrescuelog to list out the bad block locations (using the block size B):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ddrescuelog -b B --list-blocks=- sdX.map&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* For each of these, convert to a block location in the volume (rather than the disk) by subtracting &amp;lt;code&amp;gt;(T * S / B)&amp;lt;/code&amp;gt;. In my case that's 256. Let's call each of these bad volume blocks '''BB'''&lt;br /&gt;
* Start debugfs for the volume with :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debugfs /dev/sdXY&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* For each '''BB''' run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testb BB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If debugfs returns &amp;quot;Block BB not in use&amp;quot;, then that block isn't part of a file and can safely be overwritten. If it returns &amp;quot;Block BB marked in use&amp;quot; then we need to get an inode number (we'll call it '''I''') and convert that inode number to a file path with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
icheck BB&lt;br /&gt;
ncheck I&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For any unused blocks, we need to do the following:&lt;br /&gt;
* Check with dd that we’ve got the right block IDs. For each one of these reads we expect to see an error (and “0+0 records in”):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b B --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  dd if=/dev/sdX of=/dev/null count=1 bs=B skip=$block&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* For each of the bad blocks, write zeros over the block to force it to be reallocated from spare space on the drive. Be careful here – getting it wrong will destroy data! Also note that when reading, “skip” is used to position the input stream, but here “seek” is used to position the output stream:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b B --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  dd if=/dev/zero of=/dev/sdX count=1 bs=B seek=$block&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* It’s possible that dd will fail to write to the block, in which case try again with hdparm:&lt;br /&gt;
&lt;br /&gt;
** First check that we’ve got the right sectors (we expect to see “SG_IO: bad/missing sense data” for each sector on stderr, so we pipe stdout to /dev/null to avoid noise). Note that we use '''S''' as the block size for ddrescuelog, since hdparm deals in sectors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b S --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  hdparm --read-sector $block /dev/sdX &amp;gt; /dev/null&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** Assuming we’ve seen the expected errors, write zeros over each of the bad sectors. Note that we use '''S''' as the block size for ddrescuelog, since hdparm deals in sectors. Be careful here – getting it wrong will destroy data! You may be asked to add a “—yes-i-know-what-i-am-doing” flag.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b S --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  hdparm --write-sector $block /dev/sdX&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check that the number of failing sectors has decreased:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smartctl -a /dev/sdX | grep Pending&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For any files reported by `debugfs`:&lt;br /&gt;
* Write random data over the bad file, which should force the pending sector to be marked bad and reallocated from spare space on the disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shred -n 1 –v /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check that the number of failing sectors has decreased:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smartctl -a /dev/sdX | grep Pending&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Assuming the number of pending sectors has decreased, it’s then ok to delete the bad file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Restore the deleted file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snapraid fix -f /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More details:&lt;br /&gt;
* https://www.smartmontools.org/wiki/BadBlockHowto&lt;br /&gt;
* [[Mdadm#Repairing_failing_disk_on_degraded_array]]&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=SnapRAID_/_MergerFS&amp;diff=8577</id>
		<title>SnapRAID / MergerFS</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=SnapRAID_/_MergerFS&amp;diff=8577"/>
				<updated>2025-08-21T04:53:10Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Identifying/Fixing a bad block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= SnapRAID / MergerFS =&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
https://zackreed.me/setting-up-snapraid-on-ubuntu/&lt;br /&gt;
&lt;br /&gt;
Note that if (like me) you use a dedicated snapraid content directory then you'll need to create that by hand for each disk with:&lt;br /&gt;
&lt;br /&gt;
  mkdir /mnt/data/disk1/.snapraid&lt;br /&gt;
&lt;br /&gt;
== Partitioning a new data disk ==&lt;br /&gt;
Note: &amp;quot;-m 2&amp;quot; here reserves 2% of the filesystem for root-owned files (eg. .../.snapraid/content)&lt;br /&gt;
  sudo parted -a optimal -s /dev/sdX -- mklabel gpt mkpart primary 0% 100%&lt;br /&gt;
  sudo mkfs.ext4 -m 2 -T largefile4 /dev/sdX1&lt;br /&gt;
&lt;br /&gt;
== Partitioning a new parity disk ==&lt;br /&gt;
Note: &amp;quot;-m 0&amp;quot; here reserves 0% of the filesystem, ensuring that the parity disks are slightly larger than the data disks&lt;br /&gt;
  sudo parted -a optimal -s /dev/sdX -- mklabel gpt mkpart primary 0% 100%&lt;br /&gt;
  sudo mkfs.ext4 -m 0 -T largefile4 /dev/sdX1&lt;br /&gt;
&lt;br /&gt;
== Adding a new data disk to mergerfs ==&lt;br /&gt;
From: https://zackreed.me/mergerfs-neat-tricks/&lt;br /&gt;
From within the root of the mergerfs filesystem (eg. /srv)&lt;br /&gt;
  xattr -w user.mergerfs.srcmounts '+&amp;gt;/mnt/data/disk4/srv' .mergerfs&lt;br /&gt;
&lt;br /&gt;
== Removing a data disk from mergerfs ==&lt;br /&gt;
From within the root of the mergerfs filesystem (eg. /srv)&lt;br /&gt;
  xattr -w user.mergerfs.srcmounts '-/mnt/data/disk4/srv' .mergerfs&lt;br /&gt;
&lt;br /&gt;
== Forcing a resync ==&lt;br /&gt;
&lt;br /&gt;
  sudo snapraid sync&lt;br /&gt;
&lt;br /&gt;
== Identifying/Fixing a bad block ==&lt;br /&gt;
* Run ddrescue to identify the failing bytes on the disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ddrescue --ask --verbose --binary-prefixes --idirect --force /dev/sdX /dev/null sdX.map &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ddrescue will write out a map file containing start positions and sizes (all in bytes) of good (+) and bad (-) byte ranges&lt;br /&gt;
* Get the block size for the volume with &amp;lt;code&amp;gt;tune2fs -l /dev/sdXY | grep &amp;quot;Block size&amp;quot;&amp;lt;/code&amp;gt; (we'll call this '''B'''). In my case this is 4096.&lt;br /&gt;
* Get the sector size for the disk with &amp;lt;code&amp;gt;fdisk -l /dev/sdX | grep Units&amp;lt;/code&amp;gt; (we'll call this '''S'''). In my case this is 512.&lt;br /&gt;
* Identify the starting sector for the /dev/sdXY volume (eg. /dev/sda1) with &amp;lt;code&amp;gt;fdisk -l /dev/sdX&amp;lt;/code&amp;gt; (we'll call this '''T'''). In my case this is 2048.&lt;br /&gt;
* Run ddrescuelog to list out the bad block locations (using the block size B):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ddrescuelog -b B --list-blocks=- sdX.map&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* For each of these, convert to a block location in the volume (rather than the disk) by subtracting &amp;lt;code&amp;gt;(T * S / B)&amp;lt;/code&amp;gt;. In my case that's 256. Let's call each of these bad volume blocks '''BB'''&lt;br /&gt;
* Start debugfs for the volume with :&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debugfs /dev/sdXY&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* For each '''BB''' run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
testb BB&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* If debugfs returns &amp;quot;Block BB not in use&amp;quot;, then that block isn't part of a file and can safely be overwritten. If it returns &amp;quot;Block BB marked in use&amp;quot; then we need to get an inode number (we'll call it '''I''') and convert that inode number to a file path with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
icheck BB&lt;br /&gt;
ncheck I&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For any unused blocks, we need to do the following:&lt;br /&gt;
* Check with dd that we’ve got the right block IDs. For each one of these reads we expect to see an error (and “0+0 records in”):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b B --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  dd if=/dev/sdX of=/dev/null count=1 bs=B skip=$block&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* For each of the bad blocks, write zeros over the block to force it to be reallocated from spare space on the drive. Be careful here – getting it wrong will destroy data! Also note that when reading, “skip” is used to position the input stream, but here “seek” is used to position the output stream:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b B --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  dd if=/dev/zero of=/dev/sdX count=1 bs=B seek=$block&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* It’s possible that dd will fail to write to the block, in which case try again with hdparm:&lt;br /&gt;
&lt;br /&gt;
** First check that we’ve got the right sectors (we expect to see “SG_IO: bad/missing sense data” for each sector on stderr, so we pipe stdout to /dev/null to avoid noise). Note that we use '''S''' as the block size for ddrescuelog, since hdparm deals in sectors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b S --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  hdparm --read-sector $block /dev/sdX &amp;gt; /dev/null&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
** Assuming we’ve seen the expected errors, write zeros over each of the bad sectors. Note that we use '''S''' as the block size for ddrescuelog, since hdparm deals in sectors. Be careful here – getting it wrong will destroy data! You may be asked to add a “—yes-i-know-what-i-am-doing” flag.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for block in `ddrescuelog -b S --list-blocks=- sdX.map`&lt;br /&gt;
do&lt;br /&gt;
  hdparm --write-sector $block /dev/sdX&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check that the number of failing sectors has decreased:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smartctl -a /dev/sdX | grep Pending&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For any files reported by `debugfs`:&lt;br /&gt;
* Write random data over the bad file, which should force the pending sector to be marked bad and reallocated from spare space on the disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shred –v /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Check that the number of failing sectors has decreased:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
smartctl –a /dev/sdX | grep Pending&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Assuming the number of pending sectors has decreased, it’s then ok to delete the bad file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /path/to/bad/file&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
More details:&lt;br /&gt;
* https://www.smartmontools.org/wiki/BadBlockHowto&lt;br /&gt;
* [[Mdadm#Repairing_failing_disk_on_degraded_array]]&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8576</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8576"/>
				<updated>2025-08-12T07:39:07Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Saber Controls (ProffieOS 7) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
Backup: \\maine\andrew\Documents\Saber&lt;br /&gt;
Config File: ProffieOS\config\e29a-*.h&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
* Obi-Wan Kenobi (Episode 3)&lt;br /&gt;
* Mace Windu&lt;br /&gt;
* Anakin Skywalker&lt;br /&gt;
* Darth Maul&lt;br /&gt;
* Luke Skywalker (Episode 4)&lt;br /&gt;
* Luke Skywalker (Episode 6)&lt;br /&gt;
* Darth Vader&lt;br /&gt;
* Rey Skywalker&lt;br /&gt;
* Kylo Ren&lt;br /&gt;
* The Mandalorian&lt;br /&gt;
* Cal Kestis&lt;br /&gt;
* Pod Racer&lt;br /&gt;
* Heavy Blade&lt;br /&gt;
* Speeder Bike&lt;br /&gt;
* Seethe&lt;br /&gt;
* Coda&lt;br /&gt;
* Ghostbusters&lt;br /&gt;
* Star Trek&lt;br /&gt;
* Rainbow&lt;br /&gt;
&lt;br /&gt;
=== Blade Off ===&lt;br /&gt;
;PWR&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;PWR (Hold) + AUX&lt;br /&gt;
:Volume&lt;br /&gt;
:'''Turn Right''': Increase Volume&lt;br /&gt;
:'''Turn Left''': Decrease Volume&lt;br /&gt;
:'''PWR'''/'''AUX''': Exit&lt;br /&gt;
---&lt;br /&gt;
;AUX (Click)&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Long Click)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''PWR''': Select Preset and Exit&lt;br /&gt;
:'''AUX''': Select First Preset and Exit&lt;br /&gt;
;AUX (Hold) + PWR (Click)&lt;br /&gt;
:Battery Level&lt;br /&gt;
&lt;br /&gt;
=== Blade On ===&lt;br /&gt;
;PWR&lt;br /&gt;
:Extinguish Blade&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Lockup&lt;br /&gt;
;PWR (Hold) + AUX&lt;br /&gt;
:Lightning Block&lt;br /&gt;
---&lt;br /&gt;
;AUX&lt;br /&gt;
:Blaster Deflect&lt;br /&gt;
;AUX (Long Click)&lt;br /&gt;
:Multi-Blast (each swing is a Blaster Deflect)&lt;br /&gt;
:'''AUX'''/Clash: Exit&lt;br /&gt;
;AUX (Hold) + Stab Down&lt;br /&gt;
:Drag&lt;br /&gt;
;AUX (Hold) + Stab Up/Parallel&lt;br /&gt;
:Melt&lt;br /&gt;
---&lt;br /&gt;
;Clash&lt;br /&gt;
:Clash&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8575</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8575"/>
				<updated>2025-08-12T07:18:58Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Blade Off */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
Backup: \\maine\andrew\Documents\Saber&lt;br /&gt;
Config File: ProffieOS\config\e29a-*.h&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
* Obi-Wan Kenobi (Episode 3)&lt;br /&gt;
* Mace Windu&lt;br /&gt;
* Anakin Skywalker&lt;br /&gt;
* Darth Maul&lt;br /&gt;
* Luke Skywalker (Episode 4)&lt;br /&gt;
* Luke Skywalker (Episode 6)&lt;br /&gt;
* Darth Vader&lt;br /&gt;
* Rey Skywalker&lt;br /&gt;
* Kylo Ren&lt;br /&gt;
* The Mandalorian&lt;br /&gt;
* Cal Kestis&lt;br /&gt;
* Pod Racer&lt;br /&gt;
* Heavy Blade&lt;br /&gt;
* Speeder Bike&lt;br /&gt;
* Seethe&lt;br /&gt;
* Coda&lt;br /&gt;
* Ghostbusters&lt;br /&gt;
* Star Trek&lt;br /&gt;
* Rainbow&lt;br /&gt;
&lt;br /&gt;
=== Blade Off ===&lt;br /&gt;
;PWR&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;PWR (Hold) + AUX&lt;br /&gt;
:Volume&lt;br /&gt;
:'''Turn Right''': Increase Volume&lt;br /&gt;
:'''Turn Left''': Decrease Volume&lt;br /&gt;
:'''PWR'''/'''AUX''': Exit&lt;br /&gt;
---&lt;br /&gt;
;AUX (Click)&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Long Click)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''PWR''': Select Preset and Exit&lt;br /&gt;
:'''AUX''': Select First Preset and Exit&lt;br /&gt;
;AUX (Hold) + PWR (Click)&lt;br /&gt;
:Battery Level&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8574</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8574"/>
				<updated>2025-08-12T07:16:45Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Blade Off */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
Backup: \\maine\andrew\Documents\Saber&lt;br /&gt;
Config File: ProffieOS\config\e29a-*.h&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
* Obi-Wan Kenobi (Episode 3)&lt;br /&gt;
* Mace Windu&lt;br /&gt;
* Anakin Skywalker&lt;br /&gt;
* Darth Maul&lt;br /&gt;
* Luke Skywalker (Episode 4)&lt;br /&gt;
* Luke Skywalker (Episode 6)&lt;br /&gt;
* Darth Vader&lt;br /&gt;
* Rey Skywalker&lt;br /&gt;
* Kylo Ren&lt;br /&gt;
* The Mandalorian&lt;br /&gt;
* Cal Kestis&lt;br /&gt;
* Pod Racer&lt;br /&gt;
* Heavy Blade&lt;br /&gt;
* Speeder Bike&lt;br /&gt;
* Seethe&lt;br /&gt;
* Coda&lt;br /&gt;
* Ghostbusters&lt;br /&gt;
* Star Trek&lt;br /&gt;
* Rainbow&lt;br /&gt;
&lt;br /&gt;
=== Blade Off ===&lt;br /&gt;
;PWR (Click)&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;AUX (Click)&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Long Click)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''PWR''': Select Preset and Exit&lt;br /&gt;
:'''AUX''': Select First Preset and Exit&lt;br /&gt;
;AUX (Hold) + PWR (Click)&lt;br /&gt;
:Battery Level&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8573</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8573"/>
				<updated>2025-08-12T07:14:42Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* When Off */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
Backup: \\maine\andrew\Documents\Saber&lt;br /&gt;
Config File: ProffieOS\config\e29a-*.h&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
* Obi-Wan Kenobi (Episode 3)&lt;br /&gt;
* Mace Windu&lt;br /&gt;
* Anakin Skywalker&lt;br /&gt;
* Darth Maul&lt;br /&gt;
* Luke Skywalker (Episode 4)&lt;br /&gt;
* Luke Skywalker (Episode 6)&lt;br /&gt;
* Darth Vader&lt;br /&gt;
* Rey Skywalker&lt;br /&gt;
* Kylo Ren&lt;br /&gt;
* The Mandalorian&lt;br /&gt;
* Cal Kestis&lt;br /&gt;
* Pod Racer&lt;br /&gt;
* Heavy Blade&lt;br /&gt;
* Speeder Bike&lt;br /&gt;
* Seethe&lt;br /&gt;
* Coda&lt;br /&gt;
* Ghostbusters&lt;br /&gt;
* Star Trek&lt;br /&gt;
* Rainbow&lt;br /&gt;
&lt;br /&gt;
=== Blade Off ===&lt;br /&gt;
;PWR (Click)&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;AUX (Click)&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Hold)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''AUX''': First Preset&lt;br /&gt;
:'''PWR''': Select Preset&lt;br /&gt;
;AUX (Hold) + PWR (Click)&lt;br /&gt;
:Battery Level&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8572</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8572"/>
				<updated>2025-08-12T07:14:28Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* When Off */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
Backup: \\maine\andrew\Documents\Saber&lt;br /&gt;
Config File: ProffieOS\config\e29a-*.h&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
* Obi-Wan Kenobi (Episode 3)&lt;br /&gt;
* Mace Windu&lt;br /&gt;
* Anakin Skywalker&lt;br /&gt;
* Darth Maul&lt;br /&gt;
* Luke Skywalker (Episode 4)&lt;br /&gt;
* Luke Skywalker (Episode 6)&lt;br /&gt;
* Darth Vader&lt;br /&gt;
* Rey Skywalker&lt;br /&gt;
* Kylo Ren&lt;br /&gt;
* The Mandalorian&lt;br /&gt;
* Cal Kestis&lt;br /&gt;
* Pod Racer&lt;br /&gt;
* Heavy Blade&lt;br /&gt;
* Speeder Bike&lt;br /&gt;
* Seethe&lt;br /&gt;
* Coda&lt;br /&gt;
* Ghostbusters&lt;br /&gt;
* Star Trek&lt;br /&gt;
* Rainbow&lt;br /&gt;
&lt;br /&gt;
=== When Off ===&lt;br /&gt;
;PWR (Click)&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;AUX (Click)&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Hold)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''AUX''': First Preset&lt;br /&gt;
:'''PWR''': Select Preset&lt;br /&gt;
;AUX (Hold) + PWR (Click)&lt;br /&gt;
:Battery Level&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8571</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8571"/>
				<updated>2025-08-12T07:13:28Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* When Off */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
Backup: \\maine\andrew\Documents\Saber&lt;br /&gt;
Config File: ProffieOS\config\e29a-*.h&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
* Obi-Wan Kenobi (Episode 3)&lt;br /&gt;
* Mace Windu&lt;br /&gt;
* Anakin Skywalker&lt;br /&gt;
* Darth Maul&lt;br /&gt;
* Luke Skywalker (Episode 4)&lt;br /&gt;
* Luke Skywalker (Episode 6)&lt;br /&gt;
* Darth Vader&lt;br /&gt;
* Rey Skywalker&lt;br /&gt;
* Kylo Ren&lt;br /&gt;
* The Mandalorian&lt;br /&gt;
* Cal Kestis&lt;br /&gt;
* Pod Racer&lt;br /&gt;
* Heavy Blade&lt;br /&gt;
* Speeder Bike&lt;br /&gt;
* Seethe&lt;br /&gt;
* Coda&lt;br /&gt;
* Ghostbusters&lt;br /&gt;
* Star Trek&lt;br /&gt;
* Rainbow&lt;br /&gt;
&lt;br /&gt;
=== When Off ===&lt;br /&gt;
;PWR (Click)&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:PWR (Long Click): Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;AUX&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Hold)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''AUX''': First Preset&lt;br /&gt;
:'''PWR''': Select Preset&lt;br /&gt;
;AUX (Hold) + PWR (Click)&lt;br /&gt;
:Battery Level&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8570</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8570"/>
				<updated>2025-08-12T07:10:36Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Saber Controls (ProffieOS 7) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Config ===&lt;br /&gt;
Backup: \\maine\andrew\Documents\Saber&lt;br /&gt;
Config File: ProffieOS\config\e29a-*.h&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
* Obi-Wan Kenobi (Episode 3)&lt;br /&gt;
* Mace Windu&lt;br /&gt;
* Anakin Skywalker&lt;br /&gt;
* Darth Maul&lt;br /&gt;
* Luke Skywalker (Episode 4)&lt;br /&gt;
* Luke Skywalker (Episode 6)&lt;br /&gt;
* Darth Vader&lt;br /&gt;
* Rey Skywalker&lt;br /&gt;
* Kylo Ren&lt;br /&gt;
* The Mandalorian&lt;br /&gt;
* Cal Kestis&lt;br /&gt;
* Pod Racer&lt;br /&gt;
* Heavy Blade&lt;br /&gt;
* Speeder Bike&lt;br /&gt;
* Seethe&lt;br /&gt;
* Coda&lt;br /&gt;
* Ghostbusters&lt;br /&gt;
* Star Trek&lt;br /&gt;
* Rainbow&lt;br /&gt;
&lt;br /&gt;
=== When Off ===&lt;br /&gt;
;PWR&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:PWR (Long Click): Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;AUX&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Hold)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''PWR''': Select Preset&lt;br /&gt;
:'''PWR (Long Click)''': Select Preset&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8569</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8569"/>
				<updated>2025-08-12T07:08:21Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Preset List */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
- Obi-Wan Kenobi (Episode 3)&lt;br /&gt;
- Mace Windu&lt;br /&gt;
- Anakin Skywalker&lt;br /&gt;
- Darth Maul&lt;br /&gt;
- Luke Skywalker (Episode 4)&lt;br /&gt;
- Luke Skywalker (Episode 6)&lt;br /&gt;
- Darth Vader&lt;br /&gt;
- Rey Skywalker&lt;br /&gt;
- Kylo Ren&lt;br /&gt;
- The Mandalorian&lt;br /&gt;
- Cal Kestis&lt;br /&gt;
- Pod Racer&lt;br /&gt;
- Heavy Blade&lt;br /&gt;
- Speeder Bike&lt;br /&gt;
- Seethe&lt;br /&gt;
- Coda&lt;br /&gt;
- Ghostbusters&lt;br /&gt;
- Star Trek&lt;br /&gt;
- Rainbow&lt;br /&gt;
&lt;br /&gt;
=== When Off ===&lt;br /&gt;
;PWR&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:PWR (Long Click): Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;AUX&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Hold)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''PWR''': Select Preset&lt;br /&gt;
:'''PWR (Long Click)''': Select Preset&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8568</id>
		<title>Saber Controls</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Saber_Controls&amp;diff=8568"/>
				<updated>2025-08-12T06:57:55Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: Created page with &amp;quot;== Saber Controls (ProffieOS 7) ==  === Preset List === -   === When Off === ;PWR :Ignite Blade ;PWR (Double Click) :Ignite Blade (muted) ;PWR (Long Click - blade up) :Play Tr...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Saber Controls (ProffieOS 7) ==&lt;br /&gt;
&lt;br /&gt;
=== Preset List ===&lt;br /&gt;
- &lt;br /&gt;
&lt;br /&gt;
=== When Off ===&lt;br /&gt;
;PWR&lt;br /&gt;
:Ignite Blade&lt;br /&gt;
;PWR (Double Click)&lt;br /&gt;
:Ignite Blade (muted)&lt;br /&gt;
;PWR (Long Click - blade up)&lt;br /&gt;
:Play Track&lt;br /&gt;
:PWR (Long Click): Stop&lt;br /&gt;
;PWR (Long Click - blade parallel)&lt;br /&gt;
:Track Player&lt;br /&gt;
:'''Turn Right''': Next Track&lt;br /&gt;
:'''Turn Left''': Previous Track&lt;br /&gt;
:'''PWR (Long Click)''': Stop&lt;br /&gt;
;PWR (Hold) + Clash&lt;br /&gt;
:Toggle Gesture Sleep&lt;br /&gt;
;AUX&lt;br /&gt;
:Change Preset&lt;br /&gt;
;AUX (Hold)&lt;br /&gt;
:Scroll Presets&lt;br /&gt;
:'''Turn Right''': Next Preset&lt;br /&gt;
:'''Turn Left''': Previous Preset&lt;br /&gt;
:'''PWR''': Select Preset&lt;br /&gt;
:'''PWR (Long Click)''': Select Preset&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Main_Page&amp;diff=8567</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Main_Page&amp;diff=8567"/>
				<updated>2025-08-12T06:20:17Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Other */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== briki Contents ==&lt;br /&gt;
=== Technology ===&lt;br /&gt;
==== Software ====&lt;br /&gt;
* [[Linux Tips]]&lt;br /&gt;
* [[Windows 10 Tips]]&lt;br /&gt;
* [[Windows XP Tips]]&lt;br /&gt;
* [[MacOS X Tips]]&lt;br /&gt;
* [[Networking Tips]]&lt;br /&gt;
&lt;br /&gt;
==== Hardware ====&lt;br /&gt;
* [[Machine List]]&lt;br /&gt;
* [[Sony TR Tips]]&lt;br /&gt;
* [[SPV M5000 Tips]]&lt;br /&gt;
* [[Speedtouch 780 Tips]]&lt;br /&gt;
&lt;br /&gt;
=== Other ===&lt;br /&gt;
* [[Bikes]]&lt;br /&gt;
* [[Saber Controls]]&lt;br /&gt;
* [[Simpsons Quotes]]&lt;br /&gt;
* [[Temporary Pages]]&lt;br /&gt;
* [[Alex]]&lt;br /&gt;
&lt;br /&gt;
== Other Contents ==&lt;br /&gt;
=== Home ===&lt;br /&gt;
----&lt;br /&gt;
* [https://home-assistant.bretts.org Home Assistant] (protected)&lt;br /&gt;
* [https://arlo.netgear.com Security Cameras] (protected)&lt;br /&gt;
&lt;br /&gt;
=== Media ===&lt;br /&gt;
----&lt;br /&gt;
* [https://plex.bretts.org Plex] (protected)&lt;br /&gt;
* [https://radarr.bretts.org Radarr] ([https://radarr-lowres.bretts.org low-res]) (private)&lt;br /&gt;
* [https://sonarr.bretts.org Sonarr] (private)&lt;br /&gt;
* [https://tautulli.bretts.org Tautulli (Plex status)] (private)&lt;br /&gt;
* [http://maine.bretts.org:33400 Plex WebTools] (private)&lt;br /&gt;
* [http://maine.bretts.org:9117 Jackett] (private)&lt;br /&gt;
&lt;br /&gt;
=== Admin ===&lt;br /&gt;
----&lt;br /&gt;
==== Network ====&lt;br /&gt;
* [https://router.bretts.org:1443/ Router] (protected)&lt;br /&gt;
* [https://unifi.bretts.org Unifi Controller] (protected)&lt;br /&gt;
&lt;br /&gt;
==== Monitoring ====&lt;br /&gt;
* [http://netdata.bretts.org Device Monitoring (netdata)]&lt;br /&gt;
* [https://ntopng.bretts.org Bandwidth Monitoring (ntopng)] (protected)&lt;br /&gt;
* [http://maine.bretts.org/mon/ Process Monitoring (nagios4)] [https://maine.bretts.org/cgi-bin/nagios4/status.cgi?host=all Services](protected)&lt;br /&gt;
* [http://maine.bretts.org/graph/bretts.org/ Network Monitoring (munin)]&lt;br /&gt;
* [https://maine.bretts.org:9443 Container Monitoring (portainer)]&lt;br /&gt;
* [http://maine.bretts.org:3001/ Grafana] (protected)&lt;br /&gt;
&lt;br /&gt;
==== Torrents ====&lt;br /&gt;
* [https://deluge.bretts.org Deluge] (protected)&lt;br /&gt;
&lt;br /&gt;
==== Apache (protected) ====&lt;br /&gt;
* [http://maine.bretts.org/doc/ Manual]&lt;br /&gt;
* [http://maine.bretts.org/server-info Server Info]&lt;br /&gt;
* [http://maine.bretts.org/server-status Server Status]&lt;br /&gt;
* [http://maine.bretts.org/php-info/ PHP Info]&lt;br /&gt;
&lt;br /&gt;
==== Tomcat (protected) ====&lt;br /&gt;
* [http://maine.bretts.org/tomcat/manager/html Manager]&lt;br /&gt;
&lt;br /&gt;
=== Development ===&lt;br /&gt;
* [http://bitbucket.bretts.org/ BitBucket]&lt;br /&gt;
* [http://jira.bretts.org/ JIRA]&lt;br /&gt;
* [http://bamboo.bretts.org/ Bamboo]&lt;br /&gt;
&lt;br /&gt;
== About ==&lt;br /&gt;
'''briki''' (''bretts.org wiki'') administered by Andrew Brett. Feel free to contribute to pre-existing pages.&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Machine_List&amp;diff=8566</id>
		<title>Machine List</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Machine_List&amp;diff=8566"/>
				<updated>2025-08-04T12:36:07Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* History */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== History ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-networking ===&lt;br /&gt;
* (1988-1993) 8086 4.2MHz, MS-DOS 3.3&lt;br /&gt;
* (1993-1995) 386SX 16MHz, Windows 3.1 + MS-DOS 5.0&lt;br /&gt;
* (1995-1996) 486DX 50MHz, Windows 3.1 + MS-DOS 5.0/Windows 95&lt;br /&gt;
&lt;br /&gt;
=== indiana ===&lt;br /&gt;
* (1996 - 1999) Fujitsu-ICL Pentium 90, Windows 95 + Windows NT 4.0&lt;br /&gt;
** 1996?: +Orchid Righteous 3D&lt;br /&gt;
&lt;br /&gt;
=== colorado === &lt;br /&gt;
* (1999 - 2001) Homebuilt Celeron 300, Windows 98/Me/XP&lt;br /&gt;
** Matrox Millennium G200?&lt;br /&gt;
* (2001 - 2002) Homebuilt Pentium 3 800, Windows XP&lt;br /&gt;
* (2002 - 2005) Homebuilt Pentium 3 800, Mandriva Linux 8.0/9.0/10.0&lt;br /&gt;
* (2005 - 2008) Dell Dimension 4300 (Pentium 4 1.8), Kubuntu 6.04&lt;br /&gt;
** 2005: +128MB Sparkle GeForce MX4000 AGP &lt;br /&gt;
** 2005: +Hauppauge WinTV-NOVA-T-MCE &lt;br /&gt;
** 2006: +Seagate Barracuda 7200.10 320GB ST3320620A&lt;br /&gt;
** 2006: +NEC-4570 16x DVD±RW/RAM Black &lt;br /&gt;
* (2008 - 2010) Dell Dimension 4300 (Pentium 4 1.8), Ubuntu 8.04&lt;br /&gt;
** 2008: +Seagate Barracuda 7200.10 750GB SATA2 3.5&amp;quot; &lt;br /&gt;
** 2008: +SATA &amp;amp; IDE PCI Controller Card&lt;br /&gt;
&lt;br /&gt;
=== texas ===&lt;br /&gt;
* (2002 - 2005) Dell Dimension 4300 (Pentium 4 1.8), Windows XP&lt;br /&gt;
** GeForce 2 MX400?&lt;br /&gt;
&lt;br /&gt;
=== vermont ===&lt;br /&gt;
* (2004 - 2006) Sony Vaio TR5MP (Pentium M 1.0), Windows XP&lt;br /&gt;
* (2006 - 2008) Sony Vaio TR5MP (Pentium M 1.0), Ubuntu 6.10/7.04/7.10/8.04&lt;br /&gt;
&lt;br /&gt;
=== alaska ===&lt;br /&gt;
* (2005 - 2007) Homebuilt Athlon64 3500+, Windows XP + Ubuntu 7.04 -&amp;gt; 8.04&lt;br /&gt;
** Cooler Master Wave Master TAC-T01-E1C Silver All Aluminum Alloy ATX Mid Tower Computer Case&lt;br /&gt;
** MSI K8N Diamond&lt;br /&gt;
** AMD Athlon 64 3500+&lt;br /&gt;
** 512MB Corsair Value Select 400MHz DDR Memory Stick &lt;br /&gt;
** 128MB Sparkle GeForce 6600GT PCI-E &lt;br /&gt;
** 300Gb Maxtor DiamondMax 10 ATA/133 6L300S0&lt;br /&gt;
** NEC ND-3520 Silver &lt;br /&gt;
** 460W Akasa PaxPower Ultra Quiet &lt;br /&gt;
** 2006: +320GB Seagate Barracuda 7200.10 SATA2 ST3320620AS&lt;br /&gt;
** 2007: +Sapphire X1950PRO 512MB GDDR3 PCI-Express&lt;br /&gt;
* (2008 - 2014) Homebuilt Core 2 Duo 3.0, Windows XP/7 + Ubuntu 8.04 -&amp;gt; 9.10&lt;br /&gt;
** 2008: +Gigabyte GA P35C-DS3R, iP35 Express, S775, PCI-E(x16), DDR2/3 1066/1333/800, SATA II, SATA RAID, ATX&lt;br /&gt;
** 2008: +Intel Core 2 Duo E8400 2 x 3.00Ghz 6Mb Cache 1333 FSB Dual Core&lt;br /&gt;
** 2008: +Corsair XMS6400 4GB DDR2 (2x2GB) 800Mhz Non-ECC&lt;br /&gt;
** 2009: +GeForce GTX 260 Core 216&lt;br /&gt;
** 2012: +Samsung 830 256GB SSD&lt;br /&gt;
* (2014 - ) Homebuilt Core i7-4770, Windows 7/10&lt;br /&gt;
** 2014: +Asus Z87-Plus Motherboard (Socket 1150, 4x DDR3, ATX, 2x PCI Express 3.0/2.0, 6x SATA 6.0 Gb/s, USB 3.0)&lt;br /&gt;
** 2014: +Intel Core i7 4770 Quad Core Retail CPU (Socket 1150, 3.40GHz, 8MB, Haswell)&lt;br /&gt;
** 2014: +Corsair CML16GX3M2A1600C10 Vengeance Low Profile 16GB (2x8GB) DDR3 1600 Mhz CL10 XMP&lt;br /&gt;
** 2014: +Sapphire R9 270X 2GB Vapor-X 1050MHz GDDR 5 PCI Express Graphics Card&lt;br /&gt;
** 2015: +ASUS Z87-A Motherboard&lt;br /&gt;
** 2015: +Cooler Master Hyper 103 92mm Fan&lt;br /&gt;
** 2016: +MSI GeForce GTX 970 GAMING Twin Frozr V 4GB Graphics Card (Maxwell)&lt;br /&gt;
** 2016: +Samsung 850 EVO 500 GB 2.5 inch Solid State Drive&lt;br /&gt;
** 2021: +Corsair RM650x PSU&lt;br /&gt;
&lt;br /&gt;
=== hawaii === &lt;br /&gt;
* (2007 - 2009) Nintendo Wii&lt;br /&gt;
&lt;br /&gt;
=== montana ===&lt;br /&gt;
* (2007 - ) Apple Mac Mini (Mid 2007), Mac OS X Tiger -&amp;gt; Lion&lt;br /&gt;
** Core 2 Duo T7200 @ 2.0GHz&lt;br /&gt;
** 4GB DDR2-667 RAM&lt;br /&gt;
** 120GB HDD&lt;br /&gt;
** Intel GMA 950&lt;br /&gt;
&lt;br /&gt;
=== pennsylvania ===&lt;br /&gt;
* (2008 - 2012) Sony PS3&lt;br /&gt;
&lt;br /&gt;
=== nevada ===&lt;br /&gt;
* (2009 - 2011) Samsung NC20 (VIA Nano 1.6), Windows XP + Ubuntu 9.04 -&amp;gt; 9.10&lt;br /&gt;
&lt;br /&gt;
=== maine ===&lt;br /&gt;
* (2010 - 2023) Homebuilt Core i5 750, Ubuntu 9.10/12.04/14.04/16.04/18.04/20.04/22.04&lt;br /&gt;
** Cooler Master ATCS 840 RC-840-KKN1-GP Black Aluminum ATX Full Tower Computer Case&lt;br /&gt;
*** Front Case Fan failed&lt;br /&gt;
** Gigabyte GA-P55-UD3R LGA 1156 Intel P55 ATX Intel Motherboard&lt;br /&gt;
** Intel Core i5-750 Lynnfield 2.66GHz LGA 1156 95W Quad-Core Processor Model BX80605I5750&lt;br /&gt;
** OCZ Gold 4GB (2 x 2GB) 240-Pin DDR3 SDRAM DDR3 1333 (PC3 10666) Desktop Memory Model OCZ3G1333LV4GK&lt;br /&gt;
** MSI N8400GS-D256H GeForce 8400 GS 256MB 64-bit GDDR2 PCI Express 2.0 x16 HDCP Ready Video Card&lt;br /&gt;
** Seagate Barracuda LP ST31500541AS 1.5TB 5900 RPM SATA 3.0Gb/s 3.5&amp;quot;&lt;br /&gt;
** Nexus NX-5000 R3 530W ATX12V v2.2 80 PLUS BRONZE Certified Modular Active PFC Power Supply&lt;br /&gt;
** 2011 onwards: +Various SATA HDDs&lt;br /&gt;
** 2013: +Crucial Ballistix 16GB (2x8GB) 240-pin DIMM, DDR3 PC3-12800&lt;br /&gt;
** 2019: +Timetec Hynix IC 16GB (2x8GB) DDR3 PC3-12800 1600 MHz Non ECC Unbuffered 1.35V/1.5V Dual Rank 240 Pin UDIMM&lt;br /&gt;
** 2021: +Corsair RM650 PSU&lt;br /&gt;
** 2021: +Cooler Master Hyper 212 CPU Fan&lt;br /&gt;
* (2023 - ) Homebuilt Core i5 13500, Ubuntu 22.04 &lt;br /&gt;
** 2023: +ASRock Z790 PRO RS/D4&lt;br /&gt;
** 2023: +Intel Core i5-13500 Desktop Processor 14 cores (6 P-cores + 8 E-cores) &lt;br /&gt;
** 2023: +Corsair CMK64GX4M2E3200C16 Vengeance LPX 64GB (2 x 32GB) DDR4 3200&lt;br /&gt;
&lt;br /&gt;
=== arizona ===&lt;br /&gt;
* (2010 - ) Apple Macbook Air (Late 2010 13-inch), Mac OS X Snow Leopard -&amp;gt; macOS Sierra&lt;br /&gt;
**  Core 2 Duo SL9400 @ 1.86 GHz&lt;br /&gt;
** 2GB DDR3-1066 RAM&lt;br /&gt;
** 128GB SSD&lt;br /&gt;
** Nvidia GeForce 320M&lt;br /&gt;
&lt;br /&gt;
=== dakota ===&lt;br /&gt;
* (2012 - ) Apple Mac Mini (Mid 2011), Mac OS X Lion -&amp;gt; macOS Sierra&lt;br /&gt;
** Core i5-2520M @ 2.5 GHz&lt;br /&gt;
** 4GB DDR3-1333 RAM&lt;br /&gt;
** 500GB SATA HDD&lt;br /&gt;
** AMD Radeon HD 6630M&lt;br /&gt;
&lt;br /&gt;
=== router ===&lt;br /&gt;
* (2016 - ) Homebuilt Celeron G1840, pfSense&lt;br /&gt;
** IN Win EM050 Matx Black Case&lt;br /&gt;
** MSI H97M-G43 Socket 1150 VGA DVI HDMI DisplayPort mATX Motherboard&lt;br /&gt;
** Intel Celeron G1840 2.80GHz Socket 1150 2MB L3 Cache&lt;br /&gt;
** Corsair 4GB DDR3 1333MHz Memory Module CL9(9-9-9-24) 1.5V Unbuffered Non-ECC&lt;br /&gt;
** Corsair Force Series LS 60GB SATA 2.5inch SSD&lt;br /&gt;
** 2021: +Corsair RM650 PSU&lt;br /&gt;
&lt;br /&gt;
=== oregon ===&lt;br /&gt;
* (2016 - ) Apple MacBook Pro (Late 2016 13-inch Touch Bar), macOS Sierra -&amp;gt; Mojave&lt;br /&gt;
** Core i5-6287U @ 3.1GHz&lt;br /&gt;
** 16GB DDR3-2133 RAM&lt;br /&gt;
** 256GB PCIe SSD&lt;br /&gt;
** Intel Iris Graphics 550&lt;br /&gt;
&lt;br /&gt;
=== virginia ===&lt;br /&gt;
* (2021 - 2025) Homebuilt Ryzen 5 5600X, Windows 10&lt;br /&gt;
** Phanteks Evolv X Antracite Grey Case&lt;br /&gt;
** Gigabyte AMD Ryzen X570 AORUS PRO&lt;br /&gt;
** Ryzen 5 5600X @ 3.7Ghz&lt;br /&gt;
** Corsair Vengeance LPX Black 32GB 3600MHz 2x16GB CAS 18-22-22-42 DDR4&lt;br /&gt;
** NVIDIA RTX 3080 Founders Edition&lt;br /&gt;
** Corsair Force MP600 1TB M.2 PCIe Gen 4 NVMe SSD&lt;br /&gt;
** Corsair RM850 PSU&lt;br /&gt;
** 2021: +Samsung 980 PRO M.2 NVMe SSD 2TB&lt;br /&gt;
* (2025 -) Homebuilt Ryzen 7 9800X3D, Windows 10&lt;br /&gt;
** +MSI MAG X870 Tomahawk&lt;br /&gt;
** +AMD Ryzen 7 9800X3D AM5 @ 4.7Ghz&lt;br /&gt;
** +Corsair Vengeance 64GB (2*32GB) RGB 6000 MHz CAS 30-36-36-76 DDR5&lt;br /&gt;
** +Corsair RM1000x Shift&lt;br /&gt;
&lt;br /&gt;
=== delaware ===&lt;br /&gt;
* (2024 -) Steam Deck 1TB OLED&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8565</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8565"/>
				<updated>2025-02-25T06:56:30Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Byparr (Alternative CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=byparr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/thephaseless/byparr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8564</id>
		<title>Windows 10 Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8564"/>
				<updated>2025-02-22T12:17:46Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Monitor Switcher ==&lt;br /&gt;
https://sourceforge.net/projects/monitorswitcher/&lt;br /&gt;
&lt;br /&gt;
== Monitor Test Patterns ==&lt;br /&gt;
* Limited vs. Full Range: http://www.lagom.nl/lcd-test/img/blacktest.png&lt;br /&gt;
* Chroma Subsampling: https://www.rtings.com/images/test-materials/2017/chroma-444.png&lt;br /&gt;
&lt;br /&gt;
== Setup MPC-BE ==&lt;br /&gt;
* MPC-BE: https://chamconsoft.com/cmc/forums/?w3=dmlld3RvcGljLnBocD90PTE5Nw==&lt;br /&gt;
* madVR: https://forum.kodi.tv/showthread.php?tid=259188&lt;br /&gt;
&lt;br /&gt;
== Rename Network ==&lt;br /&gt;
https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/&lt;br /&gt;
&lt;br /&gt;
== Installing WSL ==&lt;br /&gt;
https://docs.microsoft.com/en-us/windows/wsl/install-win10&lt;br /&gt;
&lt;br /&gt;
Note: If you see Error 0x80370102, you may need to enable virtualization in your motherboard BIOS: https://ourcodeworld.com/articles/read/1283/how-to-enable-amd-virtualization-on-the-aorus-x570-motherboard&lt;br /&gt;
&lt;br /&gt;
=== Running rsyncd automatically (DEPRECATED) ===&lt;br /&gt;
* Set '''RSYNC_ENABLE=true''' in ''/etc/default/rsync''&lt;br /&gt;
* Create ''/etc/rsyncd.conf'' with the contents (for example):&lt;br /&gt;
  [users]&lt;br /&gt;
      path = /mnt/c/Users&lt;br /&gt;
      comment = Users&lt;br /&gt;
      read only = true&lt;br /&gt;
* WSL2 virtual machines run on a separate NATed network, so we need to forward the rsync port from the real LAN to the virtual machine:&lt;br /&gt;
  netsh interface portproxy add v4tov4 listenport=873 listenaddress=0.0.0.0 connectport=873 connectaddress=127.0.0.1&lt;br /&gt;
* Go to Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection -&amp;gt; Advanced Settings -&amp;gt; Inbound Rules -&amp;gt; New Rule...&lt;br /&gt;
** Select &amp;quot;Port&amp;quot;&lt;br /&gt;
** Set &amp;quot;Specific local ports&amp;quot; to 873 &lt;br /&gt;
** Select &amp;quot;Allow the connection&amp;quot;&lt;br /&gt;
** Select only &amp;quot;Private&amp;quot;&lt;br /&gt;
** Set the &amp;quot;Name&amp;quot; to &amp;quot;rsync&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Running rsyncd automatically ==&lt;br /&gt;
* Install DeltaCopy Server from http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp&lt;br /&gt;
* Add an application rule for rsync.exe in Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection&lt;br /&gt;
&lt;br /&gt;
== Renaming networks ==&lt;br /&gt;
https://www.ghacks.net/2021/10/25/how-to-change-network-names-on-windows-11/&lt;br /&gt;
&lt;br /&gt;
== Virpil CM3 Throttle ==&lt;br /&gt;
https://www.youtube.com/watch?v=JDSk2oADsZg&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8563</id>
		<title>Windows 10 Tips</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Windows_10_Tips&amp;diff=8563"/>
				<updated>2025-02-17T03:49:00Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Monitor Switcher ==&lt;br /&gt;
https://sourceforge.net/projects/monitorswitcher/&lt;br /&gt;
&lt;br /&gt;
== Monitor Test Patterns ==&lt;br /&gt;
* Limited vs. Full Range: http://www.lagom.nl/lcd-test/img/blacktest.png&lt;br /&gt;
* Chroma Subsampling: https://www.rtings.com/images/test-materials/2017/chroma-444.png&lt;br /&gt;
&lt;br /&gt;
== Setup MPC-BE ==&lt;br /&gt;
* MPC-BE: https://chamconsoft.com/cmc/forums/?w3=dmlld3RvcGljLnBocD90PTE5Nw==&lt;br /&gt;
* madVR: https://forum.kodi.tv/showthread.php?tid=259188&lt;br /&gt;
&lt;br /&gt;
== Rename Network ==&lt;br /&gt;
https://www.howtogeek.com/364291/how-to-change-or-rename-the-active-network-profile-name-in-windows-10/&lt;br /&gt;
&lt;br /&gt;
== Installing WSL ==&lt;br /&gt;
https://docs.microsoft.com/en-us/windows/wsl/install-win10&lt;br /&gt;
&lt;br /&gt;
Note: If you see Error 0x80370102, you may need to enable virtualization in your motherboard BIOS: https://ourcodeworld.com/articles/read/1283/how-to-enable-amd-virtualization-on-the-aorus-x570-motherboard&lt;br /&gt;
&lt;br /&gt;
=== Running rsyncd automatically (DEPRECATED) ===&lt;br /&gt;
* Set '''RSYNC_ENABLE=true''' in ''/etc/default/rsync''&lt;br /&gt;
* Create ''/etc/rsyncd.conf'' with the contents (for example):&lt;br /&gt;
  [users]&lt;br /&gt;
      path = /mnt/c/Users&lt;br /&gt;
      comment = Users&lt;br /&gt;
      read only = true&lt;br /&gt;
* WSL2 virtual machines run on a separate NATed network, so we need to forward the rsync port from the real LAN to the virtual machine:&lt;br /&gt;
  netsh interface portproxy add v4tov4 listenport=873 listenaddress=0.0.0.0 connectport=873 connectaddress=127.0.0.1&lt;br /&gt;
* Go to Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection -&amp;gt; Advanced Settings -&amp;gt; Inbound Rules -&amp;gt; New Rule...&lt;br /&gt;
** Select &amp;quot;Port&amp;quot;&lt;br /&gt;
** Set &amp;quot;Specific local ports&amp;quot; to 873 &lt;br /&gt;
** Select &amp;quot;Allow the connection&amp;quot;&lt;br /&gt;
** Select only &amp;quot;Private&amp;quot;&lt;br /&gt;
** Set the &amp;quot;Name&amp;quot; to &amp;quot;rsync&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Running rsyncd automatically ==&lt;br /&gt;
* Install DeltaCopy Server from http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp&lt;br /&gt;
* Add an application rule for rsync.exe in Settings -&amp;gt; Update &amp;amp; Security -&amp;gt; Windows Security -&amp;gt; Firewall &amp;amp; network protection&lt;br /&gt;
&lt;br /&gt;
== Renaming networks ==&lt;br /&gt;
https://www.ghacks.net/2021/10/25/how-to-change-network-names-on-windows-11/&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Machine_List&amp;diff=8562</id>
		<title>Machine List</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Machine_List&amp;diff=8562"/>
				<updated>2025-02-07T06:46:29Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* virginia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== History ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-networking ===&lt;br /&gt;
* (1988-1993) 8086 4.2MHz, MS-DOS 3.3&lt;br /&gt;
* (1993-1995) 386SX 16MHz, Windows 3.1 + MS-DOS 5.0&lt;br /&gt;
* (1995-1996) 486DX 50MHz, Windows 3.1 + MS-DOS 5.0/Windows 95&lt;br /&gt;
&lt;br /&gt;
=== indiana ===&lt;br /&gt;
* (1996 - 1999) Fujitsu-ICL Pentium 90, Windows 95 + Windows NT 4.0&lt;br /&gt;
** 1996?: +Orchid Righteous 3D&lt;br /&gt;
&lt;br /&gt;
=== colorado === &lt;br /&gt;
* (1999 - 2001) Homebuilt Celeron 300, Windows 98/Me/XP&lt;br /&gt;
** Matrox Millennium G200?&lt;br /&gt;
* (2001 - 2002) Homebuilt Pentium 3 800, Windows XP&lt;br /&gt;
* (2002 - 2005) Homebuilt Pentium 3 800, Mandriva Linux 8.0/9.0/10.0&lt;br /&gt;
* (2005 - 2008) Dell Dimension 4300 (Pentium 4 1.8), Kubuntu 6.04&lt;br /&gt;
** 2005: +128MB Sparkle GeForce MX4000 AGP &lt;br /&gt;
** 2005: +Hauppauge WinTV-NOVA-T-MCE &lt;br /&gt;
** 2006: +Seagate Barracuda 7200.10 320GB ST3320620A&lt;br /&gt;
** 2006: +NEC-4570 16x DVD±RW/RAM Black &lt;br /&gt;
* (2008 - 2010) Dell Dimension 4300 (Pentium 4 1.8), Ubuntu 8.04&lt;br /&gt;
** 2008: +Seagate Barracuda 7200.10 750GB SATA2 3.5&amp;quot; &lt;br /&gt;
** 2008: +SATA &amp;amp; IDE PCI Controller Card&lt;br /&gt;
&lt;br /&gt;
=== texas ===&lt;br /&gt;
* (2002 - 2005) Dell Dimension 4300 (Pentium 4 1.8), Windows XP&lt;br /&gt;
** GeForce 2 MX400?&lt;br /&gt;
&lt;br /&gt;
=== vermont ===&lt;br /&gt;
* (2004 - 2006) Sony Vaio TR5MP (Pentium M 1.0), Windows XP&lt;br /&gt;
* (2006 - 2008) Sony Vaio TR5MP (Pentium M 1.0), Ubuntu 6.10/7.04/7.10/8.04&lt;br /&gt;
&lt;br /&gt;
=== alaska ===&lt;br /&gt;
* (2005 - 2007) Homebuilt Athlon64 3500+, Windows XP + Ubuntu 7.04 -&amp;gt; 8.04&lt;br /&gt;
** Cooler Master Wave Master TAC-T01-E1C Silver All Aluminum Alloy ATX Mid Tower Computer Case&lt;br /&gt;
** MSI K8N Diamond&lt;br /&gt;
** AMD Athlon 64 3500+&lt;br /&gt;
** 512MB Corsair Value Select 400MHz DDR Memory Stick &lt;br /&gt;
** 128MB Sparkle GeForce 6600GT PCI-E &lt;br /&gt;
** 300Gb Maxtor DiamondMax 10 ATA/133 6L300S0&lt;br /&gt;
** NEC ND-3520 Silver &lt;br /&gt;
** 460W Akasa PaxPower Ultra Quiet &lt;br /&gt;
** 2006: +320GB Seagate Barracuda 7200.10 SATA2 ST3320620AS&lt;br /&gt;
** 2007: +Sapphire X1950PRO 512MB GDDR3 PCI-Express&lt;br /&gt;
* (2008 - 2014) Homebuilt Core 2 Duo 3.0, Windows XP/7 + Ubuntu 8.04 -&amp;gt; 9.10&lt;br /&gt;
** 2008: +Gigabyte GA P35C-DS3R, iP35 Express, S775, PCI-E(x16), DDR2/3 1066/1333/800, SATA II, SATA RAID, ATX&lt;br /&gt;
** 2008: +Intel Core 2 Duo E8400 2 x 3.00Ghz 6Mb Cache 1333 FSB Dual Core&lt;br /&gt;
** 2008: +Corsair XMS6400 4GB DDR2 (2x2GB) 800Mhz Non-ECC&lt;br /&gt;
** 2009: +GeForce GTX 260 Core 216&lt;br /&gt;
** 2012: +Samsung 830 256GB SSD&lt;br /&gt;
* (2014 - ) Homebuilt Core i7-4770, Windows 7/10&lt;br /&gt;
** 2014: +Asus Z87-Plus Motherboard (Socket 1150, 4x DDR3, ATX, 2x PCI Express 3.0/2.0, 6x SATA 6.0 Gb/s, USB 3.0)&lt;br /&gt;
** 2014: +Intel Core i7 4770 Quad Core Retail CPU (Socket 1150, 3.40GHz, 8MB, Haswell)&lt;br /&gt;
** 2014: +Corsair CML16GX3M2A1600C10 Vengeance Low Profile 16GB (2x8GB) DDR3 1600 Mhz CL10 XMP&lt;br /&gt;
** 2014: +Sapphire R9 270X 2GB Vapor-X 1050MHz GDDR 5 PCI Express Graphics Card&lt;br /&gt;
** 2015: +ASUS Z87-A Motherboard&lt;br /&gt;
** 2015: +Cooler Master Hyper 103 92mm Fan&lt;br /&gt;
** 2016: +MSI GeForce GTX 970 GAMING Twin Frozr V 4GB Graphics Card (Maxwell)&lt;br /&gt;
** 2016: +Samsung 850 EVO 500 GB 2.5 inch Solid State Drive&lt;br /&gt;
** 2021: +Corsair RM650x PSU&lt;br /&gt;
&lt;br /&gt;
=== hawaii === &lt;br /&gt;
* (2007 - 2009) Nintendo Wii&lt;br /&gt;
&lt;br /&gt;
=== montana ===&lt;br /&gt;
* (2007 - ) Apple Mac Mini (Mid 2007), Mac OS X Tiger -&amp;gt; Lion&lt;br /&gt;
** Core 2 Duo T7200 @ 2.0GHz&lt;br /&gt;
** 4GB DDR2-667 RAM&lt;br /&gt;
** 120GB HDD&lt;br /&gt;
** Intel GMA 950&lt;br /&gt;
&lt;br /&gt;
=== pennsylvania ===&lt;br /&gt;
* (2008 - 2012) Sony PS3&lt;br /&gt;
&lt;br /&gt;
=== nevada ===&lt;br /&gt;
* (2009 - 2011) Samsung NC20 (VIA Nano 1.6), Windows XP + Ubuntu 9.04 -&amp;gt; 9.10&lt;br /&gt;
&lt;br /&gt;
=== maine ===&lt;br /&gt;
* (2010 - 2023) Homebuilt Core i5 750, Ubuntu 9.10/12.04/14.04/16.04/18.04/20.04/22.04&lt;br /&gt;
** Cooler Master ATCS 840 RC-840-KKN1-GP Black Aluminum ATX Full Tower Computer Case&lt;br /&gt;
*** Front Case Fan failed&lt;br /&gt;
** Gigabyte GA-P55-UD3R LGA 1156 Intel P55 ATX Intel Motherboard&lt;br /&gt;
** Intel Core i5-750 Lynnfield 2.66GHz LGA 1156 95W Quad-Core Processor Model BX80605I5750&lt;br /&gt;
** OCZ Gold 4GB (2 x 2GB) 240-Pin DDR3 SDRAM DDR3 1333 (PC3 10666) Desktop Memory Model OCZ3G1333LV4GK&lt;br /&gt;
** MSI N8400GS-D256H GeForce 8400 GS 256MB 64-bit GDDR2 PCI Express 2.0 x16 HDCP Ready Video Card&lt;br /&gt;
** Seagate Barracuda LP ST31500541AS 1.5TB 5900 RPM SATA 3.0Gb/s 3.5&amp;quot;&lt;br /&gt;
** Nexus NX-5000 R3 530W ATX12V v2.2 80 PLUS BRONZE Certified Modular Active PFC Power Supply&lt;br /&gt;
** 2011 onwards: +Various SATA HDDs&lt;br /&gt;
** 2013: +Crucial Ballistix 16GB (2x8GB) 240-pin DIMM, DDR3 PC3-12800&lt;br /&gt;
** 2019: +Timetec Hynix IC 16GB (2x8GB) DDR3 PC3-12800 1600 MHz Non ECC Unbuffered 1.35V/1.5V Dual Rank 240 Pin UDIMM&lt;br /&gt;
** 2021: +Corsair RM650 PSU&lt;br /&gt;
** 2021: +Cooler Master Hyper 212 CPU Fan&lt;br /&gt;
* (2023 - ) Homebuilt Core i5 13500, Ubuntu 22.04 &lt;br /&gt;
** 2023: +ASRock Z790 PRO RS/D4&lt;br /&gt;
** 2023: +Intel Core i5-13500 Desktop Processor 14 cores (6 P-cores + 8 E-cores) &lt;br /&gt;
** 2023: +Corsair CMK64GX4M2E3200C16 Vengeance LPX 64GB (2 x 32GB) DDR4 3200&lt;br /&gt;
&lt;br /&gt;
=== arizona ===&lt;br /&gt;
* (2010 - ) Apple Macbook Air (Late 2010 13-inch), Mac OS X Snow Leopard -&amp;gt; macOS Sierra&lt;br /&gt;
**  Core 2 Duo SL9400 @ 1.86 GHz&lt;br /&gt;
** 2GB DDR3-1066 RAM&lt;br /&gt;
** 128GB SSD&lt;br /&gt;
** Nvidia GeForce 320M&lt;br /&gt;
&lt;br /&gt;
=== dakota ===&lt;br /&gt;
* (2012 - ) Apple Mac Mini (Mid 2011), Mac OS X Lion -&amp;gt; macOS Sierra&lt;br /&gt;
** Core i5-2520M @ 2.5 GHz&lt;br /&gt;
** 4GB DDR3-1333 RAM&lt;br /&gt;
** 500GB SATA HDD&lt;br /&gt;
** AMD Radeon HD 6630M&lt;br /&gt;
&lt;br /&gt;
=== router ===&lt;br /&gt;
* (2016 - ) Homebuilt Celeron G1840, pfSense&lt;br /&gt;
** IN Win EM050 Matx Black Case&lt;br /&gt;
** MSI H97M-G43 Socket 1150 VGA DVI HDMI DisplayPort mATX Motherboard&lt;br /&gt;
** Intel Celeron G1840 2.80GHz Socket 1150 2MB L3 Cache&lt;br /&gt;
** Corsair 4GB DDR3 1333MHz Memory Module CL9(9-9-9-24) 1.5V Unbuffered Non-ECC&lt;br /&gt;
** Corsair Force Series LS 60GB SATA 2.5inch SSD&lt;br /&gt;
** 2021: +Corsair RM650 PSU&lt;br /&gt;
&lt;br /&gt;
=== oregon ===&lt;br /&gt;
* (2016 - ) Apple MacBook Pro (Late 2016 13-inch Touch Bar), macOS Sierra -&amp;gt; Mojave&lt;br /&gt;
** Core i5-6287U @ 3.1GHz&lt;br /&gt;
** 16GB DDR3-2133 RAM&lt;br /&gt;
** 256GB PCIe SSD&lt;br /&gt;
** Intel Iris Graphics 550&lt;br /&gt;
&lt;br /&gt;
=== virginia ===&lt;br /&gt;
* (2021 - 2025) Homebuilt Ryzen 5 5600X, Windows 10&lt;br /&gt;
** Phanteks Evolv X Antracite Grey Case&lt;br /&gt;
** Gigabyte AMD Ryzen X570 AORUS PRO&lt;br /&gt;
** Ryzen 5 5600X @ 3.7Ghz&lt;br /&gt;
** Corsair Vengeance LPX Black 32GB 3600MHz 2x16GB CAS 18-22-22-42 DDR4&lt;br /&gt;
** NVIDIA RTX 3080 Founders Edition&lt;br /&gt;
** Corsair Force MP600 1TB M.2 PCIe Gen 4 NVMe SSD&lt;br /&gt;
** Corsair RM850 PSU&lt;br /&gt;
** 2021: +Samsung 980 PRO M.2 NVMe SSD 2TB&lt;br /&gt;
* (2025 -) Homebuilt Ryzen 7 9800X3D, Windows 10&lt;br /&gt;
** +MSI MAG X870 Tomahawk&lt;br /&gt;
** +AMD Ryzen 7 9800X3D AM5 @ 4.7Ghz&lt;br /&gt;
** +Corsair Vengeance 64GB (2*32GB) RGB 6000 MHz CAS 30-36-36-76 DDR5&lt;br /&gt;
** +Corsair RM1000x Shift&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Machine_List&amp;diff=8561</id>
		<title>Machine List</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Machine_List&amp;diff=8561"/>
				<updated>2025-02-07T02:55:51Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== History ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-networking ===&lt;br /&gt;
* (1988-1993) 8086 4.2MHz, MS-DOS 3.3&lt;br /&gt;
* (1993-1995) 386SX 16MHz, Windows 3.1 + MS-DOS 5.0&lt;br /&gt;
* (1995-1996) 486DX 50MHz, Windows 3.1 + MS-DOS 5.0/Windows 95&lt;br /&gt;
&lt;br /&gt;
=== indiana ===&lt;br /&gt;
* (1996 - 1999) Fujitsu-ICL Pentium 90, Windows 95 + Windows NT 4.0&lt;br /&gt;
** 1996?: +Orchid Righteous 3D&lt;br /&gt;
&lt;br /&gt;
=== colorado === &lt;br /&gt;
* (1999 - 2001) Homebuilt Celeron 300, Windows 98/Me/XP&lt;br /&gt;
** Matrox Millennium G200?&lt;br /&gt;
* (2001 - 2002) Homebuilt Pentium 3 800, Windows XP&lt;br /&gt;
* (2002 - 2005) Homebuilt Pentium 3 800, Mandriva Linux 8.0/9.0/10.0&lt;br /&gt;
* (2005 - 2008) Dell Dimension 4300 (Pentium 4 1.8), Kubuntu 6.04&lt;br /&gt;
** 2005: +128MB Sparkle GeForce MX4000 AGP &lt;br /&gt;
** 2005: +Hauppauge WinTV-NOVA-T-MCE &lt;br /&gt;
** 2006: +Seagate Barracuda 7200.10 320GB ST3320620A&lt;br /&gt;
** 2006: +NEC-4570 16x DVD±RW/RAM Black &lt;br /&gt;
* (2008 - 2010) Dell Dimension 4300 (Pentium 4 1.8), Ubuntu 8.04&lt;br /&gt;
** 2008: +Seagate Barracuda 7200.10 750GB SATA2 3.5&amp;quot; &lt;br /&gt;
** 2008: +SATA &amp;amp; IDE PCI Controller Card&lt;br /&gt;
&lt;br /&gt;
=== texas ===&lt;br /&gt;
* (2002 - 2005) Dell Dimension 4300 (Pentium 4 1.8), Windows XP&lt;br /&gt;
** GeForce 2 MX400?&lt;br /&gt;
&lt;br /&gt;
=== vermont ===&lt;br /&gt;
* (2004 - 2006) Sony Vaio TR5MP (Pentium M 1.0), Windows XP&lt;br /&gt;
* (2006 - 2008) Sony Vaio TR5MP (Pentium M 1.0), Ubuntu 6.10/7.04/7.10/8.04&lt;br /&gt;
&lt;br /&gt;
=== alaska ===&lt;br /&gt;
* (2005 - 2007) Homebuilt Athlon64 3500+, Windows XP + Ubuntu 7.04 -&amp;gt; 8.04&lt;br /&gt;
** Cooler Master Wave Master TAC-T01-E1C Silver All Aluminum Alloy ATX Mid Tower Computer Case&lt;br /&gt;
** MSI K8N Diamond&lt;br /&gt;
** AMD Athlon 64 3500+&lt;br /&gt;
** 512MB Corsair Value Select 400MHz DDR Memory Stick &lt;br /&gt;
** 128MB Sparkle GeForce 6600GT PCI-E &lt;br /&gt;
** 300Gb Maxtor DiamondMax 10 ATA/133 6L300S0&lt;br /&gt;
** NEC ND-3520 Silver &lt;br /&gt;
** 460W Akasa PaxPower Ultra Quiet &lt;br /&gt;
** 2006: +320GB Seagate Barracuda 7200.10 SATA2 ST3320620AS&lt;br /&gt;
** 2007: +Sapphire X1950PRO 512MB GDDR3 PCI-Express&lt;br /&gt;
* (2008 - 2014) Homebuilt Core 2 Duo 3.0, Windows XP/7 + Ubuntu 8.04 -&amp;gt; 9.10&lt;br /&gt;
** 2008: +Gigabyte GA P35C-DS3R, iP35 Express, S775, PCI-E(x16), DDR2/3 1066/1333/800, SATA II, SATA RAID, ATX&lt;br /&gt;
** 2008: +Intel Core 2 Duo E8400 2 x 3.00Ghz 6Mb Cache 1333 FSB Dual Core&lt;br /&gt;
** 2008: +Corsair XMS6400 4GB DDR2 (2x2GB) 800Mhz Non-ECC&lt;br /&gt;
** 2009: +GeForce GTX 260 Core 216&lt;br /&gt;
** 2012: +Samsung 830 256GB SSD&lt;br /&gt;
* (2014 - ) Homebuilt Core i7-4770, Windows 7/10&lt;br /&gt;
** 2014: +Asus Z87-Plus Motherboard (Socket 1150, 4x DDR3, ATX, 2x PCI Express 3.0/2.0, 6x SATA 6.0 Gb/s, USB 3.0)&lt;br /&gt;
** 2014: +Intel Core i7 4770 Quad Core Retail CPU (Socket 1150, 3.40GHz, 8MB, Haswell)&lt;br /&gt;
** 2014: +Corsair CML16GX3M2A1600C10 Vengeance Low Profile 16GB (2x8GB) DDR3 1600 Mhz CL10 XMP&lt;br /&gt;
** 2014: +Sapphire R9 270X 2GB Vapor-X 1050MHz GDDR 5 PCI Express Graphics Card&lt;br /&gt;
** 2015: +ASUS Z87-A Motherboard&lt;br /&gt;
** 2015: +Cooler Master Hyper 103 92mm Fan&lt;br /&gt;
** 2016: +MSI GeForce GTX 970 GAMING Twin Frozr V 4GB Graphics Card (Maxwell)&lt;br /&gt;
** 2016: +Samsung 850 EVO 500 GB 2.5 inch Solid State Drive&lt;br /&gt;
** 2021: +Corsair RM650x PSU&lt;br /&gt;
&lt;br /&gt;
=== hawaii === &lt;br /&gt;
* (2007 - 2009) Nintendo Wii&lt;br /&gt;
&lt;br /&gt;
=== montana ===&lt;br /&gt;
* (2007 - ) Apple Mac Mini (Mid 2007), Mac OS X Tiger -&amp;gt; Lion&lt;br /&gt;
** Core 2 Duo T7200 @ 2.0GHz&lt;br /&gt;
** 4GB DDR2-667 RAM&lt;br /&gt;
** 120GB HDD&lt;br /&gt;
** Intel GMA 950&lt;br /&gt;
&lt;br /&gt;
=== pennsylvania ===&lt;br /&gt;
* (2008 - 2012) Sony PS3&lt;br /&gt;
&lt;br /&gt;
=== nevada ===&lt;br /&gt;
* (2009 - 2011) Samsung NC20 (VIA Nano 1.6), Windows XP + Ubuntu 9.04 -&amp;gt; 9.10&lt;br /&gt;
&lt;br /&gt;
=== maine ===&lt;br /&gt;
* (2010 - 2023) Homebuilt Core i5 750, Ubuntu 9.10/12.04/14.04/16.04/18.04/20.04/22.04&lt;br /&gt;
** Cooler Master ATCS 840 RC-840-KKN1-GP Black Aluminum ATX Full Tower Computer Case&lt;br /&gt;
*** Front Case Fan failed&lt;br /&gt;
** Gigabyte GA-P55-UD3R LGA 1156 Intel P55 ATX Intel Motherboard&lt;br /&gt;
** Intel Core i5-750 Lynnfield 2.66GHz LGA 1156 95W Quad-Core Processor Model BX80605I5750&lt;br /&gt;
** OCZ Gold 4GB (2 x 2GB) 240-Pin DDR3 SDRAM DDR3 1333 (PC3 10666) Desktop Memory Model OCZ3G1333LV4GK&lt;br /&gt;
** MSI N8400GS-D256H GeForce 8400 GS 256MB 64-bit GDDR2 PCI Express 2.0 x16 HDCP Ready Video Card&lt;br /&gt;
** Seagate Barracuda LP ST31500541AS 1.5TB 5900 RPM SATA 3.0Gb/s 3.5&amp;quot;&lt;br /&gt;
** Nexus NX-5000 R3 530W ATX12V v2.2 80 PLUS BRONZE Certified Modular Active PFC Power Supply&lt;br /&gt;
** 2011 onwards: +Various SATA HDDs&lt;br /&gt;
** 2013: +Crucial Ballistix 16GB (2x8GB) 240-pin DIMM, DDR3 PC3-12800&lt;br /&gt;
** 2019: +Timetec Hynix IC 16GB (2x8GB) DDR3 PC3-12800 1600 MHz Non ECC Unbuffered 1.35V/1.5V Dual Rank 240 Pin UDIMM&lt;br /&gt;
** 2021: +Corsair RM650 PSU&lt;br /&gt;
** 2021: +Cooler Master Hyper 212 CPU Fan&lt;br /&gt;
* (2023 - ) Homebuilt Core i5 13500, Ubuntu 22.04 &lt;br /&gt;
** 2023: +ASRock Z790 PRO RS/D4&lt;br /&gt;
** 2023: +Intel Core i5-13500 Desktop Processor 14 cores (6 P-cores + 8 E-cores) &lt;br /&gt;
** 2023: +Corsair CMK64GX4M2E3200C16 Vengeance LPX 64GB (2 x 32GB) DDR4 3200&lt;br /&gt;
&lt;br /&gt;
=== arizona ===&lt;br /&gt;
* (2010 - ) Apple Macbook Air (Late 2010 13-inch), Mac OS X Snow Leopard -&amp;gt; macOS Sierra&lt;br /&gt;
**  Core 2 Duo SL9400 @ 1.86 GHz&lt;br /&gt;
** 2GB DDR3-1066 RAM&lt;br /&gt;
** 128GB SSD&lt;br /&gt;
** Nvidia GeForce 320M&lt;br /&gt;
&lt;br /&gt;
=== dakota ===&lt;br /&gt;
* (2012 - ) Apple Mac Mini (Mid 2011), Mac OS X Lion -&amp;gt; macOS Sierra&lt;br /&gt;
** Core i5-2520M @ 2.5 GHz&lt;br /&gt;
** 4GB DDR3-1333 RAM&lt;br /&gt;
** 500GB SATA HDD&lt;br /&gt;
** AMD Radeon HD 6630M&lt;br /&gt;
&lt;br /&gt;
=== router ===&lt;br /&gt;
* (2016 - ) Homebuilt Celeron G1840, pfSense&lt;br /&gt;
** IN Win EM050 Matx Black Case&lt;br /&gt;
** MSI H97M-G43 Socket 1150 VGA DVI HDMI DisplayPort mATX Motherboard&lt;br /&gt;
** Intel Celeron G1840 2.80GHz Socket 1150 2MB L3 Cache&lt;br /&gt;
** Corsair 4GB DDR3 1333MHz Memory Module CL9(9-9-9-24) 1.5V Unbuffered Non-ECC&lt;br /&gt;
** Corsair Force Series LS 60GB SATA 2.5inch SSD&lt;br /&gt;
** 2021: +Corsair RM650 PSU&lt;br /&gt;
&lt;br /&gt;
=== oregon ===&lt;br /&gt;
* (2016 - ) Apple MacBook Pro (Late 2016 13-inch Touch Bar), macOS Sierra -&amp;gt; Mojave&lt;br /&gt;
** Core i5-6287U @ 3.1GHz&lt;br /&gt;
** 16GB DDR3-2133 RAM&lt;br /&gt;
** 256GB PCIe SSD&lt;br /&gt;
** Intel Iris Graphics 550&lt;br /&gt;
&lt;br /&gt;
=== virginia ===&lt;br /&gt;
* (2021 - 2025) Homebuilt Ryzen 5 5600X, Windows 10&lt;br /&gt;
** Phanteks Evolv X Antracite Grey Case&lt;br /&gt;
** Gigabyte AMD Ryzen X570 AORUS PRO&lt;br /&gt;
** Ryzen 5 5600X @ 3.7Ghz&lt;br /&gt;
** Corsair Vengeance LPX Black 32GB 3600MHz 2x16GB CAS 18-22-22-42 DDR4&lt;br /&gt;
** NVIDIA RTX 3080 Founders Edition&lt;br /&gt;
** Corsair Force MP600 1TB M.2 PCIe Gen 4 NVMe SSD&lt;br /&gt;
** Corsair RM850 PSU&lt;br /&gt;
* (2025 -) Homebuilt Ryzen 7 9800X3D, Windows 10&lt;br /&gt;
** +MSI MAG X870 Tomahawk&lt;br /&gt;
** +AMD Ryzen 7 9800X3D AM5 @ 4.7Ghz&lt;br /&gt;
** +Corsair Vengeance 64GB (2*32GB) RGB 6000 MHz CAS 30-36-36-76 DDR5&lt;br /&gt;
** +Corsair RM1000x Shift&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	<entry>
		<id>https://wiki.bretts.org/index.php?title=Docker&amp;diff=8560</id>
		<title>Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.bretts.org/index.php?title=Docker&amp;diff=8560"/>
				<updated>2024-12-04T06:09:03Z</updated>
		
		<summary type="html">&lt;p&gt;Andrew: /* Containers */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Commands ==&lt;br /&gt;
&lt;br /&gt;
; docker ps -a: List all containers&lt;br /&gt;
; docker container inspect &amp;lt;container&amp;gt;: Show details of &amp;lt;container&amp;gt;&lt;br /&gt;
; docker logs &amp;lt;container&amp;gt;: Show logs for &amp;lt;container&amp;gt;&lt;br /&gt;
; docker exec -it &amp;lt;container&amp;gt; /bin/bash: Start an interactive shell in &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Updating container ==&lt;br /&gt;
&lt;br /&gt;
=== Manually ===&lt;br /&gt;
  sudo docker pull &amp;lt;image&amp;gt;&lt;br /&gt;
  sudo docker stop &amp;lt;container&amp;gt;&lt;br /&gt;
  sudo docker rm &amp;lt;container&amp;gt;&lt;br /&gt;
  &amp;lt;docker run command&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Automatically ===&lt;br /&gt;
  sudo docker run --rm -v /var/run/docker.sock:/var/run/docker.sock taisun/updater --oneshot &amp;lt;container&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Containers ==&lt;br /&gt;
&lt;br /&gt;
=== Portainer ===&lt;br /&gt;
  sudo docker run -d --name portainer \&lt;br /&gt;
    -p 8000:8000 -p 9443:9443 \&lt;br /&gt;
    -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/portainer:/data \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/certs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    portainer/portainer-ce \&lt;br /&gt;
    --sslcert /certs/fullchain.pem --sslkey /certs/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Plex ===&lt;br /&gt;
&lt;br /&gt;
Get your claim token: https://www.plex.tv/claim/&lt;br /&gt;
&lt;br /&gt;
Create the container with the claim token substituted:&lt;br /&gt;
  sudo docker run -d --name plex --network=host -e PLEX_UID=111 -e PLEX_GID=127 -e TZ=Europe/London -e PLEX_CLAIM=&amp;lt;CLAIM_TOKEN&amp;gt; \&lt;br /&gt;
    -v /var/lib/plexmediaserver:/config -v /srv:/srv --device=/dev/dri:/dev/dri \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    plexinc/pms-docker:plexpass&lt;br /&gt;
&lt;br /&gt;
=== Tautulli (Plex Monitoring/Notifications) ===&lt;br /&gt;
  sudo docker run -d --name tautulli -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8181:8181 \&lt;br /&gt;
    -v /var/lib/torrent/tautulli/config:/config -v /var/lib/plexmediaserver/Library/Logs:/logs \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/tautulli&lt;br /&gt;
&lt;br /&gt;
=== Jackett (Torrent Gateway) ===&lt;br /&gt;
  sudo docker run -d --name=jackett -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 9117:9117 \&lt;br /&gt;
    -v /var/lib/torrent/jackett/config:/config -v /var/lib/torrent/jackett/downloads:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/jackett&lt;br /&gt;
&lt;br /&gt;
=== FlareSolverr (CloudFlare proxy bypass) ===&lt;br /&gt;
  sudo docker run -d --name=flaresolverr \&lt;br /&gt;
    -p 8191:8191 \&lt;br /&gt;
    -e LOG_LEVEL=info \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    ghcr.io/flaresolverr/flaresolverr:latest&lt;br /&gt;
&lt;br /&gt;
=== Deluge ===&lt;br /&gt;
  sudo docker run -d --name deluge -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/torrent/deluged/config:/config -v /srv/incoming/torrents/deluge:/srv/incoming/torrents/deluge \&lt;br /&gt;
    -v /etc/ssl/bretts.org:/etc/ssl/bretts.org \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/deluge&lt;br /&gt;
&lt;br /&gt;
Since user groups don't seem to apply across the docker boundary, &amp;quot;torrent&amp;quot; will need to be given explicit permission to the private key file via an ACL:&lt;br /&gt;
  setfacl -m &amp;quot;u:torrent:rw&amp;quot; /etc/ssl/bretts.org/key.pem&lt;br /&gt;
&lt;br /&gt;
=== Radarr (Movie Downloads) ===&lt;br /&gt;
  sudo docker run -d --name radarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 7878:7878 \&lt;br /&gt;
    -v /var/lib/torrent/radarr/config:/config -v /srv/videos/programs/movies:/movies -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/radarr&lt;br /&gt;
&lt;br /&gt;
=== Sonarr (TV Downloads) ===&lt;br /&gt;
  sudo docker run -d --name=sonarr -e PUID=127 -e PGID=138 -e TZ=Europe/London \&lt;br /&gt;
    -p 8989:8989 \&lt;br /&gt;
    -v /var/lib/torrent/sonarr/config:/config -v /srv/videos/programs/tv:/tv -v /srv/incoming/torrents/deluge:/downloads \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/sonarr&lt;br /&gt;
&lt;br /&gt;
=== Unifi ===&lt;br /&gt;
  sudo docker run -d --name=unifi-controller -e PUID=140 -e PGID=150 \&lt;br /&gt;
    -p 3478:3478/udp -p 10001:10001/udp -p 18080:18080 -p 18081:18081 -p 18443:18443 -p 18880:18880 -p 6789:6789 \&lt;br /&gt;
    -v /var/lib/unifi:/config \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    linuxserver/unifi-controller&lt;br /&gt;
&lt;br /&gt;
=== Home-Assistant (as part of host network) ===&lt;br /&gt;
  sudo docker run -d --name=home-assistant -e TZ=Europe/London \&lt;br /&gt;
    --net=host \&lt;br /&gt;
    -v /var/lib/home-assistant/config:/config -v /srv:/media -v /etc/ssl/bretts.org:/etc/ssl/bretts.org -v /var/www/html/arlo-snapshots:/arlo-snapshots \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    homeassistant/home-assistant&lt;br /&gt;
&lt;br /&gt;
=== Stash ===&lt;br /&gt;
  sudo docker run -d --name stash \&lt;br /&gt;
    -e STASH_GENERATED=/generated/ -e STASH_METADATA=/metadata/ -e STASH_CACHE=/cache/ \&lt;br /&gt;
    -e STASH_STASH=/data/ \&lt;br /&gt;
    -p 9999:9999 \&lt;br /&gt;
    -v /var/lib/stash:/root/.stash -v /var/lib/stash/metadata:/metadata -v /var/lib/stash/cache:/cache -v /var/lib/stash/blobs:/blobs -v /var/lib/stash/generated:/generated \&lt;br /&gt;
    -v /var/lib/stash/data:/data -v /srv/porn:/srv/porn -v /srv/incoming/torrents/deluge/porn:/srv/incoming/torrents/deluge/porn \&lt;br /&gt;
    -v /etc/localtime:/etc/localtime:ro \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    stashapp/stash&lt;br /&gt;
&lt;br /&gt;
=== Atlassian ===&lt;br /&gt;
&lt;br /&gt;
==== JIRA ====&lt;br /&gt;
Note: In this instance JIRA is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name jira&lt;br /&gt;
  sudo docker run -d --name=jira -e TZ=Europe/London \&lt;br /&gt;
    -e ATL_TOMCAT_SCHEME=https -e ATL_TOMCAT_SECURE=true -e ATL_PROXY_NAME=jira.bretts.org -e ATL_PROXY_PORT=443 \&lt;br /&gt;
    -p 7980:8080 \&lt;br /&gt;
    -v jira:/var/atlassian/application-data/jira \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/jira-software&lt;br /&gt;
&lt;br /&gt;
Docker JIRA runs with a uid and gid of 2001. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2001 jira-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2001 --gid 2001 jira-docker&lt;br /&gt;
&lt;br /&gt;
==== Bitbucket====&lt;br /&gt;
Note: In this instance Bitbucket is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bitbucket&lt;br /&gt;
  sudo docker run -d --name=bitbucket -e TZ=Europe/London \&lt;br /&gt;
    -e SERVER_SCHEME=https -e SERVER_SECURE=true -e SERVER_PROXY_NAME=bitbucket.bretts.org -e SERVER_PROXY_PORT=443 \&lt;br /&gt;
    -p 7990:7990 -p 7999:7999 \&lt;br /&gt;
    -v bitbucket:/var/atlassian/application-data/bitbucket \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bitbucket-server&lt;br /&gt;
&lt;br /&gt;
Docker Bitbucket runs with a uid and gid of 2003. To ensure they show up as a named user in the hosting system you can run:&lt;br /&gt;
  sudo addgroup --gid 2003 bitbucket-docker&lt;br /&gt;
  sudo adduser --system --no-create-home --uid 2003 --gid 2003 bitbucket-docker&lt;br /&gt;
&lt;br /&gt;
==== Bamboo ====&lt;br /&gt;
Note: In this instance Bamboo is configured (with `-v`) using a named volume, rather than a bind mount&lt;br /&gt;
  sudo docker volume create --name bamboo&lt;br /&gt;
  sudo docker run -d --name=bamboo -e TZ=Europe/London \&lt;br /&gt;
    -p 54663:54663 -p 7970:8085 \&lt;br /&gt;
    -v bamboo:/var/atlassian/application-data/bamboo \&lt;br /&gt;
    --restart unless-stopped \&lt;br /&gt;
    atlassian/bamboo-server&lt;br /&gt;
&lt;br /&gt;
===== Limitations =====&lt;br /&gt;
* Bamboo runs with a uid of 1000, which means it's likely to clash with a real user in the containing host&lt;br /&gt;
* Bamboo container doesn't support any reverse proxy configuration, which means hiding it behind nginx is likely to result in broken Application Links. This can be worked around by manually editing /opt/atlassian/bamboo/conf/server.xml, but those changes will be overwritten on every container upgrade.&lt;br /&gt;
&lt;br /&gt;
== Tips / Fixes ==&lt;br /&gt;
&lt;br /&gt;
=== Tautulli slow to start ===&lt;br /&gt;
This may be due to an attempt to chown a large number of files. &lt;br /&gt;
Login to the container:&lt;br /&gt;
  sudo docker exec -it &amp;lt;container&amp;gt; /bin/bash&lt;br /&gt;
Disable the chown step by editing &amp;lt;code&amp;gt;/etc/cont-init.d/30-config&amp;lt;/code&amp;gt; and commenting out the chown command.&lt;br /&gt;
&lt;br /&gt;
=== Adding an SSL cert for Unifi ===&lt;br /&gt;
  sudo openssl pkcs12 -export -inkey /etc/ssl/bretts.org/key.pem -in /etc/ssl/bretts.org/fullchain.pem -out /tmp/cert.p12 -name unifi -password pass:temppass&lt;br /&gt;
  sudo keytool -importkeystore -deststorepass aircontrolenterprise -destkeypass aircontrolenterprise -destkeystore /var/lib/unifi/data/keystore -srckeystore /tmp/cert.p12 -srcstoretype PKCS12 -srcstorepass temppass -alias unifi -noprompt&lt;br /&gt;
  sudo docker restart unifi-controller&lt;br /&gt;
  sudo rm /tmp/cert.p12&lt;br /&gt;
&lt;br /&gt;
=== Local DNS resolution fails on docker 18.09 ===&lt;br /&gt;
This may be the result of a bug: https://bugs.launchpad.net/ubuntu/+source/docker.io/+bug/1820278. Normally the container's /etc/resolv.conf should mirror that of the host, but in this case it seems to just be a default version. As a workaround, create /etc/docker/daemon.json with the following contents:&lt;br /&gt;
&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;dns&amp;quot;: [&amp;quot;192.168.1.1&amp;quot;, &amp;quot;8.8.8.8&amp;quot;],&lt;br /&gt;
    &amp;quot;dns-search&amp;quot;: [&amp;quot;bretts.org&amp;quot;]&lt;br /&gt;
  }&lt;/div&gt;</summary>
		<author><name>Andrew</name></author>	</entry>

	</feed>