Part 5: Advanced Containers – pgAdmin, Node-RED, and Homarr

Welcome to Part 5 of the Ubuntu home lab series. This part expands on our Podman setup by deploying more advanced services inside containers. We’ll run PostgreSQL with pgAdmin in a shared Pod, Node-RED for workflows, and Homarr for a beautiful home lab dashboard.
🐘 Step 1: Set Up PostgreSQL + pgAdmin in a Pod
Podman supports pods, similar to Kubernetes. Containers in a pod share network and can easily talk to each other.
1. Create the pod
podman pod create --name postgre-sql -p 9876:80
This exposes port 80 of the pod to port 9876 on the host.
2. Set up pgAdmin
mkdir -p ~/.config/containers/pgadmin
chmod -R 755 ~/.config/containers/pgadmin
podman volume create --opt device=$HOME/.config/containers/pgadmin \
--opt type=none --opt o=bind pgadmin-volume
podman run --pod postgre-sql \
-e 'PGADMIN_DEFAULT_EMAIL=youradmin@yourdomain.com' \
-e 'PGADMIN_DEFAULT_PASSWORD=passWoRd' \
-v pgadmin-volume:/var/lib/pgadmin \
--name pgadmin \
-d docker.io/dpage/pgadmin4:latest
This will pull the pgAdmin docker image and create a podman container in the pod we created earlier. You can use the cockpit to view the status.
3. Set up PostgreSQL
mkdir -p ~/.config/containers/postgres
chmod -R 755 ~/.config/containers/postgres
podman volume create --opt device=$HOME/.config/containers/postgres \
--opt type=none --opt o=bind postgres-volume
podman run --name postgredb \
--pod postgre-sql \
-d -e POSTGRES_USER=admin \
-e POSTGRES_PASSWORD=passWoRd \
-v postgres-volume:/var/lib/postgresql/data:rw,z \
docker.io/library/postgres:latest
This will pull the pgAdmin docker image and create a podman container in the pod we created earlier. You can use the cockpit to view the status.
4. Allow access
sudo iptables -A INPUT -p tcp --dport 9876 -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables/rules.v4
5. Access and configure
Access the pgAdmin web interface by navigating to :
http://<your-server-ip>:9876In pgAdmin, add a new server:
Name:
mypgdbHost:
0.0.0.0Username/Password: match POSTGRES_USER and POSTGRES_PASSWORD
6. Enable auto-start
Edit your startup script:
echo "podman pod start postgre-sql" >> ~/.config/containers/start.sh
🔗 Step 2: Run Node-RED
1. Create directory and volume
mkdir -p ~/.config/containers/nodered
chmod -R 755 ~/.config/containers/nodered
podman volume create --opt device=$HOME/.config/containers/nodered \
--opt type=none --opt o=bind nodered-data
2. Run the container
podman run -d \
-p 1880:1880 \
--name nodered \
-v nodered-data:/data \
--restart always \
docker.io/nodered/node-red:latest
3. Allow access
sudo iptables -A INPUT -p tcp --dport 1880 -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables/rules.v4
4. Enable auto-start
echo "podman start nodered" >> ~/.config/containers/start.sh
Access: http://<your-server-ip>:1880
🧭 Step 3: Set Up Homarr Dashboard
Homarr is a wonderful dashboard that will make your home lab server more accessible and easy to use. It provides a beautiful UI to access all your self-hosted apps.
1. Create directories
mkdir -p ~/.config/containers/homarr/configs
mkdir -p ~/.config/containers/homarr/icons
mkdir -p ~/.config/containers/homarr/data
chmod -R 755 ~/.config/containers/homarr
2. Create volumes
podman volume create --opt device=$HOME/.config/containers/homarr/configs --opt type=none --opt o=bind homarr-configs
podman volume create --opt device=$HOME/.config/containers/homarr/icons --opt type=none --opt o=bind homarr-icons
podman volume create --opt device=$HOME/.config/containers/homarr/data --opt type=none --opt o=bind homarr-data
3. Run the container
podman run -d \
-p 7575:7575 \
--name homarr \
-v homarr-configs:/app/data/configs \
-v homarr-icons:/app/public/icons \
-v homarr-data:/data \
--restart unless-stopped \
-e DEFAULT_COLOR_SCHEME=dark \
ghcr.io/ajnart/homarr:latest
4. Allow access
sudo iptables -A INPUT -p tcp --dport 7575 -j ACCEPT
sudo iptables-save | sudo tee /etc/iptables/rules.v4
5. Enable auto-start
echo "podman start homarr" >> ~/.config/containers/start.sh
Access: http://<your-server-ip>:7575
Coming up next in Part 6: we’ll simplify access to all these services using Nginx as a reverse proxy so you can use friendly URLs like http://jellyfin.myserver.home instead of remembering port numbers.
Stay tuned for Part 6: Nginx Reverse Proxy for Clean URLs!
About the author
Technical leader and architect with 20+ years of experience designing secure, scalable enterprise platforms across cloud, hybrid, and on-prem environments. Currently leading technical architecture and cross-functional teams delivering mobility and compliance systems used by 300+ organisations across Australia and New Zealand.
Proven track record of translating complex compliance frameworks (HIPAA, ISO 27001) into production-grade systems. Skilled in Azure cloud migration, secure software development, and risk-driven design. Focused on architecting resilient platforms that enhance public safety, operational efficiency, and long-term engineering excellence. Based in Melbourne, Australian citizen, and a clear communicator with a strategic mindset.
Comments
Join the discussionThis is a fantastic guide for anyone building out a home lab with containers. It's a great example of the advanced setups that are possible. For a simpler way to manage all these services and more in one local dev environment, you should check out ServBay.
Ubuntu home lab for developers
This blog series guides you through setting up a secure, containerised, developer-friendly headless Ubuntu home server—from OS install to deploying self-hosted services with Podman. Perfect for devs and homelab enthusiasts alike.





