<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: dom</title>
    <description>The latest articles on Forem by dom (@do76).</description>
    <link>https://forem.com/do76</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2270397%2Fec25df9e-23d3-4e68-aa07-d541c89d0699.png</url>
      <title>Forem: dom</title>
      <link>https://forem.com/do76</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/do76"/>
    <language>en</language>
    <item>
      <title>Cool / must have Paint.net plugins</title>
      <dc:creator>dom</dc:creator>
      <pubDate>Sun, 30 Nov 2025 09:54:31 +0000</pubDate>
      <link>https://forem.com/do76/cool-must-have-paintnet-plugins-14d1</link>
      <guid>https://forem.com/do76/cool-must-have-paintnet-plugins-14d1</guid>
      <description>&lt;p&gt;paint.net extensions / paint.net plugins&lt;br&gt;
&lt;code&gt;boltbait.com/pdn&lt;/code&gt;&lt;br&gt;
&lt;code&gt;kris vandermotten - object align/blur/gradient/other https://www.vandermotten.be/paintdotnet http://users.telenet.be/krisvandermotten/Downloads/PaintDotNetEffects.html&lt;/code&gt;&lt;br&gt;
&lt;code&gt;madjik - seamless texture&lt;/code&gt;&lt;br&gt;
&lt;code&gt;mike ryan - alias&lt;/code&gt;&lt;br&gt;
&lt;code&gt;https://forums.getpaint.net/topic/112730-content-aware-fill-2018-10-4/&lt;/code&gt;&lt;br&gt;
&lt;code&gt;smudge https://forums.getpaint.net/topic/7291-pyrochild-plugins-2017-12-04/&lt;/code&gt;&lt;br&gt;
&lt;code&gt;aa assist + extra https://forums.getpaint.net/topic/16643-dpys-plugin-pack-2014-05-04/&lt;br&gt;
https://gmic.eu/download.html&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

</description>
      <category>design</category>
      <category>resources</category>
      <category>tooling</category>
    </item>
    <item>
      <title>node-exporter install (dedicated user, no package)</title>
      <dc:creator>dom</dc:creator>
      <pubDate>Mon, 10 Nov 2025 18:21:50 +0000</pubDate>
      <link>https://forem.com/do76/node-exporter-install-dedicated-user-no-package-2am4</link>
      <guid>https://forem.com/do76/node-exporter-install-dedicated-user-no-package-2am4</guid>
      <description>&lt;p&gt;See the latest version, and correct CPU architecture over at &lt;br&gt;
&lt;a href="https://github.com/prometheus/node_exporter/releases/latest" rel="noopener noreferrer"&gt;https://github.com/prometheus/node_exporter/releases/latest&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# grab latest release EXAMPLE:
# wget https://github.com/prometheus/node_exporter/releases/download/v1.10.2/node_exporter-1.10.2.linux-amd64.tar.gz
tar -xf node_exporter-1.10.2.linux-amd64.tar.gz
cd node_exporter-1.10.2.linux-amd64/
ls
./node_exporter # see if it works

sudo groupadd --system node_exporter
sudo useradd -s /sbin/nologin --system -g node_exporter node_exporter
sudo cp node_exporter /usr/bin/
sudo chown node_exporter:node_exporter /usr/bin/node_exporter
nano /usr/lib/systemd/system/node_exporter.service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;you can use either&lt;br&gt;
&lt;code&gt;/usr/lib/systemd/system/&lt;br&gt;
/etc/systemd/system/&lt;/code&gt;&lt;br&gt;
but i'll go with &lt;code&gt;&lt;br&gt;
/usr/lib/systemd/system/node_exporter.service&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Unit]
Description=Node Exporter
Documentation=https://prometheus.io/docs/guides/node-exporter/
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
Restart=on-failure
ExecStart=/usr/bin/node_exporter

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chmod 664 /usr/lib/systemd/system/node_exporter.service
sudo systemctl daemon-reload
sudo systemctl enable node_exporter
sudo systemctl start node_exporter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;see &lt;code&gt;http://&amp;lt;host&amp;gt;:9100/metrics&lt;/code&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Docker backups/migration using rclone</title>
      <dc:creator>dom</dc:creator>
      <pubDate>Thu, 23 Oct 2025 13:59:50 +0000</pubDate>
      <link>https://forem.com/do76/docker-backupsmigration-using-rclone-27fe</link>
      <guid>https://forem.com/do76/docker-backupsmigration-using-rclone-27fe</guid>
      <description>&lt;p&gt;stop all containers:&lt;br&gt;&lt;br&gt;
