Files
FlareBlog/content/zh-cn/posts/docker-compose/umami-migration/index.md
2025-01-09 22:31:59 -05:00

190 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: 将Docker部署的Umami从一台服务器迁移到另一台服务器
subtitle:
date: 2024-03-11T18:03:39-04:00
slug: umami-docker-migration
draft: false
author:
name: James
link: https://www.jamesflare.com
email:
avatar: /site-logo.avif
description: 本文将介绍如何通过导出和导入 PostgreSQL 数据库,将 Docker 上运行的 Umami 服务器从一台机器迁移到另一台机器,确保在保留所有关键数据的同时实现平稳过渡。
license:
comment: true
weight: 0
tags:
- PostgreSQL
- 开源软件
- Docker
- Umami
categories:
- 教程
collections:
- Docker Compose
hiddenFromHomePage: false
hiddenFromSearch: false
hiddenFromRss: false
hiddenFromRelated: false
summary: 本文将介绍如何通过导出和导入 PostgreSQL 数据库,将 Docker 上运行的 Umami 服务器从一台机器迁移到另一台机器,确保在保留所有关键数据的同时实现平稳过渡。
resources:
- name: featured-image
src: featured-image.jpg
- name: featured-image-preview
src: featured-image-preview.jpg
toc: true
math: false
lightgallery: false
password:
message:
repost:
enable: false
url:
# 查看前言详细信息https://fixit.lruihao.cn/documentation/content-management/introduction/#front-matter
---
<!--more-->
## 简介
最近我从 netcup GmbH 购买了一台新的 ARM 服务器,需要把 Umami 服务器从旧服务器迁移到新服务器上。但我是用 Docker 安装的 Umami。
```yaml
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` 指定了:
```yaml
services:
db:
volumes:
- umami-db-data:/var/lib/postgresql/data
volumes:
umami-db-data:
```
如果我把路径挂载到容器里而不是卷,那就可以直接把路径复制到新机器上。比如:
```yaml
services:
db:
volumes:
- /root/umami/data:/var/lib/postgresql/data
```
可惜我用了卷,导致事情变得复杂。如何正确迁移 Docker 卷在网上有很多讨论,比如 [将 Docker 卷移动到另一台主机](https://4sysops.com/archives/move-a-docker-volume-to-another-host/)。但对我来说太复杂了。你可能会问Docker 卷不是存储在固定路径如 `/var/lib/docker/volumes/*` 吗?为什么不直接把文件夹复制到另一台机器并正常启动呢?这确实可行,我以前也这么干过。但它可能会导致一些潜在问题,尤其是对于不同的 Docker 容器版本。
最后,我决定只导出数据库并导入到新实例中。让我们一步一步来。
## 迁移数据库
首先,让我们进入旧容器的 Shell。
```bash
docker exec -it umami-db-1 /bin/sh
```
将数据库导出为 `.sql` 文件。
```bash
cd /
pg_dump --username=umami umami > umami.sql
```
现在数据库备份在 `umami.sql` 文件中,但它在容器内部。按 `Ctrl + D` 退出容器 Shell然后把文件复制到宿主机。
```bash
docker cp umami-db-1:/umami.sql /root
```
接着,你需要把这个备份文件传输到新主机上。在新主机上 `docker compose up -d` 后,`umami-db-1` 容器就会被创建。然后你可以通过以下命令把数据库备份文件复制到容器中:
```bash
docker cp /root/umami.sql umami-db-1:/
```
进入新的 `umami-db-1` 容器:
```bash
docker exec -it umami-db-1 /bin/sh
```
要把备份导入 Postgres我们需要以 `umami` 用户登录 `psql`
```bash
psql --username=umami -d postgres
```
`psql` Shell 中,我们先删除原有数据库,再创建一个空白数据库以准备导入。
```bash
DROP DATABASE umami;
CREATE DATABASE umami;
```
然后退出 `psql` Shell运行以下命令导入备份文件
```bash
cd /
psql --username=umami -f umami.sql umami
```
最后,重启 Umami 实例:
```bash
cd /path/to/umami/docker-compose.yaml/
docker compose down
docker compose up -d
```
## 检查
现在可以检查数据库是否迁移成功了。打开新 Umami 的 URL尝试用原来的账号登录。如果能登录那数据库很可能迁移成功了账号信息是存在数据库里的
为了进一步确认,你可以进入仪表盘,看看所有数据是否正常显示。
如果不正常,说明数据库没有成功迁移。你可以检查导出的备份文件(里面是否包含正确的数据?),以及导入的方式(看看备份文件是否成功导入到新的 Postgres
## 参考
- [如何将 Umami 从一台服务器迁移到另一台服务器](https://www.programonaut.com/how-to-migrate-umami-from-one-server-to-another/)
- [如何在 Linux 中备份和恢复 PostgreSQL 数据库](https://www.tecmint.com/backup-and-restore-postgresql-database/)