news 2026/5/6 18:52:42

Umami:从Cloud迁移到服务器

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Umami:从Cloud迁移到服务器

相信我,dockeZ 会比直接裸装数据库要好,因为很大可能你的 Umami build 不动,除非本地构建再上传;就是那样的话本地还得装环境,况且 Umami 官方是支持 docker 部署的

一、安装 Docker 和 Docker Compose

1.添加 Docker 官方仓库(镜像)

sudoapt-getupdatesudoapt-getinstall-yca-certificatescurlgnupg

2.添加 Docker GPG key 下载,换为阿里云的镜像

Docker 官方要求把 GPG key 存在这个目录,属于新的安全规范(避免污染系统 key)。

sudomkdir-p/etc/apt/keyringscurl-fsSLhttps://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg\|sudogpg--dearmor-o/etc/apt/keyrings/docker.gpg

https://download.docker.com->https://mirrors.aliyun.com

3.添加 Docker apt 源

  • 把 Docker 下载地址从官方改成镜像
  • 以后apt install docker-ce就走国内源
echo\"deb [arch=$(dpkg --print-architecture)signed-by=/etc/apt/keyrings/docker.gpg] \ https://mirrors.aliyun.com/docker-ce/linux/ubuntu \$(lsb_release-cs)stable"\|sudotee/etc/apt/sources.list.d/docker.list>/dev/null

4.安装 Docker 和 Docker Compse

刚刚添加了新源,必须更新,否则 apt 不知道这个源存在

sudoapt-getupdatesudoapt-getinstall-ydocker-ce docker-ce-cli containerd.io docker-compose-plugin

5.验证安装完成

docker-vdockercompose version

6.允许普通用户使用 Docker,避免每一步 sudo

sudousermod-aGdocker$USERnewgrpdocker

Umami 推荐用 Docker Compose 部署,这样 Umami 应用和 PostgreSQL 数据库可以统一管理。

7.创建 Umami 部署目录

sudomkdir-p/opt/umamisudochown-R$USER:$USER/opt/umamicd/opt/umami

把 Umami 的配置文件和数据库挂载数据统一放在/opt/umami,后期维护、备份、迁移更方便。

二、编写 docker-compose.yml

切换目录为

cd/opt/umaminanodocker-compose.yml

