Full actual recent docs installation for VPS

There is somewhere full installation docs for VPS for ubuntu for production?
I have tried to install but i have blank screen at login:

closing unidentified connection × Websocket message with error Corteza One, version: 2024.9.3, build time: 2025-07-03T14:12:42.259Z vendors-41d29b9a.cb31cc19.js:sourcemap:1 Mixed Content: The page at ‘https://corteza.eu/auth/callback?code=ZJK0OTK4YMYTM2NIZC0ZODUXLTKXNMYTMTG4MDDIOWEXZDI1&state=bfzfbiuily’ was loaded over HTTPS, but requested an insecure XMLHttpRequest endpoint ‘Domena corteza.eu jest utrzymywana na serwerach nazwa.pl’. This request has been blocked; the content must be served over HTTPS. (anonymous) @ vendors-41d29b9a.cb31cc19.js:sourcemap:1 vue.esm.js:3785 Ue Cr @ vue.esm.js:3785

Managed to log in: * Corteza 2024.x (Low‑code & CRM platform)

  • PostgreSQL 15 for data storage
  • Caddy 2 as an HTTPS reverse proxy (auto‑renewing Let’s Encrypt certs)
  • Everything managed by Docker Compose v2 on Ubuntu 22.04 LTS

  1. Prerequisites
Requirement Tested Version
Ubuntu 22.04 LTS
Public DNS your‑domain.example ➜ server IP
Packages curl , git , ufw

Note: All commands below assume root or sudo privileges on the VPS.


  1. One‑time server bootstrap
# Update the OS
apt update -y && apt upgrade -y

# Install Docker & Compose plugin (official repository)
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
     | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
   https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" \
  > /etc/apt/sources.list.d/docker.list
apt update -y && apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
systemctl enable --now docker

# Basic firewall (open SSH, HTTP, HTTPS)
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp 80/tcp 443/tcp
ufw --force enable

  1. Project layout
/opt/corteza
├── .env                 # secrets & environment overrides
├── docker-compose.yml   # core stack
├── Dockerfile           # (optional) custom server image
└── Caddyfile            # reverse‑proxy rules

Create the folder and enter it:

mkdir -p /opt/corteza && cd /opt/corteza

  1. Environment file (.env )
# Replace the placeholders!
DOMAIN=your-domain.example
ADMIN_EMAIL=admin@example.com
ADMIN_PASSWORD=ChangeMe123!
POSTGRES_PASSWORD=StrongPgPass123!
TIMEZONE=Europe/Amsterdam

Never commit this file to a public repo.


  1. Docker Compose file (docker-compose.yml )
services:
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: corteza
      POSTGRES_USER: corteza
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
      TZ: ${TIMEZONE}
    volumes:
      - db_data:/var/lib/postgresql/data
    restart: unless-stopped

  corteza-server:
    image: cortezaproject/corteza:2024.9
    environment:
      DB_DSN: postgres://corteza:${POSTGRES_PASSWORD}@db:5432/corteza?sslmode=disable
      DOMAIN: ${DOMAIN}
      HTTP_SSL_TERMINATED: "true"   # tells Corteza it is behind TLS already
      TZ: ${TIMEZONE}
    depends_on:
      - db
    networks:
      - backend
    restart: unless-stopped

  caddy:
    image: caddy:2-alpine
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data   # certs
      - caddy_config:/config
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - corteza-server
    networks:
      - backend
    restart: unless-stopped

volumes:
  db_data:
  caddy_data:
  caddy_config:

networks:
  backend:
    driver: bridge

  1. Caddyfile
{
    email admin@${DOMAIN}
}

${DOMAIN} {
    reverse_proxy corteza-server:80
}

Caddy will obtain a Let’s Encrypt certificate automatically when it first receives traffic for the domain.


  1. (Optional) build a custom Corteza image

If you need plugins or extra binaries, add a Dockerfile such as:

FROM cortezaproject/corteza:2024.9
# RUN apk add --no-cache …              # packages you need

Then change image: to build: in the compose file.


  1. Start the stack
cd /opt/corteza
docker compose up -d   # first time may take a minute

Check container status:

docker compose ps

Health‑check the API:

curl -w "\n" -s https://${DOMAIN}/health

Should return 200 .


  1. Create your first administrator account

Container names use the pattern corteza-server-… . Find it:

CID=$(docker ps -qf "ancestor=cortezaproject/corteza")

Run the built‑in CLI to add a user and promote it:

docker exec "$CID" ./bin/corteza-server users add "${ADMIN_EMAIL}" \
              --password "${ADMIN_PASSWORD}"

docker exec "$CID" ./bin/corteza-server roles useradd super-admin "${ADMIN_EMAIL}"

Log in at https://${DOMAIN} with the credentials you just set.


  1. Upgrade procedure

  2. Backup the database volume:
    docker run --rm -v corteza_db_data:/data -v $PWD:/backup alpine tar czf /backup/pg.tgz -C /data .

  3. Edit docker-compose.yml to bump the Corteza image tag.

  4. docker compose pull corteza-server && docker compose up -d corteza-server

  5. Verify with docker compose logs -f corteza-server .


  1. Troubleshooting quick‑hits

Symptom Command Expected
502 Bad Gateway from Caddy docker exec caddy curl -I http://corteza-server:80 HTTP/1.1 200 OK
Corteza shows mixed‑content errors Ensure HTTP_SSL_TERMINATED=true in env Page loads without JS console errors
Login fails docker logs corteza-server-… tail -n 20 Relevant error message

1 Like

Thanks, it will be helpful for the next person that comes across this use requirement.