Umami:从Cloud迁移到服务器
相信我dockeZ 会比直接裸装数据库要好因为很大可能你的 Umami build 不动除非本地构建再上传就是那样的话本地还得装环境况且 Umami 官方是支持 docker 部署的一、安装 Docker 和 Docker Compose1.添加 Docker 官方仓库(镜像)sudoapt-getupdatesudoapt-getinstall-yca-certificatescurlgnupg2.添加 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.gpghttps://download.docker.com-https://mirrors.aliyun.com3.添加 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/null4.安装 Docker 和 Docker Compse刚刚添加了新源必须更新否则 apt 不知道这个源存在sudoapt-getupdatesudoapt-getinstall-ydocker-ce docker-ce-cli containerd.io docker-compose-plugin5.验证安装完成docker-vdockercompose version6.允许普通用户使用 Docker避免每一步 sudosudousermod-aGdocker$USERnewgrpdockerUmami 推荐用 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_SECRET、POSTGRES_DB、POSTGRES_USER: umamiPOSTGRES_PASSWORD可自行更改services: umami: image: ghcr.io/umami-software/umami:latest container_name: umami ports: -127.0.0.1:3000:3000environment: DATABASE_URL: postgresql://umami:umami_passworddb: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_SECRETopenssl rand-base6432DATABASE_URL是 Umami 连接 PostgreSQL 的地址。APP_SECRET用于加密会话不能随便写固定弱字符串。127.0.0.1:3000:3000表示 Umami 只允许本机访问外部访问交给 Nginx 反代更安全。三、启动 Umami1. 以下命令是在/opt/umami 下执行否则会找不到 docker-compose.ymlcd/opt/umamisudodockercompose up-d2. 查看容器sudodockercomposeps3. 查看日志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并且获取统计脚本例如scriptdefersrchttps://umami.sirens007.cn/script.jsdata-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 放进容器的/tmp5. 随后进入 PostgreSQLsudodockercomposeexecdb psql-Uumami-dumami-U 代表用户 Users-d 代表 database数据导入、查看表结构、删除约束、恢复约束都要在 PostgreSQL 里完成或者在 Navicat 中完成在导入前最后检查一遍是否与数据库中的字段顺序对应上6. 查看website_eventSELECT ordinal_position, column_name, data_type FROM information_schema.columns WHERE table_namewebsite_eventORDER BY ordinal_position;6. 查看sessionSELECT ordinal_position, column_name, data_type FROM information_schema.columns WHERE table_namesessionORDER BY ordinal_position;注意可能输出的字段按页折叠记得检查完全重要步骤7. 迁移前先备份数据库sudodockercomposeexecdb pg_dump-Uumami-dumami/opt/umami/backup_before_import.sql8.再检查一下本地 session 和 website_event 字段顺序检查 website_eventSELECT 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_namesessionORDERBYordinal_position;然后导入时必须这样写成一整条命令不要在psql交互里分开敲\copysession(session_id,website_id,browser,os,device,screen,language,country,region,city,created_at,distinct_id)FROM/tmp/session.csvWITH(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_id9.重启 Umamisudodockercompose 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感谢你读到这里这也是我学习路上的一个小小记录。希望以后回头看时能看到自己的成长~