Plane is an open-source project management platform that supports Agile, Kanban, waterfall, and timeline workflows — a self-hosted alternative to Jira. This guide deploys Plane on Ubuntu using the official installer with an external PostgreSQL backend and S3-compatible object storage, then fronts it with Nginx Proxy Manager and a Let's Encrypt certificate. By the end, you'll have Plane serving project management workflows securely at your domain.
Prerequisite: Ubuntu host with Docker and Docker Compose installed (a one-click Docker server works), an external PostgreSQL endpoint with superuser access, an S3-compatible bucket with access/secret keys, and a domain A record pointing at the server.
Create the Plane Database
1. Connect to PostgreSQL as a superuser:
$ psql "postgres://DB_ADMIN:DB_PASSWORD@DB_HOST:DB_PORT/defaultdb"
2. Create the Plane database and confirm:
CREATE DATABASE planedb;
\c planedb;
CREATE TABLE setup_check (id SERIAL PRIMARY KEY, note TEXT);
INSERT INTO setup_check (note) VALUES ('ready');
SELECT * FROM setup_check;
\q
Plane needs a superuser account (e.g. vultradmin) because it performs root-level operations during install.
Add Your User to the Docker Group
$ sudo usermod -aG docker $USER
$ newgrp docker
Install Plane
1. Create the project directory:
$ mkdir -p ~/plane && cd ~/plane
2. Download the installer:
$ curl -fsSL -o setup.sh https://raw.githubusercontent.com/makeplane/plane/master/deploy/selfhost/install.sh
$ chmod +x setup.sh
3. Run the installer and select option 1 to install:
$ ./setup.sh
4. Edit the generated .env and set:
NGINX_PORT=8080
WEB_URL=https://plane.example.com
NEXT_PUBLIC_DEPLOY_URL=https://plane.example.com/spaces
CORS_ALLOWED_ORIGINS=https://plane.example.com
# External Postgres
PGUSER=DB_ADMIN
PGPASSWORD=DB_PASSWORD
PGHOST=DB_HOST
PGPORT=DB_PORT
PGDATABASE=planedb
# S3-compatible storage
AWS_REGION=YOUR_REGION
AWS_ACCESS_KEY_ID=YOUR_KEY
AWS_SECRET_ACCESS_KEY=YOUR_SECRET
AWS_S3_BUCKET_NAME=YOUR_BUCKET
AWS_S3_ENDPOINT_URL=https://YOUR_S3_ENDPOINT
5. Run the installer again and pick option 2 to start Plane.
Open the Firewall
$ sudo ufw allow 22/tcp
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw reload
Front Plane with Nginx Proxy Manager
1. Create a directory for the proxy:
$ mkdir -p ~/npm && cd ~/npm
2. Create the Compose file:
$ nano docker-compose.yaml
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
3. Start the proxy:
$ docker compose up -d
4. Connect the proxy to Plane's Docker network:
$ docker network connect plane-app_default nginx-proxy-manager
Configure the Proxy Host and TLS
- Open
http://SERVER_IP:81and sign in withadmin@example.com/changeme. - Change the admin email and password when prompted.
-
Proxy Hosts → Add Proxy Host:
-
Domain Names:
plane.example.com -
Scheme:
http -
Forward Hostname/IP:
plane-app-proxy-1 -
Forward Port:
80 - Toggle Websockets Support
-
Domain Names:
- SSL tab → Request a new SSL certificate with Let's Encrypt, enter your email, accept the terms, toggle Force SSL, and save.
Open https://plane.example.com to confirm Plane responds over HTTPS.
Initialize the Plane Workspace
- Navigate to
https://plane.example.com/god-mode. - Create the administrator account (email + password).
- From God Mode, set the instance name and configure SMTP for email notifications.
- Exit God Mode, create your first workspace, and invite team members.
- Complete the product tour and create your first project.
Next Steps
Plane is running with an external Postgres backend, S3 object storage, and HTTPS at your domain. From here you can:
- Create cycles, modules, and views for Agile workflows
- Integrate with GitHub or GitLab for issue sync
- Configure SMTP for invitations, mentions, and notifications
For the full guide with additional tips, visit the original article on Vultr Docs.
Top comments (0)