[{"content":" Overview # A BIOS update typically wipes the Secure Boot keys, which usually means a full IncusOS reinstall. This guide covers that process end to end on a Dell OptiPlex 3070.\nReference video: IncusOS installation walkthrough\nSteps at a glance:\nPrepare the BIOS Build the installer image Organize the installer files Create the seed configuration files Build the seed and flash the USB Install IncusOS Set the default Incus remote 1. Prepare the BIOS # On the original install, two BIOS changes were needed:\nSecure Boot keys: Delete some or all of the existing boot key certificates. SupportAssist: Disable the SupportAssist options. Without the SupportAssist change, the Dell SupportAssist Pre-Boot System Performance Check runs on its own after the key changes and reboot. Once it finishes testing memory, it reports:\nHardware scan complete with no issues. Your machine will restart and download cSOS for recovery. Disabling SupportAssist in the BIOS stops this.\n2. Build the Installer Image # Open the IncusOS Customizer and configure it as follows.\nImage # Field Value Image Type USB – Writable, can be used either for installation or for running the system directly Image Usage Installation – Install IncusOS on a boot disk Image architecture x86_64 – For 64-bit Intel and AMD systems Image application Incus (LTS 7.0) – Container and VM private cloud platform Installation target # Setting Value Wipe the target drive ✅ Checked Automatically reboot after installation ✅ Checked Target Drive Identifier (specific drive selection) Blank Target Drive Bus (flexible drive selection) Blank Target drive minimum size 900 GiB Target drive maximum size 1000 GiB Target drive selection criteria Expect a single drive to match (fail if more than one matches) The size filters bracket the OptiPlex 3070\u0026rsquo;s 953.9 GiB disk. Adjust them for your hardware.\nConfiguration and authentication # Default configuration: Check Apply default configuration. OIDC authentication: Leave unconfigured. TLS client certificate: Reinstalling with an existing client cert: retrieve it on your workstation with:\nincus remote get-client-certificate Otherwise: generate a new certificate in the UI.\nClick Download when done.\n3. Organize the Installer Files # Create this folder structure:\nIncusOS_Install/ ├── flasher_tool/ └── IncusOS_Files/ Move the downloaded IncusOS .img file into IncusOS_Files/. Copy (don\u0026rsquo;t move) the same .img file into flasher_tool/. You should now have two identical copies: a pristine original in IncusOS_Files/ and a working copy in flasher_tool/.\n4. Create the Seed Configuration Files # Create the following files in flasher_tool/.\nincus.yaml # Paste in your certificate and adjust values as needed:\nversion: \u0026#34;1\u0026#34; apply_defaults: true preseed: config: core.https_address: \u0026#34;[::]:8443\u0026#34; certificates: - name: system-admin type: client certificate: | INSERT CERTIFICATE HERE install.yaml # version: \u0026#34;1\u0026#34; force_install: true force_reboot: true If the installer reports that IncusOS is already installed, you\u0026rsquo;ll need a confirmation key in this file. See Installer says IncusOS is already installed.\nnetwork.yaml # Use the interface name found with ip link show (see Secure Boot blocks the installer):\nconfig: interfaces: - name: \u0026#34;enp1s0\u0026#34; hwaddr: \u0026#34;enp1s0\u0026#34; addresses: - \u0026#34;192.168.0.34/24\u0026#34; routes: - to: \u0026#34;0.0.0.0/0\u0026#34; via: \u0026#34;192.168.0.1\u0026#34; dns: nameservers: - \u0026#34;8.8.8.8\u0026#34; 5. Build the Seed and Flash the USB # From a terminal in flasher_tool/:\nConfirm a fresh copy of the original IncusOS .img file is present.\nDelete any seed.tar left over from a previous attempt.\nCreate the seed archive:\ntar -cf seed.tar incus.yaml install.yaml Run the flasher tool to produce the seeded image:\n~/go/bin/flasher-tool --format img --seed ./seed.tar --image ./IncusOS_202607011621.img Write the resulting .img file to a USB drive.\n6. Install IncusOS # Plug the USB drive into the target machine. Power on and press F12 repeatedly to open the boot menu. Select the USB drive. Let the installer run, and remove the USB drive when prompted. The machine reboots automatically into IncusOS. The server\u0026rsquo;s IP address is shown at the bottom of the screen once it boots. 7. Set the Default Incus Remote # On your workstation:\n# Check the current default remote incus remote get-default # Make the IncusOS server the default incus remote switch IncusOS # Confirm the change incus remote get-default Troubleshooting # Secure Boot blocks the installer # If you can\u0026rsquo;t get past Secure Boot, wipe the internal drive from a live Linux session:\nDisable Secure Boot in the BIOS.\nWrite a Linux Mint ISO to a USB drive and boot from it. Do not install Mint.\nOpen a terminal and find your network interface name (e.g. enp1s0). Note it for network.yaml:\nip link show Identify the internal drive:\nlsblk Internal drive: usually /dev/nvme0n1 (NVMe) or /dev/sda (SATA) USB drive: usually /dev/sdb or /dev/sdc Wipe the internal drive completely, including partition tables and encryption headers:\nsudo wipefs -a /dev/nvme0n1 Write a fresh, blank GPT partition table:\nsudo parted /dev/nvme0n1 mklabel gpt Shut down, remove the Mint USB, and insert the IncusOS installer USB.\nPower on, press F2 to enter the BIOS, re-enable Secure Boot, and boot.\nThe system should now boot straight into the installer.\n⚠️ wipefs and parted destroy all data on the target drive. Double-check the device name with lsblk first.\nInstaller says IncusOS is already installed # If booting the USB produces this error:\nSystem check error: IncusOS is already installed on this system: to confirm overwriting, add ForceInstallConfirmation=xxxxxx to the install seed and reboot. IncusOS is unable to run until this problem is resolved. Record the xxxxxx key.\nUpdate install.yaml:\nversion: \u0026#34;1\u0026#34; force_install: true force_install_confirmation: \u0026#34;xxxxxx\u0026#34; force_reboot: true In flasher_tool/, delete the previously seeded .img and replace it with a fresh copy from IncusOS_Files/.\nRepeat Step 5.\nThe key changes on every install attempt. The only way to get it is to boot the installer USB and read the error, then redo the seed with the new key.\nMaintenance # Updating and rebooting # Automatic updates are disabled on this server, so updates run manually from the workstation with the incus client.\nTask Command Notes Show current version incus admin os show Shows os_version and os_version_next. A blank os_version_next means you\u0026rsquo;re on the latest version. Check for updates incus admin os system update check Normally returns no output. Reboot the server incus admin os system reboot Network settings # incus admin os system network show incus admin os system network edit incus admin os system network confirm Other commands # incus list Web UI # URL: https://192.168.0.34:8443/ The UI authenticates with a certificate, so there\u0026rsquo;s no username or password. The certificate imported successfully only into Firefox; importing it into Chrome didn\u0026rsquo;t work.\n","date":"14 November 2026","externalUrl":null,"permalink":"/guides/incusos-installation-guide/","section":"Guides","summary":"","title":"IncusOS Installation Guide","type":"guides"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/alpine-linux/","section":"Tags","summary":"","title":"Alpine-Linux","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/apache/","section":"Tags","summary":"","title":"Apache","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/dell-optiplex/","section":"Tags","summary":"","title":"Dell-Optiplex","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/guides/","section":"Guides","summary":"","title":"Guides","type":"guides"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/homelab/","section":"Tags","summary":"","title":"Homelab","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/incus/","section":"Tags","summary":"","title":"Incus","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/incusos/","section":"Tags","summary":"","title":"Incusos","type":"tags"},{"content":" Overview # This guide covers installing MediaWiki on an Alpine Linux container running in Proxmox. The stack is Apache with php-fpm, MariaDB, APCu object caching, and PHP OPcache.\nSteps at a glance:\nPrepare the container Install Apache Install PHP Install and configure MariaDB Download MediaWiki Switch Apache to php-fpm Install the APCu extension Secure the upload directory Run the MediaWiki installer Enable PHP OPcache Replace these placeholders throughout:\nPlaceholder Meaning username Your Linux admin username username_wiki The MariaDB user for the wiki password The MariaDB wiki user\u0026rsquo;s password IP_ADDRESS The container\u0026rsquo;s IP address 1. Prepare the Container # Turn on the firewall # In the Proxmox web interface, assign the container to the appropriate security groups and turn on its firewall.\nCreate an admin user with doas # doas is a lightweight alternative to sudo. As root:\nInstall doas:\napk add doas Create your user (enter a password when prompted) and add it to the wheel group:\nadduser username adduser username wheel Open the doas config:\nvi /etc/doas.d/doas.conf Add this line at the end so wheel members can use root privileges through doas, then save and close:\npermit persist :wheel Switch to the new account:\nsu - username Test doas. Enter your password when prompted and confirm that vi opens:\ndoas vi test.txt Type exit twice to leave the new account and then the root session. Confirm you can no longer log in as root, then log in as your new user.\nInstall updates # doas apk update doas apk upgrade Lock the root account # doas passwd -l root Set the timezone # Install the timezone database, point /etc/localtime at the Central zone (creating the symlink), and write the zone name to /etc/timezone as a plain-text record:\ndoas apk add tzdata doas ln -sf /usr/share/zoneinfo/CST6CDT /etc/localtime echo \u0026#34;CST6CDT\u0026#34; | doas tee /etc/timezone Use tee for the last command. With doas echo \u0026quot;CST6CDT\u0026quot; \u0026gt; /etc/timezone, the \u0026gt; redirect still runs as your user and fails with \u0026ldquo;Permission denied.\u0026rdquo;\nInstall the OpenRC init system # doas apk add openrc 2. Install Apache # Install Apache, start it, and enable it at boot:\ndoas apk add apache2 doas rc-service apache2 start doas rc-update add apache2 Browse to http://IP_ADDRESS and confirm you see the \u0026ldquo;It works\u0026rdquo; page.\n3. Install PHP # Install PHP, its extensions, curl, ImageMagick, and diffutils:\ndoas apk add curl php php-mysqli php-dom php-apache2 php-mbstring php-fpm php-ctype php-json php-curl php-fileinfo php-iconv php-intl php-session php-gd php-xml php-xmlreader php-xmlwriter imagemagick diffutils Optional: Older guides also set a PHP version variable as shown below. It isn\u0026rsquo;t needed for this install.\nexport phpverx=$(alpinever=$(cat /etc/alpine-release|cut -d \u0026#39;.\u0026#39; -f1);[ $alpinever -ge 9 ] \u0026amp;\u0026amp; echo 7|| echo 5) Restart Apache:\ndoas rc-service apache2 restart Create a test page in the web root:\ncd /var/www/localhost/htdocs/ doas vi phpinfo.php Press i to insert, then paste:\n\u0026lt;?php echo phpinfo(); ?\u0026gt; Browse to http://IP_ADDRESS/phpinfo.php. A PHP configuration page means Apache and PHP are working together.\nDelete the test file:\ndoas rm phpinfo.php 4. Install and Configure MariaDB # Install MariaDB and run its initial setup:\ndoas apk add mysql mysql-client doas /etc/init.d/mariadb setup Start it and enable it at boot:\ndoas rc-service mariadb start doas rc-update add mariadb default Secure the installation:\ndoas mysql_secure_installation When prompted:\nSwitch to unix_socket authentication Change the MariaDB root password Remove anonymous user accounts Disable remote root logins Remove test databases Connect as root (enter the root password when prompted):\nmariadb -u root -p Create the wiki database and user, then grant access:\nCREATE DATABASE my_wiki; CREATE USER \u0026#39;username_wiki\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;password\u0026#39;; GRANT ALL PRIVILEGES ON my_wiki.* TO \u0026#39;username_wiki\u0026#39;@\u0026#39;localhost\u0026#39; WITH GRANT OPTION; Type exit to leave MariaDB.\n5. Download MediaWiki # Check the MediaWiki download page for the current release, and set these two variables to match it. The values below are an example for the 1.43 long-term support (LTS) branch:\nMW_BRANCH=1.43 MW_VERSION=1.43.6 MediaWiki 1.45 and later require PHP 8.2 or newer. The PHP 8.3 packages used in this guide meet that requirement.\nCreate the webapps directory and download MediaWiki from your home directory:\ndoas mkdir -p /usr/share/webapps/ cd /home/username/ doas curl https://releases.wikimedia.org/mediawiki/${MW_BRANCH}/mediawiki-${MW_VERSION}.tar.gz \u0026gt;mw.tar.gz Move the archive into place, unpack it, rename the folder, and delete the tarball:\ndoas mv mw.tar.gz /usr/share/webapps/ cd /usr/share/webapps/ doas tar zxvf mw.tar.gz doas mv mediawiki-${MW_VERSION} mediawiki doas rm mw.tar.gz Give the apache user ownership and link MediaWiki into the web root:\ndoas chown -R apache /usr/share/webapps/ doas ln -s /usr/share/webapps/mediawiki/ /var/www/localhost/htdocs/mediawiki Restart Apache:\ndoas rc-service apache2 restart 6. Switch Apache to php-fpm # Based mostly on the Alpine Linux wiki article Apache with php-fpm.\nInstall the Apache proxy module and php-fpm, then start php-fpm and enable it at boot:\ndoas apk add apache2-proxy php-fpm doas rc-service php-fpm83 start doas rc-update add php-fpm83 Edit the main Apache config:\ndoas vi /etc/apache2/httpd.conf Enable the event MPM by removing the leading #:\nLoadModule mpm_event_module modules/mod_mpm_event.so Make sure the prefork MPM is commented out:\n#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so Add this to the bottom of the file, then save and close:\n\u0026lt;FilesMatch \\.php$\u0026gt; SetHandler \u0026#34;proxy:fcgi://127.0.0.1:9000\u0026#34; \u0026lt;/FilesMatch\u0026gt; Disable mod_php. Open its config:\ndoas vi /etc/apache2/conf.d/php83-module.conf Comment out these lines, then save and close:\n#LoadModule php_module modules/mod_php8.so #DirectoryIndex index.php index.html #\u0026lt;FilesMatch \\.php$\u0026gt; # SetHandler application/x-httpd-php #\u0026lt;/FilesMatch\u0026gt; Set php-fpm to run as apache. Open the pool config:\ndoas vi /etc/php83/php-fpm.d/www.conf Set these values, then save and close:\nuser = apache group = apache Restart both services:\ndoas rc-service php-fpm83 restart \u0026amp;\u0026amp; doas rc-service apache2 restart 7. Install the APCu Extension # Adapted from \u0026ldquo;How to Install PHP APCu on Ubuntu 16.04\u0026rdquo;.\nCheck whether APCu is already installed. If this returns nothing, continue:\nphp -m | grep -i apcu Install the packages pecl needs:\ndoas apk --no-cache add php-pear php83-dev gcc musl-dev make Install APCu. Answer no when asked about debugging:\ndoas pecl install apcu Open the PHP config:\ndoas vi /etc/php83/php.ini Add this line to the bottom of the file:\nextension=apcu.so Verify APCu is enabled, then restart both services:\nphp -m | grep -i apc doas rc-service php-fpm83 restart doas rc-service apache2 restart 8. Secure the Upload Directory # Stop scripts from running in MediaWiki\u0026rsquo;s images upload directory.\nOpen the Apache config:\ndoas vi /etc/apache2/httpd.conf The Header directive in the block below needs Apache\u0026rsquo;s headers module. Find this line and make sure it\u0026rsquo;s uncommented (no leading #):\nLoadModule headers_module modules/mod_headers.so Without this module, Apache will fail to start with an \u0026ldquo;Invalid command \u0026lsquo;Header\u0026rsquo;\u0026rdquo; error.\nAdd this block anywhere in the file:\n\u0026lt;Directory \u0026#34;/var/www/localhost/htdocs/mediawiki/images\u0026#34;\u0026gt; # Ignore .htaccess files AllowOverride None # Serve HTML as plaintext, don\u0026#39;t execute SHTML AddType text/plain .html .htm .shtml .phtml .php .php3 .php4 .php5 .php7 # Old way of registering php with AddHandler RemoveHandler .php # Recent way of registering php with SetHandler \u0026lt;FilesMatch \u0026#34;\\.ph(p[3457]?s?|tml)$\u0026#34;\u0026gt; SetHandler None \u0026lt;/FilesMatch\u0026gt; # Tell browsers to not sniff files Header set X-Content-Type-Options nosniff \u0026lt;/Directory\u0026gt; Save and close, then restart Apache:\ndoas rc-service apache2 restart 9. Run the MediaWiki Installer # Browse to:\nhttp://IP_ADDRESS/mediawiki/mw-config/index.php Fill out the installation form. Make sure to:\nSet the wiki type to Private Wiki Select VisualEditor Under Settings for Object Caching, select PHP object caching (APC, APCu or WinCache) On the final page, the installer downloads LocalSettings.php. Open it in a text editor on your local machine and copy its contents.\nOn the container, create the file in the MediaWiki directory:\ncd /usr/share/webapps/mediawiki/ doas vi LocalSettings.php Press i to insert, paste the contents, and check that everything pasted correctly from top to bottom.\nConfirm $wgMainCacheType is set to CACHE_ACCEL, then save and close:\n$wgMainCacheType = CACHE_ACCEL; Restart both services:\ndoas rc-service php-fpm83 restart doas rc-service apache2 restart 10. Enable PHP OPcache # Install the OPcache extension:\ndoas apk add php-opcache Open the PHP config:\ndoas vi /etc/php83/php.ini Find and uncomment these lines, then save and close:\nopcache.enable=1 opcache.memory_consumption=128 opcache.max_accelerated_files=10000 opcache.revalidate_freq=200 Restart Apache:\ndoas rc-service apache2 restart Accessing MediaWiki # Once setup is complete, MediaWiki is available at:\nhttp://IP_ADDRESS/mediawiki http://wiki.home.lan (local DNS name) Troubleshooting # A directory listing appears instead of the wiki # If http://IP_ADDRESS/mediawiki shows a mediawiki/ directory listing:\nOpen the Apache config:\ndoas vi /etc/apache2/httpd.conf Find this block and change index.html to index.php, then save and close:\n\u0026lt;IfModule dir_module\u0026gt; DirectoryIndex index.php \u0026lt;/IfModule\u0026gt; Restart Apache:\ndoas rc-service apache2 restart ","date":"14 November 2026","externalUrl":null,"permalink":"/guides/mediawiki-alpine-linux-install/","section":"Guides","summary":"","title":"Installing MediaWiki on Alpine Linux","type":"guides"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/mariadb/","section":"Tags","summary":"","title":"Mariadb","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/mediawiki/","section":"Tags","summary":"","title":"Mediawiki","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/php/","section":"Tags","summary":"","title":"Php","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/proxmox/","section":"Tags","summary":"","title":"Proxmox","type":"tags"},{"content":"","date":"14 November 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"Here\u0026rsquo;s my collection of guides that I\u0026rsquo;ve put together for personal use and reference.\n","date":"14 November 2026","externalUrl":null,"permalink":"/","section":"Welcome","summary":"","title":"Welcome","type":"page"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]