diff options
Diffstat (limited to 'content/blog/2022-10-22-alpine-linux.md')
-rw-r--r-- | content/blog/2022-10-22-alpine-linux.md | 280 |
1 files changed, 0 insertions, 280 deletions
diff --git a/content/blog/2022-10-22-alpine-linux.md b/content/blog/2022-10-22-alpine-linux.md deleted file mode 100644 index 69b6a8b..0000000 --- a/content/blog/2022-10-22-alpine-linux.md +++ /dev/null @@ -1,280 +0,0 @@ -+++ -date = 2022-10-22 -title = "Alpine Linux: My New Server OS" -description = "A retrospective on installing and configuring Alpine Linux as my new server operating system." -+++ - -## Alpine Linux - -[Alpine Linux](https://alpinelinux.org) is a very small distro, built on -musl libc and busybox. It uses ash as the default shell, OpenRC as the -init system, and apk as the package manager. According to their website, -an Alpine container "requires no more than 8 MB and a minimal -installation to disk requires around 130 MB of storage." An actual bare -metal machine is recommended to have 100 MB of RAM and 0-700 MB of -storage space. - -Historically, I've used Ubuntu's minimal installation image as my -server OS for the last five years. Ubuntu worked well and helped as my -original server contained an nVidia GPU and no onboard graphics, so -quite a few distros won't boot or install without a lot of tinkering. - -Alpine has given me a huge increase in performance across my Docker apps -and Nginx websites. CPU load for the new server I'm using to test -Alpine hovers around 0-5% on average with an Intel(R) Core(TM) i3-6100 -CPU @ 3.70GHz. - -The only services I haven't moved over to Alpine are Plex Media Server -and Syncthing, which may increase CPU load quite a bit depending on how -many streams are running. - -### Installation - -In terms of installation, Alpine has an incredibly useful -[wiki](https://wiki.alpinelinux.org/wiki/Installation) that will guide a -user throughout the installation and post-installation processes, as -well as various other articles and guides. - -To install Alpine, find an appropriate [image to -download](https://alpinelinux.org/downloads/) and flash it to a USB -using software such as Rufus or Etcher. I opted to use the Standard -image for my x86~64~ architecture. - -Once the USB is ready, plug it into the machine and reboot. Note that -you may have to use a key such as `Esc` or `F1-12` -to access the boot menu. The Alpine Linux terminal will load quickly and -for a login. - -To log in to the installation image, use the `root` account; -there is no password. Once logged-in, execute the setup command: - -```sh -setup-alpine -``` - -The setup script will ask a series of questions to configure the system. -Be sure to answer carefully or else you may have to re-configure the -system after boot. - -- Keyboard Layout (Local keyboard language and usage mode, e.g., us - and variant of us-nodeadkeys.) -- Hostname (The name for the computer.) -- Network (For example, automatic IP address discovery with the - "DHCP" protocol.) -- DNS Servers (Domain Name Servers to query. For privacy reasons, it - is NOT recommended to route every local request to servers like - Google's 8.8.8.8 .) -- Timezone -- Proxy (Proxy server to use for accessing the web. Use "none" for - direct connections to the internet.) -- Mirror (From where to download packages. Choose the organization you - trust giving your usage patterns to.) -- SSH (Secure SHell remote access server. "Openssh" is part of the - default install image. Use "none" to disable remote login, e.g. on - laptops.) -- NTP (Network Time Protocol client used for keeping the system clock - in sync with a time-server. Package "chrony" is part of the - default install image.) -- Disk Mode (Select between diskless (disk="none"), "data" or - "sys", as described above.) - -Once the setup script is finished, be sure to reboot the machine and -remove the USB device. - -```sh -reboot -``` - -### Post-Installation - -There are many things you can do once your Alpine Linux system is up and -running, and it largely depends on what you'll use the machine for. -I'm going to walk through my personal post-installation setup for my -web server. - -1. Upgrade the System - - First, login as `root` in order to update and upgrade the - system: - - ```sh - apk -U upgrade - ``` - -2. Adding a User - - I needed to add a user so that I don't need to log in as root. Note - that if you're used to using the `sudo` command, you - will now need to use the `doas` command on Alpine Linux. - - ```sh - apk add doas - adduser <username> - adduser <username> wheel - ``` - - You can now log out and log back in using the newly-created user: - - ```sh - exit - ``` - -3. Enable Community Packages - - In order to install more common packages that aren't found in the - `main` repository, you will need to enable the - `community` repository: - - ```sh - doas nano /etc/apk/repositories - ``` - - Uncomment the community line for whichever version of Alpine you're - running: - - ```sh - /media/usb/apks - http://dl-cdn.alpinelinux.org/alpine/v3.16/main - http://dl-cdn.alpinelinux.org/alpine/v3.16/community - #http://dl-cdn.alpinelinux.org/alpine/edge/main - #http://dl-cdn.alpinelinux.org/alpine/edge/community - #http://dl-cdn.alpinelinux.org/alpine/edge/testing - ``` - -4. Install Required Packages - - Now that the community packages are available, you can install any - packages you need. In my case, I installed the web server packages I - need for my services: - - ```sh - doas apk add nano nginx docker docker-compose ufw - ``` - -5. SSH - - If you didn't install OpenSSH as part of the installation, you can - do so now: - - ```sh - doas apk add openssh - ``` - - Next, either create a new key or copy your SSH key to the server - from your current machines: - - ```sh - # Create a new key - ssh-keygen - ``` - - If you need to copy an existing SSH key from a current machine: - - ```sh - # Copy key from existing machines - ssh-copy-id <username>@<ip_address> - ``` - -6. Firewall - - Lastly, I installed `ufw` above as my firewall. To set - up, default to deny incoming and allow outgoing connections. Then - selectively allow other ports or apps as needed. - - ```sh - doas ufw default deny incoming - doas ufw default allow outgoing - doas ufw allow SSH - doas ufw allow "WWW Full" - doas ufw allow 9418 # Git server port - ``` - -7. Change Hostname - - If you don't like the hostname set during installation, you just - need to edit two files. First, edit the simple hostname file: - - ```sh - doas nano /etc/hostname - ``` - - ```sh - <hostname> - ``` - - Next, edit the `hosts` file: - - ```sh - doas nano /etc/hosts - ``` - - ```sh - 127.0.0.1 <hostname>.local <hostname> localhost.local localhost - ::1 <hostname> <hostname>.local - ``` - -## Nginx Web Server - -To set up my web server, I simply created the `www` user and -created the necessary files. - -```sh -doas adduser -D -g 'www' www -mkdir /www -doas mkdir /www -doas chown -R www:www /var/lib/nginx/ -doas chown -R www:www /www -``` - -If you're running a simple webroot, you can alter the main -`nginx.conf` file. Otherwise, you can drop configuration -files in the following directory. You don't need to enable or symlink -the configuration file like you do in other systems. - -```sh -doas nano /etc/nginx/http.d/example_website.conf -``` - -Once the configuration is set and pointed at the `/www` -directory to serve files, enable the Nginx service: - -```sh -# Note that 'default' must be included or Nginx will not start on boot -doas rc-update add nginx default -``` - -## Docker Containers - -Docker works exactly the same as other systems. Either execute a -`docker run` command or create a -`docker-compose.yml` file and do -`docker-compose up -d`. - -## Git Server - -I went in-depth on how to self-host a git server in another post: -[Self-Hosting a Personal Git Server](/blog/git-server/). - -However, there are a few differences with Alpine. First note that in -order to change the `git` user's shell, you must do a few -things a little different: - -```sh -doas apk add libuser -doas touch /etc/login.defs -doas mkdir /etc/default -doas touch /etc/default/useradd -doas lchsh git -``` - -## Thoughts on Alpine - -So far, I love Alpine Linux. I have no complaints about anything at this -point, but I'm not completely finished with the migration yet. Once -I'm able to upgrade my hardware to a rack-mounted server, I will -migrate Plex and Syncthing over to Alpine as well - possibly putting -Plex into a container or VM. - -The performance is stellar, the `apk` package manager is -seamless, and system administration tasks are effortless. My only regret -is that I didn't install Alpine sooner. |