
[{"content":"This blog is a personal project operated by 0x03ff. To ensure you can use the services and information on this website with peace of mind, this privacy policy explains how data is handled to protect your rights.\nData Collection \u0026amp; Usage # As a static site built with Hugo, this blog does not natively track visitors, run user registration accounts, or sell personal data. However, basic data may be processed through standard operations:\nServer Logs: The hosting provider (e.g., GitHub Pages, Netlify, Vercel) automatically logs standard technical data—such as your IP address, browser type, and visit timestamp—solely for security, performance, and uptime monitoring. Direct Communication: If you reach out via email or submit a comment using an external form, any personal details provided (like your name or email address) are used exclusively to reply to your inquiry. Third-Party Content \u0026amp; Links # Embedded Content: Articles on this site may include embedded content (e.g., videos, code snippets, or images). Embedded content from third-party websites behaves in the exact same way as if you visited those external sites directly. External Links: This blog contains links to external platforms (such as GitHub, Docker Hub, and open-source documentation). We are not responsible for the privacy practices or content of these external services. Your Rights \u0026amp; Contact # You have the right to request the deletion of any personal data you have directly submitted (such as email communications).\nIf you have any questions or concerns regarding this policy, please reach out via the Contact Page.\n","date":"30 July 2026","externalUrl":null,"permalink":"/privacy-policy/","section":"Welcome to My Site","summary":"","title":"Privacy Policy","type":"page"},{"content":"Welcome to my personal tech blog! Here I document my homelab experiments, system setups, embedded device tweaks, and daily notes.\nWhat You\u0026rsquo;ll Find Here # Different Platforms: Exploring diverse platforms, everyday Linux workflows, self-hosted cloud services, and virtualization technologies Networking \u0026amp; Services: Docker deployments, self-hosted applications and network security. Daily Notes \u0026amp; Setup: Workstation configurations, operating system setups, and technical notes. Contacts # Email: 00x03ff@gmail.com Github 0x03ff Feel free to explore the posts or filter content by categories.\n","date":"30 July 2026","externalUrl":null,"permalink":"/about/","section":"Welcome to My Site","summary":"","title":"About","type":"page"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/tags/adguard-home/","section":"Tags","summary":"","title":"Adguard-Home","type":"tags"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/tags/armbian/","section":"Tags","summary":"","title":"Armbian","type":"tags"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/tags/docker/","section":"Tags","summary":"","title":"Docker","type":"tags"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/posts/","section":"Posts","summary":"","title":"Posts","type":"posts"},{"content":" Introduction # Since an Armbian device is usually wired directly to the router and sits idle, it makes an ideal home server for lightweight network services like OpenWrt, Pi-hole, or AdGuard Home.\nWhile OpenWrt requires significant effort to configure properly and Pi-hole often demands ongoing maintenance, AdGuard Home strikes the perfect balance with its clean user interface and easy setup.\n1. Installing Docker on Armbian # First, install Docker using the built-in Armbian configuration utility:\nsudo armbian-config --cmd CON001 Once installed, verify that both Docker and Docker Compose are available on the system:\ndocker --version docker compose version The result should be similar to this:\nDocker version 29.1.3, build 29.1.3-0ubuntu4.1 Docker Compose version 2.40.3+ds1-0ubuntu1 2. Setting Up Docker Compose # It is best practice to keep the Docker setup inside a dedicated directory for easier management and debugging. Create a directory for docker configuration:\nmkdir -p ~/docker \u0026amp;\u0026amp; cd ~/docker nano docker-compose.yml Paste the following YAML configuration into the file (press Ctrl+O, Enter to save, then Ctrl+X to exit):\nservices: adguardhome: image: adguard/adguardhome:latest container_name: adguardhome restart: unless-stopped # Volumes persist your filters, stats, and configurations volumes: - ./workdir:/opt/adguardhome/work - ./confdir:/opt/adguardhome/conf ports: - \u0026#34;53:53/tcp\u0026#34; - \u0026#34;53:53/udp\u0026#34; # Core DNS service - \u0026#34;8000:80/tcp\u0026#34; # HTTP Web UI (after setup) - \u0026#34;443:443/tcp\u0026#34; # HTTPS Web UI / DNS-over-HTTPS - \u0026#34;443:443/udp\u0026#34; # DNS-over-QUIC - \u0026#34;3000:3000/tcp\u0026#34; # Initial Setup Wizard - \u0026#34;853:853/tcp\u0026#34; # DNS-over-TLS # Optional: If you intend to use AdGuard as a DHCP server, uncomment the lines below # cap_add: # - NET_ADMIN # network_mode: \u0026#34;host\u0026#34; Note: Mapping host port 8000 to container port 80 prevents conflicts with other applications running on common web ports like 80 or 8080.\n3. Resolving the Port 53 DNS Conflict # On Debian and Ubuntu distributions, the default systemd-resolved daemon listens on port 53. This creates a conflict with AdGuard Home or Pi-hole, preventing the container from starting because the port is already bound. It can also disrupt mesh network tools like Tailscale.\nFollow these steps to free up port 53:\nConfiguration 1. Disable the stub listener in systemd-resolved\nLog in via SSH or open a terminal. Edit the systemd-resolved configuration file:\nsudo nano /etc/systemd/resolved.conf Look for the DNS= and DNSStubListener=yes lines (or add them at the bottom) and set them as follows:\nDNS=127.0.0.1 DNSStubListener=no Create a symbolic link so Armbian points directly to the real resolved file instead of the port 53 stub listener:\nsudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf Verification 2. Restart systemd-resolved \u0026amp; verify port 53\nApply the changes by restarting systemd-resolved and Check if anything is still listening on port 53:\nsudo systemctl restart systemd-resolved sudo ss -lpnt | grep :53 Expected Result: If the last command returns blank (no output), port 53 is officially free.\n4. Launching AdGuard Home \u0026amp; Initial Setup # Now, start the AdGuard Home container from the ~/docker/ directory:\nsudo docker compose up -d Assuming the device is in bridge mode and has a static IP address on the local network (e.g., 192.168.0.50 by router or device config) open your browser and navigate to the setup wizard:\nhttp://192.168.0.50:3000/install.html Complete the initial setup wizard and create admin account:\n5. System Configuration # Go to DNS Settings and configure the Upstream DNS servers:\ntls://dns.google https://dns.google/dns-query tls://dns11.quad9.net https://dns11.quad9.net/dns-query Next, add the Bootstrap DNS servers:\n8.8.8.8 8.8.4.4 9.9.9.11 149.112.112.11 Under DNS server configuration, setting Rate limit to 0 (disabled)\nEncryption Settings: Local network setups usually do not require encryption unless AdGuard Home connects to a public network or routing via Tailscale.\n6. Adding DNS Blocklists \u0026amp; Rules # You can find popular third-party blocklists depending on needs, such as:\nhagezi/dns-blocklists DNS-Blocklists: For a better internet - keep the internet clean! Text 24896 759 HaGeZi Multi Pro (The \u0026ldquo;Ad \u0026amp; Privacy\u0026rdquo; Filter)\nGreat balance between aggressive ad/tracker blocking and zero website breakage\nhttps://raw.githubusercontent.com/hagezi/dns-blocklists/main/adblock/pro.txt HaGeZi Threat Intelligence Feeds mini\nBlocks active malware, phishing, scam, and cryptojacking domains.\nhttps://cdn.jsdelivr.net/gh/hagezi/dns-blocklists@latest/adblock/tif.mini.txt To add these, navigate to Filters \u0026gt; DNS Blocklists \u0026gt; Add blocklist \u0026gt; Add a custom list: DNS Allowlists: Use this section to unblock any websites that accidentally get caught in your blocklists.\nDNS Rewrites: Acts like a local DNS server, allowing you to map custom domain names (e.g., nas.local) to local IP addresses.\nConclusion # To wrap up, configure the client devices (or the router\u0026rsquo;s DHCP settings) to use the device\u0026rsquo;s IP address as their primary DNS servers. It is also good practice to set a public DNS server (like 8.8.8.8 or 1.1.1.1) as a secondary DNS option on the router level, ensuring network connectivity isn\u0026rsquo;t lost if the AdGuard Home server undergoes maintenance.\n","date":"28 July 2026","externalUrl":null,"permalink":"/posts/running-adguard-home-by-docker-on-armbian/","section":"Posts","summary":"","title":"Running AdGuard Home via Docker on Armbian","type":"posts"},{"content":" Introduction # The X96 Mini runs quite hot, idling around 58 °C even at standby. This happens partly because Linux and Android handle hardware power management differently at the kernel level. Furthermore, missing closed-source vendor drivers (e.g., Amlogic) under Linux can result in higher overall power consumption.\nWhile the stock X96 Mini comes with poor thermal design, it remains quite usable for low-to-mid workload tasks if cooled properly. The original setup relies on a low-quality thermal pad that barely connects the CPU to a thin metal plate:\nBecause heat transfer is so inefficient with the stock setup, hot air gets trapped inside and heats up the entire top of the enclosure.\nThe Modification # To improve hea\nt dissipation, I repurposed a northbridge heatsink salvaged from an old motherboard:\nSince the new heatsink was taller than the enclosure clearance, I had to cut out a section of the bottom cover.\nHowever, opening up the case was necessary anyway to allow better overall airflow:\nConclusion # Finally, I placed the modified X96 Mini underneath my router and used an external USB power supply to drive a repurposed USB cooling fan.\nHere is the final setup layout like:\nSystem temperatures can be easily monitored using:\narmbianmonitor -m ","date":"28 July 2026","externalUrl":null,"permalink":"/posts/improve-cooling-system-on-x96-mini/","section":"Posts","summary":"","title":"Improving the Cooling System on the X96 Mini","type":"posts"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/categories/daily/","section":"Categories","summary":"","title":"Daily","type":"categories"},{"content":" Introduction # Today, there are many cheap Android TV boxes on the market. They can stream 4K video smoothly, support HDMI-CEC, and offer a solid TV experience at a low price point.\nI found this TV box a few weeks ago. It is roughly a several years old from an era when streaming apps were much less common.\nSince the box was still functional, I plugged in an HDMI cable and a USB keyboard (since the original remote control was missing) to check the system overview:\nWith only 2 GB of RAM, running modern Android applications is difficult, and official system updates are no longer available. This led me to search online for alternative uses for old TV boxes.\nAccording to Linus Tech Tips and Reddit discussions, some cheap Android TV boxes come with malware pre-installed out of the box:\nReddit: X96 Mini stock firmware has malware, where to find clean alt?\nConsidering the security risks and the lack of system updates, installing a fresh operating system is necessary to make these boxes useful again.\nPopular open-source options include OpenWrt, LibreELEC, and other media OSs. However, OpenWrt is mainly focused on networking, and media consumption is better handled on other devices. Therefore, I decided to install a lightweight Linux distribution on it.\nArmbian is a specialized Linux distribution based on Debian/Ubuntu optimized for ARM architecture devices (though it can work on x86 as well). It provides a user-friendly setup that is great for beginners.\nFirst, identify the exact board model and CPU chipset of your device. My device is an X96 Mini with an Amlogic S905W processor (shown as s905w or s905 series):\nI followed this YouTube tutorial for guidance. Although the video is in Chinese, the general process is identical across most guides:\nChinese: 支持多种机型，给电视盒子刷入Armbian，变身迷你电脑: Supports multiple models; flash Armbian onto your TV box to transform it into a mini computer Step 1: Booting Armbian from External Storage # 1. Download the ISO Image from GitHub Download Obtain firmware Go to the page. Find the latest build that matches your CPU architecture (e.g., Amlogic S905W), download it, and extract the image file. 2. Flash Image to Boot Drive Flash SD Card / USB Flash the extracted .img file onto a USB drive or MicroSD card using a tool like BalenaEtcher or Rufus. On the X96 Mini, using the MicroSD card slot is usually recommended for boot priority. 3. Configure the DTB Boot File Config DTB Selection Open the flashed boot drive on your computer. Navigate to /boot/dtb/amlogic/ and locate the .dtb file corresponding to your CPU model (e.g., meson-gxl-s905w-x96-mini.dtb). Copy the exact filename. Then, open /boot/uEnv.txt in a text editor and update the line to match your file name: FDT=/dtb/amlogic/your-dtb-name.dtb 4. Boot and Configure Armbian First Boot System Setup Insert the boot drive into the device. To enter recovery/boot mode on the X96 Mini, use a toothpick or small pin to press and hold the hidden button inside the AV port while plugging in the power cable. Hold it for a few seconds until the Armbian boot screen appears. Follow the on-screen prompts using your USB keyboard to create your root password and initial user account. Step 2: Installing Armbian to Internal eMMC Storage # Running Armbian off an SD card works, but requires holding the reset button or keeping the SD card inserted on every restart. Some features like Wi-Fi or Bluetooth might also be disabled by default.\nTo make the setup permanent and improve performance, you can flash Armbian directly onto the internal eMMC storage.\nWarning: Installing to internal eMMC storage will overwrite the original Android OS. Proceed with caution as this process carries a risk of bricking your device! 1. Update the On-Board System Terminal Armbian Tools Log in via SSH or directly through the terminal. Update the Armbian utilities by running:\narmbian-update This process may take a few minutes.\nNext, run the upgrade command:\narmbian-upgrade Select your corresponding device ID when prompted (e.g., 113 for the X96 Mini S905W).\n2. Install OS to Internal eMMC Install eMMC Flashing To initiate the installation to internal memory, run:\narmbian-install Follow the on-screen prompts. When asked to choose a file system, select ext4 (the standard file system for general Linux usage).\nConclusion # Once the installation finishes, power off the box, remove the MicroSD card or USB drive, and power it back on. The X96 Mini will now boot directly into Armbian Linux from its internal storage!\n","date":"28 July 2026","externalUrl":null,"permalink":"/posts/how-to-install-armbian-on-x96-mini-tv-box/","section":"Posts","summary":"","title":"How to Install Armbian on X96 Mini TV Box","type":"posts"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/categories/mobile/","section":"Categories","summary":"","title":"Mobile","type":"categories"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/categories/tech/","section":"Categories","summary":"","title":"Tech","type":"categories"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/categories/desktop/","section":"Categories","summary":"","title":"Desktop","type":"categories"},{"content":"","date":"28 July 2026","externalUrl":null,"permalink":"/categories/server/","section":"Categories","summary":"","title":"Server","type":"categories"},{"content":"Explore topics and articles organized by tag:\n","date":"28 July 2026","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"Explore and document hands-on tutorials, Linux configurations, hardware hacks, and practical technology guides.\n","date":"27 July 2026","externalUrl":null,"permalink":"/","section":"Welcome to My Site","summary":"","title":"Welcome to My Site","type":"page"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"}]