8.2.15 Deployment and Configuration of 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
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

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

Initial Configuration
Get the container name:
docker ps

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

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: dband restart containers | 
| Container keeps restarting | Config or GPG key errors | Check docker logs passboltand volume permissions | 
| Healthcheck shows WARNING | Missing SMTP or wrong BASE URL | Verify APP_FULL_BASE_URLand SMTP settings indocker-compose.yml | 
Official Documentation


