<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.alpinelinux.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Benaki</id>
	<title>Alpine Linux - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.alpinelinux.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Benaki"/>
	<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/wiki/Special:Contributions/Benaki"/>
	<updated>2026-04-30T08:25:32Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32092</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32092"/>
		<updated>2026-02-25T13:40:01Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect. It is assumed the WM / compositor of the client is Wayland.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t know the DNS for &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt;, you can remove that part and connect via IP(s) directly, not DNS.&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
doas docker create -it \&lt;br /&gt;
  --name openconnect-sso \&lt;br /&gt;
  --privileged \&lt;br /&gt;
  --net=host \&lt;br /&gt;
  -v /etc/ssl/certs:/etc/ssl/certs:ro \&lt;br /&gt;
  -e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \&lt;br /&gt;
  -e XDG_RUNTIME_DIR=/tmp \&lt;br /&gt;
  -e QT_QPA_PLATFORM=wayland \&lt;br /&gt;
  -v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/tmp/$WAYLAND_DISPLAY:rw \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso:latest \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/.local/bin/vpn-connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== Why use Docker? ==&lt;br /&gt;
System updates broke the bare metal openconnect-sso install. Docker keeps things static. Another way would be pyenv - please add steps below if you succeed with it.&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32091</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32091"/>
		<updated>2026-02-25T13:39:11Z</updated>

		<summary type="html">&lt;p&gt;Benaki: /* Building the Docker image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect. Here the WM / compositor of the client is Wayland (I run sway or niri).&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t know the DNS for &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt;, you can remove that part and connect via IP(s) directly, not DNS.&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
doas docker create -it \&lt;br /&gt;
  --name openconnect-sso \&lt;br /&gt;
  --privileged \&lt;br /&gt;
  --net=host \&lt;br /&gt;
  -v /etc/ssl/certs:/etc/ssl/certs:ro \&lt;br /&gt;
  -e WAYLAND_DISPLAY=$WAYLAND_DISPLAY \&lt;br /&gt;
  -e XDG_RUNTIME_DIR=/tmp \&lt;br /&gt;
  -e QT_QPA_PLATFORM=wayland \&lt;br /&gt;
  -v $XDG_RUNTIME_DIR/$WAYLAND_DISPLAY:/tmp/$WAYLAND_DISPLAY:rw \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso:latest \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/.local/bin/vpn-connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== Why use Docker? ==&lt;br /&gt;
System updates broke the bare metal openconnect-sso install. Docker keeps things static. Another way would be pyenv - please add steps below if you succeed with it.&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32090</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32090"/>
		<updated>2026-02-25T13:10:21Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect. Here the WM / compositor of the client is Wayland (I run sway or niri).&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t know the DNS for &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt;, you can remove that part and connect via IP(s) directly, not DNS.&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/.local/bin/vpn-connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== Why use Docker? ==&lt;br /&gt;
System updates broke the bare metal openconnect-sso install. Docker keeps things static. Another way would be pyenv - please add steps below if you succeed with it.&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32089</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32089"/>
		<updated>2026-02-25T10:20:33Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect. Here the WM / compositor of the client is Wayland (I run sway or niri).&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t know the DNS for &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt;, you can remove that part and connect via IP(s) directly, not DNS.&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/vpn&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/.local/bin/vpn-connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== Why use Docker? ==&lt;br /&gt;
System updates broke the bare metal openconnect-sso install. Docker keeps things static. Another way would be pyenv - please add steps below if you succeed with it.&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32088</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32088"/>
		<updated>2026-02-25T10:14:18Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t know the DNS for &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt;, you can remove that part and connect via IP(s) directly, not DNS.&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/vpn&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/.local/bin/vpn-connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== Why use Docker? ==&lt;br /&gt;
System updates broke the bare metal openconnect-sso install. Docker keeps things static. Another way would be pyenv - please add steps below if you succeed with it.&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32087</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32087"/>
		<updated>2026-02-25T10:10:11Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t know the DNS for &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt;, you can remove that part and connect via IP(s) directly, not DNS.&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/vpn&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/.local/bin/vpn-connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32086</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32086"/>
		<updated>2026-02-25T10:07:16Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/vpn&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/.local/bin/vpn-connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32085</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32085"/>
		<updated>2026-02-25T10:06:41Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/vpn&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/.local/bin/vpn-connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/.local/bin/vpn-connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32084</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32084"/>
		<updated>2026-02-25T10:05:06Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* doas configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/vpn&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/vpn/connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/vpn/connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/vpn/connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32083</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32083"/>
		<updated>2026-02-25T10:04:48Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* [[doas]] configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/vpn&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/vpn/connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/vpn/connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/vpn/connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32082</id>
		<title>Openconnect-SSO in Docker</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Openconnect-SSO_in_Docker&amp;diff=32082"/>
		<updated>2026-02-25T10:03:25Z</updated>

		<summary type="html">&lt;p&gt;Benaki: Created page with &amp;quot;= VPN via openconnect-sso (Docker) =  This guide describes how to connect to a Cisco AnyConnect-compatible VPN using openconnect-sso running inside a Docker container, with automatic DNS configuration on connect.  == Prerequisites ==  * Docker installed and running * doas configured * The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below) * A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;  == Building the Docker imag...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= VPN via openconnect-sso (Docker) =&lt;br /&gt;
&lt;br /&gt;
This guide describes how to connect to a Cisco AnyConnect-compatible VPN using [[openconnect-sso]] running inside a Docker container, with automatic DNS configuration on connect.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]] installed and running&lt;br /&gt;
* [[doas]] configured&lt;br /&gt;
* The &amp;lt;code&amp;gt;openconnect-sso&amp;lt;/code&amp;gt; Docker image built (see below)&lt;br /&gt;
* A VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; saved at &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the Docker image ==&lt;br /&gt;
&lt;br /&gt;
Save the following as &amp;lt;code&amp;gt;Dockerfile.openconnect-sso&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FROM python:3.11-slim&lt;br /&gt;
&lt;br /&gt;
RUN apt-get update &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get install -y \&lt;br /&gt;
      openconnect \&lt;br /&gt;
      sudo \&lt;br /&gt;
      libqt6gui6 \&lt;br /&gt;
      libqt6widgets6 \&lt;br /&gt;
      libqt6webenginecore6 \&lt;br /&gt;
      libqt6webenginewidgets6 \&lt;br /&gt;
      qt6-wayland \&lt;br /&gt;
      libgl1 \&lt;br /&gt;
      libxkbcommon0 \&lt;br /&gt;
      libdbus-1-3 \&lt;br /&gt;
      libegl1 \&lt;br /&gt;
      libnss3 \&lt;br /&gt;
      libnspr4 \&lt;br /&gt;
      libxcomposite1 \&lt;br /&gt;
      libxdamage1 \&lt;br /&gt;
      libxrandr2 \&lt;br /&gt;
      libxtst6 \&lt;br /&gt;
      libxslt1.1 \&lt;br /&gt;
      libglib2.0-0 \&lt;br /&gt;
      libasound2 \&lt;br /&gt;
      libxcursor1 \&lt;br /&gt;
      fonts-liberation &amp;amp;&amp;amp; \&lt;br /&gt;
    apt-get clean &amp;amp;&amp;amp; \&lt;br /&gt;
    rm -rf /var/lib/apt/lists/*&lt;br /&gt;
&lt;br /&gt;
RUN pip install --no-cache-dir openconnect-sso&lt;br /&gt;
&lt;br /&gt;
RUN useradd -m -s /bin/bash vpnuser &amp;amp;&amp;amp; \&lt;br /&gt;
    echo &amp;quot;vpnuser ALL=(ALL) NOPASSWD: ALL&amp;quot; &amp;gt;&amp;gt; /etc/sudoers&lt;br /&gt;
&lt;br /&gt;
USER vpnuser&lt;br /&gt;
WORKDIR /home/vpnuser&lt;br /&gt;
&lt;br /&gt;
ENV QT_QPA_PLATFORM=wayland&lt;br /&gt;
ENV XDG_RUNTIME_DIR=/tmp&lt;br /&gt;
&lt;br /&gt;
ENTRYPOINT [&amp;quot;openconnect-sso&amp;quot;]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build and create the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/vpn&lt;br /&gt;
docker build -f Dockerfile.openconnect-sso -t openconnect-sso .&lt;br /&gt;
docker create --name openconnect-sso \&lt;br /&gt;
  --cap-add NET_ADMIN \&lt;br /&gt;
  --device /dev/net/tun \&lt;br /&gt;
  openconnect-sso \&lt;br /&gt;
  --server your-vpn-gateway \&lt;br /&gt;
  --user your-username&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== DNS configuration ==&lt;br /&gt;
&lt;br /&gt;
When the VPN connects, a &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface is created but the system DNS is not automatically updated. To resolve internal hostnames, save your VPN network&#039;s DNS settings to &amp;lt;code&amp;gt;~/.local/resolv.conf&amp;lt;/code&amp;gt;. This file will be copied to &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; once the tunnel is up.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
Save the following script (e.g. &amp;lt;code&amp;gt;~/vpn/connect.sh&amp;lt;/code&amp;gt;) and make it executable:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Wait for tun interface, then set DNS&lt;br /&gt;
(&lt;br /&gt;
  while ! ip addr show tun0 2&amp;gt;/dev/null | grep -q inet; do&lt;br /&gt;
    sleep 1&lt;br /&gt;
  done&lt;br /&gt;
  doas cp ~/.local/resolv.conf /etc/&lt;br /&gt;
) &amp;amp;&lt;br /&gt;
# Start VPN in foreground&lt;br /&gt;
doas docker start -ai openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chmod +x ~/vpn/connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
~/vpn/connect.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A browser window will open for SSO authentication. After completing login, the VPN tunnel will establish and DNS will be updated automatically.&lt;br /&gt;
&lt;br /&gt;
== How it works ==&lt;br /&gt;
&lt;br /&gt;
The script starts a background subshell that polls for the &amp;lt;code&amp;gt;tun0&amp;lt;/code&amp;gt; interface. Once the interface has an IP address assigned (meaning the tunnel is up), it copies the VPN-specific &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; into place. Meanwhile, the Docker container runs in the foreground so its output and the SSO browser window remain accessible.&lt;br /&gt;
&lt;br /&gt;
== Disconnecting ==&lt;br /&gt;
&lt;br /&gt;
Close the foreground process with {{Key|Ctrl|C}} or stop the container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas docker stop openconnect-sso&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You may also want to restore your original &amp;lt;code&amp;gt;/etc/resolv.conf&amp;lt;/code&amp;gt; afterwards if it is not managed by another service.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[OpenConnect]]&lt;br /&gt;
* [[DNS]]&lt;br /&gt;
* [[Docker]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=32081</id>
		<title>Tutorials and Howtos</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=32081"/>
		<updated>2026-02-25T10:01:29Z</updated>

		<summary type="html">&lt;p&gt;Benaki: /* VPN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:package_edutainment.svg|right|link=]]&lt;br /&gt;
{{TOC left}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welcome to Tutorials and Howtos, a place of basic and advanced configuration tasks for your Alpine Linux.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Howtos are smaller articles&#039;&#039;&#039; explaining how to perform a particular task with Alpine Linux, that expects a minimal knowledge from reader to perform actions. Howto&#039;s have been organized in the below page based on the topics.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The [[#Tutorials|tutorials]] are hands-on&#039;&#039;&#039; and the reader is expected to try and achieve the goals described in each step, possibly with the help of a good example. The output in one step is the starting point for the following step.&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* Contributors are requested to refer to [[Help:Editing]] first and make use of resources like [[How to write a HOWTO]].&lt;br /&gt;
* Contributions must be complete articles. &lt;br /&gt;
* Don&#039;t override already made contributions, unless there is a mistake. &lt;br /&gt;
* If you want to request a topic, please add your request in this page&#039;s [[Talk:Tutorials_and_Howtos|Discussion]].}}&lt;br /&gt;
&lt;br /&gt;
== Desktop ==&lt;br /&gt;
&lt;br /&gt;
* {{:Daily driver guide}}&lt;br /&gt;
&lt;br /&gt;
=== Networking ===&lt;br /&gt;
&lt;br /&gt;
* [[Bluetooth]] - Instructions for installing and configuring Bluetooth&lt;br /&gt;
* [[Bonding]] - Bond (or aggregate) multiple ethernet interfaces&lt;br /&gt;
* [[Bridge]] - Configuring a network bridge&lt;br /&gt;
** [[Bridge wlan0 to eth0]]&lt;br /&gt;
* [[Configure Networking]]&lt;br /&gt;
* [[How to configure static routes]]&lt;br /&gt;
* Modem&lt;br /&gt;
** [[Using HSDPA modem]]&lt;br /&gt;
** [[Using serial modem]]&lt;br /&gt;
* [[mDNS]] - Howto implement multicast DNS resolution in Alpine. &lt;br /&gt;
* [[Multi ISP]] &#039;&#039;(Dual-ISP setup with load-balancing and automatic failover)&#039;&#039;&lt;br /&gt;
* [[PXE boot]]&lt;br /&gt;
* Wi-Fi&lt;br /&gt;
** [[Wi-Fi|Connecting to a wireless access point]]&lt;br /&gt;
** [[How to setup a wireless access point]] &#039;&#039;(Setting up Secure Wireless AP w/ WPA encryption with bridge to wired network)&#039;&#039;&lt;br /&gt;
* Use [https://github.com/ifupdown-ng/ifupdown-ng/blob/main/doc/interfaces-vxlan.scd vxlan], if using  [[Ifupdown-ng]] instead of [[VLAN]]&lt;br /&gt;
* [[Setting up a Home Router]]&lt;br /&gt;
&lt;br /&gt;
=== Backup and data migration ===&lt;br /&gt;
&lt;br /&gt;
* [[Migrating data]]&lt;br /&gt;
* [[Rsnapshot]] - setting up periodic backups&lt;br /&gt;
&lt;br /&gt;
=== Other topics ===&lt;br /&gt;
&lt;br /&gt;
* [[Gaming on Alpine]]&lt;br /&gt;
* [[Remote Desktop Server]]&lt;br /&gt;
* [[Default applications|How to change default application]]&lt;br /&gt;
* [[CPU frequency scaling]]&lt;br /&gt;
* [[Mimalloc]]&lt;br /&gt;
* [[Enable Serial Console on Boot]]&lt;br /&gt;
* [[How to build the Alpine Linux kernel]]&lt;br /&gt;
* [[Nextcloud]] &#039;&#039;(Self hostable cloud suite - Dropbox Alternative)&#039;&#039;&lt;br /&gt;
* [[Setting up lm_sensors]]&lt;br /&gt;
* [[Fingerprint Authentication with swaylock]]&lt;br /&gt;
* [[Mounting a LUKS Encrypted Data Partition at Boot]]&lt;br /&gt;
* [[Desktop environments and Window managers|List of supported Desktop environments and Window managers]]&lt;br /&gt;
&lt;br /&gt;
== Diskless ==&lt;br /&gt;
&lt;br /&gt;
* [[Alpine local backup|Alpine local backup (lbu)]] &#039;&#039;(Permanently store your modifications in case your box needs reboot)&#039;&#039;&lt;br /&gt;
** [[Back Up a Flash Memory Installation]]&lt;br /&gt;
** [[Manually editing a existing apkovl]]&lt;br /&gt;
&lt;br /&gt;
== Other Architectures ==&lt;br /&gt;
&lt;br /&gt;
=== APU (PCEngines) ===&lt;br /&gt;
&lt;br /&gt;
* [[Alpine Install: from a disc to PC Engines APU|Alpine on PC Engines APU]]&lt;br /&gt;
* [https://github.com/huubsch/Installation-of-Alpine-Linux-on-PC-Engines-APU3/tree/main?tab=readme-ov-file Installation of Alpine Linux on PCEngines APU, legacy BIOS]&lt;br /&gt;
&lt;br /&gt;
=== ARM ===&lt;br /&gt;
&lt;br /&gt;
* [[Alpine on ARM]]&lt;br /&gt;
&lt;br /&gt;
==== Raspberry Pi ====&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry Pi|Raspberry Pi main page]]&lt;br /&gt;
* [[Raspberry Pi Bluetooth Speaker|Raspberry Pi - Bluetooth Speaker]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi|Raspberry Pi - Router with VPN]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi (IPv6)|Raspberry Pi - Router with VPN (IPv6)]]&lt;br /&gt;
* [[Classic install or sys mode on Raspberry Pi|Raspberry Pi - Sys mode install]]&lt;br /&gt;
* [[Raspberry Pi LVM on LUKS|Raspberry Pi - Sys mode install - LVM on LUKS]]&lt;br /&gt;
* [[RPI Video Receiver|Raspberry Pi - Video Receiver]] &#039;&#039;(network video decoder using Rasperry Pi and omxplayer)&#039;&#039;&lt;br /&gt;
* [[Raspberry Pi 3 - Browser Client]] - kiosk or digital sign&lt;br /&gt;
* [[Raspberry Pi 3 - Configuring it as wireless access point -AP Mode]]&lt;br /&gt;
* [[Raspberry Pi 3 - Setting Up Bluetooth]]&lt;br /&gt;
* [[Raspberry Pi 4 - Persistent system acting as a NAS and Time Machine]]&lt;br /&gt;
* [[Raspberry_Pi_Zero_W_-_Installation|Raspberry Pi Zero W - Installation]]&lt;br /&gt;
* [[How to set up Alpine as a wireless router|Raspberry Pi Zero W - Wireless router]] &#039;&#039;(Setting up a firewalled, Wireless AP with wired network on a Pi Zero W)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== IBM Z (IBM z Systems) ===&lt;br /&gt;
&lt;br /&gt;
* [[s390x|s390x - Installation]]&lt;br /&gt;
&lt;br /&gt;
=== PowerPC ===&lt;br /&gt;
&lt;br /&gt;
* [[Ppc64le|Powerpc64le - Installation]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* [[#Desktop security|Desktop security]] lists steps for securing Alpine Linux desktops&lt;br /&gt;
* [[Setting up a laptop]] page has detailed guidelines to configure a secured laptop&lt;br /&gt;
* [[Securing Alpine Linux|Secure Alpine Linux]] using Security Technical Implementation Guides (STIGs)&lt;br /&gt;
* [[Sshguard|SSHGuard]] - Protects hosts against brute-force attacks:  monitoring logs, attack detection, blocking using firewall.&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
{{Note| Services are arranged in alphabetical order.}}&lt;br /&gt;
&lt;br /&gt;
=== Content management systems ===&lt;br /&gt;
&lt;br /&gt;
* [[DokuWiki]] &#039;&#039;(Simple and easy to use wiki, no database required)&#039;&#039;&lt;br /&gt;
* [[Drupal]] &#039;&#039;(Content Management System (CMS) written in PHP)&#039;&#039;&lt;br /&gt;
* [[Kopano]] &#039;&#039;(Microsoft Outlook compatible Groupware)&#039;&#039;&lt;br /&gt;
* [[Mahara]] &#039;&#039;(E-portfolio and social networking system)&#039;&#039;&lt;br /&gt;
* [[MediaWiki]] &#039;&#039;(Free web-based wiki software application)&#039;&#039;&lt;br /&gt;
* [[Pastebin]] &#039;&#039;(Pastebin software application)&#039;&#039;&lt;br /&gt;
* [[WordPress]] &#039;&#039;(Web software to create website or blog)&#039;&#039;&lt;br /&gt;
* [[Moodle]] &#039;&#039;(Online Learning Management system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Database === &lt;br /&gt;
&lt;br /&gt;
* [[MariaDB]] or [[MySQL|MySQL]]&lt;br /&gt;
&lt;br /&gt;
=== DNS ===&lt;br /&gt;
&lt;br /&gt;
* [[DNSCrypt-Proxy]] &#039;&#039;Encrypt and authenticate DNS calls from your system&#039;&#039;&lt;br /&gt;
* [[Setting up nsd DNS server]]&lt;br /&gt;
* [[Small-Time DNS with BIND9]] &#039;&#039;(A simple configuration with ad blocking for your home network)&#039;&#039;&lt;br /&gt;
* Unbound&lt;br /&gt;
** [[Setting up unbound DNS server]]&lt;br /&gt;
** [[Using Unbound as an Ad-blocker]] &#039;&#039;(Setup ad blocking for your network)&#039;&#039;&lt;br /&gt;
* [[TinyDNS Format]]&lt;br /&gt;
&lt;br /&gt;
=== File server ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up an NFS server|nfs-server]]&lt;br /&gt;
* [[Setting up a Samba server|samba-server]] &#039;&#039;(standard file sharing)&#039;&#039;&lt;br /&gt;
* [[Setting up a samba-ad-dc|samba-ad-dc]] &#039;&#039;(Active Directory compatible domain controller)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
&lt;br /&gt;
* [https://git.alpinelinux.org/awall/about/ Alpine Wall User&#039;s Guide]&lt;br /&gt;
** [[Zero-To-Awall]] -&#039;&#039;AWall for dummies&#039;&#039;&lt;br /&gt;
** [[How-To Alpine Wall]] - &#039;&#039;AWall for Shorewall users&#039;&#039;&lt;br /&gt;
** [[Alpine Wall]] - &#039;&#039;AWall - Firewall management framework - Design Document&#039;&#039;&lt;br /&gt;
* [[Iptables]]&lt;br /&gt;
* [[nftables]]&lt;br /&gt;
* [[Uncomplicated Firewall|Uncomplicated Firewall or UFW]]&lt;br /&gt;
&lt;br /&gt;
=== HTTP and web services ===&lt;br /&gt;
&lt;br /&gt;
* [[Althttpd]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
** [[Apache with php-fpm]]&lt;br /&gt;
** [[Setting Up Apache with PHP]]&lt;br /&gt;
** [[Apache authentication: NTLM Single Signon]]&lt;br /&gt;
* [[Darkhttpd]]&lt;br /&gt;
* [[Lighttpd]]&lt;br /&gt;
** [[Lighttpd Advanced security]]&lt;br /&gt;
** [[Setting Up Lighttpd With FastCGI]]&lt;br /&gt;
** [[Production Web server: Lighttpd|Production web server: Lighttpd‎‎]]&lt;br /&gt;
* [[Nginx]]&lt;br /&gt;
** [[Nginx as reverse proxy with acme (letsencrypt)]]&lt;br /&gt;
** [[Nginx with PHP]]&lt;br /&gt;
* Squid Proxy&lt;br /&gt;
** [[Setting up Explicit Squid Proxy]]&lt;br /&gt;
** [[Setting up Transparent Squid Proxy]] &#039;&#039;(Covers Squid proxy and URL Filtering system)&#039;&#039;&lt;br /&gt;
** [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Tomcat]]&lt;br /&gt;
** [[Production LAMP system: Lighttpd + PHP + MySQL‎‎|Production LAMP system: Lighttpd + PHP + MariaDB/MySQL‎‎]]&lt;br /&gt;
&lt;br /&gt;
=== IRC ===&lt;br /&gt;
&lt;br /&gt;
* [[NgIRCd]] &#039;&#039;(Server for Internet Relay Chat/IRC)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Mail ===&lt;br /&gt;
&lt;br /&gt;
* [[Hosting services on Alpine]] &#039;&#039;(Hosting mail, webservices and other services)&#039;&#039;&lt;br /&gt;
* [[Hosting Web/Email services on Alpine]]&lt;br /&gt;
* Exim/Dovecot&lt;br /&gt;
** [[Small-Time Email with Exim and Dovecot]] &#039;&#039;(A simple configuration for your home network.)&lt;br /&gt;
** [[Setting up dovecot with imap and tls]]&lt;br /&gt;
* [[relay email to gmail (msmtp, mailx, sendmail]]&lt;br /&gt;
* [[relay email (nullmailer)]]&lt;br /&gt;
* [[Roundcube]] &#039;&#039;(Webmail system)&#039;&#039;&lt;br /&gt;
* [[Setting up postfix with virtual domains]]&lt;br /&gt;
* Server protection&lt;br /&gt;
** [[Setting up clamsmtp]]&lt;br /&gt;
&lt;br /&gt;
=== Monitoring ===&lt;br /&gt;
&lt;br /&gt;
* [[Awstats]] &#039;&#039;(Free log file analyzer)&#039;&#039;&lt;br /&gt;
* [[Cacti: traffic analysis and monitoring network]] &#039;&#039;(Front-end for rrdtool networking monitor)&#039;&#039;&lt;br /&gt;
* [[Cvechecker]] &#039;&#039;(Compare installed packages for Common Vulnerabilities Exposure)&#039;&#039; &amp;lt;!-- Monitoring and Security --&amp;gt;&lt;br /&gt;
* [[Linfo]]&lt;br /&gt;
* [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
* [[PhpSysInfo]] &#039;&#039;(A simple application that displays information about the host it&#039;s running on)&#039;&#039;&lt;br /&gt;
* [[Logcheck]] &#039;&#039;(log file monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Matomo]] &#039;&#039;(A real time web analytics software program)&#039;&#039;&lt;br /&gt;
* [[Rasdaemon]] &#039;&#039;(Platform Reliability, Availability and Serviceability monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft, solution, Networking and Monitoring and Server --&amp;gt;&lt;br /&gt;
** [[Setting up NRPE daemon]] &#039;&#039;(Performs remote Nagios checks)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[Setting Up Fprobe And Ntop|Ntop]] &#039;&#039;(NetFlow collection and analysis using a remote fprobe instance; for alpine 3.10-3.12 only)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Traffic monitoring]] &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
** [[Setting up monitoring using rrdtool (and rrdcollect)]]&lt;br /&gt;
** [[Setting up traffic monitoring using rrdtool (and snmp)]] &amp;lt;!-- Monitoring --&amp;gt;&lt;br /&gt;
* [[Zabbix|Zabbix - the professional complete manager]] &#039;&#039;(Monitor and track the status of network services and hardware)&#039;&#039;&lt;br /&gt;
* [[ZoneMinder video camera security and surveillance]]&lt;br /&gt;
&lt;br /&gt;
=== Remote Administration ===&lt;br /&gt;
&lt;br /&gt;
* ACF&lt;br /&gt;
** [[Changing passwords for ACF|ACF - changing passwords]]&lt;br /&gt;
** [[Generating SSL certs with ACF]] &amp;lt;!-- Generating SSL certs with ACF 1.9 --&amp;gt;&lt;br /&gt;
** [[setup-acf| ACF - setup]] &#039;&#039;(Configures ACF (webconfiguration/webmin) so you can manage your box through https)&#039;&#039;&lt;br /&gt;
* [[Setting up a SSH server]] &#039;&#039;(Using ssh is a good way to administer your box remotely)&#039;&#039;&lt;br /&gt;
** [[HOWTO OpenSSH 2FA with password and Google Authenticator |OpenSSH 2FA]] &#039;&#039;(A simple two factor setup for OpenSSH)&#039;&#039;&lt;br /&gt;
* [[OpenVCP]] &#039;&#039;(VServer Control Panel)&#039;&#039;&lt;br /&gt;
* [[PhpMyAdmin]] &#039;&#039;(Web-based administration tool for MYSQL)&#039;&#039;&lt;br /&gt;
* [[PhpPgAdmin]] &#039;&#039;(Web-based administration tool for PostgreSQL)&#039;&#039;&lt;br /&gt;
* [[Webmin]] &#039;&#039;(A web-based interface for Linux system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Telephony ===&lt;br /&gt;
&lt;br /&gt;
* [[FreePBX|FreePBX on Alpine Linux]]&lt;br /&gt;
* [[Setting up Zaptel/Asterisk on Alpine]]&lt;br /&gt;
* [[Kamailio]] &#039;&#039;(SIP Server, formerly OpenSER)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== VPN ===&lt;br /&gt;
* [[Freeradius Active Directory Integration]]&lt;br /&gt;
* [[GNUnet]]&lt;br /&gt;
* [[IGMPproxy]]&lt;br /&gt;
* [[Setting up a OpenVPN server|OpenVPN server]] &#039;&#039;(Allowing single users or devices to remotely connect to your network)&#039;&#039;&lt;br /&gt;
* [[OpenVSwitch]]&lt;br /&gt;
* [[Openconnect-SSO in Docker]]&lt;br /&gt;
* [[Tor]]&lt;br /&gt;
* [[Using Alpine on Windows domain with IPSEC isolation]]&lt;br /&gt;
* [[Configure a Wireguard interface (wg)|Wireguard]]&lt;br /&gt;
* [[Vpnc]]&lt;br /&gt;
&lt;br /&gt;
=== Other Servers ===&lt;br /&gt;
&lt;br /&gt;
* [[apcupsd]] &#039;&#039;(UPS Monitoring with apcupsd)&#039;&#039;&lt;br /&gt;
* [[Chrony and GPSD | Chrony, gpsd, and a garmin LVC 18 as a Stratum 1 NTP source ]]&lt;br /&gt;
* [[Glpi]] &#039;&#039;(Manage inventory of technical resources)&#039;&#039;&lt;br /&gt;
* [[How to setup a Alpine Linux mirror]]&lt;br /&gt;
* [[nut-ups|NUT UPS]] &#039;&#039;(UPS Monitoring with Network UPS Tools)&#039;&#039;&lt;br /&gt;
* [[Odoo]]&lt;br /&gt;
* [[Configure OpenLDAP | OpenLDAP]] &#039;&#039;(Installing and configuring the Alpine package for OpenLDAP)&#039;&#039;&lt;br /&gt;
* [[Setting up a LLDAP server|lldap-server]] &#039;&#039;(Directory Server)&#039;&#039;&lt;br /&gt;
* [[Setting up Transmission (bittorrent) with Clutch WebUI]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software development ==&lt;br /&gt;
&lt;br /&gt;
* [[Cgit]]&lt;br /&gt;
* [[OsTicket]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Patchwork]] &#039;&#039;(Patch review management system)&#039;&#039;&lt;br /&gt;
* [[Redmine]] &#039;&#039;(Project management system) [Deprecated]&#039;&#039;&lt;br /&gt;
* [[Request Tracker]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Setting up trac wiki|Trac]] &#039;&#039;(Enhanced wiki and issue tracking system for software development projects)&#039;&#039;&lt;br /&gt;
* [[Ansible]] &#039;&#039;(Configuration management)&#039;&#039;&lt;br /&gt;
* [[Installing Oracle Java|Oracle Java (installation)]]&lt;br /&gt;
&lt;br /&gt;
== Storage ==&lt;br /&gt;
&lt;br /&gt;
* [[Setting up disks manually|Manual partitioning]]&lt;br /&gt;
* [[Disk Replication with DRBD|DRBD: Disk Replication]]&lt;br /&gt;
* [[Filesystems]]&lt;br /&gt;
** [[Burning ISOs]]&lt;br /&gt;
* [[Setting up iSCSI|iSCSI Setup]]&lt;br /&gt;
** [[iSCSI Raid and Clustered File Systems]]&lt;br /&gt;
** [[Linux iSCSI Target (TCM)|iSCSI Target (TCM)/LinuxIO (LIO)]]&lt;br /&gt;
** [[Linux iSCSI Target (tgt)|User space iSCSI Target (tgt)]]&lt;br /&gt;
* [[Setting up Logical Volumes with LVM|LVM Setup]]&lt;br /&gt;
** [[Setting up LVM on GPT-labeled disks|LVM on GPT-labeled disks]]&lt;br /&gt;
** [[Installing on GPT LVM|LVM on GPT-labeled disks (updated)]]&lt;br /&gt;
** [[LVM on LUKS]]&lt;br /&gt;
* RAID&lt;br /&gt;
** [[Raid Administration]]&lt;br /&gt;
** [[Setting up a software RAID array]]&lt;br /&gt;
* [[ZFS]]&lt;br /&gt;
** [[Root on ZFS with native encryption]]&lt;br /&gt;
** [[Setting up ZFS on LUKS]]&lt;br /&gt;
* [[CEPH|CEPH]]&lt;br /&gt;
&lt;br /&gt;
== Virtualization ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]]&lt;br /&gt;
* [[Installing Alpine in a virtual machine]]&lt;br /&gt;
** [[Install Alpine on VMware ESXi]]&lt;br /&gt;
* [[KVM]] &#039;&#039;(Setting up Alpine as a KVM hypervisor)&#039;&#039;&lt;br /&gt;
* [[LXC]] &#039;&#039;(Setting up a Linux container in Alpine Linux)&#039;&#039;&lt;br /&gt;
* [[QEMU]]&lt;br /&gt;
* Xen&lt;br /&gt;
** [[Xen Dom0]] &#039;&#039;(Setting up Alpine as a dom0 for Xen hypervisor)&#039;&#039;&lt;br /&gt;
** [[Xen Dom0 on USB or SD]]&lt;br /&gt;
** [[Create Alpine Linux PV DomU|Xen DomU (paravirtualized)]]&lt;br /&gt;
** [[Xen LiveCD]]&lt;br /&gt;
** [[Xen PCI Passthrough]]&lt;br /&gt;
** [[K8s]] Building a K8s Kubernetes Cluster on Alpine Linux&lt;br /&gt;
* [[Runc]]&lt;br /&gt;
&lt;br /&gt;
== [[Simple_Walkthrough]] ==&lt;br /&gt;
* [[About-virtualization-simple]]&lt;br /&gt;
* [[LXC_Alpinelinux_Simple]]&lt;br /&gt;
* [[Qemu-simple]]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[TTY_Autologin|TTY Autologin]]&lt;br /&gt;
* [[Kexec|Faster rebooting with kexec]]&lt;br /&gt;
* [[Dynamic Multipoint VPN (DMVPN)]] combined with [[Small Office Services]]&lt;br /&gt;
* [[DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs]]&lt;br /&gt;
* [[Fault Tolerant Routing with Alpine Linux]]&lt;br /&gt;
* [[High Availability High Performance Web Cache]] &#039;&#039;(uCarp + HAProxy for High Availability Services such as Squid web proxy)&#039;&#039;&lt;br /&gt;
* [[Linux iSCSI Target (TCM)]]&lt;br /&gt;
* [[ISP Mail Server 3.x HowTo]] &#039;&#039;(Postfix+PostfixAdmin+DoveCot+Roundcube+ClamAV+Spamd - A full-service ISP mail server)&#039;&#039;&lt;br /&gt;
* [[Grommunio Mail Server]] &#039;&#039;(Mariadb+Postfix+Rspamd+Grommunio - Full-service mail server as MS exchange replacement)&#039;&#039;&lt;br /&gt;
* [[Replacing non-Alpine Linux with Alpine remotely]]&lt;br /&gt;
* [[Streaming Security Camera Video with VLC]]&lt;br /&gt;
* [[Install Alpine on a btrfs filesystem with refind as boot manager]]&lt;br /&gt;
* [[Compile software from source|How to Compile a software from source in Alpine Linux]]&lt;br /&gt;
* [https://ww2.coastal.edu/mmurphy2/oer/alpine/ Alpine Linux tutorials - Dr Murphy, Computing Science Associate Professor]&lt;br /&gt;
* [[Michael&#039;s base installation procedure|Michael&#039;s base installation procedure]]&lt;br /&gt;
* [[Michael&#039;s cwm  desktop (minimal)|Michael&#039;s cwm desktop (minimal)]]&lt;br /&gt;
* [[Michael&#039;s sway desktop (minimal)|Michael&#039;s Sway desktop (minimal)]]&lt;br /&gt;
* [[Sway_customization_guide|Sway customization guide]] &#039;&#039;(Tutorial re Sway config file basics)&#039;&#039;&lt;br /&gt;
* [[Using Distrobox For VR Gaming|Using Distrobox For VR Gaming]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Unlock_an_encrypted_data_partition_on_login&amp;diff=32027</id>
		<title>Unlock an encrypted data partition on login</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Unlock_an_encrypted_data_partition_on_login&amp;diff=32027"/>
		<updated>2026-02-07T14:40:58Z</updated>

		<summary type="html">&lt;p&gt;Benaki: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Mounting_a_LUKS_Encrypted_Data_Partition_at_Boot&amp;diff=32026</id>
		<title>Mounting a LUKS Encrypted Data Partition at Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Mounting_a_LUKS_Encrypted_Data_Partition_at_Boot&amp;diff=32026"/>
		<updated>2026-02-07T14:38:59Z</updated>

		<summary type="html">&lt;p&gt;Benaki: /* Mounting a LUKS Encrypted Data Partition at Boot */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This guide covers how to set up a secondary LUKS-encrypted partition as a data drive that is automatically unlocked and mounted when Alpine Linux boots. This is useful if, for example, you have a root partition on one drive and want an encrypted data partition on another — or if you simply want a separate encrypted volume for personal data.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A spare partition (this guide uses &amp;lt;code&amp;gt;/dev/sda1&amp;lt;/code&amp;gt; as an example)&lt;br /&gt;
