编译安装 MEMOS 作者: Hogwarts 发布于: 2023-10-08 更新于: 2024-04-16 分类: 默认分类 不想用Docker就要编译,然鹅,Memos的文档这样写道:本文档尚未完成,欢迎贡献。这好像是个悖论吧。在群内潜伏学习了两天,看有教程,还有blog。[二进制编译Memos开源笔记应用](https://ttt.td/2023/02/18/build-memos.html "二进制编译Memos开源笔记应用") 教程写于20230218,测试了一下,对于0.10.2版本的Memos能够编译成功,但对于0.16.0就不能适用了。经过群内大佬的指导,终于编译成功,尚未进行后续编译。将步骤写下,以免进坑。 #一、环境准备 需安装依赖:go、node、pnpm、buf,咱一个一个来。 ##1.1 go 的安装 参考:`https://winamp.top/91.html` ##1.2 node 的安装 参考:`https://winamp.top/377.html` ##1.3 pnpm 的安装 npm install -g pnpm ln -sf /root/nodejs/bin/pnpm /usr/local/bin/pnpm #软连接 安装的前提是npm正常安装成功 ##1.4 buf 的安装 Buf的[文档](https://buf.build/docs/installation "文档")提供了安装命令,按常规会npm安装,运行 `npm install @bufbuild/buf` ,执行 `npx buf –version` 后,npx报错,搞定后正常显示版本,但buf还是无法使用。故尝试 go 安装。 # Substitute GOBIN for your bin directory # Leave unset to default to $GOPATH/bin GO111MODULE=on GOBIN=/usr/local/bin go install \ github.com/bufbuild/buf/cmd/buf@v1.27.0 #二、web编译过程 ##2.1 下载源码 wget https://github.com/usememos/memos/archive/refs/tags/v0.21.0.tar.gz #注意版本号 ##2.2 协议代码生成 cd /root/memos/proto/ && buf generate 老版本不用执行此步骤,新版本需要从gRPC的proto文件中生成前端的API协议封装,否则编译失败。 ##2.3 编译前端文件 cd /root/memos/web/ pnpm i && pnpm build 编译前可更换Logo文件,路径为:`/memos/web/public` 也可在编辑后更换Logo文件,路径为:`/memos/web/dist/` 编译完成后更换关于中的Logo。路径为:`/memos/web/dist/assets/About-xxxxxx.js` 将 png 路径改为:`https://pic5.58cdn.com.cn/nowater/webim/big/n_v28a6b33c2077846edb1c19f0b421c1f08.png` 可用`yarn && yarn build`编译,前提是先用npm安装yarn,并软链接。 ##2.4 前端编译结果目录copy到server目录 For v0.16.1运行 rm -rf /root/memos/server/dist/ cp -r dist /root/memos/server/ For v0.18.2以上运行 cp -r dist /usr/local/bin/ #与memos运行文件同一路径 For v0.20.1以上运行(测试用非必须) mkdir -p /var/opt/memos cp -r dist /var/opt/memos/ ##2.5 编译运行文件 cd /root/memos For v0.16.1运行 CGO_ENABLED=0 go build -o /usr/local/bin/memos -trimpath -ldflags "-s -w -buildid=" ./main.go For v0.18.2以上运行 CGO_ENABLED=0 go build -o /usr/local/bin/memos -trimpath -ldflags "-s -w -buildid=" ./bin/memos/main.go Go编译注意编译的架构,可以交叉编译,并缩小体积。 For v0.16.1运行 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o memos-amd64-v0.16.1 -trimpath -ldflags "-s -w -buildid=" ./main.go For v0.18.2以上运行 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o memos-amd64-v0.18.2 -trimpath -ldflags "-s -w -buildid=" ./bin/memos/main.go ##2.6 本人自行编译文件存放目录 `https://dl.winamp.top/memos/` #三、运行测试 ##3.1 sqlite运行命令 memos -h #查看使用方法 memos -p yourport #for default demo memos -m 'prod' -p yourport -d sqlite.db-Path #注册用户运行 #For v0.21.0 不指定 -d 则在 /var/opt/memos 下生成 memos_prod.db 注意备份数据库文件及本地存储数据(memos_prod.db等) ##3.2 MySQL支持 自v0.16.1能够支持MySQL数据库了,参考:[使用 MySQL 作为数据库驱动程序](https://www.usememos.com/docs/get-started/mysql)。 ###3.2.1 新建数据库 CREATE DATABASE memos_prod; CREATE USER 'memos'@'localhost' IDENTIFIED BY 'UsermemosPasswd'; GRANT ALL PRIVILEGES ON memos* TO 'memos'@'localhost' WITH GRANT OPTION; ###3.2.2 运行命令 /usr/local/bin/memos --mode "prod" --port yourport --driver mysql --dsn 'memos:memospassword@tcp(localhost)/memos_prod' 本例中:运行端口为`yourport`;用户名为`memos`;数据库密码为`memospassword`;数据库名称为`memos_prod`。 ###3.2.3 注意问题 ~~运行文件路径`/var/opt/memos`是写死的。~~ dist文件夹和memos不在同一路径下,运行memos会报错路径错误,将dist文件夹拷贝到memos运行目录即可。 ###3.2.4 将数据从 SQLite 迁移到 MySQL /usr/local/bin/memos --driver mysql --dsn 'dbuser:dbpass@tcp(dbhost)/dbname' copydb --from sqlite://path_to_your_memos_prod.db 示例如下,虽然三个斜杠看着别扭,但能成功copy。 /usr/local/bin/memos --mode "prod" --port yourwebport --driver mysql --dsn 'memosuser:UsermemosPassWd@tcp(localhost)/memos_prod' copydb --from sqlite:///var/opt/memos_prod.db #四、开机启动 ##4.1 systemctl 方式 vim /etc/systemd/system/memos.service [Unit] Description=Memos Documentation=https://github.com/usememos/memos After=network.target nss-lookup.target [Service] Dynamicuser=yes WorkingDirectory=/opt/ ExecStart=/opt/memos -p 9000 -m prod -d /opt/ StandardOutput=null Restart=on-failure RestartSec=10s [Install] WantedBy=multi-user.target systemctl daemon-reload systemctl start memos systemctl status memos systemctl enable memos 注意运行文件路径和工作路径WorkingDirectory。 ##4.2 rc.local 方式 `https://winamp.top/413.html` #五、自定义样式 ##5.1 隐藏编号等信息 “设置”-“系统”-“自定义样式” .mt-4.w-full.flex.flex-row.justify-between.items-center.gap-2 { display: none; } ![me.png](https://winamp.top/usr/uploads/2023/11/4064916334.png) 其实仅隐藏编号就够了,等有空研究一下。 ##5.2 更改字体为鹭霞文楷 自定义样式中填写 body{font-family: "LXGW WenKai Screen", sans-serif !important;} 自定义脚本中填写 function changeFont() { const link = document.createElement("link"); link.rel = "stylesheet"; link.type = "text/css"; link.href = "https://cdn.staticfile.org/lxgw-wenkai-screen-webfont/1.7.0/lxgwwenkaiscreen.css"; document.head.append(link); }; changeFont() 字体还未充分研究,暂用他人弄好的吧。 参考:[Memos自定义代码片段](https://ysicing.me/tools/memos-diy-style/ "Memos自定义代码片段") [更改memos的字体为鹭霞文楷](https://www.imsun.org/archives/1436.html "更改memos的字体为鹭霞文楷") ##5.3 图片问题 修改 `/dist/assets/index-XXXXXX.css` 中 `img,video{max-width:auto;height:auto}` 的 `max-widt` 值即可。将 `max-width:auto` 改为 **`max-width:50%`** #六、参考 [二进制编译Memos开源笔记应用](https://ttt.td/2023/11/04/build-memos/ "二进制编译Memos开源笔记应用") [Meoms文档](https://www.usememos.com/docs "Meoms文档") 感谢Memos群内大佬的悉心指导。 安装过程还未充分测试。 标签: memos