写入内容如下(:APP_SECRETPOSTGRES_DBPOSTGRES_USER: umami

`POSTGRES_PASSWORD`可自行更改
services: umami: image: ghcr.io/umami-software/umami:latest container_name: umami ports: -"127.0.0.1:3000:3000"environment: DATABASE_URL: postgresql://umami:umami_password@db:5432/umami APP_SECRET: your_random_app_secret depends_on: db: condition: service_healthy restart: always db: image: postgres:15-alpine container_name: umami-db environment: POSTGRES_DB: umami POSTGRES_USER: umami POSTGRES_PASSWORD: umami_password volumes: - ./postgres-data:/var/lib/postgresql/data restart: always healthcheck: test:["CMD-SHELL","pg_isready -U umami -d umami"]interval: 5s timeout: 5s retries:5

** 生成**APP_SECRET

openssl rand-base6432

DATABASE_URL是 Umami 连接 PostgreSQL 的地址。
APP_SECRET用于加密会话,不能随便写固定弱字符串。
127.0.0.1:3000:3000表示 Umami 只允许本机访问,外部访问交给 Nginx 反代,更安全。

三、启动 Umami

1. 以下命令是在/opt/umami 下执行,否则会找不到 docker-compose.yml

cd/opt/umamisudodockercompose up-d

2. 查看容器

sudodockercomposeps

3. 查看日志

sudodockercompose logs-fumami

确认 Umami 和 PostgreSQL 是否正常运行,尤其是数据库,像图片中就是正常运行了

4.测试本地访问

curl-Ihttps://127.0.0.1:3000

正常是可以得到HTTP/1.1 200 OK此类回显;

我们的顺序是先确认 Umami 本身在服务器内部可访问,再配置域名和 HTTPS

四、配置 Nginx 反向代理

1.创建配置

sudonano/etc/nginx/sites-available/umami

写入:

以下内容要注意更改证书路径

server{listen80;server_name umami.sirens007.cn;return301https://$host$request_uri;}server{listen443ssl http2;server_name umami.sirens007.cn;ssl_certificate /path/to/your.crt;ssl_certificate_key /path/to/your.key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers HIGH:!aNULL:!MD5;location /{proxy_pass http://127.0.0.1:3000;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;}}

启用:

sudoln-s/etc/nginx/sites-available/umami /etc/nginx/sites-enabled/umamisudonginx-tsudosystemctl reload nginx

是因为 Docker 里的 Umami 不直接暴露公网,而是通过 Nginx 提供 HTTPS 访问,后期方便配置证书、缓存…

注意,在访问并登录 Umami 前,先申请 SSL 证书以便支持 https 协议,如果是阿里云用户可

以在阿里云中申请个人测试证书,要记得三个月一换

申请后可以在阿里云的工作台一键上传证书和私钥,记得上传

随后便可以登录 Umami:

直接在浏览器访问https://umami.sirens007.cn,改为你的域名即可

默认账号密码为:

用户名:admin

密码:umami

登录后立刻修改密码,否则你的账号可能被别人登录并改密

五、导入 Umami 访问数据

1. 在 Umami 后台添加你的网站,比如blog.sirens007.cn

创建一条 website,随后就可以得到 shareId,并且获取统计脚本,例如

<scriptdefersrc="https://umami.sirens007.cn/script.js"data-website-id="新的 website_id"></script>

为什么导入放在后面,因为可以让你的网站能拿到最新的访问数据…

开个玩笑,其实就是为了在能够拿到 website_id 后,才需要对导出的数据文件操作

2.访问Umami Cloud Data | Settings选择导出数据

随后会在你注册的邮箱中收到一个 zip 压缩包,其中只有 website_event.csv 这个文件有数据,其他两个只有表头

不知道你是一位喜欢 CLI 界面还是 GUI 界面的爱好者,如果是喜欢命令行的话在服务器用查询语句就可以查到 umami 这个仓库下的所有字段;如果喜欢图形化,那么 Navicat 可能是你需要的,或者pgAdmin - PostgreSQL Tools。类似下图中可以看到各个字段的顺序,同时也可以修改

此时你可能还需要一个能够修改 csv 文件的一个软件,不推荐 wps 和 excel,首先 excel 可能是 CRLF 文件类型问题,wps 在你编辑后需要转为 xlsx 文件,所以还是奉劝下一个CSV编辑软件:SmoothCSV - The ultimate CSV editor for macOS & Windows

在我在的版本Umami3.1中,website_event.csv 文件中有 41 行数据,而 PostgreSQL 数据库中的website_event 这个表中只有 31 条,因此如果要导入该文件需要删除 10 条数据库中不存在的字段的数据,但是要先备份该文件,因为后 10 条数据实际上是放在数据库中的 session 这个表中的,因此将备份的文件删掉 event 表中的 31 列数据后并排好序就可导入

website_event.csv 该文件中的 event_id 需要修改为服务器部署的 Umami 增设的 website 新获得的 websiteId,只有此处有修改,剩下的只需要排序即可

3. 随后使用 scp 命令上传至服务器即可

scpwebsite_event.csv session.csv root@服务器IP:/home/root/

4. 然后复制进 PostgreSQL 容器

sudodockercp/home/root/website_event.csv umami-db:/tmp/website_event.csvsudodockercp/home/root/session.csv umami-db:/tmp/session.csv

主要是因为psql \copy在容器里执行时,读取的是容器内部路径,所以要先把 CSV 放进容器的/tmp

5. 随后进入 PostgreSQL

sudodockercomposeexecdb psql-Uumami-dumami

-U 代表用户 Users,-d 代表 database

数据导入、查看表结构、删除约束、恢复约束都要在 PostgreSQL 里完成或者在 Navicat 中完成;在导入前,最后检查一遍是否与数据库中的字段顺序对应上

6. 查看website_event

SELECT ordinal_position, column_name, data_type FROM information_schema.columns WHERE table_name='website_event'ORDER BY ordinal_position;

6. 查看session

SELECT ordinal_position, column_name, data_type FROM information_schema.columns WHERE table_name='session'ORDER BY ordinal_position;

注意可能输出的字段按页折叠,记得检查完全

重要步骤!!!

7. 迁移前先备份数据库

sudodockercomposeexecdb pg_dump-Uumami-dumami>/opt/umami/backup_before_import.sql

8.再检查一下本地 session 和 website_event 字段顺序

检查 website_event:

SELECT ordinal_position, column_name, data_type FROM information_schema.columns WHERE table_name = 'website_event' ORDER BY ordinal_position;

然后根据实际字段写导入语句,例如常见结构可能类似:

\copy website_event ( event_id, website_id, session_id, created_at, url_path, url_query, referrer_path, referrer_query, referrer_domain, page_title, event_type, event_name, visit_id ) FROM '/tmp/website_event.csv' WITH (FORMAT csv, HEADER true, NULL '\N', QUOTE '"');
# 建议执行单条命令,如上条报错sudodockercomposeexecdb psql-Uumami-dumami-c"\copy session (session_id, website_id, browser, os, device, screen, language, country, region, city, created_at, distinct_id) FROM '/tmp/session.csv' WITH (FORMAT csv, HEADER true, NULL '\N', QUOTE '\"');"

注意:
这条不能直接照抄,必须以你本地information_schema.columns查到的字段为准;

原因:
Umami Cloud 导出的 CSV 字段和本地 v3.x 表结构可能不同。多字段、少字段、顺序不一致都会导入失败;


检查 session 本地字段:

SELECTcolumn_nameFROMinformation_schema.columnsWHEREtable_name='session'ORDERBYordinal_position;

然后导入时必须这样写成一整条命令,不要在psql交互里分开敲:

\copysession(session_id,website_id,browser,os,device,screen,language,country,region,city,created_at,distinct_id)FROM'/tmp/session.csv'WITH(FORMAT csv,HEADERtrue,NULL'\N',QUOTE'"');

如果你是在 shell 里执行,推荐:

sudodockercomposeexecdb psql-Uumami-dumami-c"\copy session (session_id, website_id, browser, os, device, screen, language, country, region, city, created_at, distinct_id) FROM '/tmp/session.csv' WITH (FORMAT csv, HEADER true, NULL '\N', QUOTE '\"');"

原因:

就是我之前有报错syntax error at or near "session_id"

9.重启 Umami

sudodockercompose restart umami

最后访问后台 umami.example.com 登录检查数据是否对应即可

总流程顺序:

1. 安装 Docker2. 创建 /opt/umami3. 写 docker-compose.yml4. 启动 Umami + PostgreSQL5. 配置 Nginx + HTTPS6. 登录后台并修改密码7. 创建网站8. 导出 Umami Cloud 数据9. 上传 CSV 到服务器10. 备份本地数据库11. 查看本地表结构12. 修正 CSV 字段和 website_id13. 导入 session14. 导入 website_event15. 检查数据关联16. 恢复约束17. 重启 Umami18. 修改博客统计脚本19. 后台验证统计结果

参考文章:

Umami Cloud迁移到本地踩坑记录

Installation

以上是我关于Umami的笔记分享,也可以关注关注我的Sirens-Blog🥰
感谢你读到这里,这也是我学习路上的一个小小记录。希望以后回头看时,能看到自己的成长~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/6 18:44:56

架构优先:H5GG引擎的iOS逆向工程方法论

架构优先&#xff1a;H5GG引擎的iOS逆向工程方法论 【免费下载链接】H5GG an iOS Mod Engine with JavaScript APIs & Html5 UI 项目地址: https://gitcode.com/gh_mirrors/h5/H5GG 你是否曾因iOS逆向工程的高门槛而却步&#xff1f;当面对复杂的Objective-C运行时、…

作者头像 李华
网站建设 2026/5/6 18:44:01

5分钟全面掌握HS2-HF_Patch:Honey Select 2终极汉化与增强方案

5分钟全面掌握HS2-HF_Patch&#xff1a;Honey Select 2终极汉化与增强方案 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2复杂的日文界面…

作者头像 李华
网站建设 2026/5/6 18:37:29

macOS安全监控实战:OpenClaw熔断机制与文件完整性保护详解

1. 项目概述&#xff1a;为你的Mac装上“数字看门狗”如果你和我一样&#xff0c;日常的主力工作机器是一台Mac&#xff0c;并且对系统安全有那么点“强迫症”&#xff0c;那你肯定理解那种对未知威胁的隐隐担忧。我们装了防火墙&#xff0c;开了系统完整性保护&#xff0c;但总…

作者头像 李华
网站建设 2026/5/6 18:36:38

别再乱用字符串了!UE开发中FString、FName、FText的保姆级选择指南

UE开发中的字符串选择艺术&#xff1a;FString、FName与FText的黄金法则 当你在UE编辑器中第一次尝试显示玩家姓名时&#xff0c;是否曾被三种字符串类型搞得晕头转向&#xff1f;这就像走进一家高级餐厅&#xff0c;面对琳琅满目的餐具却不知道何时该用叉子、何时该用勺子。让…

作者头像 李华