An Internal Error Has Occurred when creating admin user (Docker CE)

After i’ve struggled to try and install this password manager on my home server, i get greeted with this:

I tried refollowing the installation guide, maybe i missed something. But it’s no dice for me. I don’t really know what to do from here.

Home Server Specs: (fastfetch)

 sysadmin@ubuntu  ~  fastfetch
                             ....              sysadmin@ubuntu
              .',:clooo:  .:looooo:.           ---------------
           .;looooooooc  .oooooooooo'          OS: Ubuntu 24.04.3 LTS aarch64
        .;looooool:,''.  :ooooooooooc          Host: Raspberry Pi 4 Model B Rev 1.5
       ;looool;.         'oooooooooo,          Kernel: Linux 6.8.0-1040-raspi
      ;clool'             .cooooooc.  ,,       Uptime: 23 hours, 58 mins
         ...                ......  .:oo,      Packages: 940 (dpkg)
  .;clol:,.                        .loooo'     Shell: zsh 5.9
 :ooooooooo,                        'ooool     Terminal: /dev/pts/0
'ooooooooooo.                        loooo.    CPU: BCM2711 (4) @ 1.80 GHz
'ooooooooool                         coooo.    GPU: Broadcom bcm2711-vc5 [Integrated]
 ,loooooooc.                        .loooo.    Memory: 1.37 GiB / 3.69 GiB (37%)
   .,;;;'.                          ;ooooc     Swap: Disabled
       ...                         ,ooool.     Disk (/): 392.27 GiB / 880.10 GiB (45%) - ext4
    .cooooc.              ..',,'.  .cooo.      Local IP (eth0): 192.168.0.196/24
      ;ooooo:.           ;oooooooc.  :l.       Locale: C.UTF-8
       .coooooc,..      coooooooooo.
         .:ooooooolc:. .ooooooooooo'
           .':loooooo;  ,oooooooooc
               ..';::c'  .;loooo:'
 sysadmin@ubuntu  ~ 

Docker image i used: “passbolt-latest-ce” (i used the docker compose file listed in the installation guide)

Docker logs:

 sysadmin@ubuntu  ~  sudo docker logs 623cc7546c17
wait-for.sh: waiting for db:3306 without a timeout
wait-for.sh: db:3306 is available after 2 seconds
gpg: keybox '/var/lib/passbolt/.gnupg/pubring.kbx' created
gpg: /var/lib/passbolt/.gnupg/trustdb.gpg: trustdb created
gpg: key AC8E60B5E11C2672: public key "Passbolt default user <passbolt@yourdomain.com>" imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg: key AC8E60B5E11C2672: "Passbolt default user <passbolt@yourdomain.com>" not changed
gpg: key AC8E60B5E11C2672: secret key imported
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1
....+.........+...+.......+...+....................+.......+...+...+..+.+......+++++++++++++++++++++++++++++++++++++++++++++*.+.....+...+.+...+........+...+.......+...+......+.....+++++++++++++++++++++++++++++++++++++++++++++*............+......+..............+.+......+..+.+.........+...........+.+++++
....+...+........+++++++++++++++++++++++++++++++++++++++++++++*.....+++++++++++++++++++++++++++++++++++++++++++++*.....+...........+....+..+.+...+.................+.......+........+..................+.+.........+.........+..................+........+............+.........+..................+.......+.....+...............................+.....+........................+.+.....+....+...........+...+....+...........+......+.+..+.+......+.....+.+..+.+..+..........+..+...+....+...+..+.........+.....................+..........+...+........+...+....+.....+.+............+.....+...................+...+..+......+..............................+...+.+...........+....+...+...+.................+.............+........+...............+....+.....+............+....+.....+..........+..+...+.......+...+..............+..........+............+.........+...............+......+........+...+....+.........+......+.....+...+......+.........+...+....+...+.................+......+.........+......+.......+....................................+...........+...............+..........+...+...........+.........+...+...................+...+...+..+...+.........+.+...+.....+............+.........+...+............+....+.....+.........+...+............+...+....+...+.....+.+......+.....+.+...............+........................+......+...+..+...+...................+..................+.........+...+..+....+...............+.........+..........................+................+...............+......+..+.......+.....+....+......+.........+..+....+......+..+......+.......+..............+...............+...+.+.........+...+...+.....+....+..+.........+.+......+...+...........+.+.....+..................+................+...............+.........+.....+..........+...........+.+..+...+............+...+.........+......+............+.+..+.........+.............+........+....+...+.....+.+...................................+......+.+...+.....+....+...............+..+...+.+......+........+...+.........+..........+.........+..+....+......+..+.......+...+..+.+.....+..........+...+.........+.....+...+...+.......+...+....................+...............+.+...+..+...............................+.....+.......+.....+.+.....+.........+...+..........+.........+.........+...........+......+.......+........+...+....+......+..+.......+..+....+.........+.....+.............+...+...........+.+...+.....+................+...+..................+..+...+............+...+..........+...+......+......+........+.+.....+.+..+++++
-----
Installing passbolt

     ____                  __          ____
    / __ \____  _____ ____/ /_  ____  / / /_
   / /_/ / __ `/ ___/ ___/ __ \/ __ \/ / __/
  / ____/ /_/ (__  |__  ) /_/ / /_/ / / /
 /_/    \__,_/____/____/_.___/\____/_/\__/

 Open source password manager for teams
-------------------------------------------------------------------------------
The JWT private key could not be written.
Running migrations

     ____                  __          ____
    / __ \____  _____ ____/ /_  ____  / / /_
   / /_/ / __ `/ ___/ ___/ __ \/ __ \/ / __/
  / ____/ /_/ (__  |__  ) /_/ / /_/ / / /
 /_/    \__,_/____/____/_.___/\____/_/\__/

 Open source password manager for teams
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
 Running migration scripts.
