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
- 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.
- 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
- 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
- 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.
- 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
- 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.
- (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.
- 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
.
- 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.
-
Upgrade procedure
-
Backup the database volume:
docker run --rm -v corteza_db_data:/data -v $PWD:/backup alpine tar czf /backup/pg.tgz -C /data .
-
Edit docker-compose.yml
to bump the Corteza image tag.
-
docker compose pull corteza-server && docker compose up -d corteza-server
-
Verify with docker compose logs -f corteza-server
.
- 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