前言

我是觉得通过源码部署Memos更灵活一点,虽然通过docker部署确实方便多。
如果你也打算通过源码方式部署Memos,那么请继续往下看。

源码部署

安装Go的环境

Go官方地址

验证Go环境

C:\Users\R9000P>go version
go version go1.25.7 windows/amd64

启动Memos后台

下载Memos项目源码到本地,或点击跳转 Memos的Github仓库

git clone git@github.com:usememos/memos.git

若go下载依赖超时,可执行当前命令后重试

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

启动Memos后台运行

# 在git clone的项目源码根目录执行
go run ./cmd/memos --port 8081 --addr 127.0.0.1 --data D:\WorkSpace\MemosData --driver mysql --dsn "username:password@tcp(ip:port)/memos?charset=utf8mb4&parseTime=True&loc=Local"
  • --addr (可选)指定当前部署ip环境,不指定默认为 localhost 环境
  • --data 指定附件保存位置(如果启用mysql,则默认保存数据库attachmentblob字段下;可在web端登入后设置储存位置为文件系统,则保存当前目录下。)
  • --driver 默认是sqllite,这里是指定数据库驱动
  • --dsn 指定当前数据库连接配置信息

正常运行会打印启动日志

2026/02/07 15:37:12 INFO background runners started goroutines=10
Memos 0.26.0 started successfully!
Data directory: D:\WorkSpace\MemosData
Database driver: mysql
Server running on port 8081
Access your memos at: http://localhost:8081

Documentation: https://usememos.com
Source code: https://github.com/usememos/memos

Happy note-taking!

后台服务接口

http://localhost:3001/

启动Web端前台

安装依赖

npm i

启动web端

npm run dev 

前端页面地址

http://localhost:8081/web

打包

Memos 前端

优先打包前端文件,在构建后台包的时候需要把前端打包dist文件夹复制到.\memos\server\router\frontend\下,替换默认的空前端文件目录dist

注意: D:\WorkSpace\GitHub\memos\web\vite.config.mts 文件

# 本地环境运行,连接本机环境的memos服务
let devProxyServer = "http://localhost:8081";
# 本地环境运行,连接vpn下的远程服务器memos服务
// let devProxyServer = "http://11.1.0.9:8081";
# 打包构建部署时,需要配置为互联网发布地址环境。(否则打包部署后,Memos前端页面访问内网ip的后台是不通的。)
// let devProxyServer = "https://memos.wo0ow.com";

打包

npm run build

Memos 服务端

win 打包

go build -o memos.exe .\cmd\memos\main.go

linux 打包

设置环境

set GOARCH=amd64
go env -w GOARCH=amd64
set GOOS=linux
go env -w GOOS=linux

打包构建linux应用

go build -o memos .\cmd\memos\main.go

还原环境

基于win平台构建linux应用后,需要在构建win平台应用,则需要还原环境(不还原,则win平台go run命令会失败!)

set GOARCH=amd64
go env -w GOARCH=amd64
set GOOS=windows
go env -w GOOS=windows

部署

创建linux服务

vim /etc/systemd/system/memos.service

文件内容

# /etc/systemd/system/memos.service
[Unit]
Description=Memos Service
After=network.target mysql.service

[Service]
Type=simple
User=memos
WorkingDirectory=/opt/memos
ExecStart=/opt/memos/memos --port 8081 --addr 11.1.0.9 --data /var/lib/memos/data --driver mysql --dsn "username:password@tcp(localhost:3306)/memos?charset=utf8mb4&parseTime=True&loc=Local"
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

linux上创建用户

sudo useradd -r -s /bin/false memos

创建目录并授权

sudo mkdir -p /opt/memos /var/lib/memos/data /var/log/memos
sudo chown -R memos:memos /opt/memos /var/lib/memos /var/log/memos

设置可执行权限

chmod u+x /opt/memos/memos

启动命令

sudo systemctl daemon-reload
sudo systemctl enable memos
sudo systemctl start memos

源码部署安全建议

直接屏蔽后台关于账号密码登录接口,防止被爆破登录

在源码 auto_service.go关于用户登录处添加代码,即使用户账户密码输入正确,也不会使其登录。

// just for me ,no need login ,just for push web
if true {
return nil, status.Errorf(codes.PermissionDenied, "signin is not allowed")
}

Nginx的配置

server {
listen 443 ssl;
server_name memos.wo0ow.com;
ssl_certificate /usr/local/nginx/conf/cert/cert.crt;
ssl_certificate_key /usr/local/nginx/conf/cert/cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# 隐藏服务器信息
server_tokens off;
proxy_hide_header X-Powered-By;

# 禁止可疑User-Agent
if ($http_user_agent ~* (wget|curl|scan|bot|spider)) {
return 403;
}

location / {
proxy_pass http://11.1.0.9:8081;
}

}

第三方APP

Moe Memos官网

MoeMemos Android 应用(Github仓库地址)

如果是参考我上述的部署方式已经禁用了账户密码登录,这里补充说明如何获取登录令牌。

在本地环境启动Memos后台和前端,但是后台连接的数据库和线上环境保持一致(我是通过openvpn构建的网络,所以我可以从本地环境访问线上DB)。
在本地环境中的web端登录后,创建一个Token给到自己就行了。

参考资料

Memos的官方部署文档教程

golang在windows环境下build生成linux程序

go项目打包和部署