Skip to content

Self-host Halo

updated Sep 2026prices checked · Jul 2026
We earn commissions when you shop through the links below. Full disclosure →

A Java-based website and blog builder with a plugin and theme system, run from a Docker image with PostgreSQL or MySQL.

Key facts

LicenseGPL-3.0
StackJava, Spring Boot, Vue
Min RAM1024 MB
Official imageyes
Difficulty

What you need

  • Any VPS with at least 1024 MB of RAM
  • A domain you control — most self-hosted setups need HTTPS in front of them
  • Under an hour if you've used Docker before
Where to host itaffiliate disclosure
Hetzner Cloudrun it on
From $23.59/mo · 2 vCPU / 4 GB / 80 GB · EU + US
Get Hetzner Cloud (opens in new tab)
Kamaterafree trial
From $4/mo · 1 vCPU / 1 GB / 20 GB · US + EU + Asia
Start free on Kamatera → (opens in new tab)
DigitalOceanalso works on
From $6/mo · 1 vCPU / 1 GB / 25 GB · US + EU + Asia
Deploy on DigitalOcean → (opens in new tab)

Paid link — we earn a commission if you shop through it.

Install

Run these commands on your server:

# Halo 2 community edition (halohub/halo) with PostgreSQL, per the docs' Docker Compose guide (the docs' example uses the halo-pro image)
mkdir -p halo && cd halo
echo "DB_PASS=$(openssl rand -hex 16)" > .env
cat > docker-compose.yml <<'EOF'
services:
  halo:
    image: halohub/halo:2.26
    restart: on-failure:3
    depends_on:
      halodb: { condition: service_healthy }
    ports: ["8090:8090"]
    volumes: ["./halo2:/root/.halo2"]
    environment:
      - JVM_OPTS=-Xmx256m -Xms256m
    command:
      - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
      - --spring.r2dbc.username=halo
      - --spring.r2dbc.password=${DB_PASS}
      - --spring.sql.init.platform=postgresql
      - --halo.external-url=http://SERVER_IP:8090/
  halodb:
    image: postgres:15.4
    restart: on-failure:3
    volumes: ["./db:/var/lib/postgresql/data"]
    healthcheck:
      test: ["CMD", "pg_isready"]
      interval: 10s
      timeout: 5s
      retries: 5
    environment:
      - POSTGRES_PASSWORD=${DB_PASS}
      - POSTGRES_USER=halo
      - POSTGRES_DB=halo
      - PGUSER=halo
EOF
docker compose up -d   #  →  http://SERVER_IP:8090/system/setup  (first visit: site title + admin account)

More in CMS & blogging

We use analytics cookies (Google Analytics, PostHog) to see which guides are useful. No ad networks, no cross-site tracking. See our privacy policy.