* &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; installed: &amp;lt;code&amp;gt;doas apk add cryptsetup&amp;lt;/code&amp;gt;&lt;br /&gt;
* An Alpine system using OpenRC (the default)&lt;br /&gt;
&lt;br /&gt;
== 1. Set Up the LUKS Container ==&lt;br /&gt;
&lt;br /&gt;
If you are starting with a fresh or existing partition, format it as a LUKS container. &#039;&#039;&#039;This will erase all data on the partition.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup luksFormat /dev/sda1&lt;br /&gt;
doas cryptsetup luksOpen /dev/sda1 data&lt;br /&gt;
doas mkfs.ext4 /dev/mapper/data&lt;br /&gt;
doas cryptsetup luksClose data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. Create a Keyfile for Automatic Unlocking ==&lt;br /&gt;
&lt;br /&gt;
A keyfile allows the partition to be unlocked at boot without a passphrase prompt. The keyfile itself is stored on your root partition, so it is protected by whatever encryption or access controls that partition has.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas dd if=/dev/urandom of=/etc/crypto_keyfile.bin bs=512 count=1&lt;br /&gt;
doas chmod 600 /etc/crypto_keyfile.bin&lt;br /&gt;
doas cryptsetup luksAddKey /dev/sda1 /etc/crypto_keyfile.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your original passphrase remains as a fallback for manual unlocking.&lt;br /&gt;
&lt;br /&gt;
== 3. Create the Mount Point ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas mkdir -p /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Add an fstab Entry ==&lt;br /&gt;
&lt;br /&gt;
Add the following line to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/mapper/data    /mnt/data    ext4    defaults,nofail    0    2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;nofail&amp;lt;/code&amp;gt; option ensures that if the device or keyfile is missing for any reason, the system will still boot.&lt;br /&gt;
&lt;br /&gt;
== 5. Create an OpenRC Init Script ==&lt;br /&gt;
&lt;br /&gt;
Alpine&#039;s OpenRC does not process &amp;lt;code&amp;gt;/etc/crypttab&amp;lt;/code&amp;gt; by default. The root partition&#039;s LUKS container is typically unlocked via kernel parameters (&amp;lt;code&amp;gt;cryptroot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cryptdm&amp;lt;/code&amp;gt;) in the initramfs, not via &amp;lt;code&amp;gt;crypttab&amp;lt;/code&amp;gt;. For additional encrypted partitions, you need a custom init script to handle both the unlock and the mount.&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;code&amp;gt;/etc/init.d/cryptdata&amp;lt;/code&amp;gt; with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/sbin/openrc-run&lt;br /&gt;
description=&amp;quot;Unlock and mount LUKS encrypted data partition&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RC_NEEDED=&amp;quot;modules lvm&amp;quot;&lt;br /&gt;
RC_AFTER=&amp;quot;modules lvm&amp;quot;&lt;br /&gt;
RC_BEFORE=&amp;quot;local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
    ebegin &amp;quot;Unlocking /dev/sda1&amp;quot;&lt;br /&gt;
    cryptsetup luksOpen /dev/sda1 data --key-file /etc/crypto_keyfile.bin&lt;br /&gt;
    eend $?&lt;br /&gt;
&lt;br /&gt;
    ebegin &amp;quot;Mounting /mnt/data&amp;quot;&lt;br /&gt;
    mount /dev/mapper/data /mnt/data&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Why both unlock and mount in the script? ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;RC_BEFORE=&amp;quot;local&amp;quot;&amp;lt;/code&amp;gt; directive is intended to make this script run before OpenRC processes &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; mounts. In practice, the timing is not always reliable, and the mount in &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; may be attempted before the LUKS container is open. Putting the mount directly in the init script guarantees the correct order: unlock first, then mount.&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;RC_AFTER=&amp;quot;modules lvm&amp;quot;&amp;lt;/code&amp;gt; — ensures kernel modules and LVM volumes are available before this script runs.&lt;br /&gt;
