8.2.15 Deployment and Configuration of Passbolt

The Host Banner Passbolt

Passbolt CE is a reliable solution for team password management with end-to-end GPG encryption. Containerized deployment lets you roll out Passbolt quickly with minimal host‐system dependencies.

Server Preparation

Requirements

  • Provisioned Virtual or Dedicated server running Ubuntu 20+
  • At least 2 vCPU, 2 GB RAM, 10 GB SSD
  • SSH access with sudo privileges or root user
  • Docker installed (guide)

Variables to replace (EN)

  • YOUR_DOMAIN — the domain where Passbolt will be accessible; used in APP_FULL_BASE_URL, the nginx config, and when issuing the SSL certificate.
  • DB_USERNAME — MariaDB user that connects to the Passbolt database (DATASOURCES_DEFAULT_USERNAME, MYSQL_USER).
  • PASSWORD — password for <DB_USERNAME> (DATASOURCES_DEFAULT_PASSWORD, MYSQL_PASSWORD).
  • DB_NAME — Passbolt database name (DATASOURCES_DEFAULT_DATABASE, MYSQL_DATABASE).
  • DB_ROOT_PASSWORD — root (administrator) password for MariaDB (MYSQL_ROOT_PASSWORD).
  • EMAIL — e-mail address of the first administrator created with register_user.
  • SMTP_HOST — SMTP server address (EMAIL_TRANSPORT_DEFAULT_HOST, optional).
  • SMTP_PASSWORD — SMTP password or token (EMAIL_TRANSPORT_DEFAULT_PASSWORD, optional).

Firewall Setup

For security, allow only the necessary ports: SSH (remote access), HTTP and HTTPS (Passbolt web interface).

UFW:

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

ufw protection

iptables:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT

Deploying Passbolt

Create and enter the working directory:

mkdir ~/passbolt && cd ~/passbolt

Create docker-compose.yml:

version: '3.8'
services:
  passbolt:
    image: passbolt/passbolt:latest-ce
    container_name: passbolt
    environment:
      APP_FULL_BASE_URL: YOUR_DOMAIN
      DATASOURCES_DEFAULT_HOST: db
      DATASOURCES_DEFAULT_USERNAME: USERNAME
      DATASOURCES_DEFAULT_PASSWORD: PASSWORD
      DATASOURCES_DEFAULT_DATABASE: DB_NAME
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - gpg_volume:/etc/passbolt/gpg
      - jwt_volume:/etc/passbolt/jwt
      - ./nginx:/etc/nginx/certs:ro
    depends_on:
      - db

  db:
    image: mariadb:10.6
    container_name: passbolt-db
    environment:
      MYSQL_ROOT_PASSWORD: DB_ROOT_PASSWORD>
      MYSQL_DATABASE: DB_NAME
      MYSQL_USER: DB_USERNAME
      MYSQL_PASSWORD: PASSWORD
    volumes:
      - db_data:/var/lib/mysql

volumes:
  gpg_volume:
  jwt_volume:
  db_data:

Note: replace db, passbolt, StrongPassw0rd!, passboltdb with your own values.

Bring up the containers:

docker-compose up -d

docker-composeup-d

Initial Configuration

Get the container name:

docker ps

dockerps

Run the install script:

docker exec -it passbolt su -m -c "/usr/share/php/passbolt/bin/cake passbolt install" -s /bin/sh www-data

Follow the prompts:

  • Web server: nginx (built-in)
  • SSL certificate: self-signed or via reverse proxy
  • Database: passboltdb / user: passbolt / password: StrongPassw0rd!

Important: if you run an external nginx or Caddy, remove ports 80/443 from Compose and set up the reverse proxy yourself.

Registering the First Administrator

After installation, you must create the first admin user via CLI:

docker exec -it passbolt su -m -c "/usr/share/php/passbolt/bin/cake passbolt register_user -u EMAIL -f Admin -l User -r admin" -s /bin/sh www-data

Note: replace admin@example.com with your admin email.

SMTP Configuration

Add SMTP settings under environment for the passbolt service in docker-compose.yml:

EMAIL_TRANSPORT_DEFAULT_CLASSNAME: Smtp
EMAIL_TRANSPORT_DEFAULT_HOST: smtp.mailgun.org
EMAIL_TRANSPORT_DEFAULT_PORT: 587
EMAIL_TRANSPORT_DEFAULT_USERNAME: postmaster@mg.example.com
EMAIL_TRANSPORT_DEFAULT_PASSWORD: your_smtp_password
EMAIL_TRANSPORT_DEFAULT_TLS: true

Note: be sure to replace smtp.mailgun.org, 587, postmaster@mg.example.com, your_smtp_password per our SMTP guide.

A correctly configured mail service is required to send invitations to new users.

Reverse Proxy (nginx)

If you use an external nginx, create this config:

server {
    listen 443 ssl;
    server_name YOUR_DOMAIN;

    ssl_certificate     /etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/YOUR_DOMAIN/privkey.pem;

    location / {
        proxy_pass         http://127.0.0.1:80;
        proxy_set_header   Host $host;
        proxy_set_header   X-Real-IP $remote_addr;
        proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header   X-Forwarded-Proto $scheme;
    }
}

Obtain an SSL certificate:

sudo certbot certonly --standalone -d YOUR_DOMAIN

Disable ports in docker-compose.yml when using the external proxy:

    ports:
      # - "80:80"
      # - "443:443"

Automatic Updates (Watchtower)

Add Watchtower to docker-compose.yml:

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: always
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

This will auto-restart containers when new images are available.

Diagnostics and Logging

Check container status and logs:

docker ps -a
docker logs passbolt
docker logs -f passbolt

View nginx errors:

docker exec -it passbolt tail -f /var/log/nginx/error.log

Verification

In your browser, visit:

https://YOUR_DOMAIN

Run the health check:

docker exec -it passbolt su -m -c "/usr/share/php/passbolt/bin/cake passbolt healthcheck" -s /bin/sh www-data

dockerexec

Backup

Create a backup directory:

mkdir -p ~/passbolt/backup

Export the database:

docker exec passbolt-db sh -c 'exec mysqldump -u root -p"ROOT_PASSWORD" DB_NAME' > ~/passbolt/backup/passbolt_db.sql

Backup certificates and config:

sudo cp -r ~/passbolt/nginx ~/passbolt/backup/nginx_certs
docker cp passbolt:/etc/passbolt ~/passbolt/backup/passbolt_conf

Automate this with a cron job or systemd timer.

Common Issues & Solutions
Issue Cause Solution
https://<YOUR_DOMAIN> won’t open Port or nginx misconfiguration Ensure ports 80/443 are forwarded, or configure an external SSL proxy
Emails aren’t sent Missing or incorrect SMTP settings Add the EMAIL_TRANSPORT_* variables in Compose
Database error during install Database not ready when Passbolt starts Add depends_on: db and restart containers
Container keeps restarting Config or GPG key errors Check docker logs passbolt and volume permissions
Healthcheck shows WARNING Missing SMTP or wrong BASE URL Verify APP_FULL_BASE_URL and SMTP settings in docker-compose.yml