sebdanielsson.devThe personal site of Sebastian Danielssonhttps://sebdanielsson.devenAnalyze Boot Performance with systemd-analyzehttps://sebdanielsson.dev/analyze-boot-performance-with-systemd-analyzehttps://sebdanielsson.dev/analyze-boot-performance-with-systemd-analyzeLearn how to analyze and optimize your Linux boot performance using systemd-analyze to identify bottlenecks and improve system startup times.Mon, 18 Apr 2022 00:00:00 GMT<p>systemd comes with a tool for analyzing boot times, called systemd-analyze.</p> <!--truncate--> <p><strong>Read more:</strong> <a href="https://plocate.sesse.net/plocate.1.html">plocate(1)</a>, <a href="https://plocate.sesse.net/plocate-build.8.html">plocate-build(8)</a>, <a href="https://plocate.sesse.net/updatedb.8.html">updatedb(8)</a>, <a href="https://plocate.sesse.net/updatedb.conf.5.html">updatedb.conf(5)</a></p> <h2 id="update-database">Update database</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">updatedb</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="updatedb"><div></div></button></div></figure></div> <h2 id="check-current-boot-time">Check current boot time</h2> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemd-analyze</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">time</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemd-analyze time"><div></div></button></div></figure></div> <p>systemd will show the boot time for the kernel, all of the user space processes and the total boot time.</p> <h2 id="list-initialize-time-for-all-systemd-units">List initialize time for all systemd units</h2> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemd-analyze</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">blame</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemd-analyze blame"><div></div></button></div></figure></div> <p>Show start times for all processes. This helps you find bottlenecks in your boot process.</p>linuxbootperformancesystemdtutorialguideSebastian DanielssonCreate cloud-init templates in Proxmoxhttps://sebdanielsson.dev/create-cloud-init-templates-in-proxmoxhttps://sebdanielsson.dev/create-cloud-init-templates-in-proxmoxGuide to creating cloud-init templates in Proxmox VE for fast VM deployment with automated setup, EFI support, and cloud image integration.Mon, 11 Jul 2022 00:00:00 GMT<p>Quickly deploy VMs in Proxmox VE with automated cloud-init templates. This guide covers creating, configuring, and using templates for fast, consistent provisioning.</p> <h2 id="creating-the-template">Creating the template</h2> <p>Download an OpenStack compatible cloud image. For example Fedora Cloud Base 36.</p> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">wget</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">https://download.fedoraproject.org/pub/fedora/linux/releases/37/Cloud/x86_64/images/Fedora-Cloud-Base-37-1.7.x86_64.qcow2</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="wget https://download.fedoraproject.org/pub/fedora/linux/releases/37/Cloud/x86_64/images/Fedora-Cloud-Base-37-1.7.x86_64.qcow2"><div></div></button></div></figure></div> <p>Set variables for STORAGE, IMAGE_FILE, TEMPLATE_ID, TEMPLATE_NAME, VM_ID, VM_NAME. Make sure these names and identifiers are unique.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">STORAGE</span><span style="--0:#F97583">=</span><span style="--0:#9ECBFF">'local-lvm'</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">IMAGE_FILE</span><span style="--0:#F97583">=</span><span style="--0:#9ECBFF">'Fedora-Cloud-Base-37-1.7.x86_64.qcow2'</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">TEMPLATE_ID</span><span style="--0:#F97583">=</span><span style="--0:#9ECBFF">'1000'</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">TEMPLATE_NAME</span><span style="--0:#F97583">=</span><span style="--0:#9ECBFF">'fedora-template'</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">VM_ID</span><span style="--0:#F97583">=</span><span style="--0:#9ECBFF">'100'</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">VM_NAME</span><span style="--0:#F97583">=</span><span style="--0:#9ECBFF">'fedora-server'</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="STORAGE=&#x27;local-lvm&#x27;IMAGE_FILE=&#x27;Fedora-Cloud-Base-37-1.7.x86_64.qcow2&#x27;TEMPLATE_ID=&#x27;1000&#x27;TEMPLATE_NAME=&#x27;fedora-template&#x27;VM_ID=&#x27;100&#x27;VM_NAME=&#x27;fedora-server&#x27;"><div></div></button></div></figure></div> <p>Create a new VM to act as a template. Note: —ostype can be l26 for Linux kernel 2.6 or newer or win11 for Windows 11</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">create</span><span style="--0:#E1E4E8"> $TEMPLATE_ID </span><span style="--0:#79B8FF">--name</span><span style="--0:#E1E4E8"> $TEMPLATE_NAME </span><span style="--0:#79B8FF">--machine</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">q35</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--cpu</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">cputype=host</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--core</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">2</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--memory</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">2048</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--net0</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">virtio,bridge=vmbr0</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--bios</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">ovmf</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--ostype</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">l26</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm create $TEMPLATE_ID --name $TEMPLATE_NAME --machine q35 --cpu cputype=host --core 2 --memory 2048 --net0 virtio,bridge=vmbr0 --bios ovmf --ostype l26"><div></div></button></div></figure></div> <p>Add EFI disk.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $TEMPLATE_ID </span><span style="--0:#79B8FF">-efidisk0</span><span style="--0:#E1E4E8"> $STORAGE</span><span style="--0:#9ECBFF">:0,format=raw,efitype=4m,pre-enrolled-keys=</span><span style="--0:#79B8FF">1</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $TEMPLATE_ID -efidisk0 $STORAGE:0,format=raw,efitype=4m,pre-enrolled-keys=1"><div></div></button></div></figure></div> <p>Add TPM Module (Only required for Windows 11.)</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $TEMPLATE_ID </span><span style="--0:#79B8FF">-tpmstate0</span><span style="--0:#E1E4E8"> $STORAGE</span><span style="--0:#9ECBFF">:1,version=v2.0</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $TEMPLATE_ID -tpmstate0 $STORAGE:1,version=v2.0"><div></div></button></div></figure></div> <p>Import the downloaded image to local-lvm storage.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">importdisk</span><span style="--0:#E1E4E8"> $TEMPLATE_ID $IMAGE_FILE $STORAGE</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm importdisk $TEMPLATE_ID $IMAGE_FILE $STORAGE"><div></div></button></div></figure></div> <p>Attach our cloud-init image as a storage device.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $TEMPLATE_ID </span><span style="--0:#79B8FF">--scsihw</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">virtio-scsi-pci</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--scsi0</span><span style="--0:#E1E4E8"> $STORAGE</span><span style="--0:#9ECBFF">:vm-</span><span style="--0:#E1E4E8">$TEMPLATE_ID</span><span style="--0:#9ECBFF">-disk-1</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $TEMPLATE_ID --scsihw virtio-scsi-pci --scsi0 $STORAGE:vm-$TEMPLATE_ID-disk-1"><div></div></button></div></figure></div> <p>Attach a drive for the cloud-init configuration.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $TEMPLATE_ID </span><span style="--0:#79B8FF">--ide2</span><span style="--0:#E1E4E8"> $STORAGE</span><span style="--0:#9ECBFF">:cloudinit</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $TEMPLATE_ID --ide2 $STORAGE:cloudinit"><div></div></button></div></figure></div> <p>Configure the VM to boot from our cloud-init image.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $TEMPLATE_ID </span><span style="--0:#79B8FF">--boot</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">c</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--bootdisk</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">scsi0</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $TEMPLATE_ID --boot c --bootdisk scsi0"><div></div></button></div></figure></div> <p>Add a serial console for remote management with OpenStack.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $TEMPLATE_ID </span><span style="--0:#79B8FF">--serial0</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">socket</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--vga</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">serial0</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $TEMPLATE_ID --serial0 socket --vga serial0"><div></div></button></div></figure></div> <p>Convert the VM into a VM template.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">template</span><span style="--0:#E1E4E8"> $TEMPLATE_ID</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm template $TEMPLATE_ID"><div></div></button></div></figure></div> <h2 id="using-the-template">Using the template</h2> <p>Clone the template into a new VM.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">clone</span><span style="--0:#E1E4E8"> $TEMPLATE_ID $VM_ID </span><span style="--0:#79B8FF">--name</span><span style="--0:#E1E4E8"> $VM_NAME </span><span style="--0:#79B8FF">--full</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">true</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm clone $TEMPLATE_ID $VM_ID --name $VM_NAME --full true"><div></div></button></div></figure></div> <p>Resize the storage to your liking. New size can be new absolute size or prepend a + before the amount to add that amount storage in addition to current size.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">resize</span><span style="--0:#E1E4E8"> $VM_ID </span><span style="--0:#9ECBFF">scsi0</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">+20G</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm resize $VM_ID scsi0 +20G"><div></div></button></div></figure></div> <p>Add our public SSH key to the VM’s <code>authorized_keys</code>.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $VM_ID </span><span style="--0:#79B8FF">--sshkey</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">~/.ssh/name_ed25519.pub</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $VM_ID --sshkey ~/.ssh/name_ed25519.pub"><div></div></button></div></figure></div> <p>Configure the the username for the default user.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $VM_ID </span><span style="--0:#79B8FF">--ciuser</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">'fedora'</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $VM_ID --ciuser &#x27;fedora&#x27;"><div></div></button></div></figure></div> <p>Configure the the password for the default user.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set</span><span style="--0:#E1E4E8"> $VM_ID </span><span style="--0:#79B8FF">--cipassword</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">'SuperSecretPassword'</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm set $VM_ID --cipassword &#x27;SuperSecretPassword&#x27;"><div></div></button></div></figure></div> <p>Start the newly created VM.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="sh"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> $VM_ID</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qm start $VM_ID"><div></div></button></div></figure></div>linuxvmvirtualizationproxmoxtemplatecloud-initefitpmcloudbaseimagetutorialguideSebastian DanielssonRun WireGuard & Transmission in a Docker Containerhttps://sebdanielsson.dev/docker-wireguard-transmissionhttps://sebdanielsson.dev/docker-wireguard-transmissionLearn how to run WireGuard VPN and Transmission BitTorrent client together in a lightweight Alpine Linux Docker container with a custom dark web interface.Sat, 30 May 2020 00:00:00 GMT<p><strong>Update 2021-05-23:</strong> This project is no longer maintained because there is a more clean way of achieving this with only a compose file. Check out my other repo here: <a href="https://github.com/SebDanielsson">SebDanielsson</a> / <a href="https://github.com/SebDanielsson/compose-transmission-wireguard">compose-transmission-wireguard</a></p> <p>I just released my first Docker image! It’s based on Alpine Linux and runs both WireGuard and Transmission in one container that weights in at about 30 MB. I’ve customized Transmission to run the excellent <a href="https://github.com/Secretmapper">Secretmapper</a> / <a href="https://github.com/Secretmapper/combustion">combustion</a> web interface and also applied my <a href="https://github.com/SebDanielsson">SebDanielsson</a> / <a href="https://github.com/SebDanielsson/dark-combustion">dark-combustion</a> color palette.</p> <!--truncate--> <ul> <li>GitHub: <a href="https://github.com/SebDanielsson">SebDanielsson</a> / <a href="https://github.com/SebDanielsson/docker-wireguard-transmission">docker-wireguard-transmission</a></li> <li>Docker Hub: <a href="https://hub.docker.com/u/sebdanielsson">sebdanielsson</a> / <a href="https://hub.docker.com/r/sebdanielsson/wireguard-transmission">wireguard-transmission</a></li> </ul> <p>If you’re new to Docker you might want to check out my post “<a href="/get-started-with-docker">Get started with Docker</a>”, covering the basic commands for administrating images, containers and docker-compose.</p> <h2 id="usage">Usage</h2> <h3 id="docker-run">docker run</h3> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">docker</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">run</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--name</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wireguard-transmission</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">--privileged </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-e </span><span style="--0:#9ECBFF">"USERNAME=transmission"</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-e </span><span style="--0:#9ECBFF">"PASSWORD=transmission"</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-e </span><span style="--0:#9ECBFF">"INTERFACE=wg0"</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-e </span><span style="--0:#9ECBFF">"KILLSWITCH=wg0"</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-p </span><span style="--0:#9ECBFF">51820:51820/udp</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-p </span><span style="--0:#9ECBFF">9091:9091</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-v </span><span style="--0:#9ECBFF">/path/to/wg-conf-dir:/etc/wireguard</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-v </span><span style="--0:#9ECBFF">/path/to/transmission-conf-dir:/etc/transmission-daemon</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-v </span><span style="--0:#9ECBFF">/path/to/transmission-complete-dir:/transmission/complete</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-v </span><span style="--0:#9ECBFF">/path/to/transmission-incomplete-dir:/transmission/incomplete</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">-v </span><span style="--0:#9ECBFF">/path/to/transmission-watch-dir:/transmission/watch</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">\</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">sebdanielsson/wireguard-transmission</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="docker run --name wireguard-transmission \--privileged \-e &#x22;USERNAME=transmission&#x22; \-e &#x22;PASSWORD=transmission&#x22; \-e &#x22;INTERFACE=wg0&#x22; \-e &#x22;KILLSWITCH=wg0&#x22; \-p 51820:51820/udp \-p 9091:9091 \-v /path/to/wg-conf-dir:/etc/wireguard \-v /path/to/transmission-conf-dir:/etc/transmission-daemon \-v /path/to/transmission-complete-dir:/transmission/complete \-v /path/to/transmission-incomplete-dir:/transmission/incomplete \-v /path/to/transmission-watch-dir:/transmission/watch \sebdanielsson/wireguard-transmission"><div></div></button></div></figure></div> <h3 id="docker-composeyml">docker-compose.yml</h3> <div class="expressive-code"><figure class="frame"><figcaption class="header"></figcaption><pre data-language="yaml"><code><div class="ec-line"><div class="code"><span style="--0:#85E89D">version</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"3.7"</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">services</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">wireguard-transmission</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">container_name</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">wireguard-transmission</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">privileged</span><span style="--0:#E1E4E8">: </span><span style="--0:#79B8FF">true</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">environment</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">USERNAME=transmission</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">PASSWORD=transmission</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">INTERFACE=wg0</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">KILLSWITCH=wg0</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">ports</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"51820:51820/udp"</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"9091:9091"</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">volumes</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"/path/to/wg-conf-dir:/etc/wireguard"</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"/path/to/transmission-conf-dir:/etc/transmission-daemon"</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"/path/to/transmission-complete-dir:/transmission/complete"</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"/path/to/transmission-incomplete-dir:/transmission/incomplete"</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"/path/to/transmission-watch-dir:/transmission/watch"</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">image</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">sebdanielsson/wireguard-transmission</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="version: &#x22;3.7&#x22;services:wireguard-transmission:container_name: wireguard-transmissionprivileged: trueenvironment: - USERNAME=transmission - PASSWORD=transmission - INTERFACE=wg0 - KILLSWITCH=wg0ports: - &#x22;51820:51820/udp&#x22; - &#x22;9091:9091&#x22;volumes: - &#x22;/path/to/wg-conf-dir:/etc/wireguard&#x22; - &#x22;/path/to/transmission-conf-dir:/etc/transmission-daemon&#x22; - &#x22;/path/to/transmission-complete-dir:/transmission/complete&#x22; - &#x22;/path/to/transmission-incomplete-dir:/transmission/incomplete&#x22; - &#x22;/path/to/transmission-watch-dir:/transmission/watch&#x22;image: sebdanielsson/wireguard-transmission"><div></div></button></div></figure></div>dockercontainertransmissionwireguardvpnlinuxtutorialguideSebastian DanielssonGet started with Dockerhttps://sebdanielsson.dev/get-started-with-dockerhttps://sebdanielsson.dev/get-started-with-dockerBeginner's guide to Docker: install, pull images, run containers, and manage with Docker Compose.Sat, 30 May 2020 00:00:00 GMT<p>I just tried out Docker for a small project and now I get all the hype around it. While searching for good guides I stumbled upon this excellent tutorial by <a href="https://prakhar.me">Prakhar Srivastav</a>: <a href="https://docker-curriculum.com">A Docker Tutorial for Beginners</a>. If you want a deeper understanding of Docker and how it works, and not only how to spin up a container and leave it running, I highly recommend reading it. He also go through the basics of writing your own Docker image which helped me a lot.</p> <!--truncate--> <h2 id="documentation">Documentation</h2> <ul> <li><a href="https://docs.docker.com/engine/">Docker Documentation - Docker Engine</a></li> <li><a href="https://docs.docker.com/compose/">Docker Documentation - Docker Compose</a></li> <li><a href="https://wiki.archlinux.org/title/Docker">ArchWiki - Docker</a></li> </ul> <h2 id="install">Install</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-Syu</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">docker</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">docker-compose</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">docker</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">docker</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">docker</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">info</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -Syu docker docker-composesystemctl start dockersystemctl enable dockerdocker info"><div></div></button></div></figure></div> <h2 id="usage">Usage</h2> <table><thead><tr><th>Function</th><th>Command</th></tr></thead><tbody><tr><td>Pull image</td><td>docker pull <code>image</code></td></tr><tr><td>Remove image</td><td>docker image rm <code>image</code></td></tr><tr><td>List images</td><td>docker image ls</td></tr><tr><td>Run container</td><td>docker run —name <code>container</code> <code>options</code> <code>image</code></td></tr><tr><td>List containers</td><td>docker container ls</td></tr><tr><td>Stop container</td><td>docker container stop <code>container</code></td></tr><tr><td>Remove container</td><td>docker container rm <code>container</code></td></tr><tr><td>Remove inactive containers</td><td>docker container prune</td></tr><tr><td>Switch to container shell</td><td>docker exec -ti <code>container</code> /bin/sh</td></tr><tr><td>Exit container shell</td><td>exit</td></tr><tr><td>Build image</td><td>docker build —no-cache -t <code>username</code>/<code>image</code>:<code>tag</code> .</td></tr><tr><td>Delete stopped containers, networks, images and build cache</td><td>docker system prune -a</td></tr><tr><td>Delete dangling volumes</td><td>docker volume prune</td></tr><tr><td>Rename volume</td><td>docker volume create —name <code>new_volume</code> &#x26;&#x26; <br> docker run —rm -it -v <code>old_volume</code>:/from -v <code>new_volume</code>:/to alpine ash -c “cd /from ; cp -av . /to” &#x26;&#x26; <br> docker volume rm <code>old_volume</code></td></tr></tbody></table> <h3 id="docker-compose-update-images">Docker Compose update images</h3> <p>If you’re using Docker compose and want to update the images to the latest versions you can run the following when in the same directroy as <code>docker-compose.yaml</code></p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">docker-compose</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">up</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--force-recreate</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--build</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-d</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">docker</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">image</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">prune</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-f</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="docker-compose up --force-recreate --build -ddocker image prune -f"><div></div></button></div></figure></div>dockercontainerarchlinuxtutorialguideSebastian DanielssonInstall Arch Linuxhttps://sebdanielsson.dev/install-arch-linuxhttps://sebdanielsson.dev/install-arch-linuxStep-by-step guide to installing Arch Linux on x86-64 UEFI systems, covering partitioning, setup, configuration, and first boot.Sat, 01 Feb 2020 00:00:00 GMT<p>This is my personal step-by-step guide for installing Arch Linux on x86-64 UEFI based machines. This guide is a slimmed down and simplified version of the <a href="https://wiki.archlinux.org/index.php/Installation_guide">Installation guide</a> on ArchWiki.</p> <!--truncate--> <h2 id="pre-installation">Pre-installation</h2> <p>Keyboard layout</p> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">loadkeys</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">sv-latin1</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="loadkeys sv-latin1"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Console_keymap">console keymap</a></p> <p>Pacman mirrors</p> <p>Edit <code>/etc/pacman.d/mirrorlist</code> and uncomment a couple of nearby mirrors.</p> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Mirrors">mirrorlist</a></p> <p>Verify the boot mode</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">ls</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/sys/firmware/efi/efivars</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="ls /sys/firmware/efi/efivars"><div></div></button></div></figure></div> <p>“Stuff” should show up.</p> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/UEFI#UEFI_variables">efivars</a></p> <p>Test internet connection</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">ping</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-c</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">3</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">archlinux.org</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="ping -c 3 archlinux.org"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Network_configuration#Check_the_connection">ping</a></p> <p>Update the system clock</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">timedatectl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">set-ntp</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">true</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="timedatectl set-ntp true"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://jlk.fjfi.cvut.cz/arch/manpages/man/timedatectl.1">timedatectl(1)</a></p> <p>Create and format partitions</p> <p>Find your drive</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">fdisk</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-l</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="fdisk -l"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Fdisk">fdisk</a></p> <p>Wipe the drive</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">shred</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--verbose</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--random-source=/dev/urandom</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--iterations=1</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/dev/`</span><span style="--0:#B392F0">yourdrive</span><span style="--0:#9ECBFF">`</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="shred --verbose --random-source=/dev/urandom --iterations=1 /dev/&#x60;yourdrive&#x60;"><div></div></button></div></figure></div> <p><code>yourdrive</code> should be replaced with your storage device, e.g. <code>sda</code>.</p> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Securely_wipe_disk#shred">shred</a></p> <p>Create a boot and root partition</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">cfdisk</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/dev/`</span><span style="--0:#B392F0">yourdrive</span><span style="--0:#9ECBFF">`</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="cfdisk /dev/&#x60;yourdrive&#x60;"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Fdisk">fdisk</a> | <a href="https://jlk.fjfi.cvut.cz/arch/manpages/man/cfdisk.8">cfdisk</a> | <a href="https://wiki.archlinux.org/index.php/Partitioning">partitioning</a></p> <ul> <li>Partition table: GPT</li> <li>New → Partition Size: 512 MiB → EFI System</li> <li>New → Partition Size: xxxG → Linux Filesystem</li> </ul> <p>List your partitions</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">fdisk</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-l</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">`</span><span style="--0:#B392F0">yourdrive</span><span style="--0:#9ECBFF">`</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="fdisk -l &#x60;yourdrive&#x60;"><div></div></button></div></figure></div> <p>Format the partitions</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">mkfs.fat</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-F32</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/dev/`</span><span style="--0:#B392F0">efipartition</span><span style="--0:#9ECBFF">`</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">mkfs.ext4</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/dev/`</span><span style="--0:#B392F0">rootpartition</span><span style="--0:#9ECBFF">`</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="mkfs.fat -F32 /dev/&#x60;efipartition&#x60;mkfs.ext4 /dev/&#x60;rootpartition&#x60;"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/File_systems#Types_of_file_systems">filesystems</a> | <a href="https://jlk.fjfi.cvut.cz/arch/manpages/man/mkfs.fat.8.en">mkfs.fat</a> | <a href="https://jlk.fjfi.cvut.cz/arch/manpages/man/mke2fs.8">mkfs.ext4</a></p> <p>Mount the partitions</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">mount</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/dev/`</span><span style="--0:#B392F0">rootpartition</span><span style="--0:#9ECBFF">`</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">/mnt</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">mkdir</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/mnt/boot</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">mount</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/dev/`</span><span style="--0:#B392F0">efipartition</span><span style="--0:#9ECBFF">`</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">/mnt/boot</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="mount /dev/&#x60;rootpartition&#x60; /mntmkdir /mnt/bootmount /dev/&#x60;efipartition&#x60; /mnt/boot"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Mount">mount</a></p> <h2 id="installation">Installation</h2> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacstrap</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/mnt</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">base</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">base-devel</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">linux</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">linux-firmware</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">dhcpcd</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">efibootmgr</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">grub</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">inetutils</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">lvm2</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">man-db</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">man-pages</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">nano</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">netctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">sudo</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">sysfsutils</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">texinfo</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">usbutils</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">vi</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">which</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacstrap /mnt base base-devel linux linux-firmware dhcpcd efibootmgr grub inetutils lvm2 man-db man-pages nano netctl sudo sysfsutils texinfo usbutils vi which"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://projects.archlinux.org/arch-install-scripts.git/tree/pacstrap.in">pacstrap</a> | <a href="https://www.archlinux.org/groups/x86_64/base/">base</a> | <a href="https://www.archlinux.org/groups/x86_64/base-devel/">base-devel</a></p> <h2 id="configure-the-system">Configure the system</h2> <p>Fstab</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">genfstab</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-U</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/mnt</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">>></span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/mnt/etc/fstab</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="genfstab -U /mnt >> /mnt/etc/fstab"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Fstab">fstab</a></p> <p>Chroot</p> <p>This will change the root directory to our new installation.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">arch-chroot</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/mnt</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="arch-chroot /mnt"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Change_root">chroot</a></p> <p>Time</p> <p>Set time zone</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">ln</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-sf</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/usr/share/zoneinfo/Europe/Stockholm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/etc/localtime</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="ln -sf /usr/share/zoneinfo/Europe/Stockholm /etc/localtime"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Time_zone">time zone</a></p> <p>Set the hardware clock</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">hwclock</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--systohc</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--utc</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="hwclock --systohc --utc"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://jlk.fjfi.cvut.cz/arch/manpages/man/hwclock.8">hwclock</a></p> <p>Localization</p> <p>Generate locales</p> <p>Edit <code>/etc/locale.gen</code> and uncomment <code>en_US.UTF-8 UTF-8</code>.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">locale-gen</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="locale-gen"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Localization">localizations</a></p> <p>Set system language</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/locale.conf</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">LANG</span><span style="--0:#F97583">=</span><span style="--0:#9ECBFF">en_US.UTF-8</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="LANG=en_US.UTF-8"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://jlk.fjfi.cvut.cz/arch/manpages/man/locale.conf.5">locale.conf</a></p> <p>Set keyboard layout</p> <p>For a Swedish keyboard layout, the file should contain: <code>KEYMAP=sv-latin1</code>.</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/vconsole.conf</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">KEYMAP</span><span style="--0:#F97583">=</span><span style="--0:#9ECBFF">sv-latin1</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="KEYMAP=sv-latin1"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://jlk.fjfi.cvut.cz/arch/manpages/man/vconsole.conf.5">vconsole.conf</a></p> <p>Network</p> <p>Hostname</p> <p>This file should only contain the hostname for this device</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/hostname</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">yourhostname</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="yourhostname"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Hostname">hostname</a></p> <p>Hosts</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/hosts</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">127.0.0.1</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">localhost</span></div></div><div class="ec-line"><div class="code"><span style="--0:#79B8FF">:</span><span style="--0:#9ECBFF">:1</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">localhost</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">127.0.1.1</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">myhostname.localdomain</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">myhostname</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="127.0.0.1 localhost::1 localhost127.0.1.1 myhostname.localdomain myhostname"><div></div></button></div></figure></div> <ul> <li>Change <code>hostname</code> to your hostname</li> <li>If this system has a public IP address, it should be used instead of <code>127.0.1.1</code></li> </ul> <p><strong><em>More info:</em></strong> <a href="https://jlk.fjfi.cvut.cz/arch/manpages/man/hosts.5">hosts(5)</a></p> <p>DHCP</p> <p>To get network access we need to enable <code>dhcpcd.service</code>.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">dhcpcd.service</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl enable dhcpcd.service"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Network_configuration#Network_managers">network managers</a> | <a href="https://wiki.archlinux.org/index.php/Dhcpcd">dhcpcd</a></p> <p>Root password</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">passwd</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="passwd"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Password">password</a></p> <p>Bootloader</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">grub-install</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--target=x86_64-efi</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--efi-directory=/boot</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--bootloader-id=arch_grub</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=arch_grub"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/GRUB">GRUB</a> | <a href="https://wiki.archlinux.org/index.php/Unified_Extensible_Firmware_Interface">UEFI</a> | <a href="https://www.archlinux.org/packages/?name=grub">grub</a> | <a href="https://www.archlinux.org/packages/?name=efibootmgr">efibootmgr</a></p> <p>Microcode</p> <p>Depending on your CPU you need to install the latest microcode.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">&#x3C;intel-ucode</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">or</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">amd-ucode></span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S <intel-ucode or amd-ucode>"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Microcode">Microcode</a> | <a href="https://www.archlinux.org/packages/?name=intel-ucode">intel-ucode</a> | <a href="https://www.archlinux.org/packages/?name=amd-ucode">amd-ucode</a></p> <p>GRUB</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">grub-mkconfig</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-o</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/boot/grub/grub.cfg</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="grub-mkconfig -o /boot/grub/grub.cfg"><div></div></button></div></figure></div> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/GRUB">GRUB</a></p> <p>Exit chroot</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#79B8FF">exit</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="exit"><div></div></button></div></figure></div> <h2 id="finish">Finish</h2> <p>Reboot</p> <p>Reboot your system and remove your installation media.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">reboot</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="reboot"><div></div></button></div></figure></div>archlinuxinstalltutorialguideSebastian DanielssonInstall Ghost with NGINX on Arch Linuxhttps://sebdanielsson.dev/install-ghost-with-nginx-on-arch-linuxhttps://sebdanielsson.dev/install-ghost-with-nginx-on-arch-linuxStep-by-step guide to installing Ghost CMS on Arch Linux, using NGINX as a reverse proxy with HTTPS and automated certificate renewal.Thu, 03 Feb 2022 00:00:00 GMT<p>Complete guide on how to install Ghost and using NGINX as a reverse proxy to make the site accessible on the internet over HTTP/2.</p> <!--truncate--> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">nodejs-lts-fermium</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">npm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">sqlite</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">nginx-mainline</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">certbot</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">certbot-nginx</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">npm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">install</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">ghost-cli@latest</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-g</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S nodejs-lts-fermium npm sqlite nginx-mainline certbot certbot-nginxnpm install ghost-cli@latest -g"><div></div></button></div></figure></div> <h3 id="prepare-directory">Prepare directory</h3> <p>Create a directory to install Ghost to and cd to it</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">mkdir</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/var/www/`</span><span style="--0:#B392F0">yourdomain.com</span><span style="--0:#9ECBFF">`</span></div></div><div class="ec-line"><div class="code"><span style="--0:#79B8FF">cd</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/var/www/`</span><span style="--0:#B392F0">yourdomain.com</span><span style="--0:#9ECBFF">`</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="mkdir /var/www/&#x60;yourdomain.com&#x60;cd /var/www/&#x60;yourdomain.com&#x60;"><div></div></button></div></figure></div> <h3 id="install-ghost-with-a-sqlite-database">Install Ghost with a sqlite database</h3> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">ghost</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">install</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">—-db=sqlite3</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="ghost install —-db=sqlite3"><div></div></button></div></figure></div> <p>When asked about URL, enter the full URL to your domain. E.g. <a href="https://hogwarts.zone">https://hogwarts.zone</a></p> <h2 id="configuration">Configuration</h2> <h3 id="nginx">NGINX</h3> <p>DigitalOcean has provided a tool for configuring your web server over at <a href="https://nginxconfig.io">nginxconfig.io</a>, use it and follow the instructions to create a site. Then proceed with the instructions below.</p> <h3 id="enable-your-site-in-nginx">Enable your site in NGINX</h3> <p>If you’ve generated a config as mentioned above you should be ready to activate your site.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#79B8FF">cd</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/etc/nginx</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">ln</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-s</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">sites-available/`</span><span style="--0:#B392F0">yourdomain.com</span><span style="--0:#9ECBFF">`</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">sites-enabled/</span><span style="--0:#9ECBFF">`</span><span style="--0:#B392F0">yourdomain.com</span><span style="--0:#9ECBFF">`</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="cd /etc/nginxln -s sites-available/&#x60;yourdomain.com&#x60; sites-enabled/&#x60;yourdomain.com&#x60;"><div></div></button></div></figure></div> <h4 id="disable-the-default-site">Disable the default site</h4> <p>If you want to disable the default site and create a new one, instead of adding your site to the default webroot, you can disable it by removing the symlink.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">rm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/etc/nginx/sites-enabled/default</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="rm /etc/nginx/sites-enabled/default"><div></div></button></div></figure></div> <h3 id="certificate-renewal">Certificate renewal</h3> <h4 id="create-a-systemd-service">Create a systemd service</h4> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/systemd/system/certbot.service</span></figcaption><pre data-language="systemd"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Unit]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">Description</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">Let’s Encrypt renewal</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Service]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">Type</span><span style="--0:#F97583">=</span><span style="--0:#79B8FF">oneshot</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">ExecStart</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">/usr/bin/certbot renew —quiet —agree-tos —deploy-hook “systemctl reload nginx.service”</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Unit]Description=Let’s Encrypt renewal[Service]Type=oneshotExecStart=/usr/bin/certbot renew —quiet —agree-tos —deploy-hook “systemctl reload nginx.service”"><div></div></button></div></figure></div> <h4 id="create-a-timer">Create a timer</h4> <p>Make it run twice a day at random times to help reduce load on Let’s Encrypt servers.</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/systemd/system/certbot.timer</span></figcaption><pre data-language="systemd"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Unit]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">Description</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">Twice daily renewal of Let’s Encrypt’s certificates</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Timer]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">OnCalendar</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">0/12:00:00</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">RandomizedDelaySec</span><span style="--0:#F97583">=</span><span style="--0:#79B8FF">1h</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">Persistent</span><span style="--0:#F97583">=</span><span style="--0:#79B8FF">true</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Install]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">WantedBy</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">timers.target</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Unit]Description=Twice daily renewal of Let’s Encrypt’s certificates[Timer]OnCalendar=0/12:00:00RandomizedDelaySec=1hPersistent=true[Install]WantedBy=timers.target"><div></div></button></div></figure></div> <h4 id="start-and-enable-the-service">Start and enable the service</h4> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">certbot.timer</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">certbot.timer</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start certbot.timersystemctl enable certbot.timer"><div></div></button></div></figure></div> <h3 id="run-nginx">Run NGINX</h3> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">nginx</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">nginx</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start nginxsystemctl enable nginx"><div></div></button></div></figure></div> <h3 id="live">Live</h3> <p>Your website should now be live at <a href="https://yourdomain.com">https://yourdomain.com</a>.</p>ghostcmsblognginxreverse proxyarchlinuxtutorialguideSebastian DanielssonInstall NGINX on Arch Linuxhttps://sebdanielsson.dev/install-nginx-on-arch-linuxhttps://sebdanielsson.dev/install-nginx-on-arch-linuxStep-by-step guide to installing NGINX with HTTP/2 and Let's Encrypt TLS certificates on Arch Linux, including automatic certificate renewal.Tue, 04 Feb 2020 00:00:00 GMT<p>Fast and easy tutorial for installing a NGINX web server with HTTP/2 and TLS certificates from Let’s Encrypt on Arch Linux.</p> <!--truncate--> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">nginx-mainline</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">certbot</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">certbot-nginx</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S nginx-mainline certbot certbot-nginx"><div></div></button></div></figure></div> <p>The default page served at <a href="http://127.0.0.1">http://127.0.0.1</a> is located at <code>/usr/share/nginx/html/index.html</code>.</p> <h2 id="configuration">Configuration</h2> <p>DigitalOcean has provided a tool for configuring your web server over at <a href="https://nginxconfig.io">nginxconfig.io</a>, use it and follow the instructions to create a site. Then proceed with the instructions below.</p> <h3 id="disable-the-default-site">Disable the default site</h3> <p>If you want to disable the default site and create a new one, instead of adding your site to the default webroot, you can disable it by removing the symlink.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">rm</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/etc/nginx/sites-enabled/default</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="rm /etc/nginx/sites-enabled/default"><div></div></button></div></figure></div> <h2 id="automatically-renew-the-certificates">Automatically renew the certificates</h2> <h3 id="create-a-systemd-service">Create a systemd service</h3> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/systemd/system/certbot.service</span></figcaption><pre data-language="systemd"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Unit]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">Description</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">Let’s Encrypt renewal</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Service]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">Type</span><span style="--0:#F97583">=</span><span style="--0:#79B8FF">oneshot</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">ExecStart</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">/usr/bin/certbot renew —quiet —agree-tos —deploy-hook “systemctl reload nginx.service”</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Unit]Description=Let’s Encrypt renewal[Service]Type=oneshotExecStart=/usr/bin/certbot renew —quiet —agree-tos —deploy-hook “systemctl reload nginx.service”"><div></div></button></div></figure></div> <h3 id="create-a-timer">Create a timer</h3> <p>Make it run twice a day at random times to help reduce load on Let’s Encrypt servers</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/systemd/system/certbot.timer</span></figcaption><pre data-language="systemd"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Unit]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">Description</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">Twice daily renewal of Let’s Encrypt’s certificates</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Timer]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">OnCalendar</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">0/12:00:00</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">RandomizedDelaySec</span><span style="--0:#F97583">=</span><span style="--0:#79B8FF">1h</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">Persistent</span><span style="--0:#F97583">=</span><span style="--0:#79B8FF">true</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Install]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">WantedBy</span><span style="--0:#F97583">=</span><span style="--0:#E1E4E8">timers.target</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Unit]Description=Twice daily renewal of Let’s Encrypt’s certificates[Timer]OnCalendar=0/12:00:00RandomizedDelaySec=1hPersistent=true[Install]WantedBy=timers.target"><div></div></button></div></figure></div> <h3 id="start-and-enable-the-service">Start and enable the service</h3> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">certbot.timer</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">certbot.timer</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start certbot.timersystemctl enable certbot.timer"><div></div></button></div></figure></div> <h2 id="run-nginx">Run NGINX</h2> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">nginx</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">nginx</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start nginxsystemctl enable nginx"><div></div></button></div></figure></div> <h2 id="live">Live</h2> <p>Your website should now be live at <a href="https://yourdomain.com">https://yourdomain.com</a>.</p>nginxreverse proxyarchlinuxtutorialguideSebastian DanielssonInstall paru on Arch Linuxhttps://sebdanielsson.dev/install-paru-on-arch-linuxhttps://sebdanielsson.dev/install-paru-on-arch-linuxLearn how to install paru, the newest AUR helper written in Rust that lets you install packages from the Arch User Repository with the same ease as pacman.Tue, 18 May 2021 00:00:00 GMT<p>Paru is the newest and hottest AUR Helper. From one of the developers of yay and written is Rust this project has gained a lot of traction in the Arch commuinty. This guide will walk you through the steps for installing this AUR Helper which lets you install packages from the AUR (Arch User Repository) in the same way you install packages from the Arch repos with pacman.</p> <!--truncate--> <p><strong>Read more:</strong> <a href="https://github.com/Morganamilo/paru">paru - GitHub</a></p> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--needed</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">base-devel</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">git</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">clone</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">https://aur.archlinux.org/paru.git</span></div></div><div class="ec-line"><div class="code"><span style="--0:#79B8FF">cd</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">paru</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">makepkg</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-si</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S --needed base-develgit clone https://aur.archlinux.org/paru.gitcd parumakepkg -si"><div></div></button></div></figure></div> <h2 id="usage">Usage</h2> <table><thead><tr><th>Command</th><th>Function</th></tr></thead><tbody><tr><td>paru -Ss foo</td><td>Searches for package foo on the repos or the AUR.</td></tr><tr><td>paru -Si foo</td><td>Get information about a package.</td></tr><tr><td>paru -S foo</td><td>Installs package foo from the repos or the AUR.</td></tr><tr><td>paru -d foo</td><td>Remove a package from the local repo.</td></tr><tr><td>paru -Syu</td><td>Update package list and upgrade all installed repo and AUR packages.</td></tr><tr><td>paru -Sua</td><td>Update all currently installed AUR packages.</td></tr><tr><td>paru -Qua</td><td>Print available AUR updates.</td></tr><tr><td>paru -c</td><td>Uninstall unneeded dependencies.</td></tr></tbody></table>paruauraur helperrustarchlinuxtutorialguideSebastian DanielssonInstall Phoronix Test Suite on Arch Linuxhttps://sebdanielsson.dev/install-phoronix-test-suite-on-arch-linuxhttps://sebdanielsson.dev/install-phoronix-test-suite-on-arch-linuxStep-by-step guide to installing the Phoronix Test Suite on Arch Linux using an AUR helper for comprehensive system benchmarking and performance testing.Sat, 29 Feb 2020 00:00:00 GMT<p>This guide will walk through the steps for installing the <a href="https://www.phoronix-test-suite.com/">Phoronix Test Suite</a> on Arch Linux. The software will be installed from the <a href="https://aur.archlinux.org/">Arch User Repository (AUR)</a> with the help of the <a href="https://wiki.archlinux.org/index.php/AUR_helpers">AUR Helper</a><em>yay</em>. If you don’t have an AUR Helper you should definately install one. I have a guide for two of them: <a href="/install-yay-on-arch-linux">Install yay on Arch Linux</a> &#x26; <a href="/install-paru-on-arch-linux">Install paru on Arch Linux</a>.</p> <!--truncate--> <p><a href="https://www.phoronix-test-suite.com/documentation/phoronix-test-suite.html">Phoronix Test Suite - Documentation</a></p> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">paru</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">phoronix-test-suite</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="paru -S phoronix-test-suite"><div></div></button></div></figure></div> <h2 id="usage">Usage</h2> <table><thead><tr><th>Function</th><th>Command</th></tr></thead><tbody><tr><td>List tests</td><td>phoronix-test-suite list-tests</td></tr><tr><td>Install test</td><td>phoronix-test-suite install <code>test</code></td></tr><tr><td>Run test</td><td>phoronix-test-suite run <code>test</code></td></tr></tbody></table>phoronix test suiteptsbenchmarkarchlinuxtutorialguideSebastian DanielssonInstall Reflector on Arch Linuxhttps://sebdanielsson.dev/install-reflector-on-arch-linuxhttps://sebdanielsson.dev/install-reflector-on-arch-linuxLearn to install and set up Reflector, a Python tool that automatically updates your Arch Linux mirrorlist for faster package downloads.Sun, 29 Mar 2020 00:00:00 GMT<p>Reflector is a small Python3 script that sort through the Arch Linux mirrors based on parameters of your choice and updates your mirrorlist.</p> <!--truncate--> <p><strong><em>More info:</em></strong> <a href="https://wiki.archlinux.org/index.php/Reflector">Reflector - ArchWiki</a> | <a href="https://xyne.archlinux.ca/projects/reflector/">Project website - xyne</a></p> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">reflector</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S reflector"><div></div></button></div></figure></div> <h2 id="usage">Usage</h2> <p><code>reflector --help</code> will show you the available commands and their options.</p> <p>The following command will update your mirrorlist with the 50 fastest mirrors that have support for both HTTPS and IPV6.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">reflector</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--verbose</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--completion-percent</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">100</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--ipv6</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--protocol</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">https</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--score</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">50</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--sort</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">rate</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">--save</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">/etc/pacman.d/mirrorlist</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="reflector --verbose --completion-percent 100 --ipv6 --protocol https --score 50 --sort rate --save /etc/pacman.d/mirrorlist"><div></div></button></div></figure></div> <h2 id="service">Service</h2> <p>Reflector can run automatically in the background at chosen intervalls. The default timer will run reflector once a week.</p> <p>If you want the options from the example earlier make the following changes.</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/xdg/reflector/reflector.conf</span></figcaption><pre data-language="plaintext"><code><div class="ec-line"><div class="code"><span style="--0:#e1e4e8">--save /etc/pacman.d/mirrorlist</span></div></div><div class="ec-line"><div class="code"><span style="--0:#e1e4e8">--completion-percent 100</span></div></div><div class="ec-line"><div class="code"><span style="--0:#e1e4e8">--protocol https</span></div></div><div class="ec-line"><div class="code"><span style="--0:#e1e4e8">--ipv6</span></div></div><div class="ec-line"><div class="code"><span style="--0:#e1e4e8">--score 50</span></div></div><div class="ec-line"><div class="code"><span style="--0:#e1e4e8">--sort rate</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="--save /etc/pacman.d/mirrorlist--completion-percent 100--protocol https--ipv6--score 50--sort rate"><div></div></button></div></figure></div> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">reflector.timer</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">reflector.timer</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">reflector.service</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl enable reflector.timersystemctl start reflector.timersystemctl start reflector.service"><div></div></button></div></figure></div>reflectorpacmanmirrorspythonarchlinuxtutorialguideSebastian DanielssonInstall tmux on Arch Linuxhttps://sebdanielsson.dev/install-tmux-on-linuxhttps://sebdanielsson.dev/install-tmux-on-linuxLearn how to install and use tmux, a terminal multiplexer that enables multiple terminal sessions, multitasking capabilities, and persistent SSH sessions.Thu, 11 Feb 2021 00:00:00 GMT<p>Tmux is a terminal multiplexer. This lets you to run multiple terminal sessions simultaniously. It gives you multitasking capabilities for your terminal and more importantly, this enables you to complete system updates even after a broken SSH connection since terminal sessions can be resumed.</p> <!--truncate--> <p><strong>Read more:</strong> <a href="https://man7.org/linux/man-pages/man1/tmux.1.html">tmux(1)</a></p> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">tmux</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S tmux"><div></div></button></div></figure></div> <h3 id="sane-scrolling">Sane scrolling</h3> <p>The default scrolling behaviour runs through the previous commands instead of scrolling the terminal output. Enable sane scrolling behaviour with this config line.</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">~/.config/tmux/tmux.conf</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#79B8FF">set</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-g</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">mouse</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">on</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="set -g mouse on"><div></div></button></div></figure></div> <h2 id="usage">Usage</h2> <h3 id="commands">Commands</h3> <p>Here is a summary of the most common commands that you’ll want to use.</p> <table><thead><tr><th>Command</th><th>Function</th></tr></thead><tbody><tr><td>tmux</td><td>Start a new session</td></tr><tr><td>tmux new -s <code>name</code></td><td>Start a new named session</td></tr><tr><td>tmux ls</td><td>List sessions</td></tr><tr><td>tmux attach</td><td>Attach to the most recently used session</td></tr><tr><td>tmux attach -t <code>name</code></td><td>Attach to a named session</td></tr><tr><td>tmux kill-session -t <code>name</code></td><td>Kill a named session</td></tr></tbody></table> <h3 id="key-bindings">Key bindings</h3> <p>Tmux also have a lot of keybindings to help you manage all sessions and windows. Here are the essential bindings that you’ll want to learn. The default key combination to initiate a command is <strong>Ctrl+b / control+b</strong>.</p> <table><thead><tr><th>Command</th><th>Function</th></tr></thead><tbody><tr><td>Ctrl+b ?</td><td>List all key bindings.</td></tr><tr><td>Ctrl-b d</td><td>Detach from the current session</td></tr><tr><td>Ctrl+b %</td><td>Add a new pane to the right</td></tr><tr><td>Ctrl+b “</td><td>Add a new pane to the bottom</td></tr><tr><td>Ctrl+b %</td><td>Split pane horizontally</td></tr><tr><td>Ctrl+b “</td><td>Split pane vertically</td></tr><tr><td>Ctrl+b o</td><td>Switch to the next pane</td></tr><tr><td>Ctrl+b ;</td><td>Move between the current and previous pane</td></tr><tr><td>Ctrl+b <code>arrow-key</code></td><td>Navigate between the panes</td></tr><tr><td>Ctrl+b x</td><td>Ctrl+b x Close the current pane</td></tr><tr><td>Ctrl-b c</td><td>Create a new window</td></tr><tr><td>Ctrl-b w</td><td>Switch between sessions and windows</td></tr></tbody></table>tmuxterminalmultiplexerarchlinuxtutorialguideSebastian DanielssonInstall Transmission on Arch Linuxhttps://sebdanielsson.dev/install-transmission-on-arch-linuxhttps://sebdanielsson.dev/install-transmission-on-arch-linuxStep-by-step guide to installing and configuring Transmission on Arch Linux, including VPN kill switch setup and Web UI customization.Mon, 03 Feb 2020 00:00:00 GMT<p>This guide show you how to install Transmission on Arch Linux and configure it with a kill switch so that Transmission will only download and upload using a specific IP address. For example a <a href="/install-wireguard-client-on-arch-linux">WireGuard VPN</a>. The guide is based on the tutorial over at the <a href="https://github.com/transmission/transmission/wiki">Transmission Wiki</a> on GitHub. <a href="https://github.com/transmission/transmission/wiki/Editing-Configuration-Files">Documentation for the config file</a> can be found over at the GitHub Wiki page as well.</p> <!--truncate--> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">transmission-cli</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S transmission-cli"><div></div></button></div></figure></div> <h2 id="configuration">Configuration</h2> <h3 id="generate-config-file">Generate config file**</h3> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">transmission.service</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">stop</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">transmission.service</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start transmission.servicesystemctl stop transmission.service"><div></div></button></div></figure></div> <h3 id="edit-the-config-file">Edit the config file**</h3> <ul> <li>Make sure Transmission is not running when making changes to this file, otherwise the changes won’t save.</li> <li>The last line shall not end with a comma!</li> <li>Change <code>webuiusername</code> and <code>webuipassword</code>. When Transmission run the password will be encrypted. Depending on your subnetting for your VPN and LAN you might need to change the values in <code>rpc-whitelist</code>. In my config I set <code>umask</code>: 2, (base 10) which is the same as umask 002 and octal 775. <a href="https://www.wintelguy.com/umask-calc.pl">octal to umask Calculator</a> | <a href="https://www.rapidtables.com/convert/number/octal-to-decimal.html">octal to base 10 converter</a></li> <li>If you want a kill switch, enter your local VPN IP on line <code>”bind-address-ipv4”: ”*.*.*.*”,</code>. Transmission will only download/upload through this IP. If the VPN connection is dropped Transmission will stop all traffic.</li> <li>Below are my recommended changes.</li> </ul> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/var/lib/transmission/.config/transmission-daemon/settings.json</span></figcaption><pre data-language="json"><code><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”encryption”: </span><span style="--0:#79B8FF">1</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”dht-enabled”: </span><span style="--0:#79B8FF">false</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”lpd-enabled”: </span><span style="--0:#79B8FF">false</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”pex-enabled”: </span><span style="--0:#79B8FF">false</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”port-forwarding-enabled”: </span><span style="--0:#79B8FF">false</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”rpc-username”: ”&#x3C;webuiusername>”,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”rpc-password”: ”&#x3C;webuipassword>”,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”rpc-url”: ”/transmission/”,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”rpc-whitelist”: ”</span><span style="--0:#79B8FF">127.0</span><span style="--0:#E1E4E8">.</span><span style="--0:#79B8FF">0.1</span><span style="--0:#E1E4E8">,</span><span style="--0:#79B8FF">192.168</span><span style="--0:#E1E4E8">.*.*”,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”umask”: </span><span style="--0:#79B8FF">2</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">”utp-enabled”: </span><span style="--0:#79B8FF">false</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="”encryption”: 1,”dht-enabled”: false,”lpd-enabled”: false,”pex-enabled”: false,”port-forwarding-enabled”: false,”rpc-username”: ”<webuiusername>”,”rpc-password”: ”<webuipassword>”,”rpc-url”: ”/transmission/”,”rpc-whitelist”: ”127.0.0.1,192.168.*.*”,”umask”: 2,”utp-enabled”: false"><div></div></button></div></figure></div> <h3 id="change-the-webui-theme">Change the WebUI theme</h3> <p>To change theme of the web UI, change the default web root to a directory that the user that’s running transmission can access. Add the following environmental variable.</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/lib/systemd/system/multi-user.target.wants/transmission.service</span></figcaption><pre data-language="json"><code><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">[</span><span style="--0:#FDAEB7;--0fs:italic">Service</span><span style="--0:#E1E4E8">]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">Environment=TRANSMISSION_WEB_HOME=/usr/share/transmission</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Service]Environment=TRANSMISSION_WEB_HOME=/usr/share/transmission"><div></div></button></div></figure></div> <p>Put the theme into the folder that you pointed to and you should be all set.</p> <h4 id="reload-services">Reload services</h4> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">daemon-reload</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl daemon-reload"><div></div></button></div></figure></div> <h4 id="checking-for-errors-and-testing">Checking for errors and testing</h4> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">transmission.service</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">status</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">transmission.service</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start transmission.servicesystemctl status transmission.service"><div></div></button></div></figure></div> <h4 id="enable-autostart">Enable autostart</h4> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">transmission.service</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">transmission.service</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start transmission.servicesystemctl enable transmission.service"><div></div></button></div></figure></div> <h2 id="bonus">Bonus</h2> <p>You can make Transmission Web UI remotely accessible by either connecting to your LAN with <a href="/install-wireguard-client-on-arch-linux">WireGuard</a> or by making the Web UI accessible on the internet over HTTPS with <a href="/install-nginx-on-arch-linux/">NGINX</a> reverse proxy.</p>transmissionarchlinuxtutorialguideSebastian DanielssonInstall WireGuard [Client] on Arch Linuxhttps://sebdanielsson.dev/install-wireguard-client-on-arch-linuxhttps://sebdanielsson.dev/install-wireguard-client-on-arch-linuxLearn how to install and configure WireGuard as a VPN client on Arch Linux, including key generation and secure tunnel setup.Mon, 03 Feb 2020 00:00:00 GMT<p>This is a very basic tutorial on how to install WireGuard on Arch Linux to use it as a VPN client. For example if you need maximum privacy while <a href="/install-transmission-on-arch-linux/">torrenting</a> your favorite Linux distros.</p> <!--truncate--> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wireguard-tools</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S wireguard-tools"><div></div></button></div></figure></div> <h2 id="configuration">Configuration</h2> <h3 id="generate-keys">Generate keys</h3> <p>First up we need to generate our private and public key. The private key should reside in our configuration and the public key will be used by the other peers, in this case the server. If you have already been provided with a complete config file you can skip to the next section. Remember that you and the server and are not supposed to know each other’s private key. You only need to exchange the public keys.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">wg</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">genkey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">|</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">tee</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">privatekey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">|</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">wg</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">pubkey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">></span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">publickey</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="wg genkey | tee privatekey | wg pubkey > publickey"><div></div></button></div></figure></div> <p>Print the keys and copy them for the following configuration.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">cat</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">peer1-privatekey</span><span style="--0:#E1E4E8"> &#x26;&#x26; </span><span style="--0:#B392F0">cat</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">peer1-publickey</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="cat peer1-privatekey &#x26;&#x26; cat peer1-publickey"><div></div></button></div></figure></div> <h3 id="configure-your-first-tunnel">Configure your first tunnel</h3> <p>In this tutorial we’ll use wg0 as the name for our WireGuard interface. If you already have a WireGuard configuration named wg0, make sure to use another name for this configuration.</p> <p>Below is an example config for routing all traffic except local (192.168.1.*) through the VPN. If your local subnet is on e.g. 192.168.0.X</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/wireguard/wg0.conf</span></figcaption><pre data-language="ini"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Interface]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PrivateKey</span><span style="--0:#E1E4E8"> = `PRIVATEKEY`</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">Address</span><span style="--0:#E1E4E8"> = `IPV4FROMVPNPROVIDER`,`IPV6FROMVPNPROVIDER`</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">DNS</span><span style="--0:#E1E4E8"> = `VPNDNS4`,`VPNDNS6`</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PostUp</span><span style="--0:#E1E4E8"> = ip route add `192.168.1.0/24 via 192.168.1.1`</span><span style="--0:#99A0A6">;</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PreDown</span><span style="--0:#E1E4E8"> = ip route delete `192.168.1.0/24`</span><span style="--0:#99A0A6">;</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Peer]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PublicKey</span><span style="--0:#E1E4E8"> = `PUBLICKEY`</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">AllowedIPs</span><span style="--0:#E1E4E8"> = `0.0.0.0/0`,`::0/0`</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">Endpoint</span><span style="--0:#E1E4E8"> = `PUBLICVPNSERVERIP`:`PORT`</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PersistentKeepalive</span><span style="--0:#E1E4E8"> = 25</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Interface]PrivateKey = &#x60;PRIVATEKEY&#x60;Address = &#x60;IPV4FROMVPNPROVIDER&#x60;,&#x60;IPV6FROMVPNPROVIDER&#x60;DNS = &#x60;VPNDNS4&#x60;,&#x60;VPNDNS6&#x60;PostUp = ip route add &#x60;192.168.1.0/24 via 192.168.1.1&#x60;;PreDown = ip route delete &#x60;192.168.1.0/24&#x60;;[Peer]PublicKey = &#x60;PUBLICKEY&#x60;AllowedIPs = &#x60;0.0.0.0/0&#x60;,&#x60;::0/0&#x60;Endpoint = &#x60;PUBLICVPNSERVERIP&#x60;:&#x60;PORT&#x60;PersistentKeepalive = 25"><div></div></button></div></figure></div> <h2 id="starting-wireguard">Starting WireGuard</h2> <p>Manually bring up the WireGuard interface and check for any errors.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wg-quick@wg0</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">status</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wg-quick@wg0</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start wg-quick@wg0systemctl status wg-quick@wg0"><div></div></button></div></figure></div> <p>You may want to bring up the interface automatically as a service with systemd.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wg-quick@wg0</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl enable wg-quick@wg0"><div></div></button></div></figure></div>wireguardvpnarchlinuxtutorialguideSebastian DanielssonInstall WireGuard [Server] on Arch Linuxhttps://sebdanielsson.dev/install-wireguard-server-on-arch-linuxhttps://sebdanielsson.dev/install-wireguard-server-on-arch-linuxStep-by-step guide to installing and configuring a WireGuard VPN server on Arch Linux for secure remote access.Wed, 05 Feb 2020 00:00:00 GMT<p>This is a very basic tutorial on how to install WireGuard on Arch Linux to use it as a VPN server. For example if you want to access your home LAN from remote locations.</p> <!--truncate--> <h2 id="installation">Installation</h2> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wireguard-tools</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S wireguard-tools"><div></div></button></div></figure></div> <h2 id="configuration">Configuration</h2> <p>In this tutorial we’ll use wg0 as the name for our WireGuard interface. If you already have a WireGuard configuration named wg0, make sure to use another name for this configuration.</p> <h3 id="server-configuration">Server configuration</h3> <h4 id="generate-server-keys">Generate server keys</h4> <p>First up we need to generate our private and public key. The private key should reside in our configuration and the public key will be used by the peers.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">wg</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">genkey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">|</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">tee</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">server1-privatekey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">|</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">wg</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">pubkey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">></span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">server1-publickey</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="wg genkey | tee server1-privatekey | wg pubkey > server1-publickey"><div></div></button></div></figure></div> <p>Print the keys and copy them for the following configuration.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">cat</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">server1-privatekey</span><span style="--0:#E1E4E8"> &#x26;&#x26; </span><span style="--0:#B392F0">cat</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">server1-publickey</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="cat server1-privatekey &#x26;&#x26; cat server1-publickey"><div></div></button></div></figure></div> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/wireguard/wg0.conf</span></figcaption><pre data-language="ini"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Interface]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PrivateKey</span><span style="--0:#E1E4E8"> = &#x3C;SERVER_PRIVATE_KEY></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">Address</span><span style="--0:#E1E4E8"> = 10.0.2.1/24</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">ListenPort</span><span style="--0:#E1E4E8"> = 51820</span></div></div><div class="ec-line"><div class="code"><span style="--0:#99A0A6"># IF SERVER IS BEHIND NAT YOU WILL NEED THE FOLLOWING TWO RULES, ASSUMING YOUR ETHERNET ADAPTER IS NAMED "eth0" OTHERWISE CHANGE TO MATCH YOUR NAME</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PostUp</span><span style="--0:#E1E4E8"> = iptables -A FORWARD -i %i -j ACCEPT</span><span style="--0:#99A0A6">; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PostDown</span><span style="--0:#E1E4E8"> = iptables -D FORWARD -i %i -j ACCEPT</span><span style="--0:#99A0A6">; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#99A0A6"># Peer1</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Peer]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PublicKey</span><span style="--0:#E1E4E8"> = &#x3C;PEER1_PUBLIC_KEY></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PresharedKey</span><span style="--0:#E1E4E8"> = &#x3C;PEER1_PRE-SHARED-KEY_(OPTIONAL)></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">AllowedIPs</span><span style="--0:#E1E4E8"> = 10.0.2.2/32</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#99A0A6"># Peer2</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Peer]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PublicKey</span><span style="--0:#E1E4E8"> = &#x3C;PEER2_PUBLIC_KEY></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">AllowedIPs</span><span style="--0:#E1E4E8"> = 10.0.2.3/32</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Interface]PrivateKey = <SERVER_PRIVATE_KEY>Address = 10.0.2.1/24ListenPort = 51820# IF SERVER IS BEHIND NAT YOU WILL NEED THE FOLLOWING TWO RULES, ASSUMING YOUR ETHERNET ADAPTER IS NAMED &#x22;eth0&#x22; OTHERWISE CHANGE TO MATCH YOUR NAMEPostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADEPostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE# Peer1[Peer]PublicKey = <PEER1_PUBLIC_KEY>PresharedKey = <PEER1_PRE-SHARED-KEY_(OPTIONAL)>AllowedIPs = 10.0.2.2/32# Peer2[Peer]PublicKey = <PEER2_PUBLIC_KEY>AllowedIPs = 10.0.2.3/32"><div></div></button></div></figure></div> <h3 id="peer-configuration">Peer configuration</h3> <p>Peers will need to geneate a private and public key as well. Remember that you and the server and are not supposed to know each other’s private key. You only need to exchange the public keys. Generate a private and public key for each peer.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">wg</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">genkey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">|</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">tee</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">peer1-privatekey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">|</span><span style="--0:#E1E4E8"> </span><span style="--0:#B392F0">wg</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">pubkey</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">></span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">peer1-publickey</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="wg genkey | tee peer1-privatekey | wg pubkey > peer1-publickey"><div></div></button></div></figure></div> <h4 id="peer1-config">Peer1 config</h4> <p>Print the keys and copy them for the following configuration.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">cat</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">peer1-privatekey</span><span style="--0:#E1E4E8"> &#x26;&#x26; </span><span style="--0:#B392F0">cat</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">peer1-publickey</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="cat peer1-privatekey &#x26;&#x26; cat peer1-publickey"><div></div></button></div></figure></div> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/wireguard/wg0-peer1.conf</span></figcaption><pre data-language="ini"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Interface]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PrivateKey</span><span style="--0:#E1E4E8"> = &#x3C;PEER1_PRIVATE_KEY></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">Address</span><span style="--0:#E1E4E8"> = 10.0.2.2/32</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">DNS</span><span style="--0:#E1E4E8"> = 1.1.1.1</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Peer]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PublicKey</span><span style="--0:#E1E4E8"> = &#x3C;SERVER_PUBLICKEY></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PresharedKey</span><span style="--0:#E1E4E8"> = &#x3C;PRE-SHARED-KEY_OPTIONAL></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">AllowedIPs</span><span style="--0:#E1E4E8"> = 0.0.0.0/0, ::/0</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">Endpoint</span><span style="--0:#E1E4E8"> = &#x3C;SERVER-HOSTNAME-OR-IP>:51820</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PersistentKeepalive</span><span style="--0:#E1E4E8"> = 25</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Interface]PrivateKey = <PEER1_PRIVATE_KEY>Address = 10.0.2.2/32DNS = 1.1.1.1[Peer]PublicKey = <SERVER_PUBLICKEY>PresharedKey = <PRE-SHARED-KEY_OPTIONAL>AllowedIPs = 0.0.0.0/0, ::/0Endpoint = <SERVER-HOSTNAME-OR-IP>:51820PersistentKeepalive = 25"><div></div></button></div></figure></div> <h4 id="peer2-config">Peer2 config</h4> <p>Print the keys and copy them for the following configuration.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">cat</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">peer2-privatekey</span><span style="--0:#E1E4E8"> &#x26;&#x26; </span><span style="--0:#B392F0">cat</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">peer2-publickey</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="cat peer2-privatekey &#x26;&#x26; cat peer2-publickey"><div></div></button></div></figure></div> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/wireguard/wg0-peer2.conf</span></figcaption><pre data-language="ini"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Interface]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PrivateKey</span><span style="--0:#E1E4E8"> = &#x3C;PEER2_PRIVATE_KEY></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">Address</span><span style="--0:#E1E4E8"> = 10.0.2.3/32</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">DNS</span><span style="--0:#E1E4E8"> = 1.1.1.1</span></div></div><div class="ec-line"><div class="code"> </div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">[Peer]</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PublicKey</span><span style="--0:#E1E4E8"> = &#x3C;SERVER_PUBLICKEY></span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">AllowedIPs</span><span style="--0:#E1E4E8"> = 0.0.0.0/0, ::/0</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">Endpoint</span><span style="--0:#E1E4E8"> = &#x3C;SERVER-HOSTNAME-OR-IP>:51820</span></div></div><div class="ec-line"><div class="code"><span style="--0:#F97583">PersistentKeepalive</span><span style="--0:#E1E4E8"> = 25</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[Interface]PrivateKey = <PEER2_PRIVATE_KEY>Address = 10.0.2.3/32DNS = 1.1.1.1[Peer]PublicKey = <SERVER_PUBLICKEY>AllowedIPs = 0.0.0.0/0, ::/0Endpoint = <SERVER-HOSTNAME-OR-IP>:51820PersistentKeepalive = 25"><div></div></button></div></figure></div> <h3 id="share-config-to-peers">Share config to peers</h3> <p>For a computer, share the respective peer config file to the user, e.g. with <a href="https://github.com/magic-wormhole/magic-wormhole">magic-wormhole</a>. If they are a mobile user you might want to use qrencode and let them scan a QR code. <code>cd</code> to the directory containing the peer config files and generate the QR codes.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">qrencode</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-t</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">ansiutf8</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">&#x3C;</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wg0-peer1.conf</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">qrencode</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-t</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">ansiutf8</span><span style="--0:#E1E4E8"> </span><span style="--0:#F97583">&#x3C;</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wg0-peer2.conf</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="qrencode -t ansiutf8 < wg0-peer1.confqrencode -t ansiutf8 < wg0-peer2.conf"><div></div></button></div></figure></div> <h3 id="enable-ipv4-forwarding">Enable IPv4 forwarding</h3> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">sysctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-w</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">net.ipv4.ip_forward=</span><span style="--0:#79B8FF">1</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="sysctl -w net.ipv4.ip_forward=1"><div></div></button></div></figure></div> <p>Make the change permanent:</p> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">/etc/sysctl.d/99-sysctl.conf</span></figcaption><pre data-language="ini"><code><div class="ec-line"><div class="code"><span style="--0:#F97583">net.ipv4.ip_forward</span><span style="--0:#E1E4E8"> = 1</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="net.ipv4.ip_forward = 1"><div></div></button></div></figure></div> <h2 id="starting-wireguard">Starting WireGuard</h2> <p>Manually bring up the WireGuard interface and check for any errors.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">start</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wg-quick@wg0</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">status</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wg-quick@wg0</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl start wg-quick@wg0systemctl status wg-quick@wg0"><div></div></button></div></figure></div> <p>You may want to bring up the interface automatically as a service with systemd.</p> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">systemctl</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">enable</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">wg-quick@wg0</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="systemctl enable wg-quick@wg0"><div></div></button></div></figure></div>wireguardservervpnarchlinuxtutorialguideSebastian DanielssonInstall yay on Arch Linuxhttps://sebdanielsson.dev/install-yay-on-arch-linuxhttps://sebdanielsson.dev/install-yay-on-arch-linuxLearn how to install yay, an AUR Helper that lets you install packages from the Arch User Repository using the same commands as pacman.Thu, 27 Feb 2020 00:00:00 GMT<p>This guide will walk through the steps for installing yay (Yet another Yogurt) which is an AUR Helper. This will let you install packages from the AUR (Arch User Repository) in the same way you install packages from the Arch Repo with pacman.</p> <p>Update 2021-05-21: There is a new AUR Helper that has got a lot of traction. It’s called paru and works mostly the same but is written in Rust! <a href="/install-paru-on-arch-linux">I have a guide for installing it as well</a>.</p> <!--truncate--> <p><a href="https://github.com/Jguer/yay">yay - GitHub</a></p> <h2 id="installation">Installation</h2> <p>Do not run <code>makepkg -si</code> as root.</p> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">pacman</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-S</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">git</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">binutils</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">make</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">gcc</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">fakeroot</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">git</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">clone</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">https://aur.archlinux.org/yay-bin.git</span></div></div><div class="ec-line"><div class="code"><span style="--0:#79B8FF">cd</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">yay-bin</span></div></div><div class="ec-line"><div class="code"><span style="--0:#B392F0">makepkg</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-si</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="pacman -S git binutils make gcc fakerootgit clone https://aur.archlinux.org/yay-bin.gitcd yay-binmakepkg -si"><div></div></button></div></figure></div> <h2 id="usage">Usage</h2> <table><thead><tr><th>Command</th><th>Function</th></tr></thead><tbody><tr><td>yay -Ss foo</td><td>Searches for package foo on the repos or the AUR.</td></tr><tr><td>yay -Si foo</td><td>Get information about a package.</td></tr><tr><td>yay -S foo</td><td>Installs package foo from the repos or the AUR.</td></tr><tr><td>yay -Rns foo</td><td>Remove package, its dependencies and config files.</td></tr><tr><td>yay -Syu</td><td>Update package list and upgrade all installed repo and AUR packages.</td></tr><tr><td>yay -Sua</td><td>Update all currently installed AUR packages.</td></tr><tr><td>yay -Qua</td><td>Print available AUR updates.</td></tr><tr><td>yay -Yc</td><td>Uninstall unneeded dependencies.</td></tr></tbody></table>yayauraur helperarchlinuxtutorialguideSebastian DanielssonStart a Minecraft Bedrock Server using Dockerhttps://sebdanielsson.dev/minecraft-bedrock-dedicated-server-dockerhttps://sebdanielsson.dev/minecraft-bedrock-dedicated-server-dockerComplete guide to setting up a Minecraft Bedrock dedicated server using Docker and Docker Compose with configuration examples and permissions management.Thu, 10 Sep 2020 00:00:00 GMT<p>This guide will show you how to start a Minecraft Bedrock dedicated server using Docker.</p> <!--truncate--> <h2 id="preparations">Preparations</h2> <h3 id="docker-volume">Docker volume</h3> <p>Create a Docker volume where we will store our server.</p> <div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.tzzqb.css"><script type="module" src="/_astro/ec.0vx5m.js"></script><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">docker</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">volume</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">create</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">minecraft</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="docker volume create minecraft"><div></div></button></div></figure></div> <h3 id="docker-composeyaml">docker-compose.yaml</h3> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">docker-compose.yaml</span></figcaption><pre data-language="yaml"><code><div class="ec-line"><div class="code"><span style="--0:#85E89D">services</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">minecraft</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">container_name</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"minecraft"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">image</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">itzg/minecraft-bedrock-server</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">ports</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"19132:19132/udp"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">volumes</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">- </span><span style="--0:#9ECBFF">"minecraft:/data"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">environment</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">EULA</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"TRUE"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">SERVER_NAME</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"Minecraft Server"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">SERVER_PORT</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"19132"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">GAMEMODE</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"survival"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">DIFFICULTY</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"easy"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">LEVEL_TYPE</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"DEFAULT"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">ALLOW_CHEATS</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"true"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">MAX_PLAYERS</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"10"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">ONLINE_MODE</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"true"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#99A0A6">#WHITE_LIST: ""</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">VIEW_DISTANCE</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"12"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">TICK_DISTANCE</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"12"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">PLAYER_IDLE_TIMEOUT</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"0"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">MAX_THREADS</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"8"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">LEVEL_NAME</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"level"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#99A0A6">#LEVEL_SEED: ""</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">DEFAULT_PLAYER_PERMISSION_LEVEL</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"member"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">TEXTUREPACK_REQUIRED</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"false"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">SERVER_AUTHORITATIVE_MOVEMENT</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"true"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">PLAYER_MOVEMENT_SCORE_THRESHOLD</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"20"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">PLAYER_MOVEMENT_DISTANCE_THRESHOLD</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"0.3"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">PLAYER_MOVEMENT_DURATION_THRESHOLD_IN_MS</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"500"</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">CORRECT_PLAYER_MOVEMENT</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"false"</span></div></div><div class="ec-line"><div class="code"><span style="--0:#85E89D">volumes</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">minecraft</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">external</span><span style="--0:#E1E4E8">:</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#85E89D">name</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">minecraft</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="services: minecraft: container_name: &#x22;minecraft&#x22; image: itzg/minecraft-bedrock-server ports: - &#x22;19132:19132/udp&#x22; volumes: - &#x22;minecraft:/data&#x22; environment: EULA: &#x22;TRUE&#x22; SERVER_NAME: &#x22;Minecraft Server&#x22; SERVER_PORT: &#x22;19132&#x22; GAMEMODE: &#x22;survival&#x22; DIFFICULTY: &#x22;easy&#x22; LEVEL_TYPE: &#x22;DEFAULT&#x22; ALLOW_CHEATS: &#x22;true&#x22; MAX_PLAYERS: &#x22;10&#x22; ONLINE_MODE: &#x22;true&#x22; #WHITE_LIST: &#x22;&#x22; VIEW_DISTANCE: &#x22;12&#x22; TICK_DISTANCE: &#x22;12&#x22; PLAYER_IDLE_TIMEOUT: &#x22;0&#x22; MAX_THREADS: &#x22;8&#x22; LEVEL_NAME: &#x22;level&#x22; #LEVEL_SEED: &#x22;&#x22; DEFAULT_PLAYER_PERMISSION_LEVEL: &#x22;member&#x22; TEXTUREPACK_REQUIRED: &#x22;false&#x22; SERVER_AUTHORITATIVE_MOVEMENT: &#x22;true&#x22; PLAYER_MOVEMENT_SCORE_THRESHOLD: &#x22;20&#x22; PLAYER_MOVEMENT_DISTANCE_THRESHOLD: &#x22;0.3&#x22; PLAYER_MOVEMENT_DURATION_THRESHOLD_IN_MS: &#x22;500&#x22; CORRECT_PLAYER_MOVEMENT: &#x22;false&#x22;volumes: minecraft: external: name: minecraft"><div></div></button></div></figure></div> <h3 id="serverproperties">server.properties</h3> <p>This Docker Image gives you a bunch of environment variables to configure the <code>server.properties</code> config file. Check out this <a href="https://minecraft.gamepedia.com/Server.properties#Bedrock_Edition_3">wiki page</a> describing all server properties.</p> <h3 id="permissionsjson">permissions.json</h3> <p>There are three roles: <code>operator</code>, <code>member</code>, <code>visitor</code>. Players are defined by their unique xuid (Xbox User ID) in decimal. You can find players xuid by entering their Xbox Live Gamertag and checking the decimal button on this site: <a href="https://cxkes.me/xbox/xuid">https://cxkes.me/xbox/xuid</a></p> <p>After running the container for the first time you should be able to find <code>permissions.json</code> at <code>/var/lib/docker/volumes/minecraft/_data/permissions.json</code> if you named your volume <code>minecraft</code>.</p> <h4 id="example">Example</h4> <div class="expressive-code"><figure class="frame has-title"><figcaption class="header"><span class="title">permissions.json</span></figcaption><pre data-language="json"><code><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">[</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#79B8FF">"permission"</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"operator"</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#79B8FF">"xuid"</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"451298348"</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">},</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#79B8FF">"permission"</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"member"</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#79B8FF">"xuid"</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"52819329"</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">},</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">{</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#79B8FF">"permission"</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"visitor"</span><span style="--0:#E1E4E8">,</span></div></div><div class="ec-line"><div class="code"><span class="indent"> </span><span style="--0:#79B8FF">"xuid"</span><span style="--0:#E1E4E8">: </span><span style="--0:#9ECBFF">"234114123"</span></div></div><div class="ec-line"><div class="code"><span class="indent"><span style="--0:#E1E4E8"> </span></span><span style="--0:#E1E4E8">}</span></div></div><div class="ec-line"><div class="code"><span style="--0:#E1E4E8">]</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="[ { &#x22;permission&#x22;: &#x22;operator&#x22;, &#x22;xuid&#x22;: &#x22;451298348&#x22; }, { &#x22;permission&#x22;: &#x22;member&#x22;, &#x22;xuid&#x22;: &#x22;52819329&#x22; }, { &#x22;permission&#x22;: &#x22;visitor&#x22;, &#x22;xuid&#x22;: &#x22;234114123&#x22; }]"><div></div></button></div></figure></div> <h2 id="start">Start</h2> <div class="expressive-code"><figure class="frame is-terminal"><figcaption class="header"><span class="title"></span><span class="sr-only">Terminal window</span></figcaption><pre data-language="shell"><code><div class="ec-line"><div class="code"><span style="--0:#B392F0">docker-compose</span><span style="--0:#E1E4E8"> </span><span style="--0:#9ECBFF">up</span><span style="--0:#E1E4E8"> </span><span style="--0:#79B8FF">-d</span></div></div></code></pre><div class="copy"><div aria-live="polite"></div><button title="Copy to clipboard" data-copied="Copied!" data-code="docker-compose up -d"><div></div></button></div></figure></div>dockercontainercomposeminecraftbedrockdedicatedserverlinuxtutorialguideSebastian Danielsson