vaultwarden从sqlite切换到mysql

  • 目录树结构

    .
    ├── vaultwarden.env
    ├── data
    ├── db
    └── docker-compose.yml
    

一、修改 docker-compose.ymlbitwarden.env

  • docker-compose.yml

    version: "3.4"
    
    services:
    # 数据库配置
      vaultwarden_db:
        image: mariadb:latest
        container_name: vaultwarden_db
        hostname: "mariadb"
        env_file: vaultwarden.env
        volumes:
            - "./db:/var/lib/mysql"
            - "/etc/localtime:/etc/localtime:ro"
    
      vaultwarden:
        image: vaultwarden/server:latest
        container_name: vaultwarden
        env_file: vaultwarden.env
        ports:
            - 8080:80
        volumes:
            - './data:/data/'
    
  • vaultwarden.env

    TZ=Asia/Shanghai
    
    # MySQL数据库连接
    MYSQL_ROOT_PASSWORD="vaultwarden"
    MYSQL_PASSWORD="vaultwarden"
    MYSQL_DATABASE="vaultwarden"
    MYSQL_USER="vaultwarden"
    
    DATABASE_URL="mysql://vaultwarden:vaultwarden@mariadb/vaultwarden"
    RUST_BACKTRACE=1
    
    # 用户注册=否
    SIGNUPS_ALLOWED=false
    
    # 启用管理页面,且为加密token
    ADMIN_TOKEN='$argon2id$v=19$m=65540,t=3,p=4$ewb7tCYqD/htz0xxxxxxxxxxxxxxxxxx6Y8$uKxxxxxxxxxxuixxxxYRZgvk'
    
    # 启用推送 us地区
    PUSH_ENABLED=true
    PUSH_INSTALLATION_ID='xxxxxx'
    PUSH_INSTALLATION_KEY='xxx'
    
    # 邮件配置
    SMTP_HOST='mail.narutos.top'
    SMTP_FROM='xxxx@narutos.top'
    SMTP_USERNAME='xxx@narutos.top'
    SMTP_PASSWORD='xxxxxxxxx'
    SMTP_PORT=465
    SMTP_SECURITY=force_tls
    

二、准备一个空的mariadb数据库

  1. 运行一个数据库容器

     docker run --rm --detach \
      --name mariadb \
      --env MARIADB_ROOT_PASSWORD=vaultwarden \
      -v ./db:/var/lib/mysql \
      mariadb:latest
    
  2. 进入 MariaDB 容器内部,并连接到 MariaDB 数据库

    docker exec -it mariadb bash
    
    # 在容器内部连接到 MariaDB,密码为 vaultwarden
    mariadb -u root -p
    
    
  3. 为Vaultwarden创建一个新的(空)数据库(确保字符集和整理正确!):

    CREATE DATABASE vaultwarden CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
    
  4. 创建一个新的数据库用户并授予数据库权限(MariaDB、v8之前的MySQL版本):

    • 'vaultwarden'@'localhost':表示 vaultwarden 用户只能从本地主机(localhost)连接到数据库。
    • 'vaultwarden'@'192.168.0.2':表示 vaultwarden 用户只能从指定的 IP 地址(例如 192.168.0.2)连接到数据库。
    • 'vaultwarden'@'%':表示 vaultwarden 用户可以从任何主机连接到数据库。
    CREATE USER 'vaultwarden'@'%' IDENTIFIED BY 'vaultwarden';
    GRANT ALL ON `vaultwarden`.* TO 'vaultwarden'@'%';
    FLUSH PRIVILEGES;
    
  5. 停止mariadb容器,尝试运行vaultwarden

    # 两次exit退出容器
    docker stop mariadb #停止数据库容器,要不然会显示文件被锁定
    docker compose up #启动vaultwarden
    
    📌 如果正常运行(能进网页,日志不报错),证明配置没问题,就可以按 `Ctrl+C` 停掉容器否则就要重试之前的步骤

三、处理旧数据库,得到mysqldump.sql

  1. db.sqlite3目录下运行一个数据库容器

    docker run -it --rm -v "$PWD":/code esolang/sqlite3 sh
    cd /code
    
  2. 使用以下命令转储现有的 SQLite 数据库。仔细检查您的 sqlite 数据库名称,默认应为 db.sqlite3

    📌 我们需要从 sqlite 转储的输出中移除一些查询,如创建表等,我们将在这里进行。
    /usr/bin/sqlite3 db.sqlite3 .dump | grep "^INSERT INTO" | grep -v "__diesel_schema_migrations" > sqlitedump.sql
    
    echo "SET FOREIGN_KEY_CHECKS=0;" > mysqldump.sql
    
    cat sqlitedump.sql >> mysqldump.sql
    
  3. 退出容器,复制 mysqldump.sqlmariadb 数据库里面

    exit
    cp mysqldump.sql /docker/vaultwarden/db/
    

四、导入数据到mariadb数据库

  1. 运行一个数据库容器

     docker run --rm --detach \
      --name mariadb \
      --env MARIADB_ROOT_PASSWORD=vaultwarden \
      -v ./db:/var/lib/mysql \
      mariadb:latest
    
  2. 加载 MySQL 转储:

    docker exec -it mariadb bash
    cd /var/lib/mysql
    # 加载,密码为 vaultwarden
    mariadb --force --password --user=vaultwarden --database=vaultwarden < mysqldump.sql
    
  3. 退出容器

    exit
    docker stop mariadb
    

五、正常启动

  • 修改docker-compose.yml(可选)

    version: "3.4"
    
    services:
    # 数据库配置
      vaultwarden_db:
        image: mariadb:latest
        restart: always
        container_name: vaultwarden_db
        hostname: "mariadb"
        env_file: vaultwarden.env
        volumes:
            - "./db:/var/lib/mysql"
            - "/etc/localtime:/etc/localtime:ro"
    
      vaultwarden:
        image: vaultwarden/server:latest
        restart: always
        container_name: vaultwarden
        env_file: vaultwarden.env
        ports:
            - 127.0.0.1:8080:80
        volumes:
            - './data:/data/'
    

docker compose up -d

参考链接:

Q.E.D.