Files
FlareBlog/content/zh-cn/posts/docker-compose/umami-migration/index.md
2024-06-30 23:43:49 +08:00

5.5 KiB
Raw Blame History

title, subtitle, date, slug, draft, author, description, license, comment, weight, tags, categories, hiddenFromHomePage, hiddenFromSearch, hiddenFromRss, hiddenFromRelated, summary, resources, toc, math, lightgallery, password, message, repost
title subtitle date slug draft author description license comment weight tags categories hiddenFromHomePage hiddenFromSearch hiddenFromRss hiddenFromRelated summary resources toc math lightgallery password message repost
将 Umami Docker 从一台服务器迁移到另一台服务器 2024-03-11T18:03:39-04:00 umami-docker-migration false
name link email avatar
James https://www.jamesflare.com /site-logo.avif
本文将介绍如何通过导出和导入 PostgreSQL 数据库,将 Docker 上运行的 Umami 服务器从一台机器迁移到另一台机器,确保在保留所有关键数据的同时实现平稳过渡。 true 0
PostgreSQL
开源
Docker
Umami
教程
false false false false 本文将介绍如何通过导出和导入 PostgreSQL 数据库,将 Docker 上运行的 Umami 服务器从一台机器迁移到另一台机器,确保在保留所有关键数据的同时实现平稳过渡。
name src
featured-image featured-image.jpg
name src
featured-image-preview featured-image-preview.jpg
true false false
enable url
false

简介

最近我从 netcup GmbH 购买了一台新的 ARM 服务器,需要把 Umami 服务器从旧服务器迁移到新服务器上。但我是用 Docker 安装的 Umami。

version: '3'
services:
  umami:
    image: ghcr.io/umami-software/umami:postgresql-latest
    ports:
      - "3000:3000"
    environment:
      DATABASE_URL: postgresql://umami:umami@db:5432/umami
      DATABASE_TYPE: postgresql
      APP_SECRET: replace-me-with-a-random-string
    depends_on:
      db:
        condition: service_healthy
    restart: always
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: umami
      POSTGRES_USER: umami
      POSTGRES_PASSWORD: umami
    volumes:
      - umami-db-data:/var/lib/postgresql/data
    restart: always
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
      interval: 5s
      timeout: 5s
      retries: 5
volumes:
  umami-db-data:

迁移中最困难和重要的部分就是导出 Umami 的数据。我们有几种方法可以实现:

  • 导出 Docker 卷(非常复杂)
  • 导出数据库(我的选择)
  • 复制整个路径(不推荐)

比较方法

首先,我们要知道 Umami 的数据是存储在卷Volume中的。因为 docker-compose.yml 指定了:

services:
  db:
    volumes:
      - umami-db-data:/var/lib/postgresql/data
volumes:
  umami-db-data:

如果我把路径挂载到容器里而不是卷,那就可以直接把路径复制到新机器上。比如:

services:
  db:
    volumes:
      - /root/umami/data:/var/lib/postgresql/data

可惜我用了卷,导致事情变得复杂。如何正确迁移 Docker 卷在网上有很多讨论,比如 将 Docker 卷移动到另一台主机。但对我来说太复杂了。你可能会问Docker 卷不是存储在固定路径如 /var/lib/docker/volumes/* 吗?为什么不直接把文件夹复制到另一台机器并正常启动呢?这确实可行,我以前也这么干过。但它可能会导致一些潜在问题,尤其是对于不同的 Docker 容器版本。

最后,我决定只导出数据库并导入到新实例中。让我们一步一步来。

迁移数据库

首先,让我们进入旧容器的 Shell。

docker exec -it umami-db-1 /bin/sh

将数据库导出为 .sql 文件。

cd /
pg_dump --username=umami umami > umami.sql

现在数据库备份在 umami.sql 文件中,但它在容器内部。按 Ctrl + D 退出容器 Shell然后把文件复制到宿主机。

docker cp umami-db-1:/umami.sql /root

接着,你需要把这个备份文件传输到新主机上。在新主机上 docker compose up -d 后,umami-db-1 容器就会被创建。然后你可以通过以下命令把数据库备份文件复制到容器中:

docker cp /root/umami.sql umami-db-1:/

进入新的 umami-db-1 容器:

docker exec -it umami-db-1 /bin/sh

要把备份导入 Postgres我们需要以 umami 用户登录 psql

psql --username=umami -d postgres

psql Shell 中,我们先删除原有数据库,再创建一个空白数据库以准备导入。

DROP DATABASE umami;
CREATE DATABASE umami;

然后退出 psql Shell运行以下命令导入备份文件

cd /
psql --username=umami -f umami.sql umami

最后,重启 Umami 实例:

cd /path/to/umami/docker-compose.yaml/
docker compose down
docker compose up -d

检查

现在可以检查数据库是否迁移成功了。打开新 Umami 的 URL尝试用原来的账号登录。如果能登录那数据库很可能迁移成功了账号信息是存在数据库里的

为了进一步确认,你可以进入仪表盘,看看所有数据是否正常显示。

如果不正常,说明数据库没有成功迁移。你可以检查导出的备份文件(里面是否包含正确的数据?),以及导入的方式(看看备份文件是否成功导入到新的 Postgres

参考