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>:9876
In pgAdmin, add a new server:
Name:
mypgdb
Host:
0.0.0.0
Username/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!
Subscribe to my newsletter
Read articles from Febin Joy directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Febin Joy
Febin Joy
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.