* &amp;lt;code&amp;gt;RC_BEFORE=&amp;quot;local&amp;quot;&amp;lt;/code&amp;gt; — requests that this script runs before the &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; service, which is where general &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; mounts are processed.&lt;br /&gt;
&lt;br /&gt;
== 6. Enable the Service ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas chmod +x /etc/init.d/cryptdata&lt;br /&gt;
doas rc-update add cryptdata boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. Test ==&lt;br /&gt;
&lt;br /&gt;
Reboot and verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
df -h | grep data&lt;br /&gt;
# Should show something like:&lt;br /&gt;
# /dev/mapper/data    219G    2.0M    208G    0%    /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also confirm the LUKS container is active:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup status data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manual Unlock (Fallback) ==&lt;br /&gt;
&lt;br /&gt;
If you ever need to unlock the partition by hand (e.g. the keyfile is missing), you can do so with your original passphrase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup luksOpen /dev/sda1 data&lt;br /&gt;
doas mount /dev/mapper/data /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Mounting_a_LUKS_Encrypted_Data_Partition_at_Boot&amp;diff=32025</id>
		<title>Mounting a LUKS Encrypted Data Partition at Boot</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Mounting_a_LUKS_Encrypted_Data_Partition_at_Boot&amp;diff=32025"/>
		<updated>2026-02-07T14:38:45Z</updated>

		<summary type="html">&lt;p&gt;Benaki: Created page with &amp;quot;= Mounting a LUKS Encrypted Data Partition at Boot =  This guide covers how to set up a secondary LUKS-encrypted partition as a data drive that is automatically unlocked and mounted when Alpine Linux boots. This is useful if, for example, you have a root partition on one drive and want an encrypted data partition on another — or if you simply want a separate encrypted volume for personal data.  == Prerequisites ==  * A spare partition (this guide uses &amp;lt;code&amp;gt;/dev/sda1&amp;lt;/...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Mounting a LUKS Encrypted Data Partition at Boot =&lt;br /&gt;
&lt;br /&gt;
This guide covers how to set up a secondary LUKS-encrypted partition as a data drive that is automatically unlocked and mounted when Alpine Linux boots. This is useful if, for example, you have a root partition on one drive and want an encrypted data partition on another — or if you simply want a separate encrypted volume for personal data.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A spare partition (this guide uses &amp;lt;code&amp;gt;/dev/sda1&amp;lt;/code&amp;gt; as an example)&lt;br /&gt;
* &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; installed: &amp;lt;code&amp;gt;doas apk add cryptsetup&amp;lt;/code&amp;gt;&lt;br /&gt;
* An Alpine system using OpenRC (the default)&lt;br /&gt;
&lt;br /&gt;
== 1. Set Up the LUKS Container ==&lt;br /&gt;
&lt;br /&gt;
If you are starting with a fresh or existing partition, format it as a LUKS container. &#039;&#039;&#039;This will erase all data on the partition.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup luksFormat /dev/sda1&lt;br /&gt;
doas cryptsetup luksOpen /dev/sda1 data&lt;br /&gt;
doas mkfs.ext4 /dev/mapper/data&lt;br /&gt;
doas cryptsetup luksClose data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. Create a Keyfile for Automatic Unlocking ==&lt;br /&gt;
&lt;br /&gt;
A keyfile allows the partition to be unlocked at boot without a passphrase prompt. The keyfile itself is stored on your root partition, so it is protected by whatever encryption or access controls that partition has.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas dd if=/dev/urandom of=/etc/crypto_keyfile.bin bs=512 count=1&lt;br /&gt;
doas chmod 600 /etc/crypto_keyfile.bin&lt;br /&gt;
doas cryptsetup luksAddKey /dev/sda1 /etc/crypto_keyfile.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your original passphrase remains as a fallback for manual unlocking.&lt;br /&gt;
&lt;br /&gt;
== 3. Create the Mount Point ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas mkdir -p /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Add an fstab Entry ==&lt;br /&gt;
&lt;br /&gt;
Add the following line to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/mapper/data    /mnt/data    ext4    defaults,nofail    0    2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;nofail&amp;lt;/code&amp;gt; option ensures that if the device or keyfile is missing for any reason, the system will still boot.&lt;br /&gt;
&lt;br /&gt;
== 5. Create an OpenRC Init Script ==&lt;br /&gt;
&lt;br /&gt;
Alpine&#039;s OpenRC does not process &amp;lt;code&amp;gt;/etc/crypttab&amp;lt;/code&amp;gt; by default. The root partition&#039;s LUKS container is typically unlocked via kernel parameters (&amp;lt;code&amp;gt;cryptroot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cryptdm&amp;lt;/code&amp;gt;) in the initramfs, not via &amp;lt;code&amp;gt;crypttab&amp;lt;/code&amp;gt;. For additional encrypted partitions, you need a custom init script to handle both the unlock and the mount.&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;code&amp;gt;/etc/init.d/cryptdata&amp;lt;/code&amp;gt; with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/sbin/openrc-run&lt;br /&gt;
description=&amp;quot;Unlock and mount LUKS encrypted data partition&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RC_NEEDED=&amp;quot;modules lvm&amp;quot;&lt;br /&gt;
RC_AFTER=&amp;quot;modules lvm&amp;quot;&lt;br /&gt;
RC_BEFORE=&amp;quot;local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
    ebegin &amp;quot;Unlocking /dev/sda1&amp;quot;&lt;br /&gt;
    cryptsetup luksOpen /dev/sda1 data --key-file /etc/crypto_keyfile.bin&lt;br /&gt;
    eend $?&lt;br /&gt;
&lt;br /&gt;
    ebegin &amp;quot;Mounting /mnt/data&amp;quot;&lt;br /&gt;
    mount /dev/mapper/data /mnt/data&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Why both unlock and mount in the script? ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;RC_BEFORE=&amp;quot;local&amp;quot;&amp;lt;/code&amp;gt; directive is intended to make this script run before OpenRC processes &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; mounts. In practice, the timing is not always reliable, and the mount in &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; may be attempted before the LUKS container is open. Putting the mount directly in the init script guarantees the correct order: unlock first, then mount.&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;RC_AFTER=&amp;quot;modules lvm&amp;quot;&amp;lt;/code&amp;gt; — ensures kernel modules and LVM volumes are available before this script runs.&lt;br /&gt;
* &amp;lt;code&amp;gt;RC_BEFORE=&amp;quot;local&amp;quot;&amp;lt;/code&amp;gt; — requests that this script runs before the &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; service, which is where general &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; mounts are processed.&lt;br /&gt;
&lt;br /&gt;
== 6. Enable the Service ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas chmod +x /etc/init.d/cryptdata&lt;br /&gt;
doas rc-update add cryptdata boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. Test ==&lt;br /&gt;
&lt;br /&gt;
Reboot and verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
df -h | grep data&lt;br /&gt;
# Should show something like:&lt;br /&gt;
# /dev/mapper/data    219G    2.0M    208G    0%    /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also confirm the LUKS container is active:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup status data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manual Unlock (Fallback) ==&lt;br /&gt;
&lt;br /&gt;
If you ever need to unlock the partition by hand (e.g. the keyfile is missing), you can do so with your original passphrase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup luksOpen /dev/sda1 data&lt;br /&gt;
doas mount /dev/mapper/data /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=32024</id>
		<title>Tutorials and Howtos</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=32024"/>
		<updated>2026-02-07T14:38:05Z</updated>

		<summary type="html">&lt;p&gt;Benaki: /* Other topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:package_edutainment.svg|right|link=]]&lt;br /&gt;
{{TOC left}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welcome to Tutorials and Howtos, a place of basic and advanced configuration tasks for your Alpine Linux.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Howtos are smaller articles&#039;&#039;&#039; explaining how to perform a particular task with Alpine Linux, that expects a minimal knowledge from reader to perform actions. Howto&#039;s have been organized in the below page based on the topics.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The [[#Tutorials|tutorials]] are hands-on&#039;&#039;&#039; and the reader is expected to try and achieve the goals described in each step, possibly with the help of a good example. The output in one step is the starting point for the following step.&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* Contributors are requested to refer to [[Help:Editing]] first and make use of resources like [[How to write a HOWTO]].&lt;br /&gt;
* Contributions must be complete articles. &lt;br /&gt;
* Don&#039;t override already made contributions, unless there is a mistake. &lt;br /&gt;
* If you want to request a topic, please add your request in this page&#039;s [[Talk:Tutorials_and_Howtos|Discussion]].}}&lt;br /&gt;
&lt;br /&gt;
== Desktop ==&lt;br /&gt;
&lt;br /&gt;
* {{:Daily driver guide}}&lt;br /&gt;
&lt;br /&gt;
=== Networking ===&lt;br /&gt;
&lt;br /&gt;
* [[Bluetooth]] - Instructions for installing and configuring Bluetooth&lt;br /&gt;
* [[Bonding]] - Bond (or aggregate) multiple ethernet interfaces&lt;br /&gt;
* [[Bridge]] - Configuring a network bridge&lt;br /&gt;
** [[Bridge wlan0 to eth0]]&lt;br /&gt;
* [[Configure Networking]]&lt;br /&gt;
* [[How to configure static routes]]&lt;br /&gt;
* Modem&lt;br /&gt;
** [[Using HSDPA modem]]&lt;br /&gt;
** [[Using serial modem]]&lt;br /&gt;
* [[mDNS]] - Howto implement multicast DNS resolution in Alpine. &lt;br /&gt;
* [[Multi ISP]] &#039;&#039;(Dual-ISP setup with load-balancing and automatic failover)&#039;&#039;&lt;br /&gt;
* [[PXE boot]]&lt;br /&gt;
* Wi-Fi&lt;br /&gt;
** [[Wi-Fi|Connecting to a wireless access point]]&lt;br /&gt;
** [[How to setup a wireless access point]] &#039;&#039;(Setting up Secure Wireless AP w/ WPA encryption with bridge to wired network)&#039;&#039;&lt;br /&gt;
* Use [https://github.com/ifupdown-ng/ifupdown-ng/blob/main/doc/interfaces-vxlan.scd vxlan], if using  [[Ifupdown-ng]] instead of [[VLAN]]&lt;br /&gt;
* [[Setting up a Home Router]]&lt;br /&gt;
&lt;br /&gt;
=== Backup and data migration ===&lt;br /&gt;
&lt;br /&gt;
* [[Migrating data]]&lt;br /&gt;
* [[Rsnapshot]] - setting up periodic backups&lt;br /&gt;
&lt;br /&gt;
=== Other topics ===&lt;br /&gt;
&lt;br /&gt;
* [[Gaming on Alpine]]&lt;br /&gt;
* [[Remote Desktop Server]]&lt;br /&gt;
* [[Default applications|How to change default application]]&lt;br /&gt;
* [[CPU frequency scaling]]&lt;br /&gt;
* [[Mimalloc]]&lt;br /&gt;
* [[Enable Serial Console on Boot]]&lt;br /&gt;
* [[How to build the Alpine Linux kernel]]&lt;br /&gt;
* [[Nextcloud]] &#039;&#039;(Self hostable cloud suite - Dropbox Alternative)&#039;&#039;&lt;br /&gt;
* [[Setting up lm_sensors]]&lt;br /&gt;
* [[Fingerprint Authentication with swaylock]]&lt;br /&gt;
* [[Mounting a LUKS Encrypted Data Partition at Boot]]&lt;br /&gt;
* [[Desktop environments and Window managers|List of supported Desktop environments and Window managers]]&lt;br /&gt;
&lt;br /&gt;
== Diskless ==&lt;br /&gt;
&lt;br /&gt;
* [[Alpine local backup|Alpine local backup (lbu)]] &#039;&#039;(Permanently store your modifications in case your box needs reboot)&#039;&#039;&lt;br /&gt;
** [[Back Up a Flash Memory Installation]]&lt;br /&gt;
** [[Manually editing a existing apkovl]]&lt;br /&gt;
&lt;br /&gt;
== Other Architectures ==&lt;br /&gt;
&lt;br /&gt;
=== APU (PCEngines) ===&lt;br /&gt;
&lt;br /&gt;
* [[Alpine Install: from a disc to PC Engines APU|Alpine on PC Engines APU]]&lt;br /&gt;
* [https://github.com/huubsch/Installation-of-Alpine-Linux-on-PC-Engines-APU3/tree/main?tab=readme-ov-file Installation of Alpine Linux on PCEngines APU, legacy BIOS]&lt;br /&gt;
&lt;br /&gt;
=== ARM ===&lt;br /&gt;
&lt;br /&gt;
* [[Alpine on ARM]]&lt;br /&gt;
&lt;br /&gt;
==== Raspberry Pi ====&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry Pi|Raspberry Pi main page]]&lt;br /&gt;
* [[Raspberry Pi Bluetooth Speaker|Raspberry Pi - Bluetooth Speaker]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi|Raspberry Pi - Router with VPN]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi (IPv6)|Raspberry Pi - Router with VPN (IPv6)]]&lt;br /&gt;
* [[Classic install or sys mode on Raspberry Pi|Raspberry Pi - Sys mode install]]&lt;br /&gt;
* [[Raspberry Pi LVM on LUKS|Raspberry Pi - Sys mode install - LVM on LUKS]]&lt;br /&gt;
* [[RPI Video Receiver|Raspberry Pi - Video Receiver]] &#039;&#039;(network video decoder using Rasperry Pi and omxplayer)&#039;&#039;&lt;br /&gt;
* [[Raspberry Pi 3 - Browser Client]] - kiosk or digital sign&lt;br /&gt;
* [[Raspberry Pi 3 - Configuring it as wireless access point -AP Mode]]&lt;br /&gt;
* [[Raspberry Pi 3 - Setting Up Bluetooth]]&lt;br /&gt;
* [[Raspberry Pi 4 - Persistent system acting as a NAS and Time Machine]]&lt;br /&gt;
* [[Raspberry_Pi_Zero_W_-_Installation|Raspberry Pi Zero W - Installation]]&lt;br /&gt;
* [[How to set up Alpine as a wireless router|Raspberry Pi Zero W - Wireless router]] &#039;&#039;(Setting up a firewalled, Wireless AP with wired network on a Pi Zero W)&#039;&#039;&lt;br /&gt;
* [[RPI Video Receiver]]&lt;br /&gt;
&lt;br /&gt;
=== IBM Z (IBM z Systems) ===&lt;br /&gt;
&lt;br /&gt;
* [[s390x|s390x - Installation]]&lt;br /&gt;
&lt;br /&gt;
=== PowerPC ===&lt;br /&gt;
&lt;br /&gt;
* [[Ppc64le|Powerpc64le - Installation]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* [[#Desktop security|Desktop security]] lists steps for securing Alpine Linux desktops&lt;br /&gt;
* [[Setting up a laptop]] page has detailed guidelines to configure a secured laptop&lt;br /&gt;
* [[Securing Alpine Linux|Secure Alpine Linux]] using Security Technical Implementation Guides (STIGs)&lt;br /&gt;
* [[Sshguard|SSHGuard]] - Protects hosts against brute-force attacks:  monitoring logs, attack detection, blocking using firewall.&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
{{Note| Services are arranged in alphabetical order.}}&lt;br /&gt;
&lt;br /&gt;
=== Content management systems ===&lt;br /&gt;
&lt;br /&gt;
* [[DokuWiki]] &#039;&#039;(Simple and easy to use wiki, no database required)&#039;&#039;&lt;br /&gt;
* [[Drupal]] &#039;&#039;(Content Management System (CMS) written in PHP)&#039;&#039;&lt;br /&gt;
* [[Kopano]] &#039;&#039;(Microsoft Outlook compatible Groupware)&#039;&#039;&lt;br /&gt;
* [[Mahara]] &#039;&#039;(E-portfolio and social networking system)&#039;&#039;&lt;br /&gt;
* [[MediaWiki]] &#039;&#039;(Free web-based wiki software application)&#039;&#039;&lt;br /&gt;
* [[Pastebin]] &#039;&#039;(Pastebin software application)&#039;&#039;&lt;br /&gt;
* [[WordPress]] &#039;&#039;(Web software to create website or blog)&#039;&#039;&lt;br /&gt;
* [[Moodle]] &#039;&#039;(Online Learning Management system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Database === &lt;br /&gt;
&lt;br /&gt;
* [[MariaDB]] or [[MySQL|MySQL]]&lt;br /&gt;
&lt;br /&gt;
=== DNS ===&lt;br /&gt;
&lt;br /&gt;
* [[DNSCrypt-Proxy]] &#039;&#039;Encrypt and authenticate DNS calls from your system&#039;&#039;&lt;br /&gt;
* [[Setting up nsd DNS server]]&lt;br /&gt;
* [[Small-Time DNS with BIND9]] &#039;&#039;(A simple configuration with ad blocking for your home network)&#039;&#039;&lt;br /&gt;
* Unbound&lt;br /&gt;
** [[Setting up unbound DNS server]]&lt;br /&gt;
** [[Using Unbound as an Ad-blocker]] &#039;&#039;(Setup ad blocking for your network)&#039;&#039;&lt;br /&gt;
* [[TinyDNS Format]]&lt;br /&gt;
&lt;br /&gt;
=== File server ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up an NFS server|nfs-server]]&lt;br /&gt;
* [[Setting up a Samba server|samba-server]] &#039;&#039;(standard file sharing)&#039;&#039;&lt;br /&gt;
* [[Setting up a samba-ad-dc|samba-ad-dc]] &#039;&#039;(Active Directory compatible domain controller)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
&lt;br /&gt;
* [https://git.alpinelinux.org/awall/about/ Alpine Wall User&#039;s Guide]&lt;br /&gt;
** [[Zero-To-Awall]] -&#039;&#039;AWall for dummies&#039;&#039;&lt;br /&gt;
** [[How-To Alpine Wall]] - &#039;&#039;AWall for Shorewall users&#039;&#039;&lt;br /&gt;
** [[Alpine Wall]] - &#039;&#039;AWall - Firewall management framework - Design Document&#039;&#039;&lt;br /&gt;
* [[Iptables]]&lt;br /&gt;
* [[nftables]]&lt;br /&gt;
* [[Uncomplicated Firewall|Uncomplicated Firewall or UFW]]&lt;br /&gt;
&lt;br /&gt;
=== HTTP and web services ===&lt;br /&gt;
&lt;br /&gt;
* [[Althttpd]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
** [[Apache with php-fpm]]&lt;br /&gt;
** [[Setting Up Apache with PHP]]&lt;br /&gt;
** [[Apache authentication: NTLM Single Signon]]&lt;br /&gt;
* [[Darkhttpd]]&lt;br /&gt;
* [[Lighttpd]]&lt;br /&gt;
** [[Lighttpd Advanced security]]&lt;br /&gt;
** [[Setting Up Lighttpd With FastCGI]]&lt;br /&gt;
** [[Production Web server: Lighttpd|Production web server: Lighttpd‎‎]]&lt;br /&gt;
* [[Nginx]]&lt;br /&gt;
** [[Nginx as reverse proxy with acme (letsencrypt)]]&lt;br /&gt;
** [[Nginx with PHP]]&lt;br /&gt;
* Squid Proxy&lt;br /&gt;
** [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
** [[Setting up Explicit Squid Proxy]]&lt;br /&gt;
** [[Setting up Transparent Squid Proxy]] &#039;&#039;(Covers Squid proxy and URL Filtering system)&#039;&#039;&lt;br /&gt;
** [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Tomcat]]&lt;br /&gt;
** [[Production LAMP system: Lighttpd + PHP + MySQL‎‎|Production LAMP system: Lighttpd + PHP + MariaDB/MySQL‎‎]]&lt;br /&gt;
&lt;br /&gt;
=== IRC ===&lt;br /&gt;
&lt;br /&gt;
* [[NgIRCd]] &#039;&#039;(Server for Internet Relay Chat/IRC)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Mail ===&lt;br /&gt;
&lt;br /&gt;
* [[Hosting services on Alpine]] &#039;&#039;(Hosting mail, webservices and other services)&#039;&#039;&lt;br /&gt;
* [[Hosting Web/Email services on Alpine]]&lt;br /&gt;
* Exim/Dovecot&lt;br /&gt;
** [[Small-Time Email with Exim and Dovecot]] &#039;&#039;(A simple configuration for your home network.)&lt;br /&gt;
** [[Setting up dovecot with imap and tls]]&lt;br /&gt;
* [[relay email to gmail (msmtp, mailx, sendmail]]&lt;br /&gt;
* [[relay email (nullmailer)]]&lt;br /&gt;
* [[Roundcube]] &#039;&#039;(Webmail system)&#039;&#039;&lt;br /&gt;
* [[Setting up postfix with virtual domains]]&lt;br /&gt;
* Server protection&lt;br /&gt;
** [[Setting up clamsmtp]]&lt;br /&gt;
&lt;br /&gt;
=== Monitoring ===&lt;br /&gt;
&lt;br /&gt;
* [[Awstats]] &#039;&#039;(Free log file analyzer)&#039;&#039;&lt;br /&gt;
* [[Cacti: traffic analysis and monitoring network]] &#039;&#039;(Front-end for rrdtool networking monitor)&#039;&#039;&lt;br /&gt;
* [[Cvechecker]] &#039;&#039;(Compare installed packages for Common Vulnerabilities Exposure)&#039;&#039; &amp;lt;!-- Monitoring and Security --&amp;gt;&lt;br /&gt;
* [[Linfo]]&lt;br /&gt;
* [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
* [[PhpSysInfo]] &#039;&#039;(A simple application that displays information about the host it&#039;s running on)&#039;&#039;&lt;br /&gt;
* [[Logcheck]] &#039;&#039;(log file monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Matomo]] &#039;&#039;(A real time web analytics software program)&#039;&#039;&lt;br /&gt;
* [[Rasdaemon]] &#039;&#039;(Platform Reliability, Availability and Serviceability monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft, solution, Networking and Monitoring and Server --&amp;gt;&lt;br /&gt;
** [[Setting up NRPE daemon]] &#039;&#039;(Performs remote Nagios checks)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[Setting Up Fprobe And Ntop|Ntop]] &#039;&#039;(NetFlow collection and analysis using a remote fprobe instance; for alpine 3.10-3.12 only)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Traffic monitoring]] &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
** [[Setting up monitoring using rrdtool (and rrdcollect)]]&lt;br /&gt;
** [[Setting up traffic monitoring using rrdtool (and snmp)]] &amp;lt;!-- Monitoring --&amp;gt;&lt;br /&gt;
* [[Zabbix|Zabbix - the professional complete manager]] &#039;&#039;(Monitor and track the status of network services and hardware)&#039;&#039;&lt;br /&gt;
* [[ZoneMinder video camera security and surveillance]]&lt;br /&gt;
&lt;br /&gt;
=== Remote Administration ===&lt;br /&gt;
&lt;br /&gt;
* ACF&lt;br /&gt;
** [[Changing passwords for ACF|ACF - changing passwords]]&lt;br /&gt;
** [[Generating SSL certs with ACF]] &amp;lt;!-- Generating SSL certs with ACF 1.9 --&amp;gt;&lt;br /&gt;
** [[setup-acf| ACF - setup]] &#039;&#039;(Configures ACF (webconfiguration/webmin) so you can manage your box through https)&#039;&#039;&lt;br /&gt;
* [[Setting up a SSH server]] &#039;&#039;(Using ssh is a good way to administer your box remotely)&#039;&#039;&lt;br /&gt;
** [[HOWTO OpenSSH 2FA with password and Google Authenticator |OpenSSH 2FA]] &#039;&#039;(A simple two factor setup for OpenSSH)&#039;&#039;&lt;br /&gt;
* [[OpenVCP]] &#039;&#039;(VServer Control Panel)&#039;&#039;&lt;br /&gt;
* [[PhpMyAdmin]] &#039;&#039;(Web-based administration tool for MYSQL)&#039;&#039;&lt;br /&gt;
* [[PhpPgAdmin]] &#039;&#039;(Web-based administration tool for PostgreSQL)&#039;&#039;&lt;br /&gt;
* [[Webmin]] &#039;&#039;(A web-based interface for Linux system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Telephony ===&lt;br /&gt;
&lt;br /&gt;
* [[FreePBX|FreePBX on Alpine Linux]]&lt;br /&gt;
* [[Setting up Zaptel/Asterisk on Alpine]]&lt;br /&gt;
* [[Kamailio]] &#039;&#039;(SIP Server, formerly OpenSER)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== VPN ===&lt;br /&gt;
* [[Freeradius Active Directory Integration]]&lt;br /&gt;
* [[GNUnet]]&lt;br /&gt;
* [[IGMPproxy]]&lt;br /&gt;
* [[Setting up a OpenVPN server|OpenVPN server]] &#039;&#039;(Allowing single users or devices to remotely connect to your network)&#039;&#039;&lt;br /&gt;
* [[OpenVSwitch]]&lt;br /&gt;
* [[Tor]]&lt;br /&gt;
* [[Using Alpine on Windows domain with IPSEC isolation]]&lt;br /&gt;
* [[Configure a Wireguard interface (wg)|Wireguard]]&lt;br /&gt;
* [[Vpnc]]&lt;br /&gt;
&lt;br /&gt;
=== Other Servers ===&lt;br /&gt;
&lt;br /&gt;
* [[apcupsd]] &#039;&#039;(UPS Monitoring with apcupsd)&#039;&#039;&lt;br /&gt;
* [[Chrony and GPSD | Chrony, gpsd, and a garmin LVC 18 as a Stratum 1 NTP source ]]&lt;br /&gt;
* [[Glpi]] &#039;&#039;(Manage inventory of technical resources)&#039;&#039;&lt;br /&gt;
* [[How to setup a Alpine Linux mirror]]&lt;br /&gt;
* [[nut-ups|NUT UPS]] &#039;&#039;(UPS Monitoring with Network UPS Tools)&#039;&#039;&lt;br /&gt;
* [[Odoo]]&lt;br /&gt;
* [[Configure OpenLDAP | OpenLDAP]] &#039;&#039;(Installing and configuring the Alpine package for OpenLDAP)&#039;&#039;&lt;br /&gt;
* [[Setting up a LLDAP server|lldap-server]] &#039;&#039;(Directory Server)&#039;&#039;&lt;br /&gt;
* [[Setting up Transmission (bittorrent) with Clutch WebUI]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software development ==&lt;br /&gt;
&lt;br /&gt;
* [[Cgit]]&lt;br /&gt;
* [[OsTicket]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Patchwork]] &#039;&#039;(Patch review management system)&#039;&#039;&lt;br /&gt;
* [[Redmine]] &#039;&#039;(Project management system) [Deprecated]&#039;&#039;&lt;br /&gt;
* [[Request Tracker]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Setting up trac wiki|Trac]] &#039;&#039;(Enhanced wiki and issue tracking system for software development projects)&#039;&#039;&lt;br /&gt;
* [[Ansible]] &#039;&#039;(Configuration management)&#039;&#039;&lt;br /&gt;
* [[Installing Oracle Java|Oracle Java (installation)]]&lt;br /&gt;
&lt;br /&gt;
== Storage ==&lt;br /&gt;
&lt;br /&gt;
* [[Setting up disks manually|Manual partitioning]]&lt;br /&gt;
* [[Disk Replication with DRBD|DRBD: Disk Replication]]&lt;br /&gt;
* [[Filesystems]]&lt;br /&gt;
** [[Burning ISOs]]&lt;br /&gt;
* [[Setting up iSCSI|iSCSI Setup]]&lt;br /&gt;
** [[iSCSI Raid and Clustered File Systems]]&lt;br /&gt;
** [[Linux iSCSI Target (TCM)|iSCSI Target (TCM)/LinuxIO (LIO)]]&lt;br /&gt;
** [[Linux iSCSI Target (tgt)|User space iSCSI Target (tgt)]]&lt;br /&gt;
* [[Setting up Logical Volumes with LVM|LVM Setup]]&lt;br /&gt;
** [[Setting up LVM on GPT-labeled disks|LVM on GPT-labeled disks]]&lt;br /&gt;
** [[Installing on GPT LVM|LVM on GPT-labeled disks (updated)]]&lt;br /&gt;
** [[LVM on LUKS]]&lt;br /&gt;
* RAID&lt;br /&gt;
** [[Raid Administration]]&lt;br /&gt;
** [[Setting up a software RAID array]]&lt;br /&gt;
* [[ZFS]]&lt;br /&gt;
** [[Root on ZFS with native encryption]]&lt;br /&gt;
** [[Setting up ZFS on LUKS]]&lt;br /&gt;
* [[CEPH|CEPH]]&lt;br /&gt;
&lt;br /&gt;
== Virtualization ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]]&lt;br /&gt;
* [[Installing Alpine in a virtual machine]]&lt;br /&gt;
** [[Install Alpine on VMware ESXi]]&lt;br /&gt;
* [[KVM]] &#039;&#039;(Setting up Alpine as a KVM hypervisor)&#039;&#039;&lt;br /&gt;
* [[LXC]] &#039;&#039;(Setting up a Linux container in Alpine Linux)&#039;&#039;&lt;br /&gt;
* [[QEMU]]&lt;br /&gt;
* Xen&lt;br /&gt;
** [[Xen Dom0]] &#039;&#039;(Setting up Alpine as a dom0 for Xen hypervisor)&#039;&#039;&lt;br /&gt;
** [[Xen Dom0 on USB or SD]]&lt;br /&gt;
** [[Create Alpine Linux PV DomU|Xen DomU (paravirtualized)]]&lt;br /&gt;
** [[Xen LiveCD]]&lt;br /&gt;
** [[Xen PCI Passthrough]]&lt;br /&gt;
** [[K8s]] Building a K8s Kubernetes Cluster on Alpine Linux&lt;br /&gt;
* [[Runc]]&lt;br /&gt;
&lt;br /&gt;
== [[Simple_Walkthrough]] ==&lt;br /&gt;
* [[About-virtualization-simple]]&lt;br /&gt;
* [[LXC_Alpinelinux_Simple]]&lt;br /&gt;
* [[Qemu-simple]]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[TTY_Autologin|TTY Autologin]]&lt;br /&gt;
* [[Kexec|Faster rebooting with kexec]]&lt;br /&gt;
* [[Dynamic Multipoint VPN (DMVPN)]] combined with [[Small Office Services]]&lt;br /&gt;
* [[DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs]]&lt;br /&gt;
* [[Fault Tolerant Routing with Alpine Linux]]&lt;br /&gt;
* [[High Availability High Performance Web Cache]] &#039;&#039;(uCarp + HAProxy for High Availability Services such as Squid web proxy)&#039;&#039;&lt;br /&gt;
* [[Linux iSCSI Target (TCM)]]&lt;br /&gt;
* [[ISP Mail Server 3.x HowTo]] &#039;&#039;(Postfix+PostfixAdmin+DoveCot+Roundcube+ClamAV+Spamd - A full-service ISP mail server)&#039;&#039;&lt;br /&gt;
* [[Grommunio Mail Server]] &#039;&#039;(Mariadb+Postfix+Rspamd+Grommunio - Full-service mail server as MS exchange replacement)&#039;&#039;&lt;br /&gt;
* [[Replacing non-Alpine Linux with Alpine remotely]]&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft --&amp;gt;&lt;br /&gt;
* [[Streaming Security Camera Video with VLC]]&lt;br /&gt;
* [[Install Alpine on a btrfs filesystem with refind as boot manager]]&lt;br /&gt;
* [[Compile software from source|How to Compile a software from source in Alpine Linux]]&lt;br /&gt;
* [https://ww2.coastal.edu/mmurphy2/oer/alpine/ Alpine Linux tutorials - Dr Murphy, Computing Science Associate Professor]&lt;br /&gt;
* [[Michael&#039;s base installation procedure|Michael&#039;s base installation procedure]]&lt;br /&gt;
* [[Michael&#039;s cwm  desktop (minimal)|Michael&#039;s cwm desktop (minimal)]]&lt;br /&gt;
* [[Michael&#039;s sway desktop (minimal)|Michael&#039;s Sway desktop (minimal)]]&lt;br /&gt;
* [[Sway_customization_guide|Sway customization guide]] &#039;&#039;(Tutorial re Sway config file basics)&#039;&#039;&lt;br /&gt;
* [[Using Distrobox For VR Gaming|Using Distrobox For VR Gaming]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Unlock_an_encrypted_data_partition_on_login&amp;diff=32023</id>
		<title>Unlock an encrypted data partition on login</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Unlock_an_encrypted_data_partition_on_login&amp;diff=32023"/>
		<updated>2026-02-07T14:35:35Z</updated>

		<summary type="html">&lt;p&gt;Benaki: Created page with &amp;quot;= Mounting a LUKS Encrypted Data Partition at Boot =  This guide covers how to set up a secondary LUKS-encrypted partition as a data drive that is automatically unlocked and mounted when Alpine Linux boots. This is useful if, for example, you have a root partition on one drive and want an encrypted data partition on another — or if you simply want a separate encrypted volume for personal data.  == Prerequisites ==  * A spare partition (this guide uses &amp;lt;code&amp;gt;/dev/sda1&amp;lt;/...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Mounting a LUKS Encrypted Data Partition at Boot =&lt;br /&gt;
&lt;br /&gt;
This guide covers how to set up a secondary LUKS-encrypted partition as a data drive that is automatically unlocked and mounted when Alpine Linux boots. This is useful if, for example, you have a root partition on one drive and want an encrypted data partition on another — or if you simply want a separate encrypted volume for personal data.&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
&lt;br /&gt;
* A spare partition (this guide uses &amp;lt;code&amp;gt;/dev/sda1&amp;lt;/code&amp;gt; as an example)&lt;br /&gt;
* &amp;lt;code&amp;gt;cryptsetup&amp;lt;/code&amp;gt; installed: &amp;lt;code&amp;gt;doas apk add cryptsetup&amp;lt;/code&amp;gt;&lt;br /&gt;
* An Alpine system using OpenRC (the default)&lt;br /&gt;
&lt;br /&gt;
== 1. Set Up the LUKS Container ==&lt;br /&gt;
&lt;br /&gt;
If you are starting with a fresh or existing partition, format it as a LUKS container. &#039;&#039;&#039;This will erase all data on the partition.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup luksFormat /dev/sda1&lt;br /&gt;
doas cryptsetup luksOpen /dev/sda1 data&lt;br /&gt;
doas mkfs.ext4 /dev/mapper/data&lt;br /&gt;
doas cryptsetup luksClose data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2. Create a Keyfile for Automatic Unlocking ==&lt;br /&gt;
&lt;br /&gt;
A keyfile allows the partition to be unlocked at boot without a passphrase prompt. The keyfile itself is stored on your root partition, so it is protected by whatever encryption or access controls that partition has.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas dd if=/dev/urandom of=/etc/crypto_keyfile.bin bs=512 count=1&lt;br /&gt;
doas chmod 600 /etc/crypto_keyfile.bin&lt;br /&gt;
doas cryptsetup luksAddKey /dev/sda1 /etc/crypto_keyfile.bin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Your original passphrase remains as a fallback for manual unlocking.&lt;br /&gt;
&lt;br /&gt;
== 3. Create the Mount Point ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas mkdir -p /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. Add an fstab Entry ==&lt;br /&gt;
&lt;br /&gt;
Add the following line to &amp;lt;code&amp;gt;/etc/fstab&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/dev/mapper/data    /mnt/data    ext4    defaults,nofail    0    2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;nofail&amp;lt;/code&amp;gt; option ensures that if the device or keyfile is missing for any reason, the system will still boot.&lt;br /&gt;
&lt;br /&gt;
== 5. Create an OpenRC Init Script ==&lt;br /&gt;
&lt;br /&gt;
Alpine&#039;s OpenRC does not process &amp;lt;code&amp;gt;/etc/crypttab&amp;lt;/code&amp;gt; by default. The root partition&#039;s LUKS container is typically unlocked via kernel parameters (&amp;lt;code&amp;gt;cryptroot&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cryptdm&amp;lt;/code&amp;gt;) in the initramfs, not via &amp;lt;code&amp;gt;crypttab&amp;lt;/code&amp;gt;. For additional encrypted partitions, you need a custom init script to handle both the unlock and the mount.&lt;br /&gt;
&lt;br /&gt;
Create &amp;lt;code&amp;gt;/etc/init.d/cryptdata&amp;lt;/code&amp;gt; with the following contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/sbin/openrc-run&lt;br /&gt;
description=&amp;quot;Unlock and mount LUKS encrypted data partition&amp;quot;&lt;br /&gt;
&lt;br /&gt;
RC_NEEDED=&amp;quot;modules lvm&amp;quot;&lt;br /&gt;
RC_AFTER=&amp;quot;modules lvm&amp;quot;&lt;br /&gt;
RC_BEFORE=&amp;quot;local&amp;quot;&lt;br /&gt;
&lt;br /&gt;
start() {&lt;br /&gt;
    ebegin &amp;quot;Unlocking /dev/sda1&amp;quot;&lt;br /&gt;
    cryptsetup luksOpen /dev/sda1 data --key-file /etc/crypto_keyfile.bin&lt;br /&gt;
    eend $?&lt;br /&gt;
&lt;br /&gt;
    ebegin &amp;quot;Mounting /mnt/data&amp;quot;&lt;br /&gt;
    mount /dev/mapper/data /mnt/data&lt;br /&gt;
    eend $?&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Why both unlock and mount in the script? ===&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;RC_BEFORE=&amp;quot;local&amp;quot;&amp;lt;/code&amp;gt; directive is intended to make this script run before OpenRC processes &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; mounts. In practice, the timing is not always reliable, and the mount in &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; may be attempted before the LUKS container is open. Putting the mount directly in the init script guarantees the correct order: unlock first, then mount.&lt;br /&gt;
&lt;br /&gt;
=== Dependencies ===&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;RC_AFTER=&amp;quot;modules lvm&amp;quot;&amp;lt;/code&amp;gt; — ensures kernel modules and LVM volumes are available before this script runs.&lt;br /&gt;
* &amp;lt;code&amp;gt;RC_BEFORE=&amp;quot;local&amp;quot;&amp;lt;/code&amp;gt; — requests that this script runs before the &amp;lt;code&amp;gt;local&amp;lt;/code&amp;gt; service, which is where general &amp;lt;code&amp;gt;fstab&amp;lt;/code&amp;gt; mounts are processed.&lt;br /&gt;
&lt;br /&gt;
== 6. Enable the Service ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas chmod +x /etc/init.d/cryptdata&lt;br /&gt;
doas rc-update add cryptdata boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7. Test ==&lt;br /&gt;
&lt;br /&gt;
Reboot and verify:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
df -h | grep data&lt;br /&gt;
# Should show something like:&lt;br /&gt;
# /dev/mapper/data    219G    2.0M    208G    0%    /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can also confirm the LUKS container is active:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup status data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Manual Unlock (Fallback) ==&lt;br /&gt;
&lt;br /&gt;
If you ever need to unlock the partition by hand (e.g. the keyfile is missing), you can do so with your original passphrase:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
doas cryptsetup luksOpen /dev/sda1 data&lt;br /&gt;
doas mount /dev/mapper/data /mnt/data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=32022</id>
		<title>Tutorials and Howtos</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=32022"/>
		<updated>2026-02-07T14:30:10Z</updated>

		<summary type="html">&lt;p&gt;Benaki: /* Other topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:package_edutainment.svg|right|link=]]&lt;br /&gt;
{{TOC left}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welcome to Tutorials and Howtos, a place of basic and advanced configuration tasks for your Alpine Linux.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Howtos are smaller articles&#039;&#039;&#039; explaining how to perform a particular task with Alpine Linux, that expects a minimal knowledge from reader to perform actions. Howto&#039;s have been organized in the below page based on the topics.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The [[#Tutorials|tutorials]] are hands-on&#039;&#039;&#039; and the reader is expected to try and achieve the goals described in each step, possibly with the help of a good example. The output in one step is the starting point for the following step.&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* Contributors are requested to refer to [[Help:Editing]] first and make use of resources like [[How to write a HOWTO]].&lt;br /&gt;
* Contributions must be complete articles. &lt;br /&gt;
* Don&#039;t override already made contributions, unless there is a mistake. &lt;br /&gt;
* If you want to request a topic, please add your request in this page&#039;s [[Talk:Tutorials_and_Howtos|Discussion]].}}&lt;br /&gt;
&lt;br /&gt;
== Desktop ==&lt;br /&gt;
&lt;br /&gt;
* {{:Daily driver guide}}&lt;br /&gt;
&lt;br /&gt;
=== Networking ===&lt;br /&gt;
&lt;br /&gt;
* [[Bluetooth]] - Instructions for installing and configuring Bluetooth&lt;br /&gt;
* [[Bonding]] - Bond (or aggregate) multiple ethernet interfaces&lt;br /&gt;
* [[Bridge]] - Configuring a network bridge&lt;br /&gt;
** [[Bridge wlan0 to eth0]]&lt;br /&gt;
* [[Configure Networking]]&lt;br /&gt;
* [[How to configure static routes]]&lt;br /&gt;
* Modem&lt;br /&gt;
** [[Using HSDPA modem]]&lt;br /&gt;
** [[Using serial modem]]&lt;br /&gt;
* [[mDNS]] - Howto implement multicast DNS resolution in Alpine. &lt;br /&gt;
* [[Multi ISP]] &#039;&#039;(Dual-ISP setup with load-balancing and automatic failover)&#039;&#039;&lt;br /&gt;
* [[PXE boot]]&lt;br /&gt;
* Wi-Fi&lt;br /&gt;
** [[Wi-Fi|Connecting to a wireless access point]]&lt;br /&gt;
** [[How to setup a wireless access point]] &#039;&#039;(Setting up Secure Wireless AP w/ WPA encryption with bridge to wired network)&#039;&#039;&lt;br /&gt;
* Use [https://github.com/ifupdown-ng/ifupdown-ng/blob/main/doc/interfaces-vxlan.scd vxlan], if using  [[Ifupdown-ng]] instead of [[VLAN]]&lt;br /&gt;
* [[Setting up a Home Router]]&lt;br /&gt;
&lt;br /&gt;
=== Backup and data migration ===&lt;br /&gt;
&lt;br /&gt;
* [[Migrating data]]&lt;br /&gt;
* [[Rsnapshot]] - setting up periodic backups&lt;br /&gt;
&lt;br /&gt;
=== Other topics ===&lt;br /&gt;
&lt;br /&gt;
* [[Gaming on Alpine]]&lt;br /&gt;
* [[Remote Desktop Server]]&lt;br /&gt;
* [[Default applications|How to change default application]]&lt;br /&gt;
* [[CPU frequency scaling]]&lt;br /&gt;
* [[Mimalloc]]&lt;br /&gt;
* [[Enable Serial Console on Boot]]&lt;br /&gt;
* [[How to build the Alpine Linux kernel]]&lt;br /&gt;
* [[Nextcloud]] &#039;&#039;(Self hostable cloud suite - Dropbox Alternative)&#039;&#039;&lt;br /&gt;
* [[Setting up lm_sensors]]&lt;br /&gt;
* [[Fingerprint Authentication with swaylock]]&lt;br /&gt;
* [[Unlock an encrypted data partition on login]]&lt;br /&gt;
* [[Desktop environments and Window managers|List of supported Desktop environments and Window managers]]&lt;br /&gt;
&lt;br /&gt;
== Diskless ==&lt;br /&gt;
&lt;br /&gt;
* [[Alpine local backup|Alpine local backup (lbu)]] &#039;&#039;(Permanently store your modifications in case your box needs reboot)&#039;&#039;&lt;br /&gt;
** [[Back Up a Flash Memory Installation]]&lt;br /&gt;
** [[Manually editing a existing apkovl]]&lt;br /&gt;
&lt;br /&gt;
== Other Architectures ==&lt;br /&gt;
&lt;br /&gt;
=== APU (PCEngines) ===&lt;br /&gt;
&lt;br /&gt;
* [[Alpine Install: from a disc to PC Engines APU|Alpine on PC Engines APU]]&lt;br /&gt;
* [https://github.com/huubsch/Installation-of-Alpine-Linux-on-PC-Engines-APU3/tree/main?tab=readme-ov-file Installation of Alpine Linux on PCEngines APU, legacy BIOS]&lt;br /&gt;
&lt;br /&gt;
=== ARM ===&lt;br /&gt;
&lt;br /&gt;
* [[Alpine on ARM]]&lt;br /&gt;
&lt;br /&gt;
==== Raspberry Pi ====&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry Pi|Raspberry Pi main page]]&lt;br /&gt;
* [[Raspberry Pi Bluetooth Speaker|Raspberry Pi - Bluetooth Speaker]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi|Raspberry Pi - Router with VPN]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi (IPv6)|Raspberry Pi - Router with VPN (IPv6)]]&lt;br /&gt;
* [[Classic install or sys mode on Raspberry Pi|Raspberry Pi - Sys mode install]]&lt;br /&gt;
* [[Raspberry Pi LVM on LUKS|Raspberry Pi - Sys mode install - LVM on LUKS]]&lt;br /&gt;
* [[RPI Video Receiver|Raspberry Pi - Video Receiver]] &#039;&#039;(network video decoder using Rasperry Pi and omxplayer)&#039;&#039;&lt;br /&gt;
* [[Raspberry Pi 3 - Browser Client]] - kiosk or digital sign&lt;br /&gt;
* [[Raspberry Pi 3 - Configuring it as wireless access point -AP Mode]]&lt;br /&gt;
* [[Raspberry Pi 3 - Setting Up Bluetooth]]&lt;br /&gt;
* [[Raspberry Pi 4 - Persistent system acting as a NAS and Time Machine]]&lt;br /&gt;
* [[Raspberry_Pi_Zero_W_-_Installation|Raspberry Pi Zero W - Installation]]&lt;br /&gt;
* [[How to set up Alpine as a wireless router|Raspberry Pi Zero W - Wireless router]] &#039;&#039;(Setting up a firewalled, Wireless AP with wired network on a Pi Zero W)&#039;&#039;&lt;br /&gt;
* [[RPI Video Receiver]]&lt;br /&gt;
&lt;br /&gt;
=== IBM Z (IBM z Systems) ===&lt;br /&gt;
&lt;br /&gt;
* [[s390x|s390x - Installation]]&lt;br /&gt;
&lt;br /&gt;
=== PowerPC ===&lt;br /&gt;
&lt;br /&gt;
* [[Ppc64le|Powerpc64le - Installation]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* [[#Desktop security|Desktop security]] lists steps for securing Alpine Linux desktops&lt;br /&gt;
* [[Setting up a laptop]] page has detailed guidelines to configure a secured laptop&lt;br /&gt;
* [[Securing Alpine Linux|Secure Alpine Linux]] using Security Technical Implementation Guides (STIGs)&lt;br /&gt;
* [[Sshguard|SSHGuard]] - Protects hosts against brute-force attacks:  monitoring logs, attack detection, blocking using firewall.&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
{{Note| Services are arranged in alphabetical order.}}&lt;br /&gt;
&lt;br /&gt;
=== Content management systems ===&lt;br /&gt;
&lt;br /&gt;
* [[DokuWiki]] &#039;&#039;(Simple and easy to use wiki, no database required)&#039;&#039;&lt;br /&gt;
* [[Drupal]] &#039;&#039;(Content Management System (CMS) written in PHP)&#039;&#039;&lt;br /&gt;
* [[Kopano]] &#039;&#039;(Microsoft Outlook compatible Groupware)&#039;&#039;&lt;br /&gt;
* [[Mahara]] &#039;&#039;(E-portfolio and social networking system)&#039;&#039;&lt;br /&gt;
* [[MediaWiki]] &#039;&#039;(Free web-based wiki software application)&#039;&#039;&lt;br /&gt;
* [[Pastebin]] &#039;&#039;(Pastebin software application)&#039;&#039;&lt;br /&gt;
* [[WordPress]] &#039;&#039;(Web software to create website or blog)&#039;&#039;&lt;br /&gt;
* [[Moodle]] &#039;&#039;(Online Learning Management system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Database === &lt;br /&gt;
&lt;br /&gt;
* [[MariaDB]] or [[MySQL|MySQL]]&lt;br /&gt;
&lt;br /&gt;
=== DNS ===&lt;br /&gt;
&lt;br /&gt;
* [[DNSCrypt-Proxy]] &#039;&#039;Encrypt and authenticate DNS calls from your system&#039;&#039;&lt;br /&gt;
* [[Setting up nsd DNS server]]&lt;br /&gt;
* [[Small-Time DNS with BIND9]] &#039;&#039;(A simple configuration with ad blocking for your home network)&#039;&#039;&lt;br /&gt;
* Unbound&lt;br /&gt;
** [[Setting up unbound DNS server]]&lt;br /&gt;
** [[Using Unbound as an Ad-blocker]] &#039;&#039;(Setup ad blocking for your network)&#039;&#039;&lt;br /&gt;
* [[TinyDNS Format]]&lt;br /&gt;
&lt;br /&gt;
=== File server ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up an NFS server|nfs-server]]&lt;br /&gt;
* [[Setting up a Samba server|samba-server]] &#039;&#039;(standard file sharing)&#039;&#039;&lt;br /&gt;
* [[Setting up a samba-ad-dc|samba-ad-dc]] &#039;&#039;(Active Directory compatible domain controller)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
&lt;br /&gt;
* [https://git.alpinelinux.org/awall/about/ Alpine Wall User&#039;s Guide]&lt;br /&gt;
** [[Zero-To-Awall]] -&#039;&#039;AWall for dummies&#039;&#039;&lt;br /&gt;
** [[How-To Alpine Wall]] - &#039;&#039;AWall for Shorewall users&#039;&#039;&lt;br /&gt;
** [[Alpine Wall]] - &#039;&#039;AWall - Firewall management framework - Design Document&#039;&#039;&lt;br /&gt;
* [[Iptables]]&lt;br /&gt;
* [[nftables]]&lt;br /&gt;
* [[Uncomplicated Firewall|Uncomplicated Firewall or UFW]]&lt;br /&gt;
&lt;br /&gt;
=== HTTP and web services ===&lt;br /&gt;
&lt;br /&gt;
* [[Althttpd]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
** [[Apache with php-fpm]]&lt;br /&gt;
** [[Setting Up Apache with PHP]]&lt;br /&gt;
** [[Apache authentication: NTLM Single Signon]]&lt;br /&gt;
* [[Darkhttpd]]&lt;br /&gt;
* [[Lighttpd]]&lt;br /&gt;
** [[Lighttpd Advanced security]]&lt;br /&gt;
** [[Setting Up Lighttpd With FastCGI]]&lt;br /&gt;
** [[Production Web server: Lighttpd|Production web server: Lighttpd‎‎]]&lt;br /&gt;
* [[Nginx]]&lt;br /&gt;
** [[Nginx as reverse proxy with acme (letsencrypt)]]&lt;br /&gt;
** [[Nginx with PHP]]&lt;br /&gt;
* Squid Proxy&lt;br /&gt;
** [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
** [[Setting up Explicit Squid Proxy]]&lt;br /&gt;
** [[Setting up Transparent Squid Proxy]] &#039;&#039;(Covers Squid proxy and URL Filtering system)&#039;&#039;&lt;br /&gt;
** [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Tomcat]]&lt;br /&gt;
** [[Production LAMP system: Lighttpd + PHP + MySQL‎‎|Production LAMP system: Lighttpd + PHP + MariaDB/MySQL‎‎]]&lt;br /&gt;
&lt;br /&gt;
=== IRC ===&lt;br /&gt;
&lt;br /&gt;
* [[NgIRCd]] &#039;&#039;(Server for Internet Relay Chat/IRC)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Mail ===&lt;br /&gt;
&lt;br /&gt;
* [[Hosting services on Alpine]] &#039;&#039;(Hosting mail, webservices and other services)&#039;&#039;&lt;br /&gt;
* [[Hosting Web/Email services on Alpine]]&lt;br /&gt;
* Exim/Dovecot&lt;br /&gt;
** [[Small-Time Email with Exim and Dovecot]] &#039;&#039;(A simple configuration for your home network.)&lt;br /&gt;
** [[Setting up dovecot with imap and tls]]&lt;br /&gt;
* [[relay email to gmail (msmtp, mailx, sendmail]]&lt;br /&gt;
* [[relay email (nullmailer)]]&lt;br /&gt;
* [[Roundcube]] &#039;&#039;(Webmail system)&#039;&#039;&lt;br /&gt;
* [[Setting up postfix with virtual domains]]&lt;br /&gt;
* Server protection&lt;br /&gt;
** [[Setting up clamsmtp]]&lt;br /&gt;
&lt;br /&gt;
=== Monitoring ===&lt;br /&gt;
&lt;br /&gt;
* [[Awstats]] &#039;&#039;(Free log file analyzer)&#039;&#039;&lt;br /&gt;
* [[Cacti: traffic analysis and monitoring network]] &#039;&#039;(Front-end for rrdtool networking monitor)&#039;&#039;&lt;br /&gt;
* [[Cvechecker]] &#039;&#039;(Compare installed packages for Common Vulnerabilities Exposure)&#039;&#039; &amp;lt;!-- Monitoring and Security --&amp;gt;&lt;br /&gt;
* [[Linfo]]&lt;br /&gt;
* [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
* [[PhpSysInfo]] &#039;&#039;(A simple application that displays information about the host it&#039;s running on)&#039;&#039;&lt;br /&gt;
* [[Logcheck]] &#039;&#039;(log file monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Matomo]] &#039;&#039;(A real time web analytics software program)&#039;&#039;&lt;br /&gt;
* [[Rasdaemon]] &#039;&#039;(Platform Reliability, Availability and Serviceability monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft, solution, Networking and Monitoring and Server --&amp;gt;&lt;br /&gt;
** [[Setting up NRPE daemon]] &#039;&#039;(Performs remote Nagios checks)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[Setting Up Fprobe And Ntop|Ntop]] &#039;&#039;(NetFlow collection and analysis using a remote fprobe instance; for alpine 3.10-3.12 only)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Traffic monitoring]] &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
** [[Setting up monitoring using rrdtool (and rrdcollect)]]&lt;br /&gt;
** [[Setting up traffic monitoring using rrdtool (and snmp)]] &amp;lt;!-- Monitoring --&amp;gt;&lt;br /&gt;
* [[Zabbix|Zabbix - the professional complete manager]] &#039;&#039;(Monitor and track the status of network services and hardware)&#039;&#039;&lt;br /&gt;
* [[ZoneMinder video camera security and surveillance]]&lt;br /&gt;
&lt;br /&gt;
=== Remote Administration ===&lt;br /&gt;
&lt;br /&gt;
* ACF&lt;br /&gt;
** [[Changing passwords for ACF|ACF - changing passwords]]&lt;br /&gt;
** [[Generating SSL certs with ACF]] &amp;lt;!-- Generating SSL certs with ACF 1.9 --&amp;gt;&lt;br /&gt;
** [[setup-acf| ACF - setup]] &#039;&#039;(Configures ACF (webconfiguration/webmin) so you can manage your box through https)&#039;&#039;&lt;br /&gt;
* [[Setting up a SSH server]] &#039;&#039;(Using ssh is a good way to administer your box remotely)&#039;&#039;&lt;br /&gt;
** [[HOWTO OpenSSH 2FA with password and Google Authenticator |OpenSSH 2FA]] &#039;&#039;(A simple two factor setup for OpenSSH)&#039;&#039;&lt;br /&gt;
* [[OpenVCP]] &#039;&#039;(VServer Control Panel)&#039;&#039;&lt;br /&gt;
* [[PhpMyAdmin]] &#039;&#039;(Web-based administration tool for MYSQL)&#039;&#039;&lt;br /&gt;
* [[PhpPgAdmin]] &#039;&#039;(Web-based administration tool for PostgreSQL)&#039;&#039;&lt;br /&gt;
* [[Webmin]] &#039;&#039;(A web-based interface for Linux system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Telephony ===&lt;br /&gt;
&lt;br /&gt;
* [[FreePBX|FreePBX on Alpine Linux]]&lt;br /&gt;
* [[Setting up Zaptel/Asterisk on Alpine]]&lt;br /&gt;
* [[Kamailio]] &#039;&#039;(SIP Server, formerly OpenSER)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== VPN ===&lt;br /&gt;
* [[Freeradius Active Directory Integration]]&lt;br /&gt;
* [[GNUnet]]&lt;br /&gt;
* [[IGMPproxy]]&lt;br /&gt;
* [[Setting up a OpenVPN server|OpenVPN server]] &#039;&#039;(Allowing single users or devices to remotely connect to your network)&#039;&#039;&lt;br /&gt;
* [[OpenVSwitch]]&lt;br /&gt;
* [[Tor]]&lt;br /&gt;
* [[Using Alpine on Windows domain with IPSEC isolation]]&lt;br /&gt;
* [[Configure a Wireguard interface (wg)|Wireguard]]&lt;br /&gt;
* [[Vpnc]]&lt;br /&gt;
&lt;br /&gt;
=== Other Servers ===&lt;br /&gt;
&lt;br /&gt;
* [[apcupsd]] &#039;&#039;(UPS Monitoring with apcupsd)&#039;&#039;&lt;br /&gt;
* [[Chrony and GPSD | Chrony, gpsd, and a garmin LVC 18 as a Stratum 1 NTP source ]]&lt;br /&gt;
* [[Glpi]] &#039;&#039;(Manage inventory of technical resources)&#039;&#039;&lt;br /&gt;
* [[How to setup a Alpine Linux mirror]]&lt;br /&gt;
* [[nut-ups|NUT UPS]] &#039;&#039;(UPS Monitoring with Network UPS Tools)&#039;&#039;&lt;br /&gt;
* [[Odoo]]&lt;br /&gt;
* [[Configure OpenLDAP | OpenLDAP]] &#039;&#039;(Installing and configuring the Alpine package for OpenLDAP)&#039;&#039;&lt;br /&gt;
* [[Setting up a LLDAP server|lldap-server]] &#039;&#039;(Directory Server)&#039;&#039;&lt;br /&gt;
* [[Setting up Transmission (bittorrent) with Clutch WebUI]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software development ==&lt;br /&gt;
&lt;br /&gt;
* [[Cgit]]&lt;br /&gt;
* [[OsTicket]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Patchwork]] &#039;&#039;(Patch review management system)&#039;&#039;&lt;br /&gt;
* [[Redmine]] &#039;&#039;(Project management system) [Deprecated]&#039;&#039;&lt;br /&gt;
* [[Request Tracker]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Setting up trac wiki|Trac]] &#039;&#039;(Enhanced wiki and issue tracking system for software development projects)&#039;&#039;&lt;br /&gt;
* [[Ansible]] &#039;&#039;(Configuration management)&#039;&#039;&lt;br /&gt;
* [[Installing Oracle Java|Oracle Java (installation)]]&lt;br /&gt;
&lt;br /&gt;
== Storage ==&lt;br /&gt;
&lt;br /&gt;
* [[Setting up disks manually|Manual partitioning]]&lt;br /&gt;
* [[Disk Replication with DRBD|DRBD: Disk Replication]]&lt;br /&gt;
* [[Filesystems]]&lt;br /&gt;
** [[Burning ISOs]]&lt;br /&gt;
* [[Setting up iSCSI|iSCSI Setup]]&lt;br /&gt;
** [[iSCSI Raid and Clustered File Systems]]&lt;br /&gt;
** [[Linux iSCSI Target (TCM)|iSCSI Target (TCM)/LinuxIO (LIO)]]&lt;br /&gt;
** [[Linux iSCSI Target (tgt)|User space iSCSI Target (tgt)]]&lt;br /&gt;
* [[Setting up Logical Volumes with LVM|LVM Setup]]&lt;br /&gt;
** [[Setting up LVM on GPT-labeled disks|LVM on GPT-labeled disks]]&lt;br /&gt;
** [[Installing on GPT LVM|LVM on GPT-labeled disks (updated)]]&lt;br /&gt;
** [[LVM on LUKS]]&lt;br /&gt;
* RAID&lt;br /&gt;
** [[Raid Administration]]&lt;br /&gt;
** [[Setting up a software RAID array]]&lt;br /&gt;
* [[ZFS]]&lt;br /&gt;
** [[Root on ZFS with native encryption]]&lt;br /&gt;
** [[Setting up ZFS on LUKS]]&lt;br /&gt;
* [[CEPH|CEPH]]&lt;br /&gt;
&lt;br /&gt;
== Virtualization ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]]&lt;br /&gt;
* [[Installing Alpine in a virtual machine]]&lt;br /&gt;
** [[Install Alpine on VMware ESXi]]&lt;br /&gt;
* [[KVM]] &#039;&#039;(Setting up Alpine as a KVM hypervisor)&#039;&#039;&lt;br /&gt;
* [[LXC]] &#039;&#039;(Setting up a Linux container in Alpine Linux)&#039;&#039;&lt;br /&gt;
* [[QEMU]]&lt;br /&gt;
* Xen&lt;br /&gt;
** [[Xen Dom0]] &#039;&#039;(Setting up Alpine as a dom0 for Xen hypervisor)&#039;&#039;&lt;br /&gt;
** [[Xen Dom0 on USB or SD]]&lt;br /&gt;
** [[Create Alpine Linux PV DomU|Xen DomU (paravirtualized)]]&lt;br /&gt;
** [[Xen LiveCD]]&lt;br /&gt;
** [[Xen PCI Passthrough]]&lt;br /&gt;
** [[K8s]] Building a K8s Kubernetes Cluster on Alpine Linux&lt;br /&gt;
* [[Runc]]&lt;br /&gt;
&lt;br /&gt;
== [[Simple_Walkthrough]] ==&lt;br /&gt;
* [[About-virtualization-simple]]&lt;br /&gt;
* [[LXC_Alpinelinux_Simple]]&lt;br /&gt;
* [[Qemu-simple]]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[TTY_Autologin|TTY Autologin]]&lt;br /&gt;
* [[Kexec|Faster rebooting with kexec]]&lt;br /&gt;
* [[Dynamic Multipoint VPN (DMVPN)]] combined with [[Small Office Services]]&lt;br /&gt;
* [[DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs]]&lt;br /&gt;
* [[Fault Tolerant Routing with Alpine Linux]]&lt;br /&gt;
* [[High Availability High Performance Web Cache]] &#039;&#039;(uCarp + HAProxy for High Availability Services such as Squid web proxy)&#039;&#039;&lt;br /&gt;
* [[Linux iSCSI Target (TCM)]]&lt;br /&gt;
* [[ISP Mail Server 3.x HowTo]] &#039;&#039;(Postfix+PostfixAdmin+DoveCot+Roundcube+ClamAV+Spamd - A full-service ISP mail server)&#039;&#039;&lt;br /&gt;
* [[Grommunio Mail Server]] &#039;&#039;(Mariadb+Postfix+Rspamd+Grommunio - Full-service mail server as MS exchange replacement)&#039;&#039;&lt;br /&gt;
* [[Replacing non-Alpine Linux with Alpine remotely]]&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft --&amp;gt;&lt;br /&gt;
* [[Streaming Security Camera Video with VLC]]&lt;br /&gt;
* [[Install Alpine on a btrfs filesystem with refind as boot manager]]&lt;br /&gt;
* [[Compile software from source|How to Compile a software from source in Alpine Linux]]&lt;br /&gt;
* [https://ww2.coastal.edu/mmurphy2/oer/alpine/ Alpine Linux tutorials - Dr Murphy, Computing Science Associate Professor]&lt;br /&gt;
* [[Michael&#039;s base installation procedure|Michael&#039;s base installation procedure]]&lt;br /&gt;
* [[Michael&#039;s cwm  desktop (minimal)|Michael&#039;s cwm desktop (minimal)]]&lt;br /&gt;
* [[Michael&#039;s sway desktop (minimal)|Michael&#039;s Sway desktop (minimal)]]&lt;br /&gt;
* [[Sway_customization_guide|Sway customization guide]] &#039;&#039;(Tutorial re Sway config file basics)&#039;&#039;&lt;br /&gt;
* [[Using Distrobox For VR Gaming|Using Distrobox For VR Gaming]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30837</id>
		<title>Fingerprint Authentication with swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30837"/>
		<updated>2025-09-01T16:17:09Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Fingerprint Authentication with swaylock =&lt;br /&gt;
&lt;br /&gt;
Not all fingerprint readers are supported, see [https://fprint.freedesktop.org/supported-devices.html here].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;lsusb | grep finger&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
will give you your USB ID.&lt;br /&gt;
&lt;br /&gt;
This guide shows how to configure fingerprint authentication for swaylock on Alpine Linux, allowing you to unlock using either:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;enter password&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;touch fingerprint sensor&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Install the fprintd package:&lt;br /&gt;
&lt;br /&gt;
 doas apk add fprintd&lt;br /&gt;
&lt;br /&gt;
== Configure PolicyKit Permissions ==&lt;br /&gt;
&lt;br /&gt;
Upon installation, standard users are not authorized to enroll fingerprints. Create a PolicyKit rule to allow members of the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group to manage fingerprints:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 polkit.addRule(function (action, subject) {&lt;br /&gt;
     if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
         if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
             return polkit.Result.YES;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 });&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Add your user to the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
 doas adduser $USER input&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must log out and back in (or reboot) for the group membership &amp;amp; PolicyKit rule to take effect.&lt;br /&gt;
&lt;br /&gt;
== Enroll Fingerprints ==&lt;br /&gt;
&lt;br /&gt;
If you previously enrolled fingerprints as root (or want to start fresh), delete existing enrollments:&lt;br /&gt;
&lt;br /&gt;
 # Delete fingerprints for current user&lt;br /&gt;
 fprintd-delete $(whoami)&lt;br /&gt;
 &lt;br /&gt;
 # If you accidentally enrolled as root, delete those too&lt;br /&gt;
 doas fprintd-delete root&lt;br /&gt;
&lt;br /&gt;
Enroll your fingerprint(s):&lt;br /&gt;
&lt;br /&gt;
 fprintd-enroll&lt;br /&gt;
&lt;br /&gt;
Verify the enrollment works:&lt;br /&gt;
&lt;br /&gt;
 fprintd-verify&lt;br /&gt;
&lt;br /&gt;
== Configure PAM for swaylock ==&lt;br /&gt;
&lt;br /&gt;
Create the PAM configuration for swaylock:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 # Try password authentication first&lt;br /&gt;
 auth sufficient pam_unix.so nullok&lt;br /&gt;
 # If no password provided, try fingerprint&lt;br /&gt;
 auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
 auth required pam_deny.so&lt;br /&gt;
 &lt;br /&gt;
 # KWallet integration (optional)&lt;br /&gt;
 -auth    optional        pam_kwallet.so&lt;br /&gt;
 -auth    optional        pam_kwallet5.so&lt;br /&gt;
 -session optional        pam_kwallet.so auto_start&lt;br /&gt;
 -session optional        pam_kwallet5.so auto_start&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Once configured, swaylock will accept both authentication methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Password authentication:&#039;&#039;&#039; Type your password and press Enter&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint authentication:&#039;&#039;&#039; Press Enter without typing anything, then touch the fingerprint sensor&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Permission denied during enrollment:&#039;&#039;&#039; Ensure you&#039;re in the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group and have logged out/in after adding the group&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint recognized but doesn&#039;t unlock:&#039;&#039;&#039; Check that fingerprints are enrolled for the correct user (not root)&lt;br /&gt;
* &#039;&#039;&#039;No fallback to password:&#039;&#039;&#039; Verify the PAM configuration has &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; before &amp;lt;code&amp;gt;pam_fprintd.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending to Other Services ==&lt;br /&gt;
&lt;br /&gt;
You can apply similar fingerprint authentication to other services by adding the same PAM configuration pattern to files in &amp;lt;code&amp;gt;/etc/pam.d/&amp;lt;/code&amp;gt; such as:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;polkit-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30836</id>
		<title>Fingerprint Authentication with swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30836"/>
		<updated>2025-09-01T16:16:57Z</updated>

		<summary type="html">&lt;p&gt;Benaki: usb id&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Fingerprint Authentication with swaylock =&lt;br /&gt;
&lt;br /&gt;
Not all fingerprint readers are supported, see [https://fprint.freedesktop.org/supported-devices.html here].&lt;br /&gt;
&amp;lt;code&amp;gt;lsusb | grep finger&amp;lt;/code&amp;gt;&lt;br /&gt;
will give you your USB ID.&lt;br /&gt;
&lt;br /&gt;
This guide shows how to configure fingerprint authentication for swaylock on Alpine Linux, allowing you to unlock using either:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;enter password&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;touch fingerprint sensor&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Install the fprintd package:&lt;br /&gt;
&lt;br /&gt;
 doas apk add fprintd&lt;br /&gt;
&lt;br /&gt;
== Configure PolicyKit Permissions ==&lt;br /&gt;
&lt;br /&gt;
Upon installation, standard users are not authorized to enroll fingerprints. Create a PolicyKit rule to allow members of the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group to manage fingerprints:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 polkit.addRule(function (action, subject) {&lt;br /&gt;
     if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
         if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
             return polkit.Result.YES;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 });&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Add your user to the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
 doas adduser $USER input&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must log out and back in (or reboot) for the group membership &amp;amp; PolicyKit rule to take effect.&lt;br /&gt;
&lt;br /&gt;
== Enroll Fingerprints ==&lt;br /&gt;
&lt;br /&gt;
If you previously enrolled fingerprints as root (or want to start fresh), delete existing enrollments:&lt;br /&gt;
&lt;br /&gt;
 # Delete fingerprints for current user&lt;br /&gt;
 fprintd-delete $(whoami)&lt;br /&gt;
 &lt;br /&gt;
 # If you accidentally enrolled as root, delete those too&lt;br /&gt;
 doas fprintd-delete root&lt;br /&gt;
&lt;br /&gt;
Enroll your fingerprint(s):&lt;br /&gt;
&lt;br /&gt;
 fprintd-enroll&lt;br /&gt;
&lt;br /&gt;
Verify the enrollment works:&lt;br /&gt;
&lt;br /&gt;
 fprintd-verify&lt;br /&gt;
&lt;br /&gt;
== Configure PAM for swaylock ==&lt;br /&gt;
&lt;br /&gt;
Create the PAM configuration for swaylock:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 # Try password authentication first&lt;br /&gt;
 auth sufficient pam_unix.so nullok&lt;br /&gt;
 # If no password provided, try fingerprint&lt;br /&gt;
 auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
 auth required pam_deny.so&lt;br /&gt;
 &lt;br /&gt;
 # KWallet integration (optional)&lt;br /&gt;
 -auth    optional        pam_kwallet.so&lt;br /&gt;
 -auth    optional        pam_kwallet5.so&lt;br /&gt;
 -session optional        pam_kwallet.so auto_start&lt;br /&gt;
 -session optional        pam_kwallet5.so auto_start&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Once configured, swaylock will accept both authentication methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Password authentication:&#039;&#039;&#039; Type your password and press Enter&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint authentication:&#039;&#039;&#039; Press Enter without typing anything, then touch the fingerprint sensor&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Permission denied during enrollment:&#039;&#039;&#039; Ensure you&#039;re in the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group and have logged out/in after adding the group&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint recognized but doesn&#039;t unlock:&#039;&#039;&#039; Check that fingerprints are enrolled for the correct user (not root)&lt;br /&gt;
* &#039;&#039;&#039;No fallback to password:&#039;&#039;&#039; Verify the PAM configuration has &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; before &amp;lt;code&amp;gt;pam_fprintd.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending to Other Services ==&lt;br /&gt;
&lt;br /&gt;
You can apply similar fingerprint authentication to other services by adding the same PAM configuration pattern to files in &amp;lt;code&amp;gt;/etc/pam.d/&amp;lt;/code&amp;gt; such as:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;polkit-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30834</id>
		<title>Fingerprint Authentication with swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30834"/>
		<updated>2025-09-01T14:11:23Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Fingerprint Authentication with swaylock =&lt;br /&gt;
&lt;br /&gt;
This guide shows how to configure fingerprint authentication for swaylock on Alpine Linux, allowing you to unlock using either:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;enter password&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;touch fingerprint sensor&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Install the fprintd package:&lt;br /&gt;
&lt;br /&gt;
 doas apk add fprintd&lt;br /&gt;
&lt;br /&gt;
== Configure PolicyKit Permissions ==&lt;br /&gt;
&lt;br /&gt;
Upon installation, standard users are not authorized to enroll fingerprints. Create a PolicyKit rule to allow members of the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group to manage fingerprints:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 polkit.addRule(function (action, subject) {&lt;br /&gt;
     if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
         if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
             return polkit.Result.YES;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 });&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Add your user to the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
 doas adduser $USER input&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must log out and back in (or reboot) for the group membership &amp;amp; PolicyKit rule to take effect.&lt;br /&gt;
&lt;br /&gt;
== Enroll Fingerprints ==&lt;br /&gt;
&lt;br /&gt;
If you previously enrolled fingerprints as root (or want to start fresh), delete existing enrollments:&lt;br /&gt;
&lt;br /&gt;
 # Delete fingerprints for current user&lt;br /&gt;
 fprintd-delete $(whoami)&lt;br /&gt;
 &lt;br /&gt;
 # If you accidentally enrolled as root, delete those too&lt;br /&gt;
 doas fprintd-delete root&lt;br /&gt;
&lt;br /&gt;
Enroll your fingerprint(s):&lt;br /&gt;
&lt;br /&gt;
 fprintd-enroll&lt;br /&gt;
&lt;br /&gt;
Verify the enrollment works:&lt;br /&gt;
&lt;br /&gt;
 fprintd-verify&lt;br /&gt;
&lt;br /&gt;
== Configure PAM for swaylock ==&lt;br /&gt;
&lt;br /&gt;
Create the PAM configuration for swaylock:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 # Try password authentication first&lt;br /&gt;
 auth sufficient pam_unix.so nullok&lt;br /&gt;
 # If no password provided, try fingerprint&lt;br /&gt;
 auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
 auth required pam_deny.so&lt;br /&gt;
 &lt;br /&gt;
 # KWallet integration (optional)&lt;br /&gt;
 -auth    optional        pam_kwallet.so&lt;br /&gt;
 -auth    optional        pam_kwallet5.so&lt;br /&gt;
 -session optional        pam_kwallet.so auto_start&lt;br /&gt;
 -session optional        pam_kwallet5.so auto_start&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Once configured, swaylock will accept both authentication methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Password authentication:&#039;&#039;&#039; Type your password and press Enter&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint authentication:&#039;&#039;&#039; Press Enter without typing anything, then touch the fingerprint sensor&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Permission denied during enrollment:&#039;&#039;&#039; Ensure you&#039;re in the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group and have logged out/in after adding the group&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint recognized but doesn&#039;t unlock:&#039;&#039;&#039; Check that fingerprints are enrolled for the correct user (not root)&lt;br /&gt;
* &#039;&#039;&#039;No fallback to password:&#039;&#039;&#039; Verify the PAM configuration has &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; before &amp;lt;code&amp;gt;pam_fprintd.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending to Other Services ==&lt;br /&gt;
&lt;br /&gt;
You can apply similar fingerprint authentication to other services by adding the same PAM configuration pattern to files in &amp;lt;code&amp;gt;/etc/pam.d/&amp;lt;/code&amp;gt; such as:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;polkit-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30833</id>
		<title>Setting up fprintd for swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30833"/>
		<updated>2025-09-01T14:09:44Z</updated>

		<summary type="html">&lt;p&gt;Benaki: Blanked the page&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30832</id>
		<title>Fingerprint Authentication with swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30832"/>
		<updated>2025-09-01T14:08:25Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Fingerprint Authentication with swaylock =&lt;br /&gt;
&lt;br /&gt;
This guide shows how to configure fingerprint authentication for swaylock on Alpine Linux, allowing you to unlock using either:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;enter password&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;touch fingerprint sensor&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Install the fprintd package:&lt;br /&gt;
&lt;br /&gt;
 doas apk add fprintd&lt;br /&gt;
&lt;br /&gt;
== Configure PolicyKit Permissions ==&lt;br /&gt;
&lt;br /&gt;
Upon installation, standard users are not authorized to enroll fingerprints. Create a PolicyKit rule to allow members of the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group to manage fingerprints:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 polkit.addRule(function (action, subject) {&lt;br /&gt;
     if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
         if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
             return polkit.Result.YES;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 });&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Add your user to the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
 doas adduser $USER input&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must log out and back in (or reboot) for the group membership to take effect.&lt;br /&gt;
&lt;br /&gt;
== Enroll Fingerprints ==&lt;br /&gt;
&lt;br /&gt;
If you previously enrolled fingerprints as root (or want to start fresh), delete existing enrollments:&lt;br /&gt;
&lt;br /&gt;
 # Delete fingerprints for current user&lt;br /&gt;
 fprintd-delete $(whoami)&lt;br /&gt;
 &lt;br /&gt;
 # If you accidentally enrolled as root, delete those too&lt;br /&gt;
 doas fprintd-delete root&lt;br /&gt;
&lt;br /&gt;
Enroll your fingerprint(s):&lt;br /&gt;
&lt;br /&gt;
 fprintd-enroll&lt;br /&gt;
&lt;br /&gt;
Verify the enrollment works:&lt;br /&gt;
&lt;br /&gt;
 fprintd-verify&lt;br /&gt;
&lt;br /&gt;
== Configure PAM for swaylock ==&lt;br /&gt;
&lt;br /&gt;
Create the PAM configuration for swaylock:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 # Try password authentication first&lt;br /&gt;
 auth sufficient pam_unix.so nullok&lt;br /&gt;
 # If no password provided, try fingerprint&lt;br /&gt;
 auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
 auth required pam_deny.so&lt;br /&gt;
 &lt;br /&gt;
 # KWallet integration (optional)&lt;br /&gt;
 -auth    optional        pam_kwallet.so&lt;br /&gt;
 -auth    optional        pam_kwallet5.so&lt;br /&gt;
 -session optional        pam_kwallet.so auto_start&lt;br /&gt;
 -session optional        pam_kwallet5.so auto_start&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Once configured, swaylock will accept both authentication methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Password authentication:&#039;&#039;&#039; Type your password and press Enter&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint authentication:&#039;&#039;&#039; Press Enter without typing anything, then touch the fingerprint sensor&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Permission denied during enrollment:&#039;&#039;&#039; Ensure you&#039;re in the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group and have logged out/in after adding the group&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint recognized but doesn&#039;t unlock:&#039;&#039;&#039; Check that fingerprints are enrolled for the correct user (not root)&lt;br /&gt;
* &#039;&#039;&#039;No fallback to password:&#039;&#039;&#039; Verify the PAM configuration has &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; before &amp;lt;code&amp;gt;pam_fprintd.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending to Other Services ==&lt;br /&gt;
&lt;br /&gt;
You can apply similar fingerprint authentication to other services by adding the same PAM configuration pattern to files in &amp;lt;code&amp;gt;/etc/pam.d/&amp;lt;/code&amp;gt; such as:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; &lt;br /&gt;
* &amp;lt;code&amp;gt;polkit-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30831</id>
		<title>Fingerprint Authentication with swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Fingerprint_Authentication_with_swaylock&amp;diff=30831"/>
		<updated>2025-09-01T14:06:50Z</updated>

		<summary type="html">&lt;p&gt;Benaki: Fingerprint Authentication with swaylock&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Fingerprint Authentication with swaylock =&lt;br /&gt;
&lt;br /&gt;
This guide shows how to configure fingerprint authentication for swaylock on Alpine Linux, allowing you to unlock using either:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;enter password&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;touch fingerprint sensor&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Install the fprintd package:&lt;br /&gt;
&lt;br /&gt;
 doas apk add fprintd&lt;br /&gt;
&lt;br /&gt;
== Configure PolicyKit Permissions ==&lt;br /&gt;
&lt;br /&gt;
Upon installation, standard users are not authorized to enroll fingerprints. Create a PolicyKit rule to allow members of the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group to manage fingerprints:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 polkit.addRule(function (action, subject) {&lt;br /&gt;
     if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
         if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
             return polkit.Result.YES;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 });&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Add your user to the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
 doas adduser $USER input&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must log out and back in (or reboot) for the group membership to take effect.&lt;br /&gt;
&lt;br /&gt;
== Enroll Fingerprints ==&lt;br /&gt;
&lt;br /&gt;
If you previously enrolled fingerprints as root (or want to start fresh), delete existing enrollments:&lt;br /&gt;
&lt;br /&gt;
 # Delete fingerprints for current user&lt;br /&gt;
 fprintd-delete $(whoami)&lt;br /&gt;
 &lt;br /&gt;
 # If you accidentally enrolled as root, delete those too&lt;br /&gt;
 doas fprintd-delete root&lt;br /&gt;
&lt;br /&gt;
Enroll your fingerprint(s):&lt;br /&gt;
&lt;br /&gt;
 fprintd-enroll&lt;br /&gt;
&lt;br /&gt;
Verify the enrollment works:&lt;br /&gt;
&lt;br /&gt;
 fprintd-verify&lt;br /&gt;
&lt;br /&gt;
== Configure PAM for swaylock ==&lt;br /&gt;
&lt;br /&gt;
Create the PAM configuration for swaylock:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 # Try password authentication first&lt;br /&gt;
 auth sufficient pam_unix.so nullok&lt;br /&gt;
 # If no password provided, try fingerprint&lt;br /&gt;
 auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
 auth required pam_deny.so&lt;br /&gt;
 &lt;br /&gt;
 # KWallet integration (optional)&lt;br /&gt;
 -auth    optional        pam_kwallet.so&lt;br /&gt;
 -auth    optional        pam_kwallet5.so&lt;br /&gt;
 -session optional        pam_kwallet.so auto_start&lt;br /&gt;
 -session optional        pam_kwallet5.so auto_start&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Once configured, swaylock will accept both authentication methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Password authentication:&#039;&#039;&#039; Type your password and press Enter&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint authentication:&#039;&#039;&#039; Press Enter without typing anything, then touch the fingerprint sensor&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Permission denied during enrollment:&#039;&#039;&#039; Ensure you&#039;re in the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group and have logged out/in after adding the group&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint recognized but doesn&#039;t unlock:&#039;&#039;&#039; Check that fingerprints are enrolled for the correct user (not root)&lt;br /&gt;
* &#039;&#039;&#039;No fallback to password:&#039;&#039;&#039; Verify the PAM configuration has &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; before &amp;lt;code&amp;gt;pam_fprintd.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending to Other Services ==&lt;br /&gt;
&lt;br /&gt;
You can apply similar fingerprint authentication to other services by adding the same PAM configuration pattern to files in &amp;lt;code&amp;gt;/etc/pam.d/&amp;lt;/code&amp;gt; such as:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;doas&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;polkit-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=30830</id>
		<title>Tutorials and Howtos</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=30830"/>
		<updated>2025-09-01T14:04:56Z</updated>

		<summary type="html">&lt;p&gt;Benaki: /* Other topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:package_edutainment.svg|right|link=]]&lt;br /&gt;
{{TOC left}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welcome to Tutorials and Howtos, a place of basic and advanced configuration tasks for your Alpine Linux.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Howtos are smaller articles&#039;&#039;&#039; explaining how to perform a particular task with Alpine Linux, that expects a minimal knowledge from reader to perform actions. Howto&#039;s have been organized in the below page based on the topics.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The [[#Tutorials|tutorials]] are hands-on&#039;&#039;&#039; and the reader is expected to try and achieve the goals described in each step, possibly with the help of a good example. The output in one step is the starting point for the following step.&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* Contributors are requested to refer to [[Help:Editing]] first and make use of resources like [[How to write a HOWTO]].&lt;br /&gt;
* Contributions must be complete articles. &lt;br /&gt;
* Don&#039;t override already made contributions, unless there is a mistake. &lt;br /&gt;
* If you want to request a topic, please add your request in this page&#039;s [[Talk:Tutorials_and_Howtos|Discussion]].}}&lt;br /&gt;
&lt;br /&gt;
== Desktop ==&lt;br /&gt;
&lt;br /&gt;
* {{:Daily driver guide}}&lt;br /&gt;
&lt;br /&gt;
=== Networking ===&lt;br /&gt;
&lt;br /&gt;
* [[Bluetooth]] - Instructions for installing and configuring Bluetooth&lt;br /&gt;
* [[Bonding]] - Bond (or aggregate) multiple ethernet interfaces&lt;br /&gt;
* [[Bridge]] - Configuring a network bridge&lt;br /&gt;
** [[Bridge wlan0 to eth0]]&lt;br /&gt;
* [[Configure Networking]]&lt;br /&gt;
* [[How to configure static routes]]&lt;br /&gt;
* Modem&lt;br /&gt;
** [[Using HSDPA modem]]&lt;br /&gt;
** [[Using serial modem]]&lt;br /&gt;
* [[mDNS]] - Howto implement multicast DNS resolution in Alpine. &lt;br /&gt;
* [[Multi ISP]] &#039;&#039;(Dual-ISP setup with load-balancing and automatic failover)&#039;&#039;&lt;br /&gt;
* [[PXE boot]]&lt;br /&gt;
* Wi-Fi&lt;br /&gt;
** [[Wi-Fi|Connecting to a wireless access point]]&lt;br /&gt;
** [[How to setup a wireless access point]] &#039;&#039;(Setting up Secure Wireless AP w/ WPA encryption with bridge to wired network)&#039;&#039;&lt;br /&gt;
* Use [https://github.com/ifupdown-ng/ifupdown-ng/blob/main/doc/interfaces-vxlan.scd vxlan], if using  [[Ifupdown-ng]] instead of [[VLAN]]&lt;br /&gt;
&lt;br /&gt;
=== Backup and data migration ===&lt;br /&gt;
&lt;br /&gt;
* [[Migrating data]]&lt;br /&gt;
* [[Rsnapshot]] - setting up periodic backups&lt;br /&gt;
&lt;br /&gt;
=== Other topics ===&lt;br /&gt;
&lt;br /&gt;
* [[Gaming on Alpine]]&lt;br /&gt;
* [[Remote Desktop Server]]&lt;br /&gt;
* [[Default applications|How to change default application]]&lt;br /&gt;
* [[CPU frequency scaling]]&lt;br /&gt;
* [[Mimalloc]]&lt;br /&gt;
* [[Enable Serial Console on Boot]]&lt;br /&gt;
* [[How to build the Alpine Linux kernel]]&lt;br /&gt;
* [[Nextcloud]] &#039;&#039;(Self hostable cloud suite - Dropbox Alternative)&#039;&#039;&lt;br /&gt;
* [[Setting up lm_sensors]]&lt;br /&gt;
* [[Fingerprint Authentication with swaylock]]&lt;br /&gt;
* [[Desktop environments and Window managers|List of supported Desktop environments and Window managers]]&lt;br /&gt;
&lt;br /&gt;
== Diskless ==&lt;br /&gt;
&lt;br /&gt;
* [[Alpine local backup|Alpine local backup (lbu)]] &#039;&#039;(Permanently store your modifications in case your box needs reboot)&#039;&#039;&lt;br /&gt;
** [[Back Up a Flash Memory Installation]]&lt;br /&gt;
** [[Manually editing a existing apkovl]]&lt;br /&gt;
&lt;br /&gt;
== Other Architectures ==&lt;br /&gt;
&lt;br /&gt;
=== ARM ===&lt;br /&gt;
&lt;br /&gt;
* [[Alpine on ARM]]&lt;br /&gt;
&lt;br /&gt;
==== Raspberry Pi ====&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry Pi|Raspberry Pi main page]]&lt;br /&gt;
* [[Raspberry Pi Bluetooth Speaker|Raspberry Pi - Bluetooth Speaker]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi|Raspberry Pi - Router with VPN]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi (IPv6)|Raspberry Pi - Router with VPN (IPv6)]]&lt;br /&gt;
* [[Classic install or sys mode on Raspberry Pi|Raspberry Pi - Sys mode install]]&lt;br /&gt;
* [[Raspberry Pi LVM on LUKS|Raspberry Pi - Sys mode install - LVM on LUKS]]&lt;br /&gt;
* [[RPI Video Receiver|Raspberry Pi - Video Receiver]] &#039;&#039;(network video decoder using Rasperry Pi and omxplayer)&#039;&#039;&lt;br /&gt;
* [[Raspberry Pi 3 - Browser Client]] - kiosk or digital sign&lt;br /&gt;
* [[Raspberry Pi 3 - Configuring it as wireless access point -AP Mode]]&lt;br /&gt;
* [[Raspberry Pi 3 - Setting Up Bluetooth]]&lt;br /&gt;
* [[Raspberry Pi 4 - Persistent system acting as a NAS and Time Machine]]&lt;br /&gt;
* [[How to set up Alpine as a wireless router|Raspberry Pi Zero W - Wireless router]] &#039;&#039;(Setting up a firewalled, Wireless AP with wired network on a Pi Zero W)&#039;&#039;&lt;br /&gt;
* [[RPI Video Receiver]]&lt;br /&gt;
&lt;br /&gt;
=== IBM Z (IBM z Systems) ===&lt;br /&gt;
&lt;br /&gt;
* [[s390x|s390x - Installation]]&lt;br /&gt;
&lt;br /&gt;
=== PowerPC ===&lt;br /&gt;
&lt;br /&gt;
* [[Ppc64le|Powerpc64le - Installation]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* [[#Desktop security|Desktop security]] lists steps for securing Alpine Linux desktops&lt;br /&gt;
* [[Setting up a laptop]] page has detailed guidelines to configure a secured laptop&lt;br /&gt;
* [[Securing Alpine Linux|Secure Alpine Linux]] using Security Technical Implementation Guides (STIGs)&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
{{Note| Services are arranged in alphabetical order.}}&lt;br /&gt;
&lt;br /&gt;
=== Content management systems ===&lt;br /&gt;
&lt;br /&gt;
* [[DokuWiki]] &#039;&#039;(Simple and easy to use wiki, no database required)&#039;&#039;&lt;br /&gt;
* [[Drupal]] &#039;&#039;(Content Management System (CMS) written in PHP)&#039;&#039;&lt;br /&gt;
* [[Kopano]] &#039;&#039;(Microsoft Outlook compatible Groupware)&#039;&#039;&lt;br /&gt;
* [[Mahara]] &#039;&#039;(E-portfolio and social networking system)&#039;&#039;&lt;br /&gt;
* [[MediaWiki]] &#039;&#039;(Free web-based wiki software application)&#039;&#039;&lt;br /&gt;
* [[Pastebin]] &#039;&#039;(Pastebin software application)&#039;&#039;&lt;br /&gt;
* [[WordPress]] &#039;&#039;(Web software to create website or blog)&#039;&#039;&lt;br /&gt;
* [[Moodle]] &#039;&#039;(Online Learning Management system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Database === &lt;br /&gt;
&lt;br /&gt;
* [[MariaDB]] or [[MySQL|MySQL]]&lt;br /&gt;
&lt;br /&gt;
=== DNS ===&lt;br /&gt;
&lt;br /&gt;
* [[DNSCrypt-Proxy]] &#039;&#039;Encrypt and authenticate DNS calls from your system&#039;&#039;&lt;br /&gt;
* [[Setting up nsd DNS server]]&lt;br /&gt;
* [[Small-Time DNS with BIND9]] &#039;&#039;(A simple configuration with ad blocking for your home network)&#039;&#039;&lt;br /&gt;
* Unbound&lt;br /&gt;
** [[Setting up unbound DNS server]]&lt;br /&gt;
** [[Using Unbound as an Ad-blocker]] &#039;&#039;(Setup ad blocking for your network)&#039;&#039;&lt;br /&gt;
* [[TinyDNS Format]]&lt;br /&gt;
&lt;br /&gt;
=== File server ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up an NFS server|nfs-server]]&lt;br /&gt;
* [[Setting up a Samba server|samba-server]] &#039;&#039;(standard file sharing)&#039;&#039;&lt;br /&gt;
* [[Setting up a samba-ad-dc|samba-ad-dc]] &#039;&#039;(Active Directory compatible domain controller)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
&lt;br /&gt;
* [https://git.alpinelinux.org/awall/about/ Alpine Wall User&#039;s Guide]&lt;br /&gt;
** [[Zero-To-Awall]] -&#039;&#039;AWall for dummies&#039;&#039;&lt;br /&gt;
** [[How-To Alpine Wall]] - &#039;&#039;AWall for Shorewall users&#039;&#039;&lt;br /&gt;
** [[Alpine Wall]] - &#039;&#039;AWall - Firewall management framework - Design Document&#039;&#039;&lt;br /&gt;
* [[Iptables]]&lt;br /&gt;
* [[nftables]]&lt;br /&gt;
* [[Uncomplicated Firewall|Uncomplicated Firewall or UFW]]&lt;br /&gt;
&lt;br /&gt;
=== HTTP and web services ===&lt;br /&gt;
&lt;br /&gt;
* [[Althttpd]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
** [[Apache with php-fpm]]&lt;br /&gt;
** [[Setting Up Apache with PHP]]&lt;br /&gt;
** [[Apache authentication: NTLM Single Signon]]&lt;br /&gt;
* [[Darkhttpd]]&lt;br /&gt;
* [[Lighttpd]]&lt;br /&gt;
** [[Lighttpd Advanced security]]&lt;br /&gt;
** [[Setting Up Lighttpd With FastCGI]]&lt;br /&gt;
** [[Production Web server: Lighttpd|Production web server: Lighttpd‎‎]]&lt;br /&gt;
* [[Nginx]]&lt;br /&gt;
** [[Nginx as reverse proxy with acme (letsencrypt)]]&lt;br /&gt;
** [[Nginx with PHP]]&lt;br /&gt;
* Squid Proxy&lt;br /&gt;
** [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
** [[Setting up Explicit Squid Proxy]]&lt;br /&gt;
** [[Setting up Transparent Squid Proxy]] &#039;&#039;(Covers Squid proxy and URL Filtering system)&#039;&#039;&lt;br /&gt;
** [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Tomcat]]&lt;br /&gt;
** [[Production LAMP system: Lighttpd + PHP + MySQL‎‎|Production LAMP system: Lighttpd + PHP + MariaDB/MySQL‎‎]]&lt;br /&gt;
&lt;br /&gt;
=== IRC ===&lt;br /&gt;
&lt;br /&gt;
* [[NgIRCd]] &#039;&#039;(Server for Internet Relay Chat/IRC)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Mail ===&lt;br /&gt;
&lt;br /&gt;
* [[Hosting services on Alpine]] &#039;&#039;(Hosting mail, webservices and other services)&#039;&#039;&lt;br /&gt;
* [[Hosting Web/Email services on Alpine]]&lt;br /&gt;
* Exim/Dovecot&lt;br /&gt;
** [[Small-Time Email with Exim and Dovecot]] &#039;&#039;(A simple configuration for your home network.)&lt;br /&gt;
** [[Setting up dovecot with imap and tls]]&lt;br /&gt;
* [[relay email to gmail (msmtp, mailx, sendmail]]&lt;br /&gt;
* [[relay email (nullmailer)]]&lt;br /&gt;
* [[Roundcube]] &#039;&#039;(Webmail system)&#039;&#039;&lt;br /&gt;
* [[Setting up postfix with virtual domains]]&lt;br /&gt;
* Server protection&lt;br /&gt;
** [[Setting up clamsmtp]]&lt;br /&gt;
&lt;br /&gt;
=== Monitoring ===&lt;br /&gt;
&lt;br /&gt;
* [[Awstats]] &#039;&#039;(Free log file analyzer)&#039;&#039;&lt;br /&gt;
* [[Cacti: traffic analysis and monitoring network]] &#039;&#039;(Front-end for rrdtool networking monitor)&#039;&#039;&lt;br /&gt;
* [[Cvechecker]] &#039;&#039;(Compare installed packages for Common Vulnerabilities Exposure)&#039;&#039; &amp;lt;!-- Monitoring and Security --&amp;gt;&lt;br /&gt;
* [[Linfo]]&lt;br /&gt;
* [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
* [[PhpSysInfo]] &#039;&#039;(A simple application that displays information about the host it&#039;s running on)&#039;&#039;&lt;br /&gt;
* [[Logcheck]] &#039;&#039;(log file monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Matomo]] &#039;&#039;(A real time web analytics software program)&#039;&#039;&lt;br /&gt;
* [[Rasdaemon]] &#039;&#039;(Platform Reliability, Availability and Serviceability monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft, solution, Networking and Monitoring and Server --&amp;gt;&lt;br /&gt;
** [[Setting up NRPE daemon]] &#039;&#039;(Performs remote Nagios checks)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[Setting Up Fprobe And Ntop|Ntop]] &#039;&#039;(NetFlow collection and analysis using a remote fprobe instance; for alpine 3.10-3.12 only)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Traffic monitoring]] &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
** [[Setting up monitoring using rrdtool (and rrdcollect)]]&lt;br /&gt;
** [[Setting up traffic monitoring using rrdtool (and snmp)]] &amp;lt;!-- Monitoring --&amp;gt;&lt;br /&gt;
* [[Zabbix|Zabbix - the professional complete manager]] &#039;&#039;(Monitor and track the status of network services and hardware)&#039;&#039;&lt;br /&gt;
* [[ZoneMinder video camera security and surveillance]]&lt;br /&gt;
&lt;br /&gt;
=== Remote Administration ===&lt;br /&gt;
&lt;br /&gt;
* ACF&lt;br /&gt;
** [[Changing passwords for ACF|ACF - changing passwords]]&lt;br /&gt;
** [[Generating SSL certs with ACF]] &amp;lt;!-- Generating SSL certs with ACF 1.9 --&amp;gt;&lt;br /&gt;
** [[setup-acf| ACF - setup]] &#039;&#039;(Configures ACF (webconfiguration/webmin) so you can manage your box through https)&#039;&#039;&lt;br /&gt;
* [[Setting up a SSH server]] &#039;&#039;(Using ssh is a good way to administer your box remotely)&#039;&#039;&lt;br /&gt;
** [[HOWTO OpenSSH 2FA with password and Google Authenticator |OpenSSH 2FA]] &#039;&#039;(A simple two factor setup for OpenSSH)&#039;&#039;&lt;br /&gt;
* [[OpenVCP]] &#039;&#039;(VServer Control Panel)&#039;&#039;&lt;br /&gt;
* [[PhpMyAdmin]] &#039;&#039;(Web-based administration tool for MYSQL)&#039;&#039;&lt;br /&gt;
* [[PhpPgAdmin]] &#039;&#039;(Web-based administration tool for PostgreSQL)&#039;&#039;&lt;br /&gt;
* [[Webmin]] &#039;&#039;(A web-based interface for Linux system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Telephony ===&lt;br /&gt;
&lt;br /&gt;
* [[FreePBX|FreePBX on Alpine Linux]]&lt;br /&gt;
* [[Setting up Zaptel/Asterisk on Alpine]]&lt;br /&gt;
* [[Kamailio]] &#039;&#039;(SIP Server, formerly OpenSER)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== VPN ===&lt;br /&gt;
* [[Freeradius Active Directory Integration]]&lt;br /&gt;
* [[GNUnet]]&lt;br /&gt;
* [[IGMPproxy]]&lt;br /&gt;
* [[Setting up a OpenVPN server|OpenVPN server]] &#039;&#039;(Allowing single users or devices to remotely connect to your network)&#039;&#039;&lt;br /&gt;
* [[OpenVSwitch]]&lt;br /&gt;
* [[Tor]]&lt;br /&gt;
* [[Using Alpine on Windows domain with IPSEC isolation]]&lt;br /&gt;
* [[Configure a Wireguard interface (wg)|Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Other Servers ===&lt;br /&gt;
&lt;br /&gt;
* [[apcupsd]] &#039;&#039;(UPS Monitoring with apcupsd)&#039;&#039;&lt;br /&gt;
* [[Chrony and GPSD | Chrony, gpsd, and a garmin LVC 18 as a Stratum 1 NTP source ]]&lt;br /&gt;
* [[Glpi]] &#039;&#039;(Manage inventory of technical resources)&#039;&#039;&lt;br /&gt;
* [[How to setup a Alpine Linux mirror]]&lt;br /&gt;
* [[nut-ups|NUT UPS]] &#039;&#039;(UPS Monitoring with Network UPS Tools)&#039;&#039;&lt;br /&gt;
* [[Odoo]]&lt;br /&gt;
* [[Configure OpenLDAP | OpenLDAP]] &#039;&#039;(Installing and configuring the Alpine package for OpenLDAP)&#039;&#039;&lt;br /&gt;
* [[Setting up a LLDAP server|lldap-server]] &#039;&#039;(Directory Server)&#039;&#039;&lt;br /&gt;
* [[Setting up Transmission (bittorrent) with Clutch WebUI]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software development ==&lt;br /&gt;
&lt;br /&gt;
* [[Cgit]]&lt;br /&gt;
* [[OsTicket]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Patchwork]] &#039;&#039;(Patch review management system)&#039;&#039;&lt;br /&gt;
* [[Redmine]] &#039;&#039;(Project management system) [Deprecated]&#039;&#039;&lt;br /&gt;
* [[Request Tracker]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Setting up trac wiki|Trac]] &#039;&#039;(Enhanced wiki and issue tracking system for software development projects)&#039;&#039;&lt;br /&gt;
* [[Ansible]] &#039;&#039;(Configuration management)&#039;&#039;&lt;br /&gt;
* [[Installing Oracle Java|Oracle Java (installation)]]&lt;br /&gt;
&lt;br /&gt;
== Storage ==&lt;br /&gt;
&lt;br /&gt;
* [[Setting up disks manually|Manual partitioning]]&lt;br /&gt;
* [[Disk Replication with DRBD|DRBD: Disk Replication]]&lt;br /&gt;
* [[Filesystems]]&lt;br /&gt;
** [[Burning ISOs]]&lt;br /&gt;
* [[Setting up iSCSI|iSCSI Setup]]&lt;br /&gt;
** [[iSCSI Raid and Clustered File Systems]]&lt;br /&gt;
** [[Linux iSCSI Target (TCM)|iSCSI Target (TCM)/LinuxIO (LIO)]]&lt;br /&gt;
** [[Linux iSCSI Target (tgt)|User space iSCSI Target (tgt)]]&lt;br /&gt;
* [[Setting up Logical Volumes with LVM|LVM Setup]]&lt;br /&gt;
** [[Setting up LVM on GPT-labeled disks|LVM on GPT-labeled disks]]&lt;br /&gt;
** [[Installing on GPT LVM|LVM on GPT-labeled disks (updated)]]&lt;br /&gt;
** [[LVM on LUKS]]&lt;br /&gt;
* RAID&lt;br /&gt;
** [[Raid Administration]]&lt;br /&gt;
** [[Setting up a software RAID array]]&lt;br /&gt;
* [[ZFS]]&lt;br /&gt;
** [[Root on ZFS with native encryption]]&lt;br /&gt;
** [[Setting up ZFS on LUKS]]&lt;br /&gt;
* [[CEPH|CEPH]]&lt;br /&gt;
&lt;br /&gt;
== Virtualization ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]]&lt;br /&gt;
* [[Installing Alpine in a virtual machine]]&lt;br /&gt;
** [[Install Alpine on VMware ESXi]]&lt;br /&gt;
* [[KVM]] &#039;&#039;(Setting up Alpine as a KVM hypervisor)&#039;&#039;&lt;br /&gt;
* [[LXC]] &#039;&#039;(Setting up a Linux container in Alpine Linux)&#039;&#039;&lt;br /&gt;
* [[QEMU]]&lt;br /&gt;
* Xen&lt;br /&gt;
** [[Xen Dom0]] &#039;&#039;(Setting up Alpine as a dom0 for Xen hypervisor)&#039;&#039;&lt;br /&gt;
** [[Xen Dom0 on USB or SD]]&lt;br /&gt;
** [[Create Alpine Linux PV DomU|Xen DomU (paravirtualized)]]&lt;br /&gt;
** [[Xen LiveCD]]&lt;br /&gt;
** [[Xen PCI Passthrough]]&lt;br /&gt;
** [[K8s]] Building a K8s Kubernetes Cluster on Alpine Linux&lt;br /&gt;
* [[Runc]]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[TTY_Autologin|TTY Autologin]]&lt;br /&gt;
* [[Kexec|Faster rebooting with kexec]]&lt;br /&gt;
* [[Dynamic Multipoint VPN (DMVPN)]] combined with [[Small Office Services]]&lt;br /&gt;
* [[DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs]]&lt;br /&gt;
* [[Fault Tolerant Routing with Alpine Linux]]&lt;br /&gt;
* [[High Availability High Performance Web Cache]] &#039;&#039;(uCarp + HAProxy for High Availability Services such as Squid web proxy)&#039;&#039;&lt;br /&gt;
* [[Linux iSCSI Target (TCM)]]&lt;br /&gt;
* [[ISP Mail Server 3.x HowTo]] &#039;&#039;(Postfix+PostfixAdmin+DoveCot+Roundcube+ClamAV+Spamd - A full-service ISP mail server)&#039;&#039;&lt;br /&gt;
* [[Grommunio Mail Server]] &#039;&#039;(Mariadb+Postfix+Rspamd+Grommunio - Full-service mail server as MS exchange replacement)&#039;&#039;&lt;br /&gt;
* [[Replacing non-Alpine Linux with Alpine remotely]]&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft --&amp;gt;&lt;br /&gt;
* [[Streaming Security Camera Video with VLC]]&lt;br /&gt;
* [[Install Alpine on a btrfs filesystem with refind as boot manager]]&lt;br /&gt;
* [[Compile software from source|How to Compile a software from source in Alpine Linux]]&lt;br /&gt;
* [https://ww2.coastal.edu/mmurphy2/oer/alpine/ Alpine Linux tutorials - Dr Murphy, Computing Science Associate Professor]&lt;br /&gt;
* [[Michael&#039;s base installation procedure|Michael&#039;s base installation procedure]]&lt;br /&gt;
* [[Michael&#039;s sway desktop (minimal)|Michael&#039;s sway desktop (minimal)]]&lt;br /&gt;
* [[Michael&#039;s cwm  desktop (minimal)|Michael&#039;s cwm  desktop (minimal)]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30829</id>
		<title>Setting up fprintd for swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30829"/>
		<updated>2025-09-01T13:41:22Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Fingerprint Authentication with swaylock =&lt;br /&gt;
&lt;br /&gt;
This guide shows how to configure fingerprint authentication for swaylock on Alpine Linux, allowing you to unlock using either:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;enter password&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;touch fingerprint sensor&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Install the fprintd package:&lt;br /&gt;
&lt;br /&gt;
 doas apk add fprintd&lt;br /&gt;
&lt;br /&gt;
== Configure PolicyKit Permissions ==&lt;br /&gt;
&lt;br /&gt;
Upon installation, standard users are not authorized to enroll fingerprints. Create a PolicyKit rule to allow members of the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group to manage fingerprints:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 polkit.addRule(function (action, subject) {&lt;br /&gt;
     if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
         if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
             return polkit.Result.YES;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 });&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
Add your user to the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
 doas adduser $USER input&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; You must log out and back in (or reboot) for the group membership to take effect.&lt;br /&gt;
&lt;br /&gt;
== Enroll Fingerprints ==&lt;br /&gt;
&lt;br /&gt;
If you previously enrolled fingerprints as root (or want to start fresh), delete existing enrollments:&lt;br /&gt;
&lt;br /&gt;
 # Delete fingerprints for current user&lt;br /&gt;
 fprintd-delete $(whoami)&lt;br /&gt;
 &lt;br /&gt;
 # If you accidentally enrolled as root, delete those too&lt;br /&gt;
 doas fprintd-delete root&lt;br /&gt;
&lt;br /&gt;
Enroll your fingerprint(s):&lt;br /&gt;
&lt;br /&gt;
 fprintd-enroll&lt;br /&gt;
&lt;br /&gt;
Verify the enrollment works:&lt;br /&gt;
&lt;br /&gt;
 fprintd-verify&lt;br /&gt;
&lt;br /&gt;
== Configure PAM for swaylock ==&lt;br /&gt;
&lt;br /&gt;
Create the PAM configuration for swaylock:&lt;br /&gt;
&lt;br /&gt;
 doas tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
 # Try password authentication first&lt;br /&gt;
 auth sufficient pam_unix.so nullok&lt;br /&gt;
 # If no password provided, try fingerprint&lt;br /&gt;
 auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
 auth required pam_deny.so&lt;br /&gt;
 &lt;br /&gt;
 # KWallet integration (optional)&lt;br /&gt;
 -auth    optional        pam_kwallet.so&lt;br /&gt;
 -auth    optional        pam_kwallet5.so&lt;br /&gt;
 -session optional        pam_kwallet.so auto_start&lt;br /&gt;
 -session optional        pam_kwallet5.so auto_start&lt;br /&gt;
 EOF&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Once configured, swaylock will accept both authentication methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Password authentication:&#039;&#039;&#039; Type your password and press Enter&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint authentication:&#039;&#039;&#039; Press Enter without typing anything, then touch the fingerprint sensor&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Permission denied during enrollment:&#039;&#039;&#039; Ensure you&#039;re in the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group and have logged out/in after adding the group&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint recognized but doesn&#039;t unlock:&#039;&#039;&#039; Check that fingerprints are enrolled for the correct user (not root)&lt;br /&gt;
* &#039;&#039;&#039;No fallback to password:&#039;&#039;&#039; Verify the PAM configuration has &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; before &amp;lt;code&amp;gt;pam_fprintd.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending to Other Services ==&lt;br /&gt;
&lt;br /&gt;
You can apply similar fingerprint authentication to other services by adding the same PAM configuration pattern to files in &amp;lt;code&amp;gt;/etc/pam.d/&amp;lt;/code&amp;gt; such as:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;doas&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;polkit-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30828</id>
		<title>Setting up fprintd for swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30828"/>
		<updated>2025-09-01T13:36:08Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Fingerprint Authentication with swaylock =&lt;br /&gt;
&lt;br /&gt;
This guide shows how to configure fingerprint authentication for swaylock on Alpine Linux, allowing you to unlock using either:&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;enter password&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;amp;lt;hit enter&amp;amp;gt;&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;&amp;amp;lt;touch fingerprint sensor&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Installation ==&lt;br /&gt;
&lt;br /&gt;
Install the fprintd package:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
doas apk add fprintd&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure PolicyKit Permissions ==&lt;br /&gt;
&lt;br /&gt;
Upon installation, standard users are not authorized to enroll fingerprints. Create a PolicyKit rule to allow members of the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group to manage fingerprints:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
doas tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
polkit.addRule(function (action, subject) {&lt;br /&gt;
    if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
        if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
            return polkit.Result.YES;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Add your user to the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
doas adduser $USER input&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|You must log out and back in (or reboot) for the group membership to take effect.}}&lt;br /&gt;
&lt;br /&gt;
== Enroll Fingerprints ==&lt;br /&gt;
&lt;br /&gt;
If you previously enrolled fingerprints as root (or want to start fresh), delete existing enrollments:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Delete fingerprints for current user&lt;br /&gt;
fprintd-delete $(whoami)&lt;br /&gt;
&lt;br /&gt;
# If you accidentally enrolled as root, delete those too&lt;br /&gt;
doas fprintd-delete root&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enroll your fingerprint(s):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
fprintd-enroll&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Verify the enrollment works:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
fprintd-verify&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure PAM for swaylock ==&lt;br /&gt;
&lt;br /&gt;
Create the PAM configuration for swaylock:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
doas tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
# Try password authentication first&lt;br /&gt;
auth sufficient pam_unix.so nullok&lt;br /&gt;
# If no password provided, try fingerprint&lt;br /&gt;
auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
auth required pam_deny.so&lt;br /&gt;
&lt;br /&gt;
# KWallet integration (optional)&lt;br /&gt;
-auth    optional        pam_kwallet.so&lt;br /&gt;
-auth    optional        pam_kwallet5.so&lt;br /&gt;
-session optional        pam_kwallet.so auto_start&lt;br /&gt;
-session optional        pam_kwallet5.so auto_start&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Usage ==&lt;br /&gt;
&lt;br /&gt;
Once configured, swaylock will accept both authentication methods:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Password authentication:&#039;&#039;&#039; Type your password and press Enter&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint authentication:&#039;&#039;&#039; Press Enter without typing anything, then touch the fingerprint sensor&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Permission denied during enrollment:&#039;&#039;&#039; Ensure you&#039;re in the &amp;lt;code&amp;gt;input&amp;lt;/code&amp;gt; group and have logged out/in after adding the group&lt;br /&gt;
* &#039;&#039;&#039;Fingerprint recognized but doesn&#039;t unlock:&#039;&#039;&#039; Check that fingerprints are enrolled for the correct user (not root)&lt;br /&gt;
* &#039;&#039;&#039;No fallback to password:&#039;&#039;&#039; Verify the PAM configuration has &amp;lt;code&amp;gt;pam_unix.so&amp;lt;/code&amp;gt; before &amp;lt;code&amp;gt;pam_fprintd.so&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extending to Other Services ==&lt;br /&gt;
&lt;br /&gt;
You can apply similar fingerprint authentication to other services by adding the same PAM configuration pattern to files in &amp;lt;code&amp;gt;/etc/pam.d/&amp;lt;/code&amp;gt; such as:&lt;br /&gt;
* &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;doas&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;polkit-1&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;login&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;su&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30827</id>
		<title>Setting up fprintd for swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30827"/>
		<updated>2025-09-01T13:34:42Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;# Fingerprint Authentication with swaylock&lt;br /&gt;
&lt;br /&gt;
This guide shows how to configure fingerprint authentication for swaylock on Alpine Linux, allowing you to unlock using either:&lt;br /&gt;
- `&amp;lt;enter password&amp;gt;` → `&amp;lt;hit enter&amp;gt;`&lt;br /&gt;
- `&amp;lt;hit enter&amp;gt;` → `&amp;lt;touch fingerprint sensor&amp;gt;`&lt;br /&gt;
&lt;br /&gt;
## Installation&lt;br /&gt;
&lt;br /&gt;
Install the fprintd package:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
doas apk add fprintd&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Configure PolicyKit Permissions&lt;br /&gt;
&lt;br /&gt;
Upon installation, standard users are not authorized to enroll fingerprints. Create a PolicyKit rule to allow members of the `input` group to manage fingerprints:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
doas tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
polkit.addRule(function (action, subject) {&lt;br /&gt;
    if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
        if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
            return polkit.Result.YES;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
});&lt;br /&gt;
EOF&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Add your user to the `input` group:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
doas adduser $USER input&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
**Note:** You must log out and back in (or reboot) for the group membership to take effect.&lt;br /&gt;
&lt;br /&gt;
## Enroll Fingerprints&lt;br /&gt;
&lt;br /&gt;
If you previously enrolled fingerprints as root (or want to start fresh), delete existing enrollments:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
# Delete fingerprints for current user&lt;br /&gt;
fprintd-delete $(whoami)&lt;br /&gt;
&lt;br /&gt;
# If you accidentally enrolled as root, delete those too&lt;br /&gt;
doas fprintd-delete root&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Enroll your fingerprint(s):&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fprintd-enroll&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
Verify the enrollment works:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
fprintd-verify&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Configure PAM for swaylock&lt;br /&gt;
&lt;br /&gt;
Create the PAM configuration for swaylock:&lt;br /&gt;
&lt;br /&gt;
```bash&lt;br /&gt;
doas tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
# Try password authentication first&lt;br /&gt;
auth sufficient pam_unix.so nullok&lt;br /&gt;
# If no password provided, try fingerprint&lt;br /&gt;
auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
auth required pam_deny.so&lt;br /&gt;
&lt;br /&gt;
# KWallet integration (optional)&lt;br /&gt;
-auth    optional        pam_kwallet.so&lt;br /&gt;
-auth    optional        pam_kwallet5.so&lt;br /&gt;
-session optional        pam_kwallet.so auto_start&lt;br /&gt;
-session optional        pam_kwallet5.so auto_start&lt;br /&gt;
EOF&lt;br /&gt;
```&lt;br /&gt;
&lt;br /&gt;
## Usage&lt;br /&gt;
&lt;br /&gt;
Once configured, swaylock will accept both authentication methods:&lt;br /&gt;
&lt;br /&gt;
- **Password authentication:** Type your password and press Enter&lt;br /&gt;
- **Fingerprint authentication:** Press Enter without typing anything, then touch the fingerprint sensor&lt;br /&gt;
&lt;br /&gt;
## Troubleshooting&lt;br /&gt;
&lt;br /&gt;
- **Permission denied during enrollment:** Ensure you&#039;re in the `input` group and have logged out/in after adding the group&lt;br /&gt;
- **Fingerprint recognized but doesn&#039;t unlock:** Check that fingerprints are enrolled for the correct user (not root)&lt;br /&gt;
- **No fallback to password:** Verify the PAM configuration has `pam_unix.so` before `pam_fprintd.so`&lt;br /&gt;
&lt;br /&gt;
## Extending to Other Services&lt;br /&gt;
&lt;br /&gt;
You can apply similar fingerprint authentication to other services by adding the same PAM configuration pattern to files in `/etc/pam.d/` such as:&lt;br /&gt;
- `sudo` or `doas`&lt;br /&gt;
- `polkit-1`&lt;br /&gt;
- `login`&lt;br /&gt;
- `su`&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30826</id>
		<title>Setting up fprintd for swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30826"/>
		<updated>2025-09-01T13:31:22Z</updated>

		<summary type="html">&lt;p&gt;Benaki: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To enable swaylock to unlock like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;enter password&amp;gt; &amp;lt;hit enter&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;hit enter&amp;gt; &amp;lt;touch fingerprint sensor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To install fprintd:&lt;br /&gt;
$ doas apk add fprintd&lt;br /&gt;
&lt;br /&gt;
Upon installation a standard user was not authorized to add prints.&lt;br /&gt;
The below was used to allow members of the &#039;input&#039; group to add prints:&lt;br /&gt;
&lt;br /&gt;
$ sudo tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
polkit.addRule(function (action, subject) {&lt;br /&gt;
if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
return polkit.Result.YES;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
$ doas adduser $USER input&lt;br /&gt;
&lt;br /&gt;
(reboot)&lt;br /&gt;
&lt;br /&gt;
I previously enrolled a print for root accidentally, needed to delete it (as well as for my user for good measure):&lt;br /&gt;
&lt;br /&gt;
$ fprintd-delete $(whoami)&lt;br /&gt;
$ fprintd-delete root&lt;br /&gt;
&lt;br /&gt;
Then enroll fresh print(s):&lt;br /&gt;
&lt;br /&gt;
$ fprintd-enroll&lt;br /&gt;
$ fprintd-verify&lt;br /&gt;
&lt;br /&gt;
Then, to set the swaylock config:&lt;br /&gt;
&lt;br /&gt;
$ sudo tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
# Try password authentication first&lt;br /&gt;
auth sufficient pam_unix.so nullok&lt;br /&gt;
# If no password provided, try fingerprint&lt;br /&gt;
auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
auth required pam_deny.so # Keep the wallet stuff&lt;br /&gt;
-auth optional pam_kwallet.so&lt;br /&gt;
-auth optional pam_kwallet5.so&lt;br /&gt;
-session optional pam_kwallet.so auto_start&lt;br /&gt;
-session optional pam_kwallet5.so auto_start&lt;br /&gt;
EOF&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30825</id>
		<title>Setting up fprintd for swaylock</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Setting_up_fprintd_for_swaylock&amp;diff=30825"/>
		<updated>2025-09-01T13:28:38Z</updated>

		<summary type="html">&lt;p&gt;Benaki: Swaylock using fprintd&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To enable swaylock to unlock like so:&lt;br /&gt;
&amp;lt;enter password&amp;gt; &amp;lt;hit enter&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;hit enter&amp;gt; &amp;lt;touch fingerprint sensor&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To install fprintd:&lt;br /&gt;
doas apk add fprintd&lt;br /&gt;
&lt;br /&gt;
Upon installation a standard user was not authorized to add prints.&lt;br /&gt;
The below was used to allow members of the &#039;input&#039; group to add prints:&lt;br /&gt;
&lt;br /&gt;
sudo tee /etc/polkit-1/rules.d/50-fingerprint.rules &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
polkit.addRule(function (action, subject) {&lt;br /&gt;
if (action.id.indexOf(&amp;quot;net.reactivated.fprint.&amp;quot;) == 0) {&lt;br /&gt;
if (subject.isInGroup(&amp;quot;input&amp;quot;)) {&lt;br /&gt;
return polkit.Result.YES;&lt;br /&gt;
}&lt;br /&gt;
}&lt;br /&gt;
});&lt;br /&gt;
EOF&lt;br /&gt;
&lt;br /&gt;
doas adduser $USER input&lt;br /&gt;
&lt;br /&gt;
(reboot)&lt;br /&gt;
&lt;br /&gt;
I previously enrolled a print for root accidentally, needed to delete it (as well as for my user for good measure):&lt;br /&gt;
&lt;br /&gt;
fprintd-delete $(whoami)&lt;br /&gt;
fprintd-delete root&lt;br /&gt;
&lt;br /&gt;
Then enroll fresh print(s):&lt;br /&gt;
&lt;br /&gt;
fprintd-enroll&lt;br /&gt;
fprintd-verify&lt;br /&gt;
&lt;br /&gt;
Then, to set the swaylock config:&lt;br /&gt;
&lt;br /&gt;
sudo tee /etc/pam.d/swaylock &amp;lt;&amp;lt; &#039;EOF&#039;&lt;br /&gt;
# Try password authentication first&lt;br /&gt;
auth sufficient pam_unix.so nullok&lt;br /&gt;
# If no password provided, try fingerprint&lt;br /&gt;
auth sufficient pam_fprintd.so ignore-empty-password&lt;br /&gt;
auth required pam_deny.so # Keep the wallet stuff&lt;br /&gt;
-auth optional pam_kwallet.so&lt;br /&gt;
-auth optional pam_kwallet5.so&lt;br /&gt;
-session optional pam_kwallet.so auto_start&lt;br /&gt;
-session optional pam_kwallet5.so auto_start&lt;br /&gt;
EOF&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
	<entry>
		<id>https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=30824</id>
		<title>Tutorials and Howtos</title>
		<link rel="alternate" type="text/html" href="https://wiki.alpinelinux.org/w/index.php?title=Tutorials_and_Howtos&amp;diff=30824"/>
		<updated>2025-09-01T13:19:48Z</updated>

		<summary type="html">&lt;p&gt;Benaki: /* Other topics */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Image:package_edutainment.svg|right|link=]]&lt;br /&gt;
{{TOC left}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Welcome to Tutorials and Howtos, a place of basic and advanced configuration tasks for your Alpine Linux.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Howtos are smaller articles&#039;&#039;&#039; explaining how to perform a particular task with Alpine Linux, that expects a minimal knowledge from reader to perform actions. Howto&#039;s have been organized in the below page based on the topics.  &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The [[#Tutorials|tutorials]] are hands-on&#039;&#039;&#039; and the reader is expected to try and achieve the goals described in each step, possibly with the help of a good example. The output in one step is the starting point for the following step.&lt;br /&gt;
&lt;br /&gt;
{{Note|&lt;br /&gt;
* Contributors are requested to refer to [[Help:Editing]] first and make use of resources like [[How to write a HOWTO]].&lt;br /&gt;
* Contributions must be complete articles. &lt;br /&gt;
* Don&#039;t override already made contributions, unless there is a mistake. &lt;br /&gt;
* If you want to request a topic, please add your request in this page&#039;s [[Talk:Tutorials_and_Howtos|Discussion]].}}&lt;br /&gt;
&lt;br /&gt;
== Desktop ==&lt;br /&gt;
&lt;br /&gt;
* {{:Daily driver guide}}&lt;br /&gt;
&lt;br /&gt;
=== Networking ===&lt;br /&gt;
&lt;br /&gt;
* [[Bluetooth]] - Instructions for installing and configuring Bluetooth&lt;br /&gt;
* [[Bonding]] - Bond (or aggregate) multiple ethernet interfaces&lt;br /&gt;
* [[Bridge]] - Configuring a network bridge&lt;br /&gt;
** [[Bridge wlan0 to eth0]]&lt;br /&gt;
* [[Configure Networking]]&lt;br /&gt;
* [[How to configure static routes]]&lt;br /&gt;
* Modem&lt;br /&gt;
** [[Using HSDPA modem]]&lt;br /&gt;
** [[Using serial modem]]&lt;br /&gt;
* [[mDNS]] - Howto implement multicast DNS resolution in Alpine. &lt;br /&gt;
* [[Multi ISP]] &#039;&#039;(Dual-ISP setup with load-balancing and automatic failover)&#039;&#039;&lt;br /&gt;
* [[PXE boot]]&lt;br /&gt;
* Wi-Fi&lt;br /&gt;
** [[Wi-Fi|Connecting to a wireless access point]]&lt;br /&gt;
** [[How to setup a wireless access point]] &#039;&#039;(Setting up Secure Wireless AP w/ WPA encryption with bridge to wired network)&#039;&#039;&lt;br /&gt;
* Use [https://github.com/ifupdown-ng/ifupdown-ng/blob/main/doc/interfaces-vxlan.scd vxlan], if using  [[Ifupdown-ng]] instead of [[VLAN]]&lt;br /&gt;
&lt;br /&gt;
=== Backup and data migration ===&lt;br /&gt;
&lt;br /&gt;
* [[Migrating data]]&lt;br /&gt;
* [[Rsnapshot]] - setting up periodic backups&lt;br /&gt;
&lt;br /&gt;
=== Other topics ===&lt;br /&gt;
&lt;br /&gt;
* [[Gaming on Alpine]]&lt;br /&gt;
* [[Remote Desktop Server]]&lt;br /&gt;
* [[Default applications|How to change default application]]&lt;br /&gt;
* [[CPU frequency scaling]]&lt;br /&gt;
* [[Mimalloc]]&lt;br /&gt;
* [[Enable Serial Console on Boot]]&lt;br /&gt;
* [[How to build the Alpine Linux kernel]]&lt;br /&gt;
* [[Nextcloud]] &#039;&#039;(Self hostable cloud suite - Dropbox Alternative)&#039;&#039;&lt;br /&gt;
* [[Setting up lm_sensors]]&lt;br /&gt;
* [[Setting up fprintd for swaylock]]&lt;br /&gt;
* [[Desktop environments and Window managers|List of supported Desktop environments and Window managers]]&lt;br /&gt;
&lt;br /&gt;
== Diskless ==&lt;br /&gt;
&lt;br /&gt;
* [[Alpine local backup|Alpine local backup (lbu)]] &#039;&#039;(Permanently store your modifications in case your box needs reboot)&#039;&#039;&lt;br /&gt;
** [[Back Up a Flash Memory Installation]]&lt;br /&gt;
** [[Manually editing a existing apkovl]]&lt;br /&gt;
&lt;br /&gt;
== Other Architectures ==&lt;br /&gt;
&lt;br /&gt;
=== ARM ===&lt;br /&gt;
&lt;br /&gt;
* [[Alpine on ARM]]&lt;br /&gt;
&lt;br /&gt;
==== Raspberry Pi ====&lt;br /&gt;
&lt;br /&gt;
* [[Raspberry Pi|Raspberry Pi main page]]&lt;br /&gt;
* [[Raspberry Pi Bluetooth Speaker|Raspberry Pi - Bluetooth Speaker]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi|Raspberry Pi - Router with VPN]]&lt;br /&gt;
* [[Linux Router with VPN on a Raspberry Pi (IPv6)|Raspberry Pi - Router with VPN (IPv6)]]&lt;br /&gt;
* [[Classic install or sys mode on Raspberry Pi|Raspberry Pi - Sys mode install]]&lt;br /&gt;
* [[Raspberry Pi LVM on LUKS|Raspberry Pi - Sys mode install - LVM on LUKS]]&lt;br /&gt;
* [[RPI Video Receiver|Raspberry Pi - Video Receiver]] &#039;&#039;(network video decoder using Rasperry Pi and omxplayer)&#039;&#039;&lt;br /&gt;
* [[Raspberry Pi 3 - Browser Client]] - kiosk or digital sign&lt;br /&gt;
* [[Raspberry Pi 3 - Configuring it as wireless access point -AP Mode]]&lt;br /&gt;
* [[Raspberry Pi 3 - Setting Up Bluetooth]]&lt;br /&gt;
* [[Raspberry Pi 4 - Persistent system acting as a NAS and Time Machine]]&lt;br /&gt;
* [[How to set up Alpine as a wireless router|Raspberry Pi Zero W - Wireless router]] &#039;&#039;(Setting up a firewalled, Wireless AP with wired network on a Pi Zero W)&#039;&#039;&lt;br /&gt;
* [[RPI Video Receiver]]&lt;br /&gt;
&lt;br /&gt;
=== IBM Z (IBM z Systems) ===&lt;br /&gt;
&lt;br /&gt;
* [[s390x|s390x - Installation]]&lt;br /&gt;
&lt;br /&gt;
=== PowerPC ===&lt;br /&gt;
&lt;br /&gt;
* [[Ppc64le|Powerpc64le - Installation]]&lt;br /&gt;
&lt;br /&gt;
== Security ==&lt;br /&gt;
&lt;br /&gt;
* [[#Desktop security|Desktop security]] lists steps for securing Alpine Linux desktops&lt;br /&gt;
* [[Setting up a laptop]] page has detailed guidelines to configure a secured laptop&lt;br /&gt;
* [[Securing Alpine Linux|Secure Alpine Linux]] using Security Technical Implementation Guides (STIGs)&lt;br /&gt;
&lt;br /&gt;
== Services == &lt;br /&gt;
&lt;br /&gt;
{{Note| Services are arranged in alphabetical order.}}&lt;br /&gt;
&lt;br /&gt;
=== Content management systems ===&lt;br /&gt;
&lt;br /&gt;
* [[DokuWiki]] &#039;&#039;(Simple and easy to use wiki, no database required)&#039;&#039;&lt;br /&gt;
* [[Drupal]] &#039;&#039;(Content Management System (CMS) written in PHP)&#039;&#039;&lt;br /&gt;
* [[Kopano]] &#039;&#039;(Microsoft Outlook compatible Groupware)&#039;&#039;&lt;br /&gt;
* [[Mahara]] &#039;&#039;(E-portfolio and social networking system)&#039;&#039;&lt;br /&gt;
* [[MediaWiki]] &#039;&#039;(Free web-based wiki software application)&#039;&#039;&lt;br /&gt;
* [[Pastebin]] &#039;&#039;(Pastebin software application)&#039;&#039;&lt;br /&gt;
* [[WordPress]] &#039;&#039;(Web software to create website or blog)&#039;&#039;&lt;br /&gt;
* [[Moodle]] &#039;&#039;(Online Learning Management system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Database === &lt;br /&gt;
&lt;br /&gt;
* [[MariaDB]] or [[MySQL|MySQL]]&lt;br /&gt;
&lt;br /&gt;
=== DNS ===&lt;br /&gt;
&lt;br /&gt;
* [[DNSCrypt-Proxy]] &#039;&#039;Encrypt and authenticate DNS calls from your system&#039;&#039;&lt;br /&gt;
* [[Setting up nsd DNS server]]&lt;br /&gt;
* [[Small-Time DNS with BIND9]] &#039;&#039;(A simple configuration with ad blocking for your home network)&#039;&#039;&lt;br /&gt;
* Unbound&lt;br /&gt;
** [[Setting up unbound DNS server]]&lt;br /&gt;
** [[Using Unbound as an Ad-blocker]] &#039;&#039;(Setup ad blocking for your network)&#039;&#039;&lt;br /&gt;
* [[TinyDNS Format]]&lt;br /&gt;
&lt;br /&gt;
=== File server ===&lt;br /&gt;
&lt;br /&gt;
* [[Setting up an NFS server|nfs-server]]&lt;br /&gt;
* [[Setting up a Samba server|samba-server]] &#039;&#039;(standard file sharing)&#039;&#039;&lt;br /&gt;
* [[Setting up a samba-ad-dc|samba-ad-dc]] &#039;&#039;(Active Directory compatible domain controller)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Firewall ===&lt;br /&gt;
&lt;br /&gt;
* [https://git.alpinelinux.org/awall/about/ Alpine Wall User&#039;s Guide]&lt;br /&gt;
** [[Zero-To-Awall]] -&#039;&#039;AWall for dummies&#039;&#039;&lt;br /&gt;
** [[How-To Alpine Wall]] - &#039;&#039;AWall for Shorewall users&#039;&#039;&lt;br /&gt;
** [[Alpine Wall]] - &#039;&#039;AWall - Firewall management framework - Design Document&#039;&#039;&lt;br /&gt;
* [[Iptables]]&lt;br /&gt;
* [[nftables]]&lt;br /&gt;
* [[Uncomplicated Firewall|Uncomplicated Firewall or UFW]]&lt;br /&gt;
&lt;br /&gt;
=== HTTP and web services ===&lt;br /&gt;
&lt;br /&gt;
* [[Althttpd]]&lt;br /&gt;
* [[Apache]]&lt;br /&gt;
** [[Apache with php-fpm]]&lt;br /&gt;
** [[Setting Up Apache with PHP]]&lt;br /&gt;
** [[Apache authentication: NTLM Single Signon]]&lt;br /&gt;
* [[Darkhttpd]]&lt;br /&gt;
* [[Lighttpd]]&lt;br /&gt;
** [[Lighttpd Advanced security]]&lt;br /&gt;
** [[Setting Up Lighttpd With FastCGI]]&lt;br /&gt;
** [[Production Web server: Lighttpd|Production web server: Lighttpd‎‎]]&lt;br /&gt;
* [[Nginx]]&lt;br /&gt;
** [[Nginx as reverse proxy with acme (letsencrypt)]]&lt;br /&gt;
** [[Nginx with PHP]]&lt;br /&gt;
* Squid Proxy&lt;br /&gt;
** [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
** [[Setting up Explicit Squid Proxy]]&lt;br /&gt;
** [[Setting up Transparent Squid Proxy]] &#039;&#039;(Covers Squid proxy and URL Filtering system)&#039;&#039;&lt;br /&gt;
** [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Tomcat]]&lt;br /&gt;
** [[Production LAMP system: Lighttpd + PHP + MySQL‎‎|Production LAMP system: Lighttpd + PHP + MariaDB/MySQL‎‎]]&lt;br /&gt;
&lt;br /&gt;
=== IRC ===&lt;br /&gt;
&lt;br /&gt;
* [[NgIRCd]] &#039;&#039;(Server for Internet Relay Chat/IRC)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Mail ===&lt;br /&gt;
&lt;br /&gt;
* [[Hosting services on Alpine]] &#039;&#039;(Hosting mail, webservices and other services)&#039;&#039;&lt;br /&gt;
* [[Hosting Web/Email services on Alpine]]&lt;br /&gt;
* Exim/Dovecot&lt;br /&gt;
** [[Small-Time Email with Exim and Dovecot]] &#039;&#039;(A simple configuration for your home network.)&lt;br /&gt;
** [[Setting up dovecot with imap and tls]]&lt;br /&gt;
* [[relay email to gmail (msmtp, mailx, sendmail]]&lt;br /&gt;
* [[relay email (nullmailer)]]&lt;br /&gt;
* [[Roundcube]] &#039;&#039;(Webmail system)&#039;&#039;&lt;br /&gt;
* [[Setting up postfix with virtual domains]]&lt;br /&gt;
* Server protection&lt;br /&gt;
** [[Setting up clamsmtp]]&lt;br /&gt;
&lt;br /&gt;
=== Monitoring ===&lt;br /&gt;
&lt;br /&gt;
* [[Awstats]] &#039;&#039;(Free log file analyzer)&#039;&#039;&lt;br /&gt;
* [[Cacti: traffic analysis and monitoring network]] &#039;&#039;(Front-end for rrdtool networking monitor)&#039;&#039;&lt;br /&gt;
* [[Cvechecker]] &#039;&#039;(Compare installed packages for Common Vulnerabilities Exposure)&#039;&#039; &amp;lt;!-- Monitoring and Security --&amp;gt;&lt;br /&gt;
* [[Linfo]]&lt;br /&gt;
* [[Obtaining user information via SNMP]] &#039;&#039;(Using squark-auth-snmp as a Squid authentication helper)&#039;&#039; &amp;lt;!-- Networking and Server, &amp;lt;== Using squark-auth-snmp --&amp;gt;&lt;br /&gt;
* [[PhpSysInfo]] &#039;&#039;(A simple application that displays information about the host it&#039;s running on)&#039;&#039;&lt;br /&gt;
* [[Logcheck]] &#039;&#039;(log file monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Matomo]] &#039;&#039;(A real time web analytics software program)&#039;&#039;&lt;br /&gt;
* [[Rasdaemon]] &#039;&#039;(Platform Reliability, Availability and Serviceability monitoring tool)&#039;&#039;&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft, solution, Networking and Monitoring and Server --&amp;gt;&lt;br /&gt;
** [[Setting up NRPE daemon]] &#039;&#039;(Performs remote Nagios checks)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[Setting Up Fprobe And Ntop|Ntop]] &#039;&#039;(NetFlow collection and analysis using a remote fprobe instance; for alpine 3.10-3.12 only)&#039;&#039; &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
* [[SqStat]] &#039;&#039;(Script to look at active squid users connections)&#039;&#039;&lt;br /&gt;
* [[Traffic monitoring]] &amp;lt;!-- Networking and Monitoring --&amp;gt;&lt;br /&gt;
** [[Setting up monitoring using rrdtool (and rrdcollect)]]&lt;br /&gt;
** [[Setting up traffic monitoring using rrdtool (and snmp)]] &amp;lt;!-- Monitoring --&amp;gt;&lt;br /&gt;
* [[Zabbix|Zabbix - the professional complete manager]] &#039;&#039;(Monitor and track the status of network services and hardware)&#039;&#039;&lt;br /&gt;
* [[ZoneMinder video camera security and surveillance]]&lt;br /&gt;
&lt;br /&gt;
=== Remote Administration ===&lt;br /&gt;
&lt;br /&gt;
* ACF&lt;br /&gt;
** [[Changing passwords for ACF|ACF - changing passwords]]&lt;br /&gt;
** [[Generating SSL certs with ACF]] &amp;lt;!-- Generating SSL certs with ACF 1.9 --&amp;gt;&lt;br /&gt;
** [[setup-acf| ACF - setup]] &#039;&#039;(Configures ACF (webconfiguration/webmin) so you can manage your box through https)&#039;&#039;&lt;br /&gt;
* [[Setting up a SSH server]] &#039;&#039;(Using ssh is a good way to administer your box remotely)&#039;&#039;&lt;br /&gt;
** [[HOWTO OpenSSH 2FA with password and Google Authenticator |OpenSSH 2FA]] &#039;&#039;(A simple two factor setup for OpenSSH)&#039;&#039;&lt;br /&gt;
* [[OpenVCP]] &#039;&#039;(VServer Control Panel)&#039;&#039;&lt;br /&gt;
* [[PhpMyAdmin]] &#039;&#039;(Web-based administration tool for MYSQL)&#039;&#039;&lt;br /&gt;
* [[PhpPgAdmin]] &#039;&#039;(Web-based administration tool for PostgreSQL)&#039;&#039;&lt;br /&gt;
* [[Webmin]] &#039;&#039;(A web-based interface for Linux system)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Telephony ===&lt;br /&gt;
&lt;br /&gt;
* [[FreePBX|FreePBX on Alpine Linux]]&lt;br /&gt;
* [[Setting up Zaptel/Asterisk on Alpine]]&lt;br /&gt;
* [[Kamailio]] &#039;&#039;(SIP Server, formerly OpenSER)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== VPN ===&lt;br /&gt;
* [[Freeradius Active Directory Integration]]&lt;br /&gt;
* [[GNUnet]]&lt;br /&gt;
* [[IGMPproxy]]&lt;br /&gt;
* [[Setting up a OpenVPN server|OpenVPN server]] &#039;&#039;(Allowing single users or devices to remotely connect to your network)&#039;&#039;&lt;br /&gt;
* [[OpenVSwitch]]&lt;br /&gt;
* [[Tor]]&lt;br /&gt;
* [[Using Alpine on Windows domain with IPSEC isolation]]&lt;br /&gt;
* [[Configure a Wireguard interface (wg)|Wireguard]]&lt;br /&gt;
&lt;br /&gt;
=== Other Servers ===&lt;br /&gt;
&lt;br /&gt;
* [[apcupsd]] &#039;&#039;(UPS Monitoring with apcupsd)&#039;&#039;&lt;br /&gt;
* [[Chrony and GPSD | Chrony, gpsd, and a garmin LVC 18 as a Stratum 1 NTP source ]]&lt;br /&gt;
* [[Glpi]] &#039;&#039;(Manage inventory of technical resources)&#039;&#039;&lt;br /&gt;
* [[How to setup a Alpine Linux mirror]]&lt;br /&gt;
* [[nut-ups|NUT UPS]] &#039;&#039;(UPS Monitoring with Network UPS Tools)&#039;&#039;&lt;br /&gt;
* [[Odoo]]&lt;br /&gt;
* [[Configure OpenLDAP | OpenLDAP]] &#039;&#039;(Installing and configuring the Alpine package for OpenLDAP)&#039;&#039;&lt;br /&gt;
* [[Setting up a LLDAP server|lldap-server]] &#039;&#039;(Directory Server)&#039;&#039;&lt;br /&gt;
* [[Setting up Transmission (bittorrent) with Clutch WebUI]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Software development ==&lt;br /&gt;
&lt;br /&gt;
* [[Cgit]]&lt;br /&gt;
* [[OsTicket]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Patchwork]] &#039;&#039;(Patch review management system)&#039;&#039;&lt;br /&gt;
* [[Redmine]] &#039;&#039;(Project management system) [Deprecated]&#039;&#039;&lt;br /&gt;
* [[Request Tracker]] &#039;&#039;(Ticket system)&#039;&#039;&lt;br /&gt;
* [[Setting up trac wiki|Trac]] &#039;&#039;(Enhanced wiki and issue tracking system for software development projects)&#039;&#039;&lt;br /&gt;
* [[Ansible]] &#039;&#039;(Configuration management)&#039;&#039;&lt;br /&gt;
* [[Installing Oracle Java|Oracle Java (installation)]]&lt;br /&gt;
&lt;br /&gt;
== Storage ==&lt;br /&gt;
&lt;br /&gt;
* [[Setting up disks manually|Manual partitioning]]&lt;br /&gt;
* [[Disk Replication with DRBD|DRBD: Disk Replication]]&lt;br /&gt;
* [[Filesystems]]&lt;br /&gt;
** [[Burning ISOs]]&lt;br /&gt;
* [[Setting up iSCSI|iSCSI Setup]]&lt;br /&gt;
** [[iSCSI Raid and Clustered File Systems]]&lt;br /&gt;
** [[Linux iSCSI Target (TCM)|iSCSI Target (TCM)/LinuxIO (LIO)]]&lt;br /&gt;
** [[Linux iSCSI Target (tgt)|User space iSCSI Target (tgt)]]&lt;br /&gt;
* [[Setting up Logical Volumes with LVM|LVM Setup]]&lt;br /&gt;
** [[Setting up LVM on GPT-labeled disks|LVM on GPT-labeled disks]]&lt;br /&gt;
** [[Installing on GPT LVM|LVM on GPT-labeled disks (updated)]]&lt;br /&gt;
** [[LVM on LUKS]]&lt;br /&gt;
* RAID&lt;br /&gt;
** [[Raid Administration]]&lt;br /&gt;
** [[Setting up a software RAID array]]&lt;br /&gt;
* [[ZFS]]&lt;br /&gt;
** [[Root on ZFS with native encryption]]&lt;br /&gt;
** [[Setting up ZFS on LUKS]]&lt;br /&gt;
* [[CEPH|CEPH]]&lt;br /&gt;
&lt;br /&gt;
== Virtualization ==&lt;br /&gt;
&lt;br /&gt;
* [[Docker]]&lt;br /&gt;
* [[Installing Alpine in a virtual machine]]&lt;br /&gt;
** [[Install Alpine on VMware ESXi]]&lt;br /&gt;
* [[KVM]] &#039;&#039;(Setting up Alpine as a KVM hypervisor)&#039;&#039;&lt;br /&gt;
* [[LXC]] &#039;&#039;(Setting up a Linux container in Alpine Linux)&#039;&#039;&lt;br /&gt;
* [[QEMU]]&lt;br /&gt;
* Xen&lt;br /&gt;
** [[Xen Dom0]] &#039;&#039;(Setting up Alpine as a dom0 for Xen hypervisor)&#039;&#039;&lt;br /&gt;
** [[Xen Dom0 on USB or SD]]&lt;br /&gt;
** [[Create Alpine Linux PV DomU|Xen DomU (paravirtualized)]]&lt;br /&gt;
** [[Xen LiveCD]]&lt;br /&gt;
** [[Xen PCI Passthrough]]&lt;br /&gt;
** [[K8s]] Building a K8s Kubernetes Cluster on Alpine Linux&lt;br /&gt;
* [[Runc]]&lt;br /&gt;
&lt;br /&gt;
== Tutorials ==&lt;br /&gt;
&lt;br /&gt;
* [[TTY_Autologin|TTY Autologin]]&lt;br /&gt;
* [[Kexec|Faster rebooting with kexec]]&lt;br /&gt;
* [[Dynamic Multipoint VPN (DMVPN)]] combined with [[Small Office Services]]&lt;br /&gt;
* [[DIY Fully working Alpine Linux for Allwinner and Other ARM SOCs]]&lt;br /&gt;
* [[Fault Tolerant Routing with Alpine Linux]]&lt;br /&gt;
* [[High Availability High Performance Web Cache]] &#039;&#039;(uCarp + HAProxy for High Availability Services such as Squid web proxy)&#039;&#039;&lt;br /&gt;
* [[Linux iSCSI Target (TCM)]]&lt;br /&gt;
* [[ISP Mail Server 3.x HowTo]] &#039;&#039;(Postfix+PostfixAdmin+DoveCot+Roundcube+ClamAV+Spamd - A full-service ISP mail server)&#039;&#039;&lt;br /&gt;
* [[Grommunio Mail Server]] &#039;&#039;(Mariadb+Postfix+Rspamd+Grommunio - Full-service mail server as MS exchange replacement)&#039;&#039;&lt;br /&gt;
* [[Replacing non-Alpine Linux with Alpine remotely]]&lt;br /&gt;
* [[Setting up A Network Monitoring and Inventory System]] &#039;&#039;(Nagios + OpenAudit and related components)&#039;&#039; &amp;lt;!-- draft --&amp;gt;&lt;br /&gt;
* [[Streaming Security Camera Video with VLC]]&lt;br /&gt;
* [[Install Alpine on a btrfs filesystem with refind as boot manager]]&lt;br /&gt;
* [[Compile software from source|How to Compile a software from source in Alpine Linux]]&lt;br /&gt;
* [https://ww2.coastal.edu/mmurphy2/oer/alpine/ Alpine Linux tutorials - Dr Murphy, Computing Science Associate Professor]&lt;br /&gt;
* [[Michael&#039;s base installation procedure|Michael&#039;s base installation procedure]]&lt;br /&gt;
* [[Michael&#039;s sway desktop (minimal)|Michael&#039;s sway desktop (minimal)]]&lt;br /&gt;
* [[Michael&#039;s cwm  desktop (minimal)|Michael&#039;s cwm  desktop (minimal)]]&lt;/div&gt;</summary>
		<author><name>Benaki</name></author>
	</entry>
</feed>