{"id":32945,"date":"2026-01-26T16:03:28","date_gmt":"2026-01-26T15:03:28","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=32945"},"modified":"2026-05-07T12:53:11","modified_gmt":"2026-05-07T10:53:11","slug":"want-to-track-how-fast-and-reliable-your-internet-is-speedtest-tracker-on-raspberry-pi","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/en\/want-to-track-how-fast-and-reliable-your-internet-is-speedtest-tracker-on-raspberry-pi\/","title":{"rendered":"Want to track how fast and reliable your internet is? SpeedTest Tracker on Raspberry Pi"},"content":{"rendered":"\n<p>Speedtest Tracker is a tool you can run on your own computer or server. It uses Ookla&#8217;s Speedtest tool to check your connection and is easy to set up with Docker.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Take control of your Internet<\/strong><\/strong><\/h2>\n\n\n\n<p>Why use this? It creates a timeline of your internet speeds and connection reliability. If your ISP isn&#8217;t giving you what they advertised, you&#8217;ll have the evidence to prove it.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img decoding=\"async\" width=\"1024\" height=\"560\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image1-1024x560.png\" alt=\"Speedtest Tracker\" class=\"wp-image-32932\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image1-1024x560.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image1-300x164.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image1-768x420.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image1-1536x840.png 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image1-2048x1121.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Fig. 1 Speedtest Tracker<\/figcaption><\/figure>\n\n\n\n<p>What will we need? Obviously, first and foremost, a Raspberry Pi microcomputer.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"1003\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image2-1024x1003.png\" alt=\"Raspberry Pi\" class=\"wp-image-32934\" style=\"width:514px;height:auto\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image2-1024x1003.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image2-300x294.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image2-768x752.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image2.png 1346w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Fig. 2 Raspberry Pi<\/figcaption><\/figure>\n\n\n\n<p>Raspberry Pi represents a product line of single-board computers developed by the Raspberry Pi Foundation to facilitate computer science education. Following its initial release in 2012, the platform has gained widespread adoption across academic research and maker communities, particularly in IoT development.<\/p>\n\n\n\n<p>SpeedTest Tracker testing will be conducted on the Raspberry Pi 5 (8GB) model, which currently represents the optimal platform given its extensive capabilities, configuration, and performance options.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Getting started<\/strong><\/strong><\/h2>\n\n\n\n<p>It is assumed that the microcomputer already has the official Raspberry Pi OS <a href=\"https:\/\/www.raspberrypi.com\/software\/\" rel=\"nofollow\" >[download]<\/a> operating system and Docker software installed.<\/p>\n\n\n\n<p><strong>Note: <\/strong>Use Docker&#8217;s official installation script, which ensures you get the latest version optimized for ARM architecture:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\n# Download and run Docker&#039;s installation script\ncurl -fsSL https:\/\/get.docker.com -o get-docker.sh\nsudo sh get-docker.sh\n\n# Add your user to docker group (avoid needing sudo every time)\nsudo usermod -aG docker $USER\n\n# Reboot or log out\/in for group changes to take effect\n<\/pre><\/div>\n\n\n<p>After rebooting, test it:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\ndocker --version \ndocker run hello-world\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Installation<\/strong><\/strong><\/h2>\n\n\n\n<p>Speedtest Tracker operates within a Docker container, allowing you to set it up on any system that supports containerization. The team at LinuxServer.io creates the container image \u2013 check the <a href=\"https:\/\/www.linuxserver.io\/our-images?name=linuxserver\/speedtest-tracker\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >link<\/a> for more details on how it&#8217;s built.<\/p>\n\n\n\n<p>For our purposes, we will use Docker Compose. It is a quick and straightforward option.<\/p>\n\n\n\n<p>Docker Compose is the preferred deployment methodology because it automatically orchestrates both the application container and the database instance.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Set up your application key<\/strong><\/strong><\/h3>\n\n\n\n<p>We&#8217;ll need an Application Key. It is required for encryption. Copy the key, including the <strong>base64:<\/strong> prefix, and paste it as your <strong>APP_KEY<\/strong> value. Run the following command to generate it:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\necho -n &#039;base64:&#039;; openssl rand -base64 32;\n<\/pre><\/div>\n\n\n<p>for example:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nraspi@raspi:~\/speedtest_tracker $ echo -n &#039;base64:&#039;; openssl rand -base64 32;\nbase64:Duu3R6xTUjvIMXukcrhrJqI9P4lBXkTAZ5LdRlUok+Y=\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Docker environment setup<\/strong><\/strong><\/h3>\n\n\n\n<p>While SQLite provides adequate functionality for typical deployments, the application also supports conventional RDBMS options, including MariaDB, MySQL, and PostgreSQL.<\/p>\n\n\n\n<p>Create a docker-compose.yaml file:<\/p>\n\n\n\n<p>The user&#8217;s <code>PUID<\/code> and <code>PGID<\/code> values can be obtained by executing the <code>id $user<\/code> command on the host system.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nservices:\n    speedtest-tracker:\n        image: lscr.io\/linuxserver\/speedtest-tracker:latest\n        restart: unless-stopped\n        container_name: speedtest-tracker\n        ports:\n            - 8080:80\n            - 8443:443\n        environment:\n            - PUID=1000\n            - PGID=1000\n            - APP_KEY=base64:UmcouDGUgO&#x5B;redacted]B22uEpVU=\n            - DB_CONNECTION=sqlite\n            - SPEEDTEST_SCHEDULE=&#039;*\/30 * * * *&#039;\n            - APP_TIMEZONE=Europe\/Warsaw\n            - DISPLAY_TIMEZON=Europe\/Warsaw\n            - APP_DEBUG=false\n        volumes:\n            - \/path\/to\/data\/data:\/config\n\t         #  - \/path\/to-custom-ssl-keys:\/config\/keys\n<\/pre><\/div>\n\n\n<p>To use your own SSL certificates, name them <code>cert.crt<\/code> (for the full certificate chain) and <code>cert.key<\/code> (for the private key), then mount them to <code>\/config\/keys<\/code> inside the container.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>Environment variables<\/strong><\/strong><\/h3>\n\n\n\n<p>Configure the required <code><em>PUID<\/em><\/code><em>, <\/em><code><em>PGID, and APP_KEY<\/em><\/code> environment variables before running the application. In my case, I additionally configured the variable <code><em>SPEEDTEST_SCHEDULE <\/em>to run the application every half hour<em>.<\/em><\/code> See the Environment variables section for <a href=\"https:\/\/docs.speedtest-tracker.dev\/getting-started\/environment-variables\" target=\"_blank\" rel=\"noopener\" title=\"\" rel=\"nofollow\" >details<\/a>.<\/p>\n\n\n\n<p>Start the container:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nraspi@raspi:~\/speedtest_tracker $ docker compose up -d\n<\/pre><\/div>\n\n\n<p>Check if the container has been created as expected:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: xml; title: ; notranslate\" title=\"\">\nraspi@raspi:~\/speedtest_tracker $ docker ps | grep linuxserver\/speedtest-tracker\n4472bdc8aea8\u00a0\u00a0 lscr.io\/linuxserver\/speedtest-tracker:latest\u00a0\u00a0 &quot;\/init&quot; 10 months ago\u00a0\u00a0 Up 2 months\u00a0\u00a0 0.0.0.0:8080-&gt;80\/tcp, :::8080-&gt;80\/tcp, 0.0.0.0:8443-&gt;443\/tcp, :::8443-&gt;443\/tcp\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 speedtest-tracker\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\"><strong><strong>First login<\/strong><\/strong><\/h3>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><img decoding=\"async\" width=\"1024\" height=\"891\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image3-1024x891.png\" alt=\"Login to Speedtest Tracker\" class=\"wp-image-32936\" style=\"width:492px;height:auto\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image3-1024x891.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image3-300x261.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image3-768x669.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/image3.png 1066w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">Fig. 3 Login to Speedtest Tracker<\/figcaption><\/figure>\n\n\n\n<p>The default username and password are automatically created during initial container startup.<\/p>\n\n\n\n<p>username: <a href=\"mailto:admin@example.com\" rel=\"nofollow\" >admin@example.com<\/a><\/p>\n\n\n\n<p>password: password<\/p>\n\n\n\n<p>Use these credentials to log in and update the default user information once you&#8217;re inside the application.<\/p>\n\n\n<div class=\"nsw-o-blogersii-banner\">\n            <picture>\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-ITO-Desktop.jpg\" media=\"(min-width: 992px)\" >\n            <source srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-ITO-Mob_.jpg\" media=\"(min-width: 300px)\" >            <img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/04\/Blog-ITO-Desktop.jpg\" alt=\"\"  class=\"\"  >\n        <\/picture>\n        <div class=\"cnt\">\n                    <div class=\"nsw-m-title-block -h3 -invert  -has-title-margin-bottom-0 -has-title-font-weight-bold\">\n                                <h2 class=\"nsw-m-title-block__title\">IT Infrastructure<\/h2>\n                <\/div>\n                            <p class=\"has-nsw-p-4-font-size has-invert-color\">\n                We will take care of your company&#039;s entire IT infrastructure 24\/7, ensuring security, efficiency, and no downtime.\n            <\/p>\n                            <a  href=\"https:\/\/sii.pl\/en\/what-we-offer\/it-infrastructure\/\" class=\"nsw-a-button -ghost -banner-button\"   >\n        <span>IT Infractructure offering<\/span>\n    <\/a>\n            <\/div>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><strong>Summary<\/strong><\/strong><\/h2>\n\n\n\n<p>Speedtest Tracker is a self-hosted, open-source application designed to monitor the performance and uptime of your internet connection. It serves as a replacement for Henry Whitaker&#8217;s abandoned project of the same name, offering an improved UI and an updated feature set.<\/p>\n\n\n\n<p><strong>Core purpose<\/strong><\/p>\n\n\n\n<p>The primary goal of the application is to help users build a historical record of their internet speed and ISP uptime. This data is helpful for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verifying if you are receiving the speeds advertised by your ISP.<\/li>\n\n\n\n<li>Identifying patterns in performance drops.<\/li>\n\n\n\n<li>Having documented proof of service issues.<\/li>\n<\/ul>\n\n\n\n<p><strong>Technical foundation<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Framework: Built using Laravel (PHP).<\/li>\n\n\n\n<li>Engine: Utilizes the Speedtest CLI by Ookla\u00ae for accurate measurements.<\/li>\n\n\n\n<li>Deployment: Designed to be easily deployed via Docker.<\/li>\n<\/ul>\n\n\n\n<p><strong>Key features<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Automated Testing: Schedule speed tests at specific intervals to track performance over time.<\/li>\n\n\n\n<li>Data Visualization: A dashboard that displays your speed history and ISP performance metrics.<\/li>\n\n\n\n<li>Integrations &amp; Notifications: Supports various data integrations and notification systems to alert you if speeds drop below a certain threshold.<\/li>\n\n\n\n<li>Security: Includes built-in authentication, authorization, and encryption.<\/li>\n\n\n\n<li>API Support: Features an API for users who want to interact with their speed test data programmatically.<\/li>\n\n\n\n<li>Database Flexibility: Supports multiple database drivers.<\/li>\n<\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;32945&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;11&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;Want to track how fast and reliable your internet is? SpeedTest Tracker on Raspberry Pi&quot;,&quot;width&quot;:&quot;159&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 159px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            5\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Speedtest Tracker is a tool you can run on your own computer or server. It uses Ookla&#8217;s Speedtest tool to &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/en\/want-to-track-how-fast-and-reliable-your-internet-is-speedtest-tracker-on-raspberry-pi\/\">Continued<\/a><\/p>\n","protected":false},"author":301,"featured_media":32941,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1320],"tags":[7709,5443,1679,1590,1526],"class_list":["post-32945","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-hard-development","tag-ito-en","tag-raspberry-pi-en","tag-docker-en","tag-tools","tag-guidebook"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2026\/01\/Charts.jpg","category_names":["Hard development"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/32945"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/users\/301"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/comments?post=32945"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/32945\/revisions"}],"predecessor-version":[{"id":33795,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/posts\/32945\/revisions\/33795"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media\/32941"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/media?parent=32945"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/categories?post=32945"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/en\/wp-json\/wp\/v2\/tags?post=32945"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}