往日微忆
文章目录

笔记应用,兜兜转转好多年,最初一开始用为知免费版再到为知收费版、Evernote 国际免费版、Joplin。使用 Joplin 也有大半年多,优点尚且不论,其他小毛病譬如 Markdown 编辑器窗口光标定位跟打出的字不在同一位置、一直没有 Web 端(有第三方但未能成功)、同步不方便等就不说了,都能忍。最近因为数据再一次同步丢失,忍不可忍,必须换掉它。想着为知可以自建了,结果试用了一下,搭建完成,等了老半天(应以几个小时算)终于可以登录了,输入用户名和密码,出现登录错误。官方帮助文档倒是都提及了,但我依步骤做还是没解决,那就算了,弃之,体验性不好。最后决定改用 Leanote 。虽然评价有好有坏,但至少目前符合我的使用需求,搭建一步成功,界面、使用体验都不错,各平台客户端都有,同步基本没问题,数据备份可自行搞定,就是官方一直没有网页剪藏(可复制粘贴变相解决),但是已经够用就行了。以下记录搭建和使用过程。

Leanote 官网:蚂蚁笔记

Leanote 官网:Github

自建 docker 镜像

新建leanote-docker-build目录,下有两文件:Dockerfilerun.sh

配置Dockerfile文件

Dockerfile文件内容如下:

FROM mongo:4.2.7-bionic
MAINTAINER zcw
ENV TZ=Asia/Shanghai

