Openstatus www.openstatus.dev

feat: blog raspberry pi (#1461)

* feat: blog raspberry pi

* fix: typo

* fix: typo

* fix: og description

* chore: update banner

* fix: typo

authored by

Maximilian Kaske and committed by
GitHub
29ed807e ae29e8b3

+229 -2
apps/web/public/assets/posts/deploy-private-locations-raspberry-pi/dashboard-create-private-location.png

This is a binary file and will not be displayed.

apps/web/public/assets/posts/deploy-private-locations-raspberry-pi/dashboard-response-logs.png

This is a binary file and will not be displayed.

apps/web/public/assets/posts/deploy-private-locations-raspberry-pi/raspberry-htop.png

This is a binary file and will not be displayed.

apps/web/public/assets/posts/deploy-private-locations-raspberry-pi/raspberry-pi-receiver.jpg

This is a binary file and will not be displayed.

apps/web/public/assets/posts/deploy-private-locations-raspberry-pi/raspberry-pi.png

This is a binary file and will not be displayed.

+2 -2
apps/web/src/app/(pages)/(content)/layout.tsx
··· 17 17 function Banner() { 18 18 return ( 19 19 <div className="border-b bg-muted/50 px-2 py-3 backdrop-blur-3xl"> 20 - <Link href="/blog/new-dashboard-we-are-so-back"> 20 + <Link href="/blog/deploy-private-locations-raspberry-pi"> 21 21 <div className="group mx-auto flex w-full max-w-4xl flex-row items-center justify-between"> 22 22 <p className="font-medium"> 23 - We Are So Back - New Dashboard. More Monitors. 23 + Monitor from anywhere. Literally anywhere. 24 24 </p> 25 25 <div className="text-nowrap"> 26 26 <span className="mr-1">Read more</span>
+227
apps/web/src/content/posts/deploy-private-locations-raspberry-pi.mdx
··· 1 + --- 2 + title: Deploy private locations on a Raspberry Pi 3 + description: An 8.5MB Docker image running uptime checks from home. 4 + author: 5 + name: Maximilian Kaske 6 + url: https://x.com/mxkaske 7 + avatar: /assets/authors/max.png 8 + publishedAt: 2025-10-17 9 + image: /assets/posts/deploy-private-locations-raspberry-pi/raspberry-pi.png 10 + tag: engineering 11 + --- 12 + 13 + We just pushed the first version of **Private Locations** at openstatus - and I had to test it on my old **Raspberry Pi 3**. 14 + 15 + Since **2016**, I've been using the Pi for **AirPlay** to connect to my receiver but other than that, it's been sitting around without any other use case. 16 + 17 + Time to revive it! 18 + 19 + <ImageWithCaption 20 + src="/assets/posts/deploy-private-locations-raspberry-pi/raspberry-pi-receiver.jpg" 21 + alt="bare metal raspberrypi on a receiver" 22 + caption="My bare metal Raspberry Pi on top of the receiver I use for AirPlay" 23 + /> 24 + 25 + --- 26 + 27 + ## Deployment Guide 28 + 29 + Obviously connecting to the Raspberry Pi via `ssh` - and if you're like me, the default password is secure enough: 30 + 31 + ```shell 32 + $ ssh pi@raspberrypi.local 33 + > password: raspberry 34 + ``` 35 + 36 + ### Hardware Specs 37 + 38 + I didn’t know exactly which Debian version it was running, but it was _very_ old - so I took the opportunity to clean everything up and upgrade to the latest available version. 39 + 40 + Model: 41 + 42 + ```shell 43 + $ cat /proc/device-tree/model 44 + > Raspberry Pi 3 Model B Rev 1.2 45 + ``` 46 + 47 + Linux Kernel: 48 + 49 + ```shell 50 + $ uname -a 51 + > Linux raspberrypi 6.12.47+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.12.47-1+rpt1 (2025-09-16) aarch64 GNU/Linux 52 + ``` 53 + 54 + Operating System: 55 + 56 + ```shell 57 + $ cat /etc/os-release 58 + > PRETTY_NAME="Debian GNU/Linux 13 (trixie)" 59 + > NAME="Debian GNU/Linux" 60 + > VERSION_ID="13" 61 + > VERSION="13 (trixie)" 62 + > VERSION_CODENAME=trixie 63 + > DEBIAN_VERSION_FULL=13.1 64 + > ID=debian 65 + > HOME_URL="https://www.debian.org/" 66 + > SUPPORT_URL="https://www.debian.org/support" 67 + > BUG_REPORT_URL="https://bugs.debian.org/" 68 + ``` 69 + 70 + I'm running the OS on a **16GB micro SD** card. The Pi has **1GB of RAM**, which is perfectly enough for this use case. 71 + 72 + <ImageWithCaption 73 + src="/assets/posts/deploy-private-locations-raspberry-pi/raspberry-htop.png" 74 + alt="htop stats" 75 + caption="Statistics from htop command" 76 + /> 77 + 78 + 79 + ### Install Docker Image 80 + 81 + Let's freshly install **Docker** using the official Debian repository instructions: 82 + 83 + https://docs.docker.com/engine/install/debian/#install-using-the-repository 84 + 85 + Once installed, Docker should already be running. 86 + 87 + You can verify it with: 88 + 89 + ```shell 90 + $ sudo systemctl status docker 91 + ``` 92 + 93 + ### Pull and Run the OpenStatus Container 94 + 95 + Let's grab the image: 96 + 97 + ```shell 98 + $ sudo docker pull ghcr.io/openstatushq/private-location:latest 99 + ``` 100 + 101 + If you have access to Private Locations in the **Dashboard**, create one - it'll will provide you a `token` to use as an environment variables: 102 + 103 + <ImageWithCaption 104 + src="/assets/posts/deploy-private-locations-raspberry-pi/dashboard-create-private-location.png" 105 + alt="dashboard create private location form" 106 + caption="Create a private location" 107 + /> 108 + 109 + 110 + Add the `token` to your shell profile: 111 + 112 + ```bash 113 + $ echo 'export OPENSTATUS_KEY=<token>’ >> ~/.bashrc 114 + ``` 115 + 116 + Reload the shell profile: 117 + 118 + ```bash 119 + $ source ~/.bashrc 120 + ``` 121 + 122 + If you are using `oh-my-zsh` you might be using the `~/.zshrc` file instead. 123 + 124 + Check that it worked: 125 + 126 + ```bash 127 + # print the env var 128 + $ echo $OPENSTATUS_KEY 129 + ``` 130 + 131 + ### Run the Container 132 + 133 + Now let's launch it: 134 + 135 + ```shell 136 + $ sudo docker run -d \ 137 +   --name openstatus-private-location \ 138 +   --restart=always \ 139 +   -e OPENSTATUS_KEY=$OPENSTATUS_KEY \ 140 +   ghcr.io/openstatushq/private-location:latest 141 + ``` 142 + 143 + What these flags do: 144 + - `-d`: run in background (detached mode) 145 + - `--restart`: auto-start on reboot 146 + - `--name`: give it a nice readable name 147 + - `-e`: pass your env var into the container 148 + 149 + > Don't sleep on `--restart=always`! How often I had to quickly switch position of and need to reboot the Raspberry, this is a game changer. 150 + 151 + To see live logs: 152 + 153 + ```shell 154 + $ sudo docker logs -f openstatus-private-location 155 + ``` 156 + 157 + 158 + 159 + --- 160 + 161 + ### What Happens Next 162 + 163 + Once the container is up, openstatus automatically fetches the endpoints you've chosen for this private location and starts monitoring them. 164 + 165 + Every few minutes (`last_seen_at`), the agent refreshes its internal database to stay up-to-date with any changes - like added monitors or updated headers. 166 + 167 + The responses of the pings are sent to our ingest endpoint for storage and aggregation. 168 + 169 + 170 + <ImageWithCaption 171 + src="/assets/posts/deploy-private-locations-raspberry-pi/dashboard-response-logs.png" 172 + alt="response logs in the openstatus dashboard" 173 + caption="Access your logs within the openstatus Dashboard." 174 + /> 175 + 176 + 177 + ### Light on Resources 178 + 179 + Our Docker image is just **8.5 MB** in size. Compare that to 1GB+ for some competitors (yes, they pack more features, but still 🤯). 180 + 181 + It's wild that a tiny 1 GB-RAM device from 2016 can now handle this so easily. 182 + 183 + ### Why Private Locations? 184 + 185 + Running a private probe means your checks happen **from within your own network** - not just from public cloud servers. 186 + 187 + It’s useful for: 188 + - Monitoring internal applications or databases 189 + - Testing network latency from real-world locations (like your office or home) 190 + - Running low-cost monitoring nodes on tiny devices (e.g. in agriculture or industrial setups) 191 + 192 + --- 193 + 194 + ## Closing Thoughts 195 + 196 + And that’s it - my **Raspberry Pi (2016)** is officially back in action. Running quietly next to my receiver, it’s now part of the openstatus network, checking endpoints from my home. 197 + 198 + Not bad for a 9-year-old piece of hardware. 199 + 200 + If you'd like to try this out yourself, contact us ([discord](https://openstatus.dev/discord), [email](mailto:ping@openstatus.dev)) and head over to: 201 + 202 + https://github.com/openstatusHQ/openstatus/pkgs/container/private-location 203 + 204 + Private locations are currently in **beta** and we're gathering feedback from early users. If you've got an old Raspberry Pi lying around - this is your excuse to bring it back to life. 205 + 206 + --- 207 + 208 + **A few more useful Commands** 209 + 210 + ```shell 211 + # stop running 212 + $ docker stop openstatus-private-location 213 + # remove the container, not the image or data: 214 + $ docker rm openstatus-private-location 215 + # remove unused images (docker keeps old images even after pulling updates) 216 + $ docker image prune -f 217 + # check docker image statistics 218 + $ docker stats 219 + # check the CPU / RAM usage (each work) 220 + $ htop 221 + $ top 222 + # update docker image 223 + $ docker stop openstatus-private-location 224 + $ docker rm openstatus-private-location 225 + $ docker pull ghcr.io/openstatushq/private-location:latest 226 + $ docker run ... # same command as before 227 + ```