OpenPanel
Self-hosting

Get started with self-hosting

This is a simple guide how to get started with OpenPanel on your own VPS.

Instructions

Prerequisites

  • VPS of any kind (only tested on Ubuntu 24.04)
    • We recommend using Hetzner (affiliate link). Use the link if you want to support us. 🫶
    • 🙋‍♂️ This should work on any system if you have pre-installed docker, node and pnpm

Quickstart

git clone https://github.com/Openpanel-dev/openpanel && cd openpanel/self-hosting && ./setup
# After setup is complete run `./start` to start OpenPanel

Clone

Clone the repository to your VPS

git clone https://github.com/Openpanel-dev/openpanel.git

Run the setup script

The setup script will do 3 things

  1. Install node (if you accept)
  2. Install docker (if you accept)
  3. Execute a node script that will ask some questions about your setup

Setup takes 30s to 2 minutes depending on your VPS

cd openpanel/self-hosting
./setup

⚠️ If the ./setup script fails to run, you can do it manually.

  1. Install docker
  2. Install node
  3. Install npm
  4. Run the npm run quiz script inside the self-hosting folder

Start 🚀

Run the ./start script located inside the self-hosting folder

./start

Good to know

Always use correct api url

When self-hosting you'll need to provide your api url when initializing the SDK.

The path should be /api and the domain should be your domain.

index.html
<script>
  window.op = window.op||function(...args){(window.op.q=window.op.q||[]).push(args);};
  window.op('init', {
    apiUrl: 'https://your-domain.com/api', 
    clientId: 'YOUR_CLIENT_ID',
    trackScreenViews: true,
    trackOutgoingLinks: true,
    trackAttributes: true,
  });
</script>
<script src="https://openpanel.dev/op1.js" defer async></script>
op.ts
import { OpenPanel } from '@openpanel/sdk';
 
const op = new OpenPanel({
  apiUrl: 'https://your-domain.com/api', 
  clientId: 'YOUR_CLIENT_ID',
  trackScreenViews: true,
  trackOutgoingLinks: true,
  trackAttributes: true,
});

E-mail

Some of OpenPanel's features require e-mail. We use Resend as our transactional e-mail provider. So to get this working you'll need to create an account on Resend and set the RESEND_API_KEY environment variable.

This is nothing that is required for the basic setup, but it is required for some features.

Features that require e-mail:

  • Password reset
  • Invitations
  • more will be added over time

Managed Redis

If you use a managed Redis service, you may need to set the notify-keyspace-events manually.

Without this setting we wont be able to listen for expired keys which we use for caluclating currently active vistors.

You will see a warning in the logs if this needs to be set manually.

Registration / Invitations

By default registrations are disabled after the first user is created.

You can change this by setting the ALLOW_REGISTRATION environment variable to true.

.env
ALLOW_REGISTRATION=true

Invitations are enabled by default. You can also disable invitations by setting the ALLOW_INVITATION environment variable to false.

.env
ALLOW_INVITATION=false

Helpful scripts

OpenPanel comes with several utility scripts to help manage your self-hosted instance:

Basic Operations

./start    # Start all OpenPanel services
./stop     # Stop all OpenPanel services
./logs     # View real-time logs from all services

Maintenance

./rebuild <service-name>    # Rebuild and restart a specific service
                            # Example: ./rebuild op-dashboard

Troubleshooting

./danger_wipe_everything   # ⚠️ Removes all containers, volumes, and data
                           # Only use this if you want to start fresh!

The danger_wipe_everything script will delete all your OpenPanel data including databases, configurations, and cached files. Use with extreme caution!

All these scripts should be run from within the self-hosting directory. Make sure the scripts are executable (chmod +x script-name if needed).

Updating

To grab the latest and greatest from OpenPanel you should just run the ./update script inside the self-hosting folder.

If you don't have the ./update script, you can run git pull and then ./update

Also read any changes in the changelog and apply them to your instance.

On this page