Skip to main content

Command Palette

Search for a command to run...

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

Published
3 min read
Part 5: Advanced Containers – pgAdmin, Node-RED, and Homarr
F

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.

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!

L

This 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

Part 5 of 6

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.

Up next

Part 6: Nginx Reverse Proxy for Clean URLs

Welcome to Part 6 of the Ubuntu home lab series. Now that we have several apps running on different ports, it’s time to simplify access using Nginx as a reverse proxy. This lets us use URLs like http://jellyfin.myserver.home instead of IP:port combos...