编译安装 MEMOS 作者: Hogwarts 发布于: 2023-10-08 更新于: 2024-09-08 分类: 默认分类 #没入坑的劝退 不想用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还是无法使用。做软链接后正常显示但报错:-bash: buf: command not found ln -sf /root/nodejs/bin/npx /usr/local/bin/npx npx -v 故尝试用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.40.1 #二、web编译过程 ##2.1 下载源码 wget https://github.com/usememos/memos/archive/refs/tags/v0.21.0.tar.gz #注意版本号 tar -zxvf v0.21.0.tar.gz mv memos-v0.21.0 memos ##2.2 协议代码生成 cd /root/memos/proto/ && buf generate 老版本不用执行此步骤,新版本需要从gRPC的proto文件中生成前端的API协议封装,否则编译失败。 ##2.3 编译前端文件 cd /root/memos/web/ #编译命令 pnpm add -g pnpm #有时可能需要升级一下下 pnpm i && pnpm build 可能报错:`-bash: /root/.local/share/pnpm/pnpm: No such file or directory` 再次软连接可解 ln -sf /root/nodejs/bin/pnpm /root/.local/share/pnpm/pnpm - 如需更换LOGO,**编译前**更换Logo文件,路径为:`/memos/web/public` - 编译完成后更换"关于"中的Logo。 ###For v0.21.0 路径为:`/memos/web/dist/assets/About-xxxxxx.js` 将 png 路径改为:`https://lychee.winamp.top/uploads/original/00/0c/6cff7ceb01dbe41d26d8a2f4d975.png` 在 `/assets/index-xxxxx.cs` 中 `img,video{max-width:50%;height:auto} `的 max-widt 值控制图片宽度,height为高度。 ###For v0.22.0 在/dist/的index.html中看到加载的文件 ` ` 在`/dist/assets/index-C3PkACOv.js`中修改"关于"中的Logo路径。 在`/dist/assets/index-BuCh7MAN.css`中修改图片宽度。 Logo文件也可改为自己搭建的图床路径。 可用`yarn && yarn build`编译,前提是先用npm安装yarn,并软链接。 ##2.4 前端编译结果目录copy到server目录 For v0.22.0 rm -rf /root/memos/server/router/frontend/dist cp -r /root/memos/web/dist /root/memos/server/router/frontend/ 其它版本参考 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.21.0运行 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/` V0.22.0 开发者上传了运行文件 `https://github.com/usememos/memos/releases` 不会用,报错:`No embeddable frontend found.` #三、运行测试 ##3.1 sqlite运行命令 #查看使用方法 memos -h #For default demo memos -p yourport #注册用户运行 memos -m 'prod' -p yourport -d sqlite.db-Path - For v0.21.0 不指定 -d 则在 /var/opt/memos 下生成 memos_prod.db - For v0.22.0 默认在memos运行路径生成memos_prod.db数据库。 - For v0.22.4 -p -d -m 参数本人运行失败,改为:`--port --date --mode` - 注意备份数据库文件及本地存储数据(memos_prod.db等) ##V0.22.0 数据库改动较大,更新后默认 Memo 可见性为私有、自定义设置归零、默认开启注册等。 ##3.2 MySQL支持 **说明:自测v0.16.1可以正常使用,高版本未实测。 建议:使用这个脚本,支持V0.21.0,V0.22.0。**Github:[memos_sqlite2mysql](https://github.com/tigerzioo/memos_sqlite2mysql) 自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运行目录即可。~~ V0.22.0又不需要了注意路径问题了。 作者是高手,改代码、变数据库如翻大饼一样简单。 ###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=/usr/local/bin/memos -p 9000 -m prod -d /opt/ #具体参数运行memos -h查看,v0.22.4未成功运行,改为 --port --mode --data 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() 字体还未充分研究,暂用他人弄好的吧。 **注意:** cdn.staticfile.org 进了ublock origin拦截规则了。有可能调试不成功。 参考:[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群内大佬的悉心指导。 编译过程还未充分测试,尤其是sqlite转SQL。水平有限,错误百出。 别入 Memos 的坑了。 标签: memos