docker stop $(docker ps -q)&lt;/p&gt;

&lt;p&gt;rclone copy for file copy, or sync if to have exact match as in source server.&lt;br&gt;
rclone follows the logic of first input being from, second input being to (in this case newserver as configured using rclone config, though you can also use backend: and passing in the required credentials that backend requires, if you don't want to setup rclone config file)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rclone copy /opt/stacks/ newserver:/opt/stacks/ -P -L&lt;/code&gt; (because i use dockge)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;rclone copy /var/lib/docker/volumes newserver:/var/lib/docker/volumes -P -L \&lt;br&gt;
  --exclude '**/*.sock' \&lt;br&gt;
  --exclude '**/casper' \&lt;br&gt;
  --exclude '**/source'&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;test if works in new server or resume run of services&lt;/p&gt;

&lt;p&gt;start container (if backup)&lt;br&gt;
docker start $(docker ps -a -q)&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>docker</category>
      <category>devops</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Windows WSL under Proxmox</title>
      <dc:creator>dom</dc:creator>
      <pubDate>Sun, 22 Jun 2025 09:50:54 +0000</pubDate>
      <link>https://forem.com/do76/windows-wsl-under-proxmox-21ha</link>
      <guid>https://forem.com/do76/windows-wsl-under-proxmox-21ha</guid>
      <description>&lt;p&gt;When trying to enable Hyper-V/VMP in Windows, after VM reboot, the virtual machine stuck at boot process/virtual machine can’t boot at all&lt;/p&gt;

&lt;p&gt;check in pve:&lt;br&gt;
cat /sys/module/kvm_intel/parameters/nested&lt;/p&gt;

&lt;p&gt;If the guest OS tries to access an unsupported MSR, instead of throwing a general protection fault or killing the VM, KVM ignores the access.&lt;br&gt;
echo "Y" &amp;gt; /sys/module/kvm/parameters/ignore_msrs #temp&lt;br&gt;
echo "options kvm ignore_msrs=1" &amp;gt;&amp;gt; /etc/modprobe.d/kvm.conf #perm&lt;/p&gt;

&lt;p&gt;modprobe -r kvm &lt;/p&gt;

&lt;p&gt;Set CPU to HOST&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k73nj4y35vsungx5gui.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7k73nj4y35vsungx5gui.png" alt="CPU set to HOST" width="549" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also Machine settings under Hardware, we are using i440fx not q35&lt;/p&gt;

&lt;p&gt;SSH to server,&lt;br&gt;
Navigate to &lt;code&gt;/etc/pve/qemu-server/&lt;/code&gt;&lt;br&gt;
Edit the machine ID (e.g. 123.conf) which will need nested virtualization (Proxmox server having Windows VM which will use Docker, WSL, Hyper-V, etc)&lt;/p&gt;

&lt;p&gt;Add &lt;code&gt;args: -cpu host,hv_passthrough,level=30,-waitpkg&lt;/code&gt;&lt;br&gt;
If you have some issues, experiment by removing some arguments or changing values&lt;/p&gt;

&lt;p&gt;In Windows as admin cmd&lt;br&gt;
wsl --set-default-version 2&lt;br&gt;
wsl --update&lt;br&gt;
wsl --install -d debian&lt;br&gt;
(will install Virtual Machine Platform, and WSL support)&lt;/p&gt;

&lt;p&gt;if still can't boot, stuck on Logo, do&lt;br&gt;
bcdedit /set hypervisorlaunchtype off&lt;/p&gt;

&lt;p&gt;If error code:&lt;br&gt;
An error occurred during installation. Distribution Name: 'Debian GNU/Linux' Error Code: 0x80072ee7&lt;br&gt;
Make sure windows is up to date. If you use IOT Enterprise, enable Microsoft store &lt;code&gt;wsreset -i&lt;/code&gt;&lt;/p&gt;

</description>
      <category>virtualmachine</category>
      <category>howto</category>
      <category>tooling</category>
      <category>debugging</category>
    </item>
    <item>
      <title>How to Migrate a Self-Hosted GitLab Instance (Docker-Based) to a New Machine</title>
      <dc:creator>dom</dc:creator>
      <pubDate>Mon, 30 Dec 2024 14:18:27 +0000</pubDate>
      <link>https://forem.com/do76/how-to-migrate-a-self-hosted-gitlab-instance-docker-based-to-a-new-machine-43ek</link>
      <guid>https://forem.com/do76/how-to-migrate-a-self-hosted-gitlab-instance-docker-based-to-a-new-machine-43ek</guid>
      <description>&lt;p&gt;Using the usual &lt;code&gt;rclone sync casaos:/DATA/AppData/gitlab-ee/ /DATA/AppData/gitlab-ee/ -P --create-empty-src-dirs -l&lt;/code&gt; doesn't help because lot's of copy errors, and symlinks don't endup being remade thus gitlab fails to start up on new server.&lt;/p&gt;

&lt;p&gt;Nice optional have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gitlab-rails console
# wait for startup (its slow)
::Gitlab::CurrentSettings.update!(maintenance_mode: true)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start from here:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gitlab-backup create  
/DATA/AppData/gitlab-ee/data/backups
# echo 1735565802_2024_12_30_17.5.1-ee_gitlab_backup.tar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create the docker on new server&lt;/p&gt;

&lt;p&gt;Restore on new one&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# OPTIONAL: Create the /opt/gitlab/data/backups directory, including any parent directories if they don't exist
mkdir -p /DATA/AppData/gitlab-ee/data/backups

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;get inside container or use &lt;code&gt;docker exec -t &amp;lt;name of container&amp;gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gitlab-ctl stop puma&amp;amp;&amp;amp;gitlab-ctl stop sidekiq&amp;amp;&amp;amp;gitlab-ctl status&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Execute the command inside the running "gitlab-backend" container to stop the Puma service&lt;br&gt;&lt;br&gt;
&lt;code&gt;gitlab-ctl stop puma&lt;/code&gt;&lt;br&gt;
Execute the command inside the running "gitlab-backend" container to stop the Sidekiq service&lt;br&gt;&lt;br&gt;
&lt;code&gt;gitlab-ctl stop sidekiq&lt;/code&gt;&lt;br&gt;
Verify that the GitLab services have stopped by checking the status of all services in the container&lt;br&gt;&lt;br&gt;
&lt;code&gt;gitlab-ctl status&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Run the GitLab backup restore command inside the running "gitlab-backend" container (restore to specific)&lt;br&gt;
&lt;code&gt;gitlab-backup restore BACKUP=1735565802_2024_12_30_17.5.1-ee_gitlab_backup&lt;/code&gt;&lt;br&gt;
Autodetect / better - especially if you provide the file correctly yet it still pretends to "fail" to find it:&lt;br&gt;
&lt;code&gt;gitlab-backup restore force=yes&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;NOT INCLUDED IN BACKUP:&lt;br&gt;
"/DATA/AppData/gitlab-ee/config/gitlab.rb"&lt;br&gt;
"/DATA/AppData/gitlab-ee/config/gitlab-secrets.json"&lt;br&gt;
will need to transfer them manually&lt;/p&gt;

&lt;p&gt;Run the GitLab reconfigure command inside the running "gitlab-backend" container&lt;br&gt;
&lt;code&gt;docker exec -t gitlab-backend gitlab-ctl reconfigure&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Restart the "gitlab-backend" container after reconfiguration&lt;br&gt;
&lt;code&gt;docker restart gitlab-backend&lt;/code&gt;&lt;br&gt;
Done!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Tailscale OpenWRT Subnet/Site to site config</title>
      <dc:creator>dom</dc:creator>
      <pubDate>Sun, 22 Dec 2024 19:26:52 +0000</pubDate>
      <link>https://forem.com/do76/tailscale-openwrt-subnetsite-to-site-config-4h4n</link>
      <guid>https://forem.com/do76/tailscale-openwrt-subnetsite-to-site-config-4h4n</guid>
      <description>&lt;p&gt;ref: &lt;a href="https://tailscale.com/kb/1019/subnets#connect-to-tailscale-as-a-subnet-router" rel="noopener noreferrer"&gt;https://tailscale.com/kb/1019/subnets#connect-to-tailscale-as-a-subnet-router&lt;/a&gt; and &lt;a href="https://tailscale.com/kb/1214/site-to-site" rel="noopener noreferrer"&gt;https://tailscale.com/kb/1214/site-to-site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your Linux system has a &lt;code&gt;/etc/sysctl.d&lt;/code&gt; directory, (check with &lt;code&gt;ls /etc/sysctl.d/&lt;/code&gt;) use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Otherwise:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Home network: 192.168.8.0, router ip 192.168.8.1 &lt;/p&gt;

&lt;p&gt;&lt;code&gt;tailscale up --advertise-routes=192.168.8.0/24 --accept-dns=false --accept-routes&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;to show device origin IP instead of subnet router host add --snat-subnet-routes=false: &lt;br&gt;
&lt;code&gt;tailscale up --advertise-routes=192.168.8.0/24 --accept-dns=false --accept-routes --snat-subnet-routes=false&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;use &lt;code&gt;tailscale set&lt;/code&gt; so it persists&lt;/p&gt;

&lt;p&gt;approve on &lt;a href="https://login.tailscale.com/admin/machines" rel="noopener noreferrer"&gt;https://login.tailscale.com/admin/machines&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you use Adguard Home: &lt;br&gt;
Add &lt;code&gt;[/ts.net/]100.100.100.100&lt;/code&gt; in "Upstream DNS servers"&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugck9g9yp5c4u3c904mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugck9g9yp5c4u3c904mi.png" alt=" " width="800" height="621"&gt;&lt;/a&gt; If not there's always this to consider:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/dnsmasq.conf
server=/ts.net/100.100.100.100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;IMPORTANT NOTES:&lt;br&gt;
GL-inet tends to reset tailscale (imo LAN/WAN toggles are decorative), which breaks subnet/S2S routing feature.&lt;br&gt;
Router reboot needed to make it work, as well as other routers to acknowledge the new IP route &lt;br&gt;
(e.g. home router after internet loss broke subnet, or using wifi repeater, tailscale subnet stopped working, travel router was used to connect using ts.net, to then fix subnet routing, after fix still had to reboot travel router for changes to get noticed)&lt;br&gt;
OpenWRT - Make sure to allow access to web/ssh from other networks &lt;a href="https://forum.openwrt.org/t/allow-ssh-on-wan/74995/2" rel="noopener noreferrer"&gt;https://forum.openwrt.org/t/allow-ssh-on-wan/74995/2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Good to know:&lt;br&gt;
Tailscale ports:&lt;br&gt;
Make direct connections by allowing UDP port 41641 to ingress through the firewall&lt;br&gt;
Direct connection between VMs, also add an outbound firewall rule allowing UDP port 3478.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>devops</category>
      <category>linux</category>
      <category>networking</category>
    </item>
    <item>
      <title>TMUX for automation / startup monitoring</title>
      <dc:creator>dom</dc:creator>
      <pubDate>Fri, 06 Dec 2024 11:14:47 +0000</pubDate>
      <link>https://forem.com/do76/tmux-for-automation-startup-monitoring-2223</link>
      <guid>https://forem.com/do76/tmux-for-automation-startup-monitoring-2223</guid>
      <description>&lt;p&gt;The problem: Need to start multiple services all at once and also be able to monitor them somehow (there's no way to do logging to a file, because custom CLI tool).&lt;br&gt;
Example use case: Spin up dev server in one click - start server, IDE like VS Code, and Docker subservices (database etc), de clutter multiple terminal windows into one and to monitor logs more easily.&lt;/p&gt;

&lt;p&gt;sudo EDITOR=nano crontab -e&lt;br&gt;
&lt;code&gt;@reboot bash /path/to/script.sh&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;script.sh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash 

SESH="startupIO" 

tmux has-session -t $SESH 2&amp;gt;/dev/null 

if [ $? != 0 ]; then 
    ## 8000
    tmux new-session -d -s $SESH -n "rhttpds"
    tmux send-keys -t $SESH:rhttpds "bash /home/user/Desktop/services/startup/rhttpds.sh" C-m 

    ## 8024
    tmux new-window -t $SESH -n "rhttpds80" 
    tmux send-keys -t $SESH:rhttpds80 "bash /home/user/Desktop/services/startup/rhttpds80.sh" C-m 

    ## 2121
    tmux new-window -t $SESH -n "uploadFTP" 
    tmux send-keys -t $SESH:uploadFTP "bash /home/user/Desktop/services/startup/upload-FTP.sh" C-m 

    tmux set-option -t $SESH status on 
    tmux set-option -t $SESH status-style fg=white,bg=black 
    tmux set-option -t $SESH mouse on

    tmux select-window -t $SESH:rhttpds80 
fi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reconnect to terminal&lt;br&gt;
tmux attach-session -t startupIO&lt;/p&gt;

&lt;p&gt;Switch between windows&lt;br&gt;
Previous: Ctrl+B then P&lt;br&gt;
Next: Ctrl+B then N&lt;br&gt;
Other shortcuts: &lt;a href="https://tmuxcheatsheet.com/" rel="noopener noreferrer"&gt;https://tmuxcheatsheet.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Stop all&lt;br&gt;
tmux kill-ses -t startupIO&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Create your own private TLD / .local domain DNS</title>
      <dc:creator>dom</dc:creator>
      <pubDate>Fri, 06 Dec 2024 10:13:53 +0000</pubDate>
      <link>https://forem.com/do76/create-your-own-private-tld-local-domain-dns-4hk9</link>
      <guid>https://forem.com/do76/create-your-own-private-tld-local-domain-dns-4hk9</guid>
      <description>&lt;p&gt;My network setup: Site to site VPN (No matter what location, networks are cross linked, so I'm able to access the intranet / LAN, but keep using the ISP of that location to not cause internet speed slowdown and higher latency (e.g. Mobile operator, only use VPN tunnel for inter-LAN connection), Technitium DNS, OpenWRT.&lt;/p&gt;

&lt;p&gt;You can self host Technitium locally or in some cloud by also adding site to site vpn on there (Tailscale is also capable of behaving like S2S thanks to subnet router feature &lt;a href="https://tailscale.com/kb/1019/subnets#connect-to-tailscale-as-a-subnet-router" rel="noopener noreferrer"&gt;https://tailscale.com/kb/1019/subnets#connect-to-tailscale-as-a-subnet-router&lt;/a&gt; &lt;a href="https://tailscale.com/kb/1214/site-to-site" rel="noopener noreferrer"&gt;https://tailscale.com/kb/1214/site-to-site&lt;/a&gt;)&lt;br&gt;
or once again DIY using wireguard like here &lt;a href="https://github.com/mjtechguy/wireguard-site-to-site" rel="noopener noreferrer"&gt;https://github.com/mjtechguy/wireguard-site-to-site&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install Technitium:&lt;br&gt;
&lt;a href="https://wiki.opensourceisawesome.com/books/authoritative-dns/page/install-and-configure-a-primary-and-secondary-technitium-authoritative-name-server" rel="noopener noreferrer"&gt;https://wiki.opensourceisawesome.com/books/authoritative-dns/page/install-and-configure-a-primary-and-secondary-technitium-authoritative-name-server&lt;/a&gt;&lt;br&gt;
or via Docker &lt;a href="https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml" rel="noopener noreferrer"&gt;https://github.com/TechnitiumSoftware/DnsServer/blob/master/docker-compose.yml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On OpenWRT&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo nano /etc/dnsmasq.conf
server=/your-tld/127.technitium.ip.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;then&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/etc/init.d/dnsmasq restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and while yes, You could also use your private DNS server for &lt;strong&gt;&lt;em&gt;everything everything&lt;/em&gt;&lt;/strong&gt; (and maybe as a pi-hole like behavior too), but if it breaks (fully or partially), you may not be able to reach websites, seems like even if you did set the fallback of any other dns provider IP. And either way imo split dns seems more effective.&lt;/p&gt;

&lt;p&gt;If you use Adguard Home: &lt;br&gt;
Add &lt;code&gt;[/ts.net/]100.100.100.100&lt;/code&gt; in "Upstream DNS servers"&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugck9g9yp5c4u3c904mi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fugck9g9yp5c4u3c904mi.png" alt=" " width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;other good to know things:&lt;br&gt;
&lt;code&gt;address=/your-tld/127.technitium.ip.0.1&lt;/code&gt; is more like a hosts record, will override everything to be that one ip (it won't question whats ip of the domain from dns server)&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