ADD run.sh /root/
RUN set -ex; \
    apt-get update; \
    apt-get install -y --no-install-recommends wget tar vim; \

    # install font
    apt-get install -y xvfb libXrender* libfontconfig*; \
    apt-get install -y \
        fonts-arphic-bkai00mp \
        fonts-arphic-bsmi00lp \
        fonts-arphic-gbsn00lp \
        fonts-arphic-gkai00mp \
        fonts-arphic-ukai \
        fonts-arphic-uming \
        ttf-wqy-zenhei \
        ttf-wqy-microhei \
        xfonts-wqy; \
    rm -rf /var/lib/apt/lists/*; \

    # download wkhtmltopdf
    wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz; \
    tar -xvf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz; \
    cp wkhtmltox/bin/wkhtmltopdf /usr/local/bin/wkhtmltopdf; \
    chmod +x /usr/local/bin/wkhtmltopdf; \
    rm -rf wkhtmltox wkhtmltox-0.12.4_linux-generic-amd64.tar.xz ;\

    #download leanote,下载地址后有说明
    wget https://static.axboy.cn/leanote/leanote-linux-amd64-v2.6.1.bin.tar.gz -O /root/leanote.tar.gz; \ 
    tar -xzf /root/leanote.tar.gz -C /root/ ;\
    rm -f /root/leanote.tar.gz ;\
    chmod a+x /root/run.sh ;\
    chmod a+x /root/leanote/bin/run.sh ;\
    echo 'export QT_QPA_PLATFORM=offscreen' >> ~/.bashrc ;\
    ln -snf /usr/share/zoneinfo/$TZ /etc/localtime ;\
    echo $TZ > /etc/timezone

EXPOSE 9000 27017
# CMD ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && /bin/bash /root/run.sh
CMD /bin/bash /root/run.sh

上述第32行地址根据实际情况修改。leanote 最新稳定版本地址可在http://leanote.org/#download查看。

配置run.sh文件

run.sh内容如下:

#!/bin/bash

mongod &

# 数据库未导入
if [ ! -f "/data/db/do_not_delete" ]; then
    echo "Initial mongo data"
    mongorestore -h localhost -d leanote --dir /root/leanote/mongodb_backup/leanote_install_data/
    echo "do not delete this file" >> /data/db/do_not_delete
    chmod 400 /data/db/do_not_delete
fi

# conf不存在
if [ ! -f '/data/leanote/conf/app.conf' ]; then
    mkdir -p /data/leanote/conf/
    cp /root/leanote/conf/app.conf /data/leanote/conf/app.conf

    echo "first run, replace secret"
    oldStr=`cat /data/leanote/conf/app.conf | grep 'app.secret'`
    newStr=app.secret=`cat /proc/sys/kernel/random/uuid`
    sed -i "s/${oldStr}/${newStr}/g" /data/leanote/conf/app.conf
    sed -i "s/site.url=.*$/site.url=\${SITE_URL} /" /data/leanote/conf/app.conf;  # SITE_URL 参数对应下述安装执行文件
fi

cp -n -r /root/leanote /data/
rm -rf /root/leanote/

echo `date "+%Y-%m-%d %H:%M:%S"`' >>>>>> start leanote service'
/data/leanote/bin/run.sh

上述两文件代码主要是参考https://github.com/axboy/docker-leanote完整功能版本相应代码,部分已根据需要和习惯自行增加和修改。建好后,在此目录执行如下命令:

docker build -t litanid/leanote:v261l1 .

将新建 docker 镜像文件 litanid/leanote:v261l1

docker login后,执行docker push litanid/leanote:v261l1,上传至 docker hub。

在 docker 环境平台搭建运行 Leanote

配置 nginx

首先,配置 DNS 解析,将域名(假设为leanote.yiwan.org)解析到你的主机。然后配置 nginx 网站文件leanote.yiwan.org.conf并启用。

leanote.yiwan.org.conf文件内容如下:

server {
    listen 80;
    #listen [::]:80;

    server_name  leanote.yiwan.org;
    rewrite ^(.*)$ https://${server_name}$1 permanent;
#   return 301 https://$host$request_uri;

}

server {
    listen    443  ssl;
    #listen [::]:443 ssl
    server_name  leanote.yiwan.org;

    charset utf-8;
    access_log  /var/log/nginx/host.access.log  main;

   #ssl on;
    ssl_certificate       /home/litad/.ssl/apa-letsencrypt/*.yiwan.org/fullchain.pem;
    ssl_certificate_key   /home/litad/.ssl/apa-letsencrypt/*.yiwan.org/key.pem;
    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers                 ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
    ssl_prefer_server_ciphers   on;
    ssl_session_cache           shared:SSL:10m;
    ssl_session_timeout         30m;

    #zero mean unlimited. you can upload any filesize you want
    client_max_body_size 0;

    underscores_in_headers on;
    
    location / {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:58081;   #对应下面设置的端口

        proxy_set_header  Host                $http_host;
        proxy_set_header  X-Real-IP           $remote_addr;
        proxy_set_header  X-Forwarded-Ssl     on;
        proxy_set_header  X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto   $scheme;
        proxy_set_header  X-Frame-Options     SAMEORIGIN;

        client_max_body_size        100m;
        client_body_buffer_size     128k;

        proxy_buffer_size           4k;
        proxy_buffers               4 32k;
        proxy_busy_buffers_size     64k;
        proxy_temp_file_write_size  64k;
    }
}

配置install-leanote_inPCC.sh文件

安装执行文件install-leanote_inPCC.sh内容如下:

#!/usr/bin/env bash

# Provide default variable values

if [ -z "${LD_CONTAINER_NAME}" ]; then
    LD_CONTAINER_NAME="leanote"    #定义容器名称
fi
if [ -z "${LD_HOST_PORT}" ]; then
    LD_HOST_PORT=58081      #定义主机端口
fi
if [ -z "${LD_SITEURL}" ]; then
    LD_SITEURL=https://leanote.yiwan.org       #定义访问域名
fi
if [ -z "${LD_HOST_DATA_DIR}" ]; then
    LD_HOST_DATA_DIR=/home/litad/ltdZiao/1syncData/90_Leanote      #定义数据目录
    mkdir -p  ${LD_HOST_DATA_DIR}/{db,conf,files,upload}        #如之前没有数据目录,则新建 
fi
if [ -z "${LEANOTE_DOCKER_IMAGE}" ]; then
    LEANOTE_DOCKER_IMAGE=litanid/leanote:v261l1        #定义 docker hub 镜像文件,同第一步匹配
fi

echo "Create or update leanote container"
echo "Container name: ${LD_CONTAINER_NAME}"
echo "Host port: ${LD_HOST_PORT}"
echo "Host data dir: ${LD_HOST_DATA_DIR}"

echo "Stop existing container..."
docker stop ${LD_CONTAINER_NAME} || true
echo "Remove existing container..."
docker rm ${LD_CONTAINER_NAME} || true
echo "Update image..."
docker pull ${LEANOTE_DOCKER_IMAGE}
echo "Start container..."
docker run --name ${LD_CONTAINER_NAME} \
  --restart=always -d \
  -v ${LD_HOST_DATA_DIR}/db:/data/db \
  -v ${LD_HOST_DATA_DIR}/conf:/data/leanote/conf \
  -v ${LD_HOST_DATA_DIR}/files:/data/leanote/files \
  -v ${LD_HOST_DATA_DIR}/upload:/data/leanote/public/upload \
  -e SITE_URL=${LD_SITEURL} \
  -p ${LD_HOST_PORT}:9000 \
  ${LEANOTE_DOCKER_IMAGE}
echo "Done!"

终端下运行此文件,如无错误,则可以打开浏览器,输入https://leanote.yiwan.org后即可访问搭建好的 Leanote 笔记。如下图示:

Web 端首页
Web 端笔记页

Leanote 使用方法以及遇到的问题和解决方法

用户和密码

初始用户有两个:

user1: username: admin, password: abc123 (管理员, 只有该用户才有权管理后台, 登录后一定要记得修改)

user2: username: [email protected], password: [email protected] (仅供体验使用,不能修改密码)

可自行增加用户。

客户端使用

Leanote 可在多平台使用,从官网下载各平台应用。各平台应用如之前用其他用户登录过,登录选定用户时笔记会和之前用户混合在一起,此时 Android 端请先管理 Leanote app,清空用户数据再重新登录,PC 端登录后请先“强制全量同步”一下(就是用服务端的数据覆盖本地数据)。建议如果可行,尽量用 Web 端登录使用。其他客户端使用时,使用前和使用后,记得先要同步一下,要不然容易造成数据不一致。

修改上传附件大小限制

使用一段时间后,你会发现本地有些笔记无法同步成功,会提示 uplodad 错误。此时一方面要修改上述leanote.yiwan.org.conf文件中的限制文件大小限制,另一方面要登录后台管理更改上传图片、附件等大小限制。当然,首要的是相应目录权限也要先设置好。

更新后无法启动容器

如果更新到新版后, 出现启动后无法访问网站或者是无法启动容器, 可能是 conf 文件与老版本不兼容引起的, 去官方地址https://github.com/leanote/leanote/tree/master/conf下载一个最新的配置文件覆盖掉 conf/app.conf 后稍作修改即可。

数据备份

数据还是要定期经常备份,要不然万一丢失了或损坏了,那才是欲哭无泪,叫天不应,叫地不灵。数据无价。

备份脚本leanote_data_autobak_inPCC.sh文件内容如下:

#!/bin/bash

# Others vars
SOCE_DIR="/home/litad/ltdZiao/1syncData/90_Leanote/"      #需要备份的目录
BACK_DIR="/home/litad/ltdZiao/1syncData/00_DataBaKUP/06leanoteserver/data/"    #备份文件要保存到的目录
DATE=`date +%Y%m%d%H%M%S`

tar cvjf ${BACK_DIR}leanote_inPCC_$DATE.tar.bz2 ${SOCE_DIR} 

chown 12078:12078 ${BACK_DIR}leanote_inPCC_$DATE.tar.bz2    #更改所属用户、用户组

# 删除7天之前的备份文件,但保留日期为1号的文件(用于手动删除)
find ${BACK_DIR}* -regextype "posix-extended" -not -regex ".*[0-9]{6}01[0-9]{6}\.tar\.bz2$" -mtime +7 -exec rm {} \;

再设置 crontab 项添加自动定期备份:

18 04 * * * /home/litad/ltdZiao/1syncData/00_DataBaKUP/06leanoteserver/docker_inPCC/leanote_data_autobak_inPCC.sh

即可。

参考文章