-------------------------------------------------------------------------------
using migration paths
 - /etc/passbolt/Migrations
using seed paths
2025-10-08 19:12:49 error: [InvalidArgumentException] There was a problem connecting to the database: SQLSTATE[HY000] [1045] Access denied for user 'passbolt'@'172.19.0.3' (using password: YES) in /usr/share/php/passbolt/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 114
Caused by: [PDOException] SQLSTATE[HY000] [1045] Access denied for user 'passbolt'@'172.19.0.3' (using password: YES) in /usr/share/php/passbolt/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 102
2025-10-08 19:12:49 error: Could not connect to Database.
<!DOCTYPE html>
<html class="passbolt no-js no-passboltplugin version" lang="en">
<head>
    <meta charset="utf-8">
    <title>Passbolt | Error</title>
    <!-- 
       ____                  __          ____
       / __ \____  _____ ____/ /_  ____  / / /_
      / /_/ / __ `/ ___/ ___/ __ \/ __ \/ / __/
     / ____/ /_/ (__  )__  ) /_/ / /_/ / / /_
    /_/    \__,_/____/____/_.___/\____/_/\__/

    Open source password manager for teams
    Copyright (c) Passbolt SA (https://www.passbolt.com)


    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as
    published by the Free Software Foundation, either version 3 of the
    License, or (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program. If not, see http://www.gnu.org/licenses/.


    -->
    <meta name="description" content="Open source password manager for teams">
    <meta name="keywords" content="Passbolt, password manager, online password manager, open source password manager">
    <meta name="robots" content="noindex, nofollow">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="shortcut icon" type="image/x-icon" href="http://192.168.0.196/favicon.ico" />
    <link rel="icon" href="http://192.168.0.196/favicon.svg" />
    <link rel="icon" href="http://192.168.0.196/favicon_32.png" sizes="32x32" />
    <link rel="icon" href="http://192.168.0.196/favicon_57.png" sizes="57x57" />
    <link rel="icon" href="http://192.168.0.196/favicon_76.png" sizes="76x76" />
    <link rel="icon" href="http://192.168.0.196/favicon_96.png" sizes="96x96" />
    <link rel="icon" href="http://192.168.0.196/favicon_128.png" sizes="128x128" />
    <link rel="icon" href="http://192.168.0.196/favicon_192.png" sizes="192x192" />
    <link rel="icon" href="http://192.168.0.196/favicon_228.png" sizes="228x228" />
    <base href="http://192.168.0.196/">
    <link rel="stylesheet" href="http://192.168.0.196/css/themes/default/api_main.min.css?v=5.6.0"></head>
<body spellcheck="false">
<div id="container" class="error page error-500">
<!-- header navigation -->
<header>
    <div class="header first ">
        <nav>
            <div class="top navigation primary">
                <ul>
                    <li class="left"><a href="http://192.168.0.196/"><span>home</span></a></li>
                    <li class="right"><a href="http://192.168.0.196/auth/login"><span>login</span></a></li>
                </ul>
            </div>
        </nav>
    </div>
</header>
<div id="content">
<div class="grid">
    <div class="row">
        <h2>An Internal Error Has Occurred</h2>
        <p class="error">
            An Internal Error Has Occurred.        </p>
    </div>
    </div>
</div>
</div>
<footer>
    <div class="footer">
        <ul class="footer-links">
            <li><a href="https://www.passbolt.com/terms">Terms</a></li>
            <li><a href="https://www.passbolt.com/credits">Credits</a></li>
            <li id="version">
                <a href="https://www.passbolt.com/credits" class="tooltip-left" data-tooltip="5.6.0">
                    <i class="fa fa-heart-o"></i>
                    <span class="visuallyhidden">Versions</span>
                </a>
            </li>
        </ul>
    </div>
</footer>
</div>
</body>
</html>

I don’t know if i’m doing anything wrong within this post as i am new to this forum and discovered about this password manager like an hour ago, but i hope what i put in this post is correct.

Checklist
:white_check_mark: I have read intro post: https://community.passbolt.com/t/about-the-installation-issues-category/12
:white_check_mark: I have read the tutorials, help and searched for similar issues
:white_check_mark: I provide relevant information about my server (component names and versions, etc.)
:white_check_mark: I provide a copy of my logs and healthcheck
:white_check_mark: I describe the steps I have taken to trouble shoot the problem
:white_check_mark: I describe the steps on how to reproduce the issue

G’day blacktac.

You can see the error is saying that passbolt can’t connect to the database.

I just tested with the latest pasbolt docker CE file and it starts successfully.
https://www.passbolt.com/docs/hosting/install/ce/docker/

My guess is that you’ve removed or changed the db password in the script.

You can check the formatting (linting) of the file with

$ docker compose -f docker-compose-ce.yaml config -q

Current default file: docker-compose-ce.yaml

services:
  db:
    image: mariadb:10.11
    restart: unless-stopped
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: "true"
      MYSQL_DATABASE: "passbolt"
      MYSQL_USER: "passbolt"
      MYSQL_PASSWORD: "P4ssb0lt"
    volumes:
      - database_volume:/var/lib/mysql

  passbolt:
    image: passbolt/passbolt:latest-ce
    #Alternatively you can use rootless:
    #image: passbolt/passbolt:latest-ce-non-root
    restart: unless-stopped
    depends_on:
      - db
    environment:
      APP_FULL_BASE_URL: https://passbolt.local
      DATASOURCES_DEFAULT_HOST: "db"
      DATASOURCES_DEFAULT_USERNAME: "passbolt"
      DATASOURCES_DEFAULT_PASSWORD: "P4ssb0lt"
      DATASOURCES_DEFAULT_DATABASE: "passbolt"
    volumes:
      - gpg_volume:/etc/passbolt/gpg
      - jwt_volume:/etc/passbolt/jwt
    command:
      [
        "/usr/bin/wait-for.sh",
        "-t",
        "0",
        "db:3306",
        "--",
        "/docker-entrypoint.sh",
      ]
    ports:
      - 80:80
      - 443:443
    #Alternatively for non-root images:
    # - 80:8080
    # - 443:4433

volumes:
  database_volume:
  gpg_volume:
  jwt_volume:

Let me know how you go.
Gareth