292 lines
15 KiB
HTML
292 lines
15 KiB
HTML
|
<!DOCTYPE html>
|
|||
|
<html>
|
|||
|
<head>
|
|||
|
<title>The Internet Vagabond :: Syncthing on the Steam Deck</title>
|
|||
|
<link type="application/atom+xml" rel="alternate" href="https://www.theinternetvagabond.com/feed.xml" title="The Internet Vagabond" />
|
|||
|
<meta name="description"
|
|||
|
content="Rants of a wandering techy, in search of truth, knowledge, and a decent ping." />
|
|||
|
<meta name="author" content="Bill Niblock" />
|
|||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|||
|
<link rel="canonical" href="https://www.theinternetvagabond.com/2022/07/04/steam_deck_syncthing.html" />
|
|||
|
<link rel="stylesheet" type="text/css"
|
|||
|
href="https://www.theinternetvagabond.com/src/styles/corrupt_layout.css" />
|
|||
|
<link rel="stylesheet" type="text/css"
|
|||
|
href="https://www.theinternetvagabond.com/src/styles/corrupt_typog.css" />
|
|||
|
<link rel="icon" type="image/x-icon"
|
|||
|
href="https://www.theinternetvagabond.com/src/images/favicon.ico" />
|
|||
|
<link rel="stylesheet"
|
|||
|
href="https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/css/fork-awesome.min.css"
|
|||
|
integrity="sha256-XoaMnoYC5TH6/+ihMEnospgm0J1PM/nioxbOUdnM8HY="
|
|||
|
crossorigin="anonymous">
|
|||
|
<script data-goatcounter="https://theinternetvagabond.goatcounter.com/count"
|
|||
|
async src="https://www.theinternetvagabond.com/src/scripts/goatcounter.js"></script>
|
|||
|
</head>
|
|||
|
<body>
|
|||
|
<div class="cor_page">
|
|||
|
<header>
|
|||
|
<a href="/">
|
|||
|
<div>
|
|||
|
<span class="first">T</span>he
|
|||
|
<span class="first">I</span>nternet
|
|||
|
<span class="first">V</span>agabond
|
|||
|
</div>
|
|||
|
</a>
|
|||
|
</header>
|
|||
|
<main>
|
|||
|
<article>
|
|||
|
<h1 id="syncthing-on-the-steam-deck-updated">Syncthing on the Steam Deck (Updated!)</h1>
|
|||
|
|
|||
|
<h2 id="update">Update</h2>
|
|||
|
|
|||
|
<p>Turns out, when you update the SteamOS, it completely over-writes the operating
|
|||
|
system. All of the setup I had originally written was great, if I never update,
|
|||
|
which is unacceptable. Not all is lost; the quest simply gets harder. If I can’t
|
|||
|
rely on system-wide services, then I rely on user services.</p>
|
|||
|
|
|||
|
<h3 id="the-wrong-way-system-wide-services">The Wrong Way: System-Wide Services</h3>
|
|||
|
|
|||
|
<p>My first attempt was to setup Syncthing as a system-wide service managed by
|
|||
|
<code class="language-plaintext highlighter-rouge">systemd</code>, installed via <code class="language-plaintext highlighter-rouge">pacman</code>. There are several problems with this. First,
|
|||
|
it requires disabling the read-only file-system. Next, <code class="language-plaintext highlighter-rouge">pacman</code> is not setup nor
|
|||
|
reliable, since every SteamOS update will over-write any changes I make to any
|
|||
|
of the read-only file-system, including the directories that <code class="language-plaintext highlighter-rouge">pacman</code> relies on.
|
|||
|
Related, the update will also erase the Syncthing package. This means I either
|
|||
|
never update (inadvisable, and unacceptable), or I setup Syncthing not in the
|
|||
|
read-only file-system.</p>
|
|||
|
|
|||
|
<h3 id="the-right-way-user-services">The Right Way: User Services</h3>
|
|||
|
|
|||
|
<p>systemd allows for non-root-based services, called user services. The Arch Wiki
|
|||
|
<a href="https://wiki.archlinux.org/title/Systemd/User">systemd/User</a> article describes
|
|||
|
this functionality much more than I will. Here are the relevant details:</p>
|
|||
|
|
|||
|
<ul>
|
|||
|
<li>User services can be enabled to start when a user logs in</li>
|
|||
|
<li>Service files are stored in the user’s home directory (specifically
|
|||
|
<code class="language-plaintext highlighter-rouge">~/.config/systemd/user</code>)</li>
|
|||
|
<li>No root privileges are required. No modifying the read-only file-system</li>
|
|||
|
</ul>
|
|||
|
|
|||
|
<h2 id="syncthing">Syncthing</h2>
|
|||
|
|
|||
|
<p>Syncthing is incredible. I’ve <a href="2020/07/19/syncthing-part-1.html">written about it
|
|||
|
before</a>, but the setup here is a bit more
|
|||
|
involved. The Steam Deck runs Arch Linux (and have I told you yet today that I
|
|||
|
do too?), so the Arch Wiki <a href="https://wiki.archlinux.org/title/Syncthing">article on
|
|||
|
Syncthing</a> gives some good insight.
|
|||
|
When I initially started this process, I installed the SyncthingGTK application
|
|||
|
from the Discover Store. This means it is a Flatpak application, and so doesn’t
|
|||
|
require elevated user privileges. I also tried the Syncthingy application, which
|
|||
|
explicitly calls out Steam Deck users. However, both require running the Flatpak
|
|||
|
in the background (like some users do for Discord or Spotify). I don’t like
|
|||
|
this, it feels off, and thus I sought a different approach.</p>
|
|||
|
|
|||
|
<h2 id="sshd-still-incredibly-useful">SSHD: Still Incredibly Useful</h2>
|
|||
|
|
|||
|
<p>I got real tired real quick of using the on-screen keyboard. After
|
|||
|
complaining, a friend recommended I enable <code class="language-plaintext highlighter-rouge">sshd</code> and just remote in to the
|
|||
|
device. Doing so was a breeze, and I recommend to others who don’t have a
|
|||
|
physical keyboard they can plug into their device. Drop to desktop mode
|
|||
|
(hold the power button for a few seconds, and select the option), and start a
|
|||
|
terminal (default is Konsole). Before remotely accessing the device, or using
|
|||
|
elevated privileges via <code class="language-plaintext highlighter-rouge">sudo</code>, I need to set a password for the default user,
|
|||
|
<em>deck</em>. In the terminal, type <code class="language-plaintext highlighter-rouge">passwd</code> and set it (and then put it in your
|
|||
|
password vault so you don’t forget. You <em>do</em> have a password vault, right?).
|
|||
|
Start the service, <code class="language-plaintext highlighter-rouge">sudo systemctl start sshd</code>, and optionally enable it to have
|
|||
|
<code class="language-plaintext highlighter-rouge">sshd</code> automatically started on each boot (<code class="language-plaintext highlighter-rouge">sudo systemctl enable sshd</code>). Get
|
|||
|
the device IP with <code class="language-plaintext highlighter-rouge">ip addr list</code>, from my desktop run <code class="language-plaintext highlighter-rouge">ssh deck@ip-address</code>,
|
|||
|
type in the password, and now I’m a grade-A Hackermans.</p>
|
|||
|
|
|||
|
<p>This setting is not reset on SteamOS updates, that I can tell. Once enabled,
|
|||
|
this will always start at boot, and always be on until explicitly turned off. Be
|
|||
|
mindful of that if you decide to wander away from your home network; maybe turn
|
|||
|
it off in public if you don’t need it.</p>
|
|||
|
|
|||
|
<h2 id="setup">Setup</h2>
|
|||
|
|
|||
|
<p>There are 2 things required: a systemd service file, and the <code class="language-plaintext highlighter-rouge">syncthing</code>
|
|||
|
binary. Syncthing is written in Go, and a compiled binary can be downloaded that
|
|||
|
has no dependencies or installation requirements. It can be downloaded from
|
|||
|
the <a href="https://github.com/syncthing/syncthing/releases/tag/v1.20.3">Syncthing
|
|||
|
Releases</a> page for
|
|||
|
many platforms and architectures. The Steam Deck is a Linux platform, using the
|
|||
|
AMD64 architecture (or x86_64), so I grab that one. I’ll note here, since I have
|
|||
|
SSH access, I do all the editing and downloading on my desktop, and then
|
|||
|
transfer the files using <code class="language-plaintext highlighter-rouge">scp</code> to the Deck. All of these steps can be done on
|
|||
|
the Deck itself, without SSH access. Once the proper tarball has been
|
|||
|
downloaded, extract it, and within will be the <code class="language-plaintext highlighter-rouge">syncthing</code> binary, ready to
|
|||
|
rock. I copy/move the binary to <code class="language-plaintext highlighter-rouge">~/.local/bin/syncthing</code> on the Deck. The exact
|
|||
|
location is less important than ensuring the binary is within my home directory
|
|||
|
on the Deck.</p>
|
|||
|
|
|||
|
<p>The systemd serivce file can also be taken from the extracted tarball, but
|
|||
|
requires modification. In the tarball, it is
|
|||
|
<code class="language-plaintext highlighter-rouge">etc/linux-systemd/user/syncthing.service</code>. Copy this file to
|
|||
|
<code class="language-plaintext highlighter-rouge">~/.config/systemd/user</code> on the Deck, and edit the “ExecStart” line in the
|
|||
|
“[Service]” section from</p>
|
|||
|
|
|||
|
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>...
|
|||
|
[Service]
|
|||
|
ExecStart=/usr/bin/syncthing serve --no-browser --no-restart --logflags=0
|
|||
|
...
|
|||
|
</code></pre></div></div>
|
|||
|
|
|||
|
<p>to</p>
|
|||
|
|
|||
|
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>...
|
|||
|
[Service]
|
|||
|
ExecStart=/home/deck/.local/bin/syncthing serve --no-browser --no-restart --logflags=0
|
|||
|
...
|
|||
|
</code></pre></div></div>
|
|||
|
<p>(or wherever you decided to put the local <code class="language-plaintext highlighter-rouge">syncthing</code> binary)</p>
|
|||
|
|
|||
|
<p>With everything in place, I can now enable and start the Syncthing user service:</p>
|
|||
|
|
|||
|
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl --user enable syncthing.service
|
|||
|
systemctl --user start syncthing.service
|
|||
|
</code></pre></div></div>
|
|||
|
|
|||
|
<p>Since I don’t have a physical keyboard plugged in, I modify my SSH command
|
|||
|
slightly to forward the Syncthing web-UI from the Deck to my local machine:</p>
|
|||
|
|
|||
|
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh -L 31337:deck-ip-goes-here:8384 deck@deck-ip-goes-here
|
|||
|
</code></pre></div></div>
|
|||
|
|
|||
|
<p>Now, on my local machine I can open one tab to <code class="language-plaintext highlighter-rouge">localhost:8384</code>, to show
|
|||
|
Syncthing on my local machine, and another tab to <code class="language-plaintext highlighter-rouge">localhost:31337</code> to show
|
|||
|
Syncthing on my Deck. From here, I add my local machine as a device on my Deck,
|
|||
|
and begin sharing folders.</p>
|
|||
|
|
|||
|
<h2 id="closing-thoughts">Closing Thoughts</h2>
|
|||
|
|
|||
|
<p>I’ve been using this setup for about a week now. I’ve synced almost 20GB of
|
|||
|
files, including configurations and saves for Retroarch. It works after
|
|||
|
restarts, OS and client upgrades, and waking the device from sleep. It sits
|
|||
|
quietly in the background, without having to start up applications. The biggest
|
|||
|
problem is that it doesn’t automatically update to the newest version of
|
|||
|
Syncthing. It’s also a bit involved to setup. To that end, I’ve written a tool
|
|||
|
to help with setup: <a href="https://codeberg.org/VagabondAzulien/steam-deck-syncthing">Steam Deck Syncthing
|
|||
|
Setup</a>. I’m still
|
|||
|
finishing it up, but I intend to make use of it to keep my version of Syncthing
|
|||
|
up-to-date. If you use it, let me know!</p>
|
|||
|
|
|||
|
<div class="author_info">
|
|||
|
Bill Niblock
|
|||
|
<a href="https://unlicense.org/"
|
|||
|
aria-label="Code dedicated to the public domain under Unlicense">
|
|||
|
<span class="fa fa-cc-pd" aria-hidden="true"
|
|||
|
title="Code dedicated to the public domain under Unlicense"</span>
|
|||
|
</a>
|
|||
|
<a href="https://creativecommons.org/publicdomain/zero/1.0/"
|
|||
|
aria-label="Published to the public domain under CC0">
|
|||
|
<span class="fa fa-cc-zero" aria-hidden="true"
|
|||
|
title="Content dedicated to the public domain under CC0"</span>
|
|||
|
</a>
|
|||
|
2022-07-12
|
|||
|
<br />
|
|||
|
[
|
|||
|
|
|||
|
<a href="/topics/gaming">gaming</a>
|
|||
|
|
|||
|
<a href="/topics/technology">technology</a>
|
|||
|
|
|||
|
]
|
|||
|
</div>
|
|||
|
</article>
|
|||
|
</main>
|
|||
|
<footer>
|
|||
|
<nav>
|
|||
|
<div><a href="/">home</a></div>
|
|||
|
|
|||
|
<div><a href="/topics/all">all</a></div>
|
|||
|
|
|||
|
<div><a href="/topics/gaming">gaming</a></div>
|
|||
|
|
|||
|
<div><a href="/topics/other">other</a></div>
|
|||
|
|
|||
|
<div><a href="/topics/philosophy">philosophy</a></div>
|
|||
|
|
|||
|
<div><a href="/topics/technology">technology</a></div>
|
|||
|
|
|||
|
<div><a href="/topics/writing">writing</a></div>
|
|||
|
|
|||
|
</nav>
|
|||
|
|
|||
|
<hr />
|
|||
|
|
|||
|
<section class="h-card">
|
|||
|
<section class="footer_about" id="about">
|
|||
|
<div>The Site</div>
|
|||
|
<div>
|
|||
|
<a class="u-url" href="https://www.theinternetvagabond.com/feed.xml"
|
|||
|
aria-label="RSS feed for the site">
|
|||
|
<span class="fa fa-rss" aria-hidden="true"
|
|||
|
title="RSS Feed"</span>
|
|||
|
</a> |
|
|||
|
<a class="u-url" href="https://theinternetvagabond.goatcounter.com/"
|
|||
|
aria-label="GoatCounter statistics for the site">
|
|||
|
<span class="fa fa-bar-chart" aria-hidden="true"
|
|||
|
title="GoatCounter Statistics"</span>
|
|||
|
</a> |
|
|||
|
<a class="u-url" href="https://codeberg.org/VagabondAzulien/the-internet-vagabond-dot-com"
|
|||
|
aria-label="Source code repository for the site">
|
|||
|
<span class="fa fa-code" aria-hidden="true"
|
|||
|
title="Site Source Code"</span>
|
|||
|
</a>
|
|||
|
</div>
|
|||
|
<a class="u-url u-uid" href="https://theinternetvagabond.com"></a>
|
|||
|
<p>
|
|||
|
This site is a small slice of internet real-estate that I use for
|
|||
|
occasional writing. Nothing I say is visionary or profound. I
|
|||
|
focus on technology, gaming, and philosophy. All opinions my
|
|||
|
own.
|
|||
|
</p>
|
|||
|
<div>The Vagabond</div>
|
|||
|
<div>
|
|||
|
<a class="u-email" rel="me"
|
|||
|
href="mailto:bill@theinternetvagabond.com"
|
|||
|
aria-label="Email Bill at The Internet Vagabond dot com">
|
|||
|
<span class="fa fa-envelope-o" aria-hidden="true"
|
|||
|
title="Email bill at theinternetvagabond.com"</span>
|
|||
|
</a> |
|
|||
|
<a class="u-url" rel="me"
|
|||
|
href="https://matrix.to/#/@vagabondazulien:matrix.org"
|
|||
|
aria-label="Speak with me on Matrix">
|
|||
|
<span class="fa fa-matrix-org" aria-hidden="true"
|
|||
|
title="Speak with me on Matrix"</span>
|
|||
|
</a> |
|
|||
|
<a class="u-url" rel="me"
|
|||
|
href="https://mastodon.social/@azulien"
|
|||
|
aria-label="Find me on the Fediverse">
|
|||
|
<span class="fa fa-mastodon" aria-hidden="true"
|
|||
|
title="Find me on the Fediverse"</span>
|
|||
|
</a> |
|
|||
|
<a class="u-url" rel="me" href="https://www.twitch.tv/vagabondazulien/profile"
|
|||
|
aria-label="Link to my Twitch channel">
|
|||
|
<span class="fa fa-twitch " aria-hidden="true"
|
|||
|
title="My Twitch channel"</span>
|
|||
|
</a>
|
|||
|
</div>
|
|||
|
<p>
|
|||
|
My name is <span class="p-name">Bill Niblock</span>. <span
|
|||
|
class="p-note">I'm a computer scientist by education, a technologist
|
|||
|
by trade, a gamer by hobby, and a philosopher by accident. I
|
|||
|
live in <span class="p-locality">Buffalo</span>, <span class="p-region">
|
|||
|
New York</span>, <span class="p-country-name">USA</span>.
|
|||
|
</p>
|
|||
|
</section>
|
|||
|
<section style="display: none;">
|
|||
|
<span class="p-category">Gaming</span>
|
|||
|
<span class="p-category">Technology</span>
|
|||
|
<span class="p-category">Philosophy</span>
|
|||
|
<span class="p-category">Open Source Software</span>
|
|||
|
<span class="p-category">Self-Hosting</span>
|
|||
|
<span class="p-category">Coffee</span>
|
|||
|
</section>
|
|||
|
</section>
|
|||
|
</footer>
|
|||
|
|
|||
|
</div>
|
|||
|
</body>
|
|||
|
</html>
|