Up in the Air!
在云端
Home
Categories
Archives
Tags
About
Home
手把手教你自建开源免费云笔记蚂蚁笔记leanote服务器,完全攻略教程比官方更详细
手把手教你自建开源免费云笔记蚂蚁笔记leanote服务器,完全攻略教程比官方更详细
取消
手把手教你自建开源免费云笔记蚂蚁笔记leanote服务器,完全攻略教程比官方更详细
由
aoeII
发布于 2016-06-27
·
最后更新:2018-06-11
3142
# 在Centos 6/7上安装leanote源码并使用supervisor守护进程 ![leanote](/api/file/getImage?fileId=5b5bcdbe3a48590478000055) 蚂蚁笔记Leanote是一个基于Go语言和非关系型数据库Mongodb构建的云笔记项目,各平台客户端齐全,功能完备,从一开始便开源在[Github](https://github.com/leanote)上,STAR数4600+,是国际上最优秀的开源云笔记项目之一。 > 特性: > > 高效笔记:Leanote 有易操作的界面, > 包含一款富文本编辑器和Markdown编辑器,让您的笔记记录更轻松和高效。对高阶用户,我们还提供Vim 和Emacs > 编辑模式,助推你的写作速度更上层楼。 > > 知识管理: Leanote 灵活而强大的“笔记本-笔记-标签”系统,让它成为你个人知识管理的利器。 > > 分享: 你可以通过Leanote同好友分享知识、想法和经历, 邀请好友加入你的笔记簿,通过云端交流信息。 > > 协作: Leanote协助你与同事之间相互协作,激荡新思路,随时随地头脑风暴。 > > 博客: Leanote也可以作为你的个人博客, 把你的知识传播的更远! 其它特性 支持Markdown编辑 写作模式 Vim 及 > Emacs 编辑模式 支持PDF导出 支持批量操作 博客自定义主题, 实现高度定制化 官方已经提供了较为详细的中英文安装教程,按照教程基本上可以在自己的服务器上私有化安装配置,但官方教程也存在一些不足之处,包括对Mongodb的安全性设置、默认用户的修改等。在此基础上,通过查阅相关组件的官方文档和博客,结合安装实践,写成本文,每行命令都亲测通过,以供后来人参考。 欢迎转载,转载请注明出处:https://aoeii.com/posts/how_to_install_leanote_on_centos_6_and_7 ---------- 让我们马上开始Leanote之旅! # 0 准备工作 ## 0.1 安装 Centos 首先最小化安装Centos 6.10 或者 7.5 64位系统,可以从这里下载[6.10官方镜像](http://mirrors.163.com/centos/6.10/isos/x86_64/CentOS-6.10-x86_64-minimal.iso) [7.5官方镜像](http://mirrors.163.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso)安装,并配置好网络,使其可以连接到互联网。 建议用**Centos 7**,可以省掉很多麻烦。 ## 0.2 安装Centos的epel源 Centos 6 yum install -y epel-release && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 Centos 7 yum install -y epel-release && rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 (可选)安装Centos的remi源 Centos 6 yum install -y http://rpms.famillecollet.com/enterprise/remi-release-6.rpm rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi cp /etc/yum.repos.d/remi.repo /etc/yum.repos.d/remi.repo.`date +%Y%m%d%H%M%S`.bak num=$(awk '/enabled=0/{print NR}' /etc/yum.repos.d/remi.repo | sed 'q') && sed -i ''$num'c enabled=1' /etc/yum.repos.d/remi.repo Centos 7 yum install -y http://rpms.famillecollet.com/enterprise/remi-release-7.rpm rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-remi cp /etc/yum.repos.d/remi.repo /etc/yum.repos.d/remi.repo.`date +%Y%m%d%H%M%S`.bak num=$(awk '/enabled=0/{print NR}' /etc/yum.repos.d/remi.repo | sed 'q') && sed -i ''$num'c enabled=1' /etc/yum.repos.d/remi.repo 显示已生效的源列表 yum repolist 更新组件并安装必要的软件 yum makecache && yum update -y && yum install -y wget vim zip unzip gzip xz bzip2 l*zip p7zip lftp ftp ---------- # 1、安装Golang 用yum安装golang yum install -y golang 配置环境变量, 编辑/etc/profile文件: vim /etc/profile 在文件最后输入以上内容后保存退出。 export GOROOT=/usr/lib/golang export GOPATH=/usr/share/gocode export PATH=$PATH:$GOROOT/bin:$GOPATH/bin 或者使用以下命令备份原文件并添加相应内容 cp /etc/profile /etc/profile.`date +%Y%m%d%H%M%S`.bak sed -i '$a export GOROOT=/usr/lib/golang\nexport GOPATH=/usr/share/gocode\nexport PATH=$PATH:$GOROOT/bin:$GOPATH/bin' /etc/profile 在终端运行以下命令使环境变量生效: source /etc/profile 查看go是否安装成功: go version 若出现类似以下信息证明安装成功 > go version go1.7.4 linux/amd64 查看环境变量是否生效 export | grep -E 'GOPATH|GOROOT|PATH' 若出现类似以下信息证明环境变量设置成功 > declare -x GOPATH="/usr/share/gocode" > declare -x GOROOT="/usr/lib/golang" > declare -x PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/usr/lib/golang/bin:/usr/share/gocode/bin" **注意:** - `GOPATH="/usr/share/gocode"` - `GOROOT="/usr/lib/golang"` - `PATH = "..........:/usr/lib/golang/bin:/usr/share/gocode/bin"` 这三个变量**非常重要**,如果你安装Golang时采用了不同以上的路径,请在后续安装中做相应的修改。 ---------- # 2、获取Revel和 Leanote 的源码 ## 2.1 方法1 - 手动下载源码及依赖库(推荐): 下载官方源码及依赖库,解压后,将src文件夹复制到`$GOPATH` 即 `/usr/share/gocode/` cd ~ && wget https://github.com/leanote/leanote-all/archive/master.zip mkdir ./leanote-src && unzip -q master.zip -d ./leanote-src cp -dprf ./leanote-src/leanote-all-master/src/* /usr/share/gocode/src 使用如下命令生成revel二进制命令, 稍后运行Leanote需要用到 go install github.com/revel/cmd/revel ## 2.2 方法2 - 用git自动下载 该方法使用Golang的 go get 来下载包, 这个命令会调用git, 所以必须先安装git。 安装git: yum install -y git-core openssh-server openssh 获取Revel和Leanote: 打开终端, 以下命令会下载Revel和Leanote及依赖包, 时间可能会有点久, 请耐心等待。 go get github.com/revel/cmd/revel go get github.com/leanote/leanote/app 下载完成后,Leanote的源码在 `/usr/share/gocode/src/github.com/leanote/leanote`下。 ---------- # 3、安装mongod数据库 导入mongod社区自己的源来安装的3.6版本(4.0版本与leanote的兼容性未知,暂不使用) ## 3.1 增加mongod社区源 创建文件/etc/yum.repos.d/mongodb-org-3.6.repo vim /etc/yum.repos.d/mongodb-org-3.6.repo 在输入以下内容并保存退出。 ``` [mongodb-org-3.6] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc ``` ## 3.2 安装mongod yum install -y mongodb-org 安装完成后默认的数据库文件位于 `/var/lib/mongo` 日志文件位于 `/var/log/mongodb`,并自动创建了用户 mongod 和用户组 mongod,赋予mongod用户具有读写上述路径的权限。 **注意:**如果希望使用其他用户来运行mongod,务必重设上述路径的权限 ## 3.3 运行MongoDB #Centos 6 service mongod start #Centos 7 systemctl start mongod.service 检查mongod是否成功启动 ps -ef | grep mongod 也可以通过查看 `/var/log/mongodb/mongod.log` 日志文件来验证: > [initandlisten] waiting for connections on port <port> <port> 在配置文件 `/etc/mongod.conf` 中定义,默认为27017 设置为开机启动 #Centos 6 chkconfig mongod on #Centos 7 systemctl enable mongod.service (参考)停止 MongoDB #Centos 6 service mongod stop #Centos 7 systemctl stop mongod.service (参考)重新启动mongod #Centos 6 service mongod restart #Centos 7 systemctl restart mongod.service ## 3.4 导入初始数据 leanote 初始数据 在`/usr/share/gocode/src/github.com/leanote/leanote/mongodb_backup/leanote_install_data/`中。 在**系统终端shell**(非mongo命令行模式)下, 输入以下命令导入数据。这里以**mongodb v3.x** 版本为例,v2.x 版本有所不同,请自行查阅相关文档。 mongorestore -h localhost -d leanote --dir /usr/share/gocode/src/github.com/leanote/leanote/mongodb_backup/leanote_install_data/ 现在在mongodb中已经新建了leanote数据库。 ### 3.4.1 启动mongo客户端 mongo ### 3.4.2 在mongo命令行下输入命令 注意:“>” 后面的为输入的命令,其余为执行命令后系统返回的信息 查看数据库 ``` > show dbs admin 0.000GB leanote 0.001GB local 0.000GB ``` 切换到leanote ``` > use leanote switched to db leanote ``` 查看表 ``` > show collections albums attachs blog_comments blog_likes blog_singles configs email_logs files find_pwds group_users groups has_share_notes leanote.ShareNotes leanote.has_share_notes note_content_histories note_contents note_images note_tags notebooks notes reports sessions share_notebooks share_notes suggestions tag_count tags themes tokens traffics user_blogs users ``` 查看users表里的用户 ``` > db.users.find() { "_id" : ObjectId("5368c1aa99c37b029d000001"), "CreatedTime" : ISODate("2014-05-06T11:04:10.658Z"), "Email" : "admin@leanote.com", "LeftIsMin" : false, "NoteListWidth" : 266, "NotebookWidth" : 160, "Pwd" : "e99a18c428cb38d5f260853678922e03", "Theme" : "simple", "ThirdType" : 0, "ThirdUserId" : "", "ThirdUsername" : "", "Username" : "admin", "UsernameRaw" : "admin", "Verified" : false, "mdEditorWidth" : 0, "Usn" : 200044, "Logo" : "" } { "_id" : ObjectId("540817e099c37b583c000001"), "CreatedTime" : ISODate("2014-09-04T07:42:24.064Z"), "Email" : "demo@leanote.com", "LeftIsMin" : false, "NoteListWidth" : 0, "NotebookWidth" : 0, "Pwd" : "84e724109bd30a935846e8302be01bd8", "Theme" : "", "ThirdType" : 0, "ThirdUserId" : "", "ThirdUsername" : "", "Username" : "demo", "UsernameRaw" : "demo", "Verified" : false, "Usn" : 200006 } ``` 可以看到,初始数据的users表中已有2个用户: 用户1 - username: admin, password: abc123 , email: admin@leanote.com **注意:**此用户为leanote管理员,只有该用户才有权管理后台, 安装完成后请及时到管理后台修改密码> 用户2 - username: demo, password: demo@leanote.com, email: demo@leanote.com **注意:**此用户仅供体验使用,已经写死在了源代码里,不支持修改邮箱和密码。如果强行在数据库中修改,可能会造成demo用户无法登陆。 ### 3.4.3 (可选)修改leanote管理员邮箱 把leanote管理员的邮箱更改为自己的邮箱 myemail@example.com 注意:“>” 后面的为输入的命令,其余为执行命令后系统返回的信息 ``` > show dbs admin 0.000GB leanote 0.002GB local 0.000GB ``` ``` > use leanote switched to db leanote ``` ``` > show collections albums attachs ······ traffics user_blogs users ``` ``` > db.users.update({"Email" : "admin@leanote.com"}, {$set:{Email: 'myemail@example.com'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) ``` ``` > db.users.find() { "_id" : ObjectId("5368c1aa99c37b029d000001"), "CreatedTime" : ISODate("2014-05-06T11:04:10.658Z"), "Email" : "myemail@example.com", "LeftIsMin" : false, "NoteListWidth" : 266, "NotebookWidth" : 160, "Pwd" : "e99a18c428cb38d5f260853678922e03", "Theme" : "simple", "ThirdType" : 0, "ThirdUserId" : "", "ThirdUsername" : "", "Username" : "admin", "UsernameRaw" : "admin", "Verified" : false, "mdEditorWidth" : 0, "Usn" : 200044, "Logo" : "" } { "_id" : ObjectId("540817e099c37b583c000001"), "CreatedTime" : ISODate("2014-09-04T07:42:24.064Z"), "Email" : "demo@leanote.com", "LeftIsMin" : false, "NoteListWidth" : 0, "NotebookWidth" : 0, "Pwd" : "84e724109bd30a935846e8302be01bd8", "Theme" : "", "ThirdType" : 0, "ThirdUserId" : "", "ThirdUsername" : "", "Username" : "demo", "UsernameRaw" : "demo", "Verified" : false, "Usn" : 200006 } ``` 从查询结果可见,admin的邮箱已经更改成功。 注意:密码在数据库里是用MD5 32加密的,不建议直接修改,请安装完成后到管理后台修改 ## 3.5 为mongodb数据库添加管理员用户 到这里你可能已经发现了,进入mongodb操作读写数据库不需要输入任何的密码进行认证。这是因为与mysql不同,mongodb初始是没有root用户的, 显然,如果你的服务器暴露在公网中,将会成为爬虫的乐园, 所以要新建一个超级用户来管理整个数据库,再创建一个数据库用户来连接leanote库,就像在mysql中经常做的那样。 **注意:**并不是在leanote库的users表里新建用户,那里的用户是leanote自己的用户。 ### 3.5.1 创建管理员账户 创建一个超级用户`root`, 密码`dbadminpassword` ,可以操作所有库及其他用户。这里以mongodb v3.x 版本为例,v2.x 版本有所不同,请自行查阅相关文档。 “>” 后面的为输入的命令,其余为执行命令后系统返回的信息 ``` # 首先切换到admin库下 > use admin switched to db admin # 添加一个超级用户root, 密码是 dbadminpassword > db.createUser( { user: "root", pwd: "dbadminpassword", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] }) Successfully added user: { "user" : "root", "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] } # 测试下是否正确 > db.auth("root", "dbadminpassword") 1 # 返回1表示正确 ``` ### 3.5.2 创建leanote库的所有者用户 创建一个leanote库所有者用户`leanoteuser`,密码`lenoteuserpassword` ``` > use leanote switched to db leanote > db.createUser({ user: "leanoteuser", pwd: "lenoteuserpassword", roles: [{role: "dbOwner", db: "leanote"}] }) Successfully added user: { "user" : "leanoteuser", "roles" : [ { "role" : "dbOwner", "db" : "leanote" } ] } > db.auth("leanoteuser", "lenoteuserpassword") 1 # 返回1表示正确 ``` 用户添加好后用 ``` > exit ``` 或按Ctrl + C退出mongod ## 3.6 开启权限验证 编辑配置文件,增加启动参数,启用用户认证 注意:mongodb v2.6以上引入了**YAML格式**的配置文件,参数也不完全相同 ,以下是v3.x的格式,v2.x请自行查阅相关文档。 vim /etc/mongod.conf 在文档最后插入以下内容并保存退出。 ``` security: authorization: enabled # This will enable authentication on your database instance. setParameter: enableLocalhostAuthBypass: false ``` 注意:authorization和enableLocalhostAuthBypass之前**两个字符的缩进**必须存在,否则启动服务时会报错 或者使用以下命令备份原文件并添加相应内容 cp /etc/mongod.conf /etc/mongod.conf.`date +%Y%m%d%H%M%S`.bak echo -e 'security:\n authorization: enabled\n\nsetParameter:\n enableLocalhostAuthBypass: false\n' >> /etc/mongod.conf 重启服务 # Centos 6 service mongod restart # Centos 7 systemctl restart mongod.service ## 3.7 调整系统限制 增加配置文件 /etc/security/limits.d/99-mongodb-nproc.conf: vim /etc/security/limits.d/99-mongodb-nproc.conf 输入以下内容并保存退出。 mongod soft nofile 64000 mongod hard nofile 64000 mongod soft nproc 32000 mongod hard nproc 32000 或者使用以下命令创建文件 echo -e 'mongod soft nofile 64000\nmongod hard nofile 64000\nmongod soft nproc 32000\nmongod hard nproc 32000' > /etc/security/limits.d/99-mongodb-nproc.conf 重启 mongod 服务: service mongod restart ## 3.8 其他相关命令,供参考 (参考)如果mongodb报意外关闭无法启动,可以尝试修复数据库 mongod --dbpath /var/lib/mongo --repair (参考)如果错误添加了用户,可以用db.dropUser删除用户 ``` > use leanote switched to db leanote > db.dropUser("leanoteuser") true > use admin switched to db admin > db.system.users.find() ``` (参考)命令行方式以mongod用户身份启动权限验证的方法 runuser -l mongod -m -c 'mongod -f /etc/mongod.conf --auth' **注意:** 如果直接用root用户运行mogod,会覆盖数据文件的读写权限,导致mogod用户无法访问关键文件而造成**启动服务失败** ---------- # 4. 配置Leanote ## 4.1 修改配置文件 Leanote的配置存储在文件 `/usr/share/gocode/src/github.com/leanote/leanote/conf/app.conf` 中。 **注意:** - 请务必修改`app.secret`一项, 在若干个随机位置处,将字符修改成一个其他的值, 否则会有安全隐患! - `app.secret`不能有除字母和数字以外的符号,否则会导致一些问题出现 vim /usr/share/gocode/src/github.com/leanote/leanote/conf/app.conf 按以下内容修改文件头部,其他部分不动,并保存 ``` http.port=9000 site.url=http://yourip:9000 # or http://localhost:9000, http://example.com:8080, http://www.example.com:9000 db.host=localhost db.port=27017 db.dbname=leanote # required db.username=leanoteuser # if not exists, please leave blank db.password=lenoteuserpassword # if not exists, please leave blank ``` **注意:** - 请按实际情况替换`site.url`参数里的`youip`为服务器实际ip或域名。 - 如果服务器正在运行php-fpm解释器,可能9000端口已被占用,启动leanote会失败。请修改leanote的端口为9001或其他未被占用的端口 ## 4.2 配置反向代理服务器 总是带着端口号9000来访问leanote,既不美观也不方便,如果直接使用80端口,又可能会与其他web服务冲突,所以强烈推荐使用nginx或者apache的反向代理功能转发真实的访问请求到leanote后台服务。 在使用nginx等反向代理转发访问请求时,app.conf中的site.url应设置为反向代理服务器对外的域名和端口号(端口为80可省略),然后在反向代理服务器上设置将访问请求转发到leanote所在服务器的http://ip:port上,如果转发到本机,可以使用http://127.0.0.1:port ### 4.2.1 nginx做反向代理 如果反向代理服务器为nginx,假设nginx为了leanote而对外开放的域名为note.example.com,端口为80,leanote所在服务器的实际内网ip为192.168.1.17,端口为9000,那么相应的配置文件应为(仅为主机server部分,http部分请自行补齐) ``` server { listen 80; server_name note.example.com; charset utf-8; location / { proxy_redirect off; 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_pass http://192.168.1.17:9000; } } ``` **注意:**`proxy_pass http://192.168.1.17:9000` 这里最后没有“`/`" ### 4.2.2 apache做反向代理 如果反向代理服务器为apache(httpd),对外端口80,域名note.example.com,转发到本机本地端口9000,配置文件如下 ``` <VirtualHost *:80> ServerAdmin webmaster@note.example.com ServerName note.example.com ErrorLog logs/note.example.com-error_log CustomLog logs/note.example.com-access_log common #off表示开启反向代理,on表示开启正向代理 ProxyRequests Off ProxyMaxForwards 100 ProxyPreserveHost On <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / http://127.0.0.1:9000/ ProxyPassReverse / http://127.0.0.1:9000/ </VirtualHost> ``` **注意:** - 如果本机上已经有其他apache的web服务占用了80端口,需要开启NameVirtualHost功能,方法为在`/etc/httpd/conf/httpd.conf`中包含这一句 NameVirtualHost *:80 - `http://127.0.0.1:9000` 后面要有"`/`",这是和nginx设置不同的地方 - apache要安装并启用`proxy`模块 查看已安装模块 ``` ls /etc/httpd/modules | grep proxy ``` 返回信息 mod_proxy_ajp.so mod_proxy_balancer.so mod_proxy_connect.so mod_proxy_ftp.so mod_proxy_http.so mod_proxy_scgi.so mod_proxy.so 查看已启用模块 cat /etc/httpd/conf/httpd.conf | grep LoadModule | grep proxy 返回信息 LoadModule proxy_module modules/mod_proxy.so LoadModule proxy_balancer_module modules/mod_proxy_balancer.so LoadModule proxy_ftp_module modules/mod_proxy_ftp.so LoadModule proxy_http_module modules/mod_proxy_http.so LoadModule proxy_ajp_module modules/mod_proxy_ajp.so LoadModule proxy_connect_module modules/mod_proxy_connect.so 前面没有"`#`"为已启用。 ### 4.2.3 使用反向代理后的app.conf 使用反向代理后,app.conf中的site.url应设置为反向代理服务器对外的域名和端口号(端口为80可省略) ``` http.port=9000 site.url=http://note.example.com ``` ### 4.2.4 为Leanote指定超级管理员帐户(admin用户): Leanote默认超级管理员为admin,且一旦不小心修改了username可能导致无法正常登录系统后台。 此时可修改配置文件app.conf,指定超级管理员用户名。 修改或/添加一行: > adminUsername=life ---------- # 5. 运行Leanote 注意: 在此之前请确保Mongodb已在后台运行! 新开一个终端命令行窗口, 运行: revel run github.com/leanote/leanote 应返回显示如下信息 > INFO 2017/06/16 14:50:09 harness.go:175: Listening on :9000 ## 5.1 打开leanote所在服务器对应的防火墙端口 ### 5.1.1 Centos 6 iptables -I INPUT 1 -p tcp --dport 9000 -j ACCEPT service iptables save 返回信息: > iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ] service iptables restart 返回信息: > iptables: Setting chains to policy ACCEPT: filter [ OK ] > iptables: Flushing firewall rules: [ OK ] > iptables: Unloading modules: [ OK ] > iptables: Applying firewall rules: [ OK ] service iptables status 返回信息: > Table: filter > Chain INPUT (policy ACCEPT) > num target prot opt source destination > 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 > 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED > 3 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 > 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 > 5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 > 6 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited > > > Chain FORWARD (policy ACCEPT) > num target prot opt source destination > 1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited > > Chain OUTPUT (policy ACCEPT) > num target prot opt source destination **注意:** > 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 这一条一定要在 > 6 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 的前面。 ### 5.1.2 Centos 7 看一下目前active的zone是哪一个 firewall-cmd --get-active-zones > public > interfaces: ens32 为当前区域打开leanote对应的端口,上面的配置文件里是9000 firewall-cmd --permanent --zone=public --add-port=9000/tcp 重启防火墙 firewall-cmd --reload 查看是否生效 firewall-cmd --list-all 打开浏览器 访问http://yourip:9000 ,或者http://note.example.com 检查是否可以顺利打开。 用Ctrl -C结束运行 ---------- # 6. 编译leanote `revel run github.com/leanote/leanote` 其实做了3件事, 1).生成routes.go, main.go, 2).编译Leanote, 3).运行Leanote. 其中1) 生成routes.go, main.go 必须要用revel来完成, 但是这两个文件一般是不会改变的。 所以我们可以不用revel来运行Leanote,为之后配置leanote自动启动时脱离revle运行,先编译leanote. - 在$GoPath/bin路径(/usr/share/gocode/bin)下build leanote, 生成leanote二进制文件 go build -o /usr/share/gocode/bin/leanote github.com/leanote/leanote/app/tmp - 运行leanote, 其中-importPath是必须的 /usr/share/gocode/bin/leanote -importPath=github.com/leanote/leanote -runMode=prod -port=9000 显示类似以下信息为成功启动 > Sorted keys module.static > Sorted keys module.testrunner > Listening on :9000... ---------- # 7 提升系统安全等级 至此,leanote安装已经基本完成了,可以用浏览器登录admin用户,进入管理后台修改密码和其他配置了。 但还有个问题: ps -ef | grep leanote 返回信息 > root 4535 4534 0 Jun23 ? 00:00:53 /usr/share/gocode/bin/leanote -importPath=github.com/leanote/leanote -runMode=prod -port=9000 > root 16317 16277 0 18:00 pts/0 00:00:00 grep leanote 可以看出,leanote程序是在root用户下运行的,如果源程序被注入恶意代码,有可能危及系统的安全,所以我们有必要为leanote专门设立一个用户来单独运行,就像apache或者nginx用户那样。 ## 创建不能登录的普通用户golang groupadd golang && cat /etc/group | grep golang 返回信息 > golang:x:500: useradd -d /usr/share/gocode/ -s /sbin/nologin -g golang golang 返回信息 > useradd: warning: the home directory already exists. > Not copying any file from skel directory into it. cat /etc/passwd | grep golang 返回信息 > golang:x:500:500::/usr/share/gocode/:/sbin/nologin 获取文件夹权限 chown -R golang.golang /usr/lib/golang /usr/share/gocode/ 如果因为其它原因想恢复上述文件夹的权限 chown -R root.root /usr/lib/golang /usr/share/gocode/ ---------- # 8、配置自动运行 ## 8.1. 安装 supervisor ### 8.1.1 Centos 6 Centos 6源里的supervisor版本为2.x,实际使用时有点问题,这里用ppython-setuptools自动安装3.x版本 yum install -y python-setuptools && easy_install supervisor mkdir -m 755 /var/lib/supervisor /etc/supervisord /var/log/supervisor (可选)查看初始设置 echo_supervisord_conf 保存初始设置为 /etc/supervisord.conf.default,以作参考 echo_supervisord_conf > /etc/supervisord.conf.default ### 8.1.2 Centos 7 centos 7的 epel源里有supervisor 3.1,可以直接安装 yum install -y supervisor ## 8.2 编辑配置文件 /etc/supervisord.conf ### 8.2.1 Centos 6 vim /etc/supervisord.conf 输入以下内容并保存退出。 ``` [unix_http_server] file=/var/lib/supervisor/supervisor.sock ; the path to the socket file [supervisord] logfile=/var/log/supervisor/supervisord.log ; main log file; default $CWD/supervisord.log logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB logfile_backups=10 ; # of main logfile backups; 0 means none, default 10 loglevel=info ; log level; default info; others: debug,warn,trace pidfile=/var/run/supervisord.pid ; supervisord pidfile; default supervisord.pid nodaemon=false ; start in foreground if true; default false minfds=1024 ; min. avail startup file descriptors; default 1024 minprocs=200 ; min. avail process descriptors;default 200 [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///var/lib/supervisor/supervisor.sock ; use a unix:// URL for a unix socket [include] files = /etc/supervisord/*.ini ``` 或者下载我写好的这个文件[supervisord.conf](https://aoeii.com/share/leanote/supervisord.conf) wget -P /etc/ https://aoeii.com/share/leanote/supervisord.conf 注意检查上面几处路径是否存在,权限是否正确。 ### 8.2.1 Centos 7 yum 安装的supervisor已经存在上面的配置文件 ## 8.3 新建配置文件/etc/supervisord/leanote.ini vim /etc/supervisord/leanote.ini 输入以下内容并保存退出。 ``` [program:leanote] command=/usr/share/gocode/bin/leanote -importPath=github.com/leanote/leanote -runMode=prod -port=9000 environment=GOROOT="/usr/lib/golang",GOPATH="/usr/share/gocode",PATH="$PATH:/usr/lib/golang/bin:/usr/share/gocode/bin" user=golang autostart=true autorestart=true startsecs=10 ; number of secs prog must stay running (def. 10) startretries=3 ; max # of serial start failures (default 3) exitcodes=0,2 ; 'expected' exit codes for process (default 0,2) stopsignal=QUIT ; signal used to kill process (default TERM) stopwaitsecs=10 ; max num secs to wait before SIGKILL (default 10) log_stdout=true ; if true, log program stdout (default true) log_stderr=true ; if true, log program stderr (def false) ``` 或者下载我写好的这个文件[leanote.ini](https://aoeii.com/share/leanote/leanote.ini) wget -P /etc/supervisord/ https://aoeii.com/share/leanote/leanote.ini ## 8.4 启动supervisor ### 8.4.1 Centos 6 读取配置文件后启动: supervisord -c /etc/supervisord.conf 查看执行结果: supervisorctl status 显示类似如下信息为成功启动 > leanote STARTING > leanote RUNNING pid 2756, uptime 0 days, 0:00:31 查看是否成功启动 ps -ef | grep leanote 显示类似以下信息为成功启动 > golang 2756 2753 0 Jun16 ? 00:00:29 /usr/share/gocode/bin/leanote -importPath=github.com/leanote/leanote -runMode=prod -port=9000 (参考)重启和启动supervisor的命令 supervisorctl reload supervisorctl start all ### 8.4.2 Centos 7 重启服务 systemctl restart supervisord.service 查看服务状态 systemctl status supervisord.service > ● supervisord.service - Process Monitoring and Control Daemon > Loaded: loaded (/usr/lib/systemd/system/supervisord.service; disabled; vendor preset: disabled) > Active: active (running) since Fri 2018-07-06 12:19:52 UCT; 0min 11s ago > Main PID: 7557 (supervisord) > CGroup: /system.slice/supervisord.service > ├─7557 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf > └─7558 /usr/share/gocode/bin/leanote -importPath=github.com/leanote/leanote -runMode=prod -port=9000 > > Jul 06 12:19:52 www.example.com systemd[1]: Starting Process Monitoring and Control Daemon... > Jul 06 12:19:52 www.example.com systemd[1]: Started Process Monitoring and Control Daemon. 查看是否成功启动 ps -ef | grep leanote > golang 7558 7557 0 12:19 ? 00:00:00 /usr/share/gocode/bin/leanote -importPath=github.com/leanote/leanote -runMode=prod -port=9000 > root 7745 3160 0 12:24 pts/1 00:00:00 grep --color=auto leanote ## 8.5 配置Supervisor开机启动 ### 8.5.1 Centos 6 增加service启动脚本 vim /etc/rc.d/init.d/supervisord 输入内容如下并保存: ``` #!/bin/bash # # supervisord Startup script for the Supervisor process control system # # Author: Mike McGrath <mmcgrath@redhat.com> (based off yumupdatesd) # Jason Koppe <jkoppe@indeed.com> adjusted to read sysconfig, # use supervisord tools to start/stop, conditionally wait # for child processes to shutdown, and startup later # Erwan Queffelec <erwan.queffelec@gmail.com> # make script LSB-compliant # # chkconfig: 345 83 04 # description: Supervisor is a client/server system that allows \ # its users to monitor and control a number of processes on \ # UNIX-like operating systems. # processname: supervisord # config: /etc/supervisord.conf # config: /etc/sysconfig/supervisord # pidfile: /var/run/supervisord.pid # ### BEGIN INIT INFO # Provides: supervisord # Required-Start: $all # Required-Stop: $all # Short-Description: start and stop Supervisor process control system # Description: Supervisor is a client/server system that allows # its users to monitor and control a number of processes on # UNIX-like operating systems. ### END INIT INFO # Source function library . /etc/rc.d/init.d/functions # Source system settings if [ -f /etc/sysconfig/supervisord ]; then . /etc/sysconfig/supervisord fi # Path to the supervisorctl script, server binary, # and short-form for messages. supervisorctl=/usr/bin/supervisorctl supervisord=${SUPERVISORD-/usr/bin/supervisord} prog=supervisord pidfile=${PIDFILE-/var/run/supervisord.pid} lockfile=${LOCKFILE-/var/lock/subsys/supervisord} STOP_TIMEOUT=${STOP_TIMEOUT-60} OPTIONS="${OPTIONS--c /etc/supervisord.conf}" RETVAL=0 start() { echo -n $"Starting $prog: " daemon --pidfile=${pidfile} $supervisord $OPTIONS RETVAL=$? echo if [ $RETVAL -eq 0 ]; then touch ${lockfile} $supervisorctl $OPTIONS status fi return $RETVAL } stop() { echo -n $"Stopping $prog: " killproc -p ${pidfile} -d ${STOP_TIMEOUT} $supervisord RETVAL=$? echo [ $RETVAL -eq 0 ] && rm -rf ${lockfile} ${pidfile} } reload() { echo -n $"Reloading $prog: " LSB=1 killproc -p $pidfile $supervisord -HUP RETVAL=$? echo if [ $RETVAL -eq 7 ]; then failure $"$prog reload" else $supervisorctl $OPTIONS status fi } restart() { stop start } case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} $supervisord RETVAL=$? [ $RETVAL -eq 0 ] && $supervisorctl $OPTIONS status ;; restart) restart ;; condrestart|try-restart) if status -p ${pidfile} $supervisord >&/dev/null; then stop start fi ;; force-reload|reload) reload ;; *) echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload}" RETVAL=2 esac exit $RETVAL ``` 或者下载我写好的这个文件[supervisord](https://aoeii.com/share/leanote/supervisord) wget -O /etc/rc.d/init.d/supervisord https://aoeii.com/share/leanote/supervisord 或者到[github下载](https://github.com/Supervisor/initscripts/blob/master/redhat-init-equeffelec) wget -O /etc/rc.d/init.d/supervisord https://raw.githubusercontent.com/Supervisor/initscripts/master/redhat-init-equeffelec 然后执行: chmod +x /etc/rc.d/init.d/supervisord chkconfig --add supervisord chkconfig supervisord on 以后就可以用任务管理器来启动、停止和重启supervisor了 # 启动 service supervisord start # 停止 service supervisord stop # 重启 service supervisord restart 检查mongod和supervisord服务的自动启动设置 chkconfig | grep -E 'mongod|supervisord' 返回如下类似信息为成功 > mongod 0:off 1:off 2:on 3:on 4:on 5:on 6:off > supervisord 0:off 1:off 2:on 3:on 4:on 5:on 6:off ### 8.5.2 Centos 7 设置开机启动 systemctl enable supervisord.service ---------- # 9. 导出PDF配置 wkhtmltopdf Leanote的PDF导出使用了wkhtmltopdf, 所以需要先安装wkhtmltopdf, 然后以管理员身份登录Leanote管理后台配置wkhtmltopdf路径。 wkhtmltopdf可以用三种方式来安装:源码编译、二进制文件、rpm包。源码编译较为繁琐,不推荐。 ## 9.1 方法1. 用rpm方式安装 v0.12.5(推荐) ### 9.1.1 下载安装包 - Centos 7 x64 wget -O ~/wkhtmltox.rpm https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox-0.12.5-1.centos7.x86_64.rpm - Centos 6 x64 wget -O ~/wkhtmltox.rpm https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox-0.12.5-1.centos6.x86_64.rpm - Centos 6 x32 wget -O ~/wkhtmltox.rpm https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.5/wkhtmltox-0.12.5-1.centos6.i686.rpm ### 9.1.2 安装依赖包 yum install -y xorg-x11-fonts-75dpi xorg-x11-fonts-Type1 ### 9.1.3 安装wkhtmltox rpm -ivh ~/wkhtmltox.rpm ## 9.2 方法2. 二进制版本wkhtmltopdf安装v0.12.4 ### 9.2.1 下载二进制文件包并解压缩 wget -O ~/wkhtmltox.tar.xz https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz tar -Jxvf ~/wkhtmltox.tar.xz 或者 xz -d ~/wkhtmltox.tar.xz && tar -xvf ~/wkhtmltox.tar 如果解压报错,需要先安装压缩工具xz yum install -y xz ### 9.2.2 将所有文件拷贝到 /usr/local chown -R root.root wkhtmltox/ cp -dprfv ~/wkhtmltox/* /usr/local/ ### 9.2.3 安装依赖包及字体支持 yum install -y libXrender fontconfig freetype libX11 libXext libpng libXfont xorg-x11-fonts-Type1 xorg-x11-fonts-75dpi mkfontscale ### 9.2.4 检查依赖包是否完整 ldd /usr/local/bin/wkhtmltopdf > linux-vdso.so.1 => (0x00007ffcbdc5d000) > libXrender.so.1 => /usr/lib64/libXrender.so.1 (0x00007fcc4ef5e000) > libfontconfig.so.1 => /usr/lib64/libfontconfig.so.1 (0x00007fcc4ed28000) > libfreetype.so.6 => /usr/lib64/libfreetype.so.6 (0x00007fcc4ea8a000) > libXext.so.6 => /usr/lib64/libXext.so.6 (0x00007fcc4e878000) > libX11.so.6 => /usr/lib64/libX11.so.6 (0x00007fcc4e53b000) > libz.so.1 => /lib64/libz.so.1 (0x00007fcc4e324000) > libdl.so.2 => /lib64/libdl.so.2 (0x00007fcc4e120000) > librt.so.1 => /lib64/librt.so.1 (0x00007fcc4df18000) > libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fcc4dcfa000) > libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00007fcc4d9f4000) > libm.so.6 => /lib64/libm.so.6 (0x00007fcc4d770000) > libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fcc4d559000) > libc.so.6 => /lib64/libc.so.6 (0x00007fcc4d1c5000) /lib64/ld-linux-x86-64.so.2 (0x000055f6c0d15000) > libexpat.so.1 => /lib64/libexpat.so.1 (0x00007fcc4cf9d000) > libxcb.so.1 => /usr/lib64/libxcb.so.1 (0x00007fcc4cd77000) > libXau.so.6 => /usr/lib64/libXau.so.6 (0x00007fcc4cb74000) > 可能部分机器会遇到libpng提示缺少的问题,原因是直接安装的版本过高,某些版本wkhtmltopdf预编译版本依赖的libpng版本要低一点,通过`yum provides libpng12.so.0`,找到对应的版本,然后在进行安装`yum install libpng12-1.2.50-6.el7.x86_64`。 ## 9.3 安装windows下的常用中文和英文字体 创建字体文件夹: mkdir -m 755 -p /usr/share/fonts/{chn,eng} 拷贝字体文件: 用winscp或其他ssh/sftp软件将本地电脑`C:\Windows\fonts\`下的msyh.ttc, msjh.ttc等字体文件直接拖动拷贝到上面的文件夹, 把微软雅黑(简体)、微软正黑(繁体)、宋体、黑体、楷体、仿宋、隶书、华文楷体、华文隶书、华文宋体、新细明体Pmingliu(繁体)等中文字体拷贝到`/usr/share/fonts/chn/` 把Arial, Times New Roman, Tahoma, Calibri, Consolas, SourceCodePro, Monaco, Inconsolata 等常用英文字体拷贝到`/usr/share/fonts/eng/` 建立字体索引信息,更新字体缓存: mkfontscale /usr/share/fonts/chn /usr/share/fonts/eng mkfontdir /usr/share/fonts/chn /usr/share/fonts/eng fc-cache -fv 返回信息 > /usr/share/fonts: caching, new cache contents: 0 fonts, 2 dirs > /usr/share/fonts/chn: caching, new cache contents: 12 fonts, 0 dirs > /usr/share/fonts/eng: caching, new cache contents: 29 fonts, 0 dirs > /usr/share/X11/fonts/Type1: caching, new cache contents: 13 fonts, 0 dirs > /usr/share/X11/fonts/TTF: skipping, no such directory > /usr/local/share/fonts: skipping, no such directory > /var/cache/fontconfig: cleaning cache directory > fc-cache: succeeded 至此,字体已经安装完毕。现在我们再来查看是否安装成功: fc-list 只查看中文字体: fc-list :lang=zh 测试wkhtmltopdf是否正常工作,检查中文页面是否能正常导出: wkhtmltopdf http://baidu.com ~/baidu.pdf ## 9.4 leanote导出PDF的设置 后台管理 - Configuration - Export PDF > Wkhtmltopdf Binary Path > > /usr/local/bin/wkhtmltopdf ## 9.5 不能导出PDF? 如果导出PDF没有出现下载文件的提示, 证明导出出错, 请按照以下步骤检查: 1. wkhtmltopdf安装是否成功? 请通过 `wkhtmltopdf http://baidu.com baidu.pdf` 检查 2. wkhtmltopdf的路径在Leanote是否正确设置? 请复制你设置的路径到控制台导出试试, 比如`/usr/local/bin/wkhtmltopdf http://baidu.com baidu.pdf` 3. 导出还有问题? 请检查你的`conf/app.conf`中设置的`site.url`是否可以访问, Leanote导出PDF时会访问笔记链接, 这个链接的前缀就是 `site.url` 4. 请检查你的`conf/app.conf`中设置`app.secret`的值中不能有特殊符号,例如"#",由于这个值会传递给wkhtmltopdf以验证请求者身份,如果存在特殊符号将导致命令执行失败 ---------- # 10 leanote后台设置 ## 10.1 手动备份数据的设置 > 后台管理 - Data - Mongodb Tool Configuration Mongodb Tool Configuration > mongodump path > > /usr/bin/mongodump > > mongorestore path > > /usr/bin/mongorestore ## 10.2 (参考)手动备份数据库命令 /usr/bin/mongodump --host localhost --db leanote --username leanoteuser --password "lenoteuserpassword" --out /usr/share/gocode/src/github.com/leanote/leanote/mongodb_backup/`date +%Y`_`date +%B`_`date +%d`_`date +%s`/ ---------- # 11(参考) nohup挂载 - 不使用supervisor的情况下 ## 11.1 nohup 2>&1 & 如果不使用supervisor来守护leanote进程,而是喜欢在终端下直接执行命令,例如使用SecureCRT跟Linux通信,当断开SecureCRT时,Linux终端也会关闭,导致跟Mongod断开连接,造成无法访问leanote。 解决方法:使用nohup指令 nohup revel run github.com/leanote/leanote 2>&1 & 或者 runuser -l leanote -m -c 'nohup revel run github.com/leanote/leanote 2>&1 &' 查看后台进程revel ps -ef | grep revel 杀死进程 kill -9 进程号 解释: > &的作用是会通过一个子进程在后台运行./startup.sh,而如果当前的shell,比如terminal被关闭了,所有的子进程也会被退出,这时你的startup.sh就不会运行了。 > 那如果你想要在ssh远程运行一段程序,然后退出terminal怎么做呢?nohup就派上用场了,如果你退出了terminal,hangup信号会发出,nohup会catch信号,并将子进程的头指向1,即初始进程没这样startup.sh这个进程就不会退出了。 > 当然,nohup默认不会被放到后台进行,所以只要结合nohup和&,就可以实现在后台运行,并且不会因为退出termianl而退出进程的功能了,这也是为什么通常这两个会同时出现。 ## 11.2 配置开机启动 虽然通过nohup命令让 Leanote进程进入后台运行了,但是一旦重启还是要手动开启,略麻烦,这时可以自己新建 `*.sh` 脚本文件,将命令写入脚本文件里,然后在 `rc.local` 配置文件中运行 `*.sh` 脚本文件就能实现开机启动 Leanote 服务端。 可以参考下面的 `leanote_autorun.sh` 写法: ``` #!/bin/bash str=$"\n" nohup revel run github.com/leanote/leanote 2>&1 & sstr=$(echo -e $str) echo $sstr tail -20 /root/nohup.out > /root/revel_leanote.log ``` 若脚本文件命名为 `leanote_autorun.sh`,且存放在`/usr/share/gocode/bin/` 目录里,先增加可执行权限, chmod +x /usr/share/gocode/bin/leanote_autorun.sh 再编辑 rc.local 配置文件: vim /etc/rc.local 加入下面的命令然后保存即可: source /etc/profile bash /usr/share/gocode/bin/leanote_autorun.sh ---------- # 12 开发版如何更新leanote? 可以使用git pull得到leanote上最新版本, 如果你已修改了leanote, 可以先fetch(推荐使用fetch的方式)最新到本地, 再与本地的合并. 如: git fetch origin master:tmp # 得到远程最新版本, 别名为tmp git diff tmp # 查看tmp与本地的不同 git merge tmp # 合并到本地 如果不能用git方式同步源码, 请到[这里](https://github.com/leanote/leanote)下载 1. 请先备份leanote之前的目录, 以防万一 2. 将下载好的替换之前的leanote 3. 将之前版本下的 - /public/upload/ 目录 - /files/ 目录 - /conf/app.conf 移到新版下相应位置,重启Leanote. 如果运行有问题, 如 "cannot find package "github.com/PuerkitoBio/goquery" in any of:..." 类似的信息, 原因是Leanote增加了新的依赖, 此时可以使用go get命令下载新包, 如下载"github.com/PuerkitoBio/goquery" go get github.com/PuerkitoBio/goquery 或下载[依赖包与源码全集](https://github.com/leanote/leanote-all) ---------- # 13 为什么需要 site.url site.url是外网可访问的域名, site.url用于生成笔记内的图片/附件路径。 比如你可以配置为http://a.com, 但在运行leanote可以设端口为9000, 再通过Nginx转发到9000. 如果外网地址是80端口, 请不要填写http://a.com:80, 而只要为http://a.com即可! 若使用nginx转发到https方式部署leanote,site.url需要配置成https://a.com ;否则在博客页面输出的css和js是以http链接形式展现在html中,高版本浏览器比如firefox会直接block掉这部分内容,从而页面显示不正常。 更多信息请查看[github issues ](https://github.com/leanote/leanote/issues/228) ---------- # 14 HTTPS 与ssl证书设置 若使用nginx转发到https方式部署leanote,site.url需要配置成https://example.com 如果申请了免费的ssl证书,nginx的配置文件可以这么写 ``` server { listen 443 ssl http2; server_name note.example.com; charset utf-8; add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;"; add_header X-Content-Type-Options nosniff; add_header X-XSS-Protection "1; mode=block"; add_header X-Robots-Tag none; add_header X-Download-Options noopen; add_header X-Permitted-Cross-Domain-Policies none; ssl on; ssl_certificate /etc/pki/tls/certs/1_note.example.com_bundle.crt; ssl_certificate_key /etc/pki/tls/private/2_note.example.com.key; ssl_session_cache shared:SSL:5m; ssl_session_timeout 10m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA256:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA"; ssl_prefer_server_ciphers on; location / { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Host $host; proxy_pass http://192.168.1.17:9000; } } ``` 注意: - 证书文件要上传存储在nginx服务器上的对应路径里 #证书 /etc/pki/tls/certs/1_note.example.com_bundle.crt #key /etc/pki/tls/private/2_note.example.com.key - 正确配置证书链/中间证书(Intermedia CA)。 通常情况下,浏览器会自动下载中间证书,但安卓的部分手机浏览器无法自动下载中间证书,这会造成访问https主机失败。 因此我们需要在反向代理服务器上增加中间证书,如果用apache做反向代理,应在apache的配置文件中增加一行 SLCertificateChainFile /path/to/1_note.example.com_chain.crt 如果是用nginx做反向代理,1_note.example.com_bundle.crt 证书文件里请依次包括域名证书、中间证书,格式大致如下: -----BEGIN CERTIFICATE----- VVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UE ChMVVGhlIFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVz ZXJ0cnVzdC5jb20xKzApBgNVBAMTIlVUTi1VU0VSRmlyc3QtTmV0d29yayBBcHBs NzExMDY5NDAxMTAvBgNVBAsTKFNlZSB3d3cucmFwaWRzc2wuY29tL3Jlc291cmNl cy9jcHMgKGMpMDcxLzAtBgNVBAsTJkRvbWFpbiBDb250cm9sIFZhbGlkYXRlZCAt XCKBNQNAzybtImcaJjXQsihqkuohYcWh2QuijBgXZC+o9IUl+2SNhw6OYXSJTuuD 09VFQFAaUC41rLcU9BDh6w7xmGnZJzZ0H8jm2E9NA6s6DId7qQ+f/YdkKePRR+Dw p9GnjmheMvhqs0DFj+tCFhHX3PK8WGrYBYG8ejsgo8uKAKTkishpOMyTs4CmTlDX chn5QGRjpq2FlIqqlTwLdMGpkeUSZjuAFblLhTQs158Q5VHC5SH+3DvJW+g7/CpT jBhiTnfNyD19rUmrWZ2dmic50B32BAiIO9OepmVvI8nA1TBvNFfhX75cOCk= -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ZXJpU2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0 aG9yaXR5IC0gRzUwHhcNMDYxMTA4MDAwMDAwWhcNMzYwNzE2MjM1OTU5WjCByjEL MAkGA1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMR8wHQYDVQQLExZW ZXJpU2lnbiBUcnVzdCBOZXR3b3JrMTowOAYDVQQLEzEoYykgMjAwNiBWZXJpU2ln biwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5MUUwQwYDVQQDEzxWZXJp U2lnbiBDbGFzcyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9y aXR5IC0gRzUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCvJAgIKXo1 nmAMqudLO07cfLw8RRy7K+D+KQL5VwijZIUVJ/XxrcgxiV0i6CqqpkKzj/i5Vbex t0uz/o9+B1fs70PbZmIVYc9gDaTY3vjgw2IIPVQT60nKWVSFJuUrjxuf6/WhkcIz SdhDY2pSS9KP6HBRTdGJaXvHcPaz3BJ023tdS1bTlr8Vd6Gw9KIl8q8ckmcY5fQG BO+QueQA5N06tRn/Arr0PO7gi+s3i+z016zy9vA9r911kTMZHRxAy3QkGSGT2RT+ rCpSx4/VBEnkjWNHiDxpg8v+R70rfk/Fla4OndTRQ8Bnc+MUCH7lP59zuDMKz10/ NIeWiu5T6CUVAgMBAAGjgbIwga8wDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E BAMCAQYwbQYIKwYBBQUHAQwEYTBfoV2gWzBZMFcwVRYJaW1hZ2UvZ2lmMCEwHzAH BgUrDgMCGgQUj+XTGoasjY5rw8+AatRIGCx7GS4wJRYjaHR0cDovL2xvZ28u= -----END CERTIFICATE----- 第一段是服务器域名证书,第二段是中间证书,中间有个空行。 - 根证书 (root CA) 签发中间证书的根证书(root CA)一般会内置于操作系统或者浏览器的安装程序里,不需要特意提供,如果操作系统或者浏览器没有内置,一般也会通过中间证书提供的url去下载根证书进行验证。但如果签发中间证书的根证书(root CA)也比较偏门,为避免自动下载链接不畅或被“墙”,最好把根证书也包括在chain.crt或bundle.crt的最后。 - 检测 可以通过这个在线工具检测站点的证书安装和验证情况 [SSL服务器证书安装检查器](https://www.myssl.cn/tools/check-server-cert.html) # 15 定时自动备份数据库并上传ftp服务器 先安装压缩软件和ftp客户端 yum install -y p7zip lftp 创建备份脚本文件 touch /root/backup_leanote.sh chmod 750 /root/backup_leanote.sh vim /root/backup_leanote.sh 输入以下内容,并按照实际的数据库用户名和密码进行修改,然后保存。 ``` #!/bin/bash BAK_DATETIME_s=`date +%Y`_`date +%B`_`date +%d`_`date +%s` BAK_DATE=`date +%Y%m%d` BAK_DATETIME=`date +%Y%m%d.%H%M%S` if [ ! -d "/root/backup/$BAK_DATE" ]; then mkdir -p /root/backup/$BAK_DATE fi cd /root/backup/$BAK_DATE echo "####################################################" echo -e "$(date "+%Y-%m-%d %H:%M:%S")" "Start backuping databases " echo " " echo -e "####" "$(date "+%Y-%m-%d %H:%M:%S")" "## Step 1 Backup leanote mongo database... " /usr/bin/mongodump --host localhost --db leanote --username leanoteuser --password "leanoteuserpassword" --out /usr/share/gocode/src/github.com/leanote/leanote/mongodb_backup/$BAK_DATETIME_s/ 7za a -t7z -r leanote-mongodb_$BAK_DATETIME.7z /usr/share/gocode/src/github.com/leanote/leanote/mongodb_backup/$BAK_DATETIME_s/ rm -rf /usr/share/gocode/src/github.com/leanote/leanote/mongodb_backup/$BAK_DATETIME_s echo " " echo -e "####" "$(date "+%Y-%m-%d %H:%M:%S")" "## Backup leanote folder..." 7za a -t7z -r leanote-dirbkp_$BAK_DATETIME.7z /usr/share/gocode/src/github.com/leanote/ chmod -R 0600 /root/backup echo " " echo -e "####" "$(date "+%Y-%m-%d %H:%M:%S")" "## Upload to ftp server" # 下面是ftp命令 # lftp -u ftpuser,ftpuserpassword ftp.server.net -e 'lcd /root/backup; mirror -R -c .; quit' # 下面是ftps命令 lftp -c 'set ftp:ssl-allow true ; set ftp:ssl-protect-data true; set ssl:verify-certificate no; set use-feat no; set ftp:ssl-auth TLS; open -u ftpuser,ftpuserpassword -p 21 -e "lcd /root/backup; mirror -R -c .; quit" ftps://ftp.server.net' echo " " echo -e "####" "$(date "+%Y-%m-%d %H:%M:%S")" "## Backup leanote acomplished!" # 下面是ftp命令 # lftp -u ftpuser,ftpuserpassword ftp.server.net -e 'lcd /root/; put backup_leanote; quit' >>/dev/null 2>&1 # 下面是ftps命令 lftp -c 'set ftp:ssl-allow true ; set ftp:ssl-protect-data true; set ssl:verify-certificate no; set use-feat no; set ftp:ssl-auth TLS; open -u ftpuser,ftpuserpassword -p 21 -e "lcd /root/; put backup_leanote.log; quit" ftps://ftp.server.net' >>/dev/null 2>&1 ``` 建议使用ftps(ftp over tls),在传输过程中数据是加密的,不会造成隐私泄露。 **注意:** ftps和sftp (Secure File Transfer Protocol)是不同的,如果备份到其他linux服务器,可以使用sftp/scp 新增定时任务,每天凌晨2:30备份数据库并上传ftp服务器 crontab -e 输入,保存。 # backup leanote databases and files every day and upload to ftp server 30 2 * * * /bin/sh /root/backup_leanote.sh >>/root/backup_leanote.log 2>&1 ---------- 参考文章 - [Leanote 源码版详细安装教程 Mac and Linux](https://github.com/leanote/leanote/wiki/Leanote-%E6%BA%90%E7%A0%81%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B----Mac-and-Linux) - [Leanote问题汇总](https://github.com/leanote/leanote/wiki/QA) - [如何不使用revel运行Leanote](http://leanote.leanote.com/post/how-to-run-leanote-without-revel) - [User Management Methods — MongoDB Manual 3.4](http://https://docs.mongodb.com/manual/reference/method/js-user-management//) - [Configuration File Options — MongoDB Manual 3.4](https://docs.mongodb.com/manual/reference/configuration-options/) - [UNIX ulimit Settings — MongoDB Manual 3.4](https://docs.mongodb.com/manual/reference/ulimit/) - [私人云笔记 Leanote 服务端搭建指南 让自己的笔记无处不在](https://www.idaybreak.com/install-leanote-server.html) - [Leanote安装笔记](https://oldcat.me/blog/post/oldcat/Leanote-%E5%AE%89%E8%A3%85%E7%AC%94%E8%AE%B0) - [auto-generated wkhtmltopdf manual](https://wkhtmltopdf.org/usage/wkhtmltopdf.txt) - [Leanote中pdf导出功能配置](http://huangketech.com/leanote-wkhtmltopdf/) - [中间证书的使用](https://www.myssl.cn/home/article-0406-42.html) - [一键备份脚本](https://teddysun.com/469.html)
blog
linux
leanote
centos
linux
该博客文章由作者通过
CC BY 4.0
进行授权。
分享
最近更新
ESXi 6.7 离线升级 7.0U3
N5105 软路由安装 ESXi 7 直通核显给 Debian / Ubuntu 虚拟机通过 Docker 实现 jellyfin 硬件转码视频文件(硬解/编码)
Leanote 支持 emoji、chart.js 以及 mermaid
手把手教你自建开源免费私有云盘服务nextcloud 14
在Centos 6和7上安装设置MySQL / MariaDB 5.5或以上的版本
热门标签
linux
centos
python
ESXi
windows
leanote
mysql
font
Docker
phpmyadmin
文章目录
用Openssl生成10年有效期的自签名证书
在Centos 6和7上安装设置nginx 1.1x