阅读视图

发现新文章,点击刷新页面。
🔲 ⭐

树莓派 | 欧路词典生词本 & 墨墨背单词 云同步教程 (eudic-maimemo-sync)

在浏览网页时,我常用欧路词典的“欧路翻译”浏览器插件进行划词翻译。这个插件会自动记录查阅过的单词,并将其添加到欧路词典的生词本中。 然而,在单词记忆方面,我更习惯使用“墨墨背单词”。

因此,我在寻找一种方法,将欧路词典的生词本同步到墨墨背单词的词库。这样,我就可以用自己习惯的软件来记忆日常阅读中遇到的生词了。

欧陆墨墨.png

后来我发现,这两个软件其实都提供开放 API。于是,我开发了 eudic-maimemo-sync 工具,实现欧路词典生词本到墨墨背单词云词库的自动同步。同时,我还将其部署在树莓派上,让它每天自动运行,实现了生词本的无缝同步。

image.png

接下来,我将介绍如何配置和使用这个工具,并分享开发过程中遇到的一些问题和解决方法。也欢迎大家贡献代码或提出建议。

目录

eudic-maimemo-sync 使用教程

1. 下载代码安装依赖

前置条件:已安装 Python 3 环境

下载代码:

git clone https://github.com/eMUQI/eudic-maimemo-sync.git

安装依赖:

cd eudic-maimemo-sync
pip install -r requirements.txt

2. 配置环境变量

接下来,需要配置环境变量。首先,复制 .env.example.env

2.1 欧路词典相关配置

  • 获取欧路词典 API 密钥

    访问此页面,登录后,获取你的API密钥。并将获取到的 API 密钥填入.env文件中的EUDIC_API_KEY字段。

    image.png
  • 获取生词本 ID

    运行 get_wordbook_id.py,查看生词本信息,记下你需要同步的生词本 ID。

    python get_wordbook_id.py
    image.png

    将需要同步的生词本 ID 填入 .env 中的 EUDIC_CATEGORY_ID

2.2 墨墨背单词相关配置

  • 获取墨墨背单词 API 密钥

    打开墨墨背单词手机 App,进入「我的」-「更多设置」-「实验功能」-「开放 API」,生成并复制 API 密钥,然后将其填入 .env 文件中的 MOMO_API_KEY 字段。

  • 获取云词库 ID

    运行 get_notepad_id.py,查看云词库信息,记住你需要同步的云词库 ID。

    python get_notepad_id.py
    image.png

    将需要同步的词库 ID 填入 .env 文件中的 MOMO_NOTEPAD_ID 字段。

3. 手动同步

运行 sync.py,即可手动触发一次同步。

python sync.py

4. 自动同步(部署到树莓派上或者其他 Linux 设备)

确保部署前已经成功手动运行过 python sync.py,验证配置无误。

使用Docker

我个人比较喜欢用 Docker, 隔离性好,依赖管理简单,不会弄乱系统的环境。在我的树莓派 5 上运行良好,额外的性能开销在可接受范围内。

创建一个 docker-compose.yml 配置文件:

services:
  eudic-maimemo-sync:
    image: ghcr.io/emuqi/eudic-maimemo-sync:latest
    container_name: eudic-maimemo-sync
    restart: unless-stopped
    env_file:
      - .env
    # volumes:
    #   - ./words_data.txt:/app/words_data.txt # 如果想查看单词记录,取消此行和上一行的注释
    environment:
      - TZ=Asia/Shanghai
      - RUN_ON_STARTUP=true # 设置为 true 时,容器每次启动时会执行一次同步任务
      # CRON 定时任务表达式配置:
      # 示例:每小时的第 0 分钟执行(即整点执行)
      # - CRON_SCHEDULE=0 * * * *
      # 示例:每天凌晨 3:15 执行
      - CRON_SCHEDULE=15 3 * * *
      # 请确保所有必需的环境变量(如 EUDIC_API_KEY 等)已在 .env 文件中定义或在此处直接指定。
    healthcheck:
      # Test if the supercronic process is running
      test: ["CMD-SHELL", "pgrep supercronic || exit 1"]
      interval: 2m
      timeout: 5s
      retries: 3
      start_period: 10s

你可以通过 CRON_SCHEDULE 来设置任务的运行周期:

  • CRON_SCHEDULE=0 * * * *: 每小时的第 0 分钟执行(即整点执行)
  • CRON_SCHEDULE=15 3 * * *: 每天凌晨 3:15 执行

在相同目录下创建一个 words_data.txt 文件,用于记录同步的单词列表,方便调试或查看。如果不需要,可以跳过此步。

touch words_data.txt

启动容器

docker compose up -d

其他方式

你还可以使用 cron 或者 systemctl 的方式来定时运行这个同步脚本。如果你熟悉这些工具的配置,欢迎分享你的方法或提交 Pull Request。


开发中遇到的问题

  1. 欧路词典 API 的 User-Agent 要求: 欧路词典 API 对请求的 User-Agent 有特定要求,不接受 Python HTTP 库(如 requests)的默认 User-Agent。因此,在与该 API 交互时,必须显式设置一个浏览器类型的 User-Agent,以确保请求被正确处理。本项目中,我采用了 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36

  2. 墨墨背单词 API 云词库格式: 墨墨背单词 API 文档中关于添加单词到云词库所需的数据格式说明不够清晰。文档中只说明数据类型是 string,但未明确其具体结构。经过试验,结构为以井号 # 开头的行作为分类标记(例如日期),换行后紧跟该分类下的单词,每个单词独占一行。下一个分类同样以 # 开头的标记开始。如 #20250415\napple\nboy#20250416\ncat

    #20250415
    apple
    boy
    #20250416
    cat
  3. Docker 中定时任务:从 Cron 到 Supercronic 的迁移: 一开始,我尝试在 Docker 容器内部署 Cron 来定时执行 Python 任务。但是,Cron 任务默认在隔离的、极简的环境中执行,无法直接继承 Docker 容器启动时定义的环境变量(例如 API 密钥等配置)。虽然有方法可以间接加载,但配置比较繁琐。于是我迁移到了 SupercronicSupercronic 是一款专为容器环境设计的 Cron 实现,它兼容标准的 Crontab 语法,还能继承容器的环境变量。如果你有类似的项目,推荐你使用 Supercronic 作为替代方案。

最后,欢迎提交 Pull Requests 或 Issues 到 eudic-maimemo-sync。有任何想法,也欢迎在下方留言。

相关链接

🔲 ⭐

2024 读书总结

过去这一年,我的阅读主要围绕心理健康、自我认知和个人成长展开。这些书籍帮助我更深入地理解了自我和他人,也为日常生活提供了实用的工具和方法。虽然遗憾没能在读完时及时记录感受,但重温这些书籍时,仍能感受到它们带给我的启发和改变。以下是我对这些书籍的简要回顾与思考。

《蛤蟆先生去看心理医生》

作者:罗伯特·戴博德
译者:陈赢
出版社:天津人民出版社

一本很薄的故事书,有点像童话或者寓言故事,如书名,讲述了蛤蟆先生去看心理医生的故事。 读起来很轻松,流畅,一下就可以读完。这本书提供了一个了解心理咨询的视角,是一本不错的心理学读物。 书中还科普了交互分析理论(Transactional Analysis,TA)中的儿童自我状态,父母自我状态,成人自我状态。这个理论认为我们会在这三种状态不停地切换,非常有趣的理论,有助于帮助了解自我。

《直视骄阳》

作者:Irvin D. Yalom
译者:张亚
出版社:中国轻工业出版社

这是一部关于如何面对死亡的深刻著作。

这本书讲了死亡焦虑的普遍性,如何识别死亡焦虑,它能够带来什么,以及我们可以如何去面对它。

对我而言,这本书帮助最大的就是带我了解了伊比鸠鲁的观念:

  • 死亡本身不可怕,因为我们无法感受死亡,死后“我”就消失了,即“完全虚无的死亡”。
  • 生前和死后,是对称的两极。死后其实和生前并无差别。
  • 波动影响。指人有意无意会对周围的任何事物产生影响,就像池塘中的涟漪,即使细微但是很长远。

这本书给了我一些方法去处理我的死亡焦虑,也给我带来了一些新的思考去看待自己的死亡和他人的死亡。书中还讨论了死亡意识如何反过来影响我们的生活态度,以及如何将对死亡的思考转化为珍惜当下的动力。如果你有存在焦虑或者死亡焦虑,我非常推荐这本书。

《非暴力沟通》

作者:马歇尔·卢森堡
译者:刘轶
出版社:华夏出版社

这本书介绍了非暴力沟通。也是一种生活理念。它提示我要关注自己内心的感受和需求,真诚地与人沟通。

通过把注意力放到观察、感受、需求和请求这四个要素来改善沟通,同时非暴力沟通还强调自主的重要性,强调个人责任。我觉得这一点和存在主义的观念是很吻合。

书中还提到了很多非常有意思的讨论:比如观察和评论的区别,请求和要求的区别。这些讨论不仅帮助我反思与人的沟通,也帮助我反思人际关系。

非暴力沟通方法在亲密关系中尤其有效,能帮助伴侣之间建立更深入的理解和连接。

书中还有很多内容,需要真正去读并且实践才有用,非常有帮助,非常推荐这本书。

《Headspace 冥想正念手册》

作者:安迪·帕帝康
译者:李芳龄
出版社:星出版

这本书科普了冥想和正念,有很多帮助理解冥想的故事,还提供一些方法帮助入门冥想。

之前一直听说过冥想,听过很多关于冥想的传闻,却也没有真正了解过。今年特别想尝试一下冥想,买了这本书来了解一下,让我对冥想有了不同的认识。书中还提供了很多隐喻帮助理解冥想。我也尝试了冥想,对我而言确实有帮助的。

如果你也对冥想感兴趣,或者正在尝试但觉得摸不着头绪,很推荐这本书。我看的这个版本是繁体中文,还有一个简体中文的版本,名字是《十分钟冥想》。

《天生敏感》

作者:伊莱恩·阿伦
译者:于娟娟
出版社:华夏出版社

这是一本讲述所谓高敏感人群的特质的书。

听了枫言枫语的节目,专门看了这本书。我大致也属于比较敏感的人群,这本书帮助高敏感人群了解自我,理解自我,并且提供了一些方法更好的与外部世界相处。还有很重要的是,能够带来很大的认同感。

《素食者》

作者:韩江
译者:胡椒筒
出版社:四川文艺出版社

这是一本小说,由2024年诺贝文学奖作者韩江写的。书中通过三个视角来叙述同一个故事,这点比较有趣。我是慕名去看,没有我想象中的好看,整本书像是讲述几个精神病的故事,很压抑。

《也许你该找个人聊聊》

作者:洛丽·戈特利布
译者:张含笑
出版社:上海文化出版社

这是一本讲述心理咨询的书。这本书很厚,由一个心理咨询师的视角写作,书中以一个个故事组成,每一个章节是一个故事,有作者本人的故事,也有作者作为心理咨询师在咨询室里遇到的故事。虽然很厚但是读起来没有压力,可以慢慢看看,每天看几个故事。我喜欢这本书不是一本说教的书,平易近人,没有让人感觉是在尝试告诉你什么道理,而是通过一个个故事,让你自己去感受,找到自己的理解。

结语

希望今年能保持阅读的习惯,也期待遇见更多好书。

☑️ ⭐

OpenAI Python API 新版本示例

最近升级了 OpenAI Python 包的最新版本。运行旧代码时出现编译错误:

You tried to access openai.ChatCompletion, but this is no longer supported in openai>=1.0.0 - see the README at https://github.com/openai/openai-python for the API.

You can run `openai migrate` to automatically upgrade your codebase to use the 1.0.0 interface.

Alternatively, you can pin your installation to the old version, e.g. `pip install openai==0.28`

A detailed migration guide is available here: https://github.com/openai/openai-python/discussions/742

openai>=1.0.0 示例

在查看了提示中迁移说明的后,写一个基本示例来调用openai>=1.0.0版本,供大家参考:

说明:代码中设置 base_url 以自定义主机,从而能够使用第三方 OpenAI 代理,这个选项的可选的,如果你使直接访问openai的服务,可以删除这一个配置。

from openai import OpenAI
client = OpenAI(
api_key="xxx",
base_url = 'xxx'
)
def get_completion(prompt, model="gpt-3.5-turbo-1106"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
temperature=0.7,
)
return response.choices[0].message.content
prompt = "你好,ChatGPT!"
print(get_completion(prompt))

如果要启用 OpenAI 新推出的 JSON mode

def get_completion(prompt, model="gpt-3.5-turbo-1106"):
messages = [{"role": "user", "content": prompt}]
response = client.chat.completions.create(
model=model,
messages=messages,
response_format={"type": "json_object"},
temperature=0.7,
)
return response.choices[0].message.content

openai==0.28 示例

import openai
openai.api_key = ''
openai.api_base = ''
def get_completion(prompt, model="gpt-3.5-turbo-1106"):
messages = [{"role": "user", "content": prompt}]
response = openai.ChatCompletion.create(
model=model,
messages=messages,
temperature=0.7,
)
return response.choices[0].message["content"]
prompt = "你好,ChatGPT!"
print(get_completion(prompt))
☑️ ⭐

AutoHotkey 脚本实现一键复制文本到 ChatGPT 提示模板

在使用ChatGPT时,常常需要借助各种提示(prompt)模板。对于翻译工作,我通常使用以下模板:

我希望你能担任英语翻译、拼写校对和修辞改进的角色。
我会用任何语言和你交流,你会识别语言,将其翻译并用更为优美和精炼的英语回答我。
请将我简单的词汇和句子替换成更为优美和高雅的表达方式,确保意思不变,但使其更具文学性。
请仅回答更正和改进的部分,不要写解释。
我提供的文本遵循Markdown格式,请不要修改我的格式。
你的回复应该以```开始```结束。
这是我的第一个文本:
<需要翻译的内容>

尽管ChatGPT的网页版具备持续对话的能力,只需在对话开始时输入上面提示模板,之后就无需再次输入,ChatGPT会理解你后面发给它的内容是需要翻译的。然而,由于对话的上下文长度是有限的,随着对话长了以后,ChatGPT可能会在后续对话中"遗忘"前面的内容,并将需要翻译的内容误认为是与它的对话内容。

因此,我更倾向于将模板放置在文本编辑器中,每次将待翻译的内容替换到提示词模板中,然后将完整的提示词发给ChatGPT。不过,当需要翻译多个文本时,就需要不断复制要翻译的内容、替换模板、然后粘贴,操作很繁琐。

于是,我想到使用AutoHotkey(AHK)来实现:每当我选中文本并使用Ctrl+C复制后,自动将复制的内容替换到提示模板中,并更新剪贴板。这样,在粘贴时就能直接发送给ChatGPT了。 通过这种方式省去了手动替换文本到模板步骤,提高效率。

效果如下:

使用效果

什么是AutoHotkey(AHK)?

AutoHotkey 是一种免费的开源脚本编程语言和自动化工具,用于创建自定义脚本和宏来自动化计算机任务和增强工作流程。它支持自定义快捷键、鼠标动作、窗口操作等,并可以与其他应用程序交互。它简单易用,适用于Windows系统,可提高效率和简化重复任务。

编写ank脚本

下载并安装AutoHotkey(AHK)后,新建一个.ahk文件(例如chatgpt_copy.ahk),并使用你喜欢的文本编辑器进行编辑。Windows自带的记事本也可以,但我推荐使用VScode。将此gist内容复制到该文件中即可:

https://gist.github.com/eMUQI/3d3eaf5241ab6dff32283fecd7eeb899

这个脚本绑定了Ctrl+Shift+C快捷键。当你按下这个快捷键时,它会执行以下操作:

  1. 复制选中的文本到剪贴板。
  2. 将剪贴板的内容插入到模板中的相应位置。
  3. 更新剪贴板内容为最终的文本。

如果你要修改代码,关于代码的说明:

  1. 为了避免破坏原来Ctrl + C的体验,我设置激活的按钮为Ctrl + Shift + C。如需修改,参考:AHK - How to Write Hotkeys
  2. 在 AutoHotkey 的脚本中,如果你需要在字符串里表示一个反引号(`),你需要使用两个反引号(``)来转义它。
  3. ;分号后的内容是注释。

运行ank脚本

由于文本编码问题,编写完脚本之后记得打开 AutoHotkey ,进入设置页面,勾选"default to UTF-8 even for v1 scripts"。否则粘贴出来的文本会变成乱码。

ank-set-1.png
ank-set-2.png

完成了以上步骤后,只需双击.ahk文件即可运行。程序会在右下角的系统托盘中显示其正在运行。

🔲 ⭐

指定 Whisper 输出为简体中文

Whisper是OpenAI推出的一种开源语音识别模型,能够自动识别多种语言,将音频转换文字。Whisper由python实现,同时拥有丰富的社区支持。除了原始的Whisper之外,还有一些相关的项目,有移植到 C/C++的whisper.cpp和能使用GPU加速的faster-whisper。如果你不懂编程或者不熟悉命令行,也有也有很多开发者开发了图形界面,比如buzzConst-me/Whisper等。

Whisper 支持直接输出srt格式的字幕文件。我最近用 Whisper 生成字幕文件,再配合ChatGPT 使用GPT-Subtrans 翻译字幕,整体效果很好。不过, Whisper有一个问题,就是Whisper 使用--language来指定语言,但无论是简体中文还是繁体中文,对应的代码都是zh。很多情况下,使用Whisper 生成字幕文件,设置参数--language zh,会生成繁体中文的字幕文件。

解决方案

在网上终于查到解决方案,分享给大家。 在 Whisper 的讨论区中,@jongwook 提出:

  1. 使用 --initial_prompt 参数,用简体中文输入 "以下是普通话的句子。" 就能生成简体中文字幕。(补充:whisper.cpp 用户可以尝试使用--prompt参数)
  2. 以此类推,用繁体中文输入 "以下是普通話的句子。" 就能得到繁体字幕。
$ whisper --language Chinese --model large audio.wav
[00:00.000 --> 00:08.000] 如果他们使用航空的方式运输货物在某些航线上可能要花几天的时间才能卸货和通关
$ whisper --language Chinese --model large audio.wav --initial_prompt "以下是普通話的句子。"  # traditional
[00:00.000 --> 00:08.000] 如果他們使用航空的方式運輸貨物,在某些航線上可能要花幾天的時間才能卸貨和通關。
$ whisper --language Chinese --model large audio.wav --initial_prompt "以下是普通话的句子。"  # simplified
[00:00.000 --> 00:08.000] 如果他们使用航空的方式运输货物,在某些航线上可能要花几天的时间才能卸货和通关。

另外,有关 --initial_prompt 参数,可在 openai的文档 查看更多。其中也提到 "有些语言可以用不同的方式书写,比如简体或繁体中文。模型可能默认不会使用你想要的转录写作风格。你可以通过使用你偏好的写作风格的提示来改善这一点。"。

🔲 ⭐

树莓派使用LUKS加密移动硬盘分区

前言

之前写过如何用树莓派挂载移动硬盘并使用SMB在局域网共享,使用了很长一段时间也没有什么问题。但是近期突然想到,这个移动硬盘里已经有太多私人资料了,虽然SMB和树莓派都有密码保护,但是硬盘本身却没有做任何的保护。一旦硬盘遗失,里面的数据就会直接泄露。于是就产生了加密硬盘,使用树莓派进行解密再使用SMB进行共享的想法。

关于加密方式,考虑过使用veracrypt加密,但是相比之下还是LUKS(Linux Unified Key Setup)更加“原生”,不依赖客户端,用起来也比较方便。

文前提示:本文不是针对完全不会的小白的教程,需要有一定的Linux基础,尤其是针对分区的操作,一定要看清楚分区名。进行操作前请备份好自己的数据。遇到问题欢迎在评论区留言。

加密指定分区

  • 树莓派配置:
Raspberry Pi 4b 4gb
OS: Ubuntu 20.04.4 LTS
Kernel: aarch64 Linux 5.4.0-1062-raspi
  1. 查看硬盘
sudo fdisk -l     

找到想要加密的硬盘分区,我这里已经提前分好区了。我这里把硬盘分成/dev/sda3/dev/sda4/dev/sda3作为日常盘,外出时使用。/dev/sda4作为加密盘,在树莓派上使用smb共享。

fdisk.png

本文中要加密的分区是 /dev/sda4 ,如果你参考了本教程的命令,记得要将后文中的所有 /dev/sda4 替换为你要加密的分区

如果你还没有分区,可以使用fdisk进行分区,具体用法可以查看 Fdisk-archwiki)。

  1. 格式化分区

提前备份好数据,然后格式化要加密的分区。将/dev/sda4替换为你的要加密的分区,注意提前备份好数据。

 sudo wipefs -a /dev/sda4    
  1. 加密分区

使用 cryptsetup 创建加密容器,使用 --type 指定使用luks2版本。使用 --cipher 指定加密算法,如果不指定默认会使用 aes-xts-plain64 ,但是树莓派的芯片不支持AES加速,加密解密会比较慢,使用 Adiantum 会比较快,具体可以看 LUKS-on-Raspberry-Pi

sudo cryptsetup --type luks2 --cipher xchacha20,aes-adiantum-plain64 luksFormat /dev/sda4

执行命令后,需要输入大写的 YES 确认执行操作,然后设置好密码。 创建加密容器.png

  1. 映射容器

加密后的分区需要解密才能使用,使用luksOpen解密分区。下面的的命令会将加密分区映射到/dev/mapper/cdata

sudo cryptsetup luksOpen /dev/sda4 cdata
ls /dev/mapper/
luksopen.png
  1. 创建文件系统

加密容器第一次使用的时候需要创建文件系统,例如我创建的是 ext4

sudo mkfs.ext4 /dev/mapper/cdata
image.png
  1. 挂载加密分区
sudo mkdir -p /media/CRYPT
sudo chmod 776 /media/CRYPT
sudo mount /dev/mapper/cdata /media/CRYPT

开机自动解密并挂载

  1. 创建密钥

由于需要使用密钥文件才能开机自动解密,我们需要先创建密钥文件,密钥文件可以使用自动生成的随机数,也可以自行创建。我创建的密钥文件是 /keyfilec

sudo cryptsetup luksAddKey /dev/sda4 /keyfilec
ADDKEY.png
  1. 验证密钥
sudo umount /dev/mapper/cdata    //取消挂载
sudo cryptsetup luksClose cdata  //锁上分区
sudo cryptsetup luksOpen /dev/sda4 cdata --key-file=/keyfilec   //使用密钥文件解密

我们取消挂载,然后将分区锁上。使用密钥文件来解密,没有看到任何提示,就说明我们已经成功使用密钥文件来打开加密分区了。 验证密钥.png

  1. 自动挂载 查看分区的UUID,后面自动解密时需要用到。
blkid /dev/sda4

sda4uuid.png 编辑 /etc/crypttab 自动打开加密分区,添加下面的内容。

cdata UUID=a8c7a856-dfe0-4273-b546-13b2cdf50f12 /keyfilec luks

编辑 /etc/fstab 自动挂载加密分区,添加下面内容。

/dev/mapper/cdata /media/CRYPT ext4 defaults 0 0
  1. 重启之后,就可以验证加密分区是否已经已经自动挂载了。

SMB共享

我的树莓派上已经配置好了smb,具体可以参考这篇文章的 配置SMB 部分。

sudo nano /etc/samba/smb.conf

修改 /etc/samba/smb.conf 在最后添加以下内容。

[share]
comment = share folder
browseable = yes
path = /media/CRYPT
create mask = 0700
directory mask = 0700
valid users = ubuntu
force user = ubuntu
force group = ubuntu
public = yes
available = yes
writable = yes

修改好配置后,重启smb服务。

sudo service smbd restart

参考文章

cryptsetup 文档

Frequently Asked Questions Cryptsetup/LUKS

Configuring LUKS: Linux Unified Key Setup (推荐)

LUKS on Raspberry Pi

🔲 ⭐

利用Samba和树莓派打造家庭NAS

本文将讲述如何利用Samba将树莓派挂载的硬盘共享到本地网络以打造家庭NAS(Network Attached Storage)。文尾有关于当前部分主流系统一些支持SMB(Server Message Block)协议的实用软件。

配置树莓派

  • 本文所用树莓派的系统信息:
Raspberry Pi 4b 4gb
OS: Ubuntu 20.04 focal
Kernel: aarch64 Linux 5.4.0-1008-raspi

挂载移动硬盘

ntfs-3g

因为在linux内核所包含的NTFS驱动程序仅提供读取操作(包括列出文件清单、开启、复制文件),而缺少写入操作(包括创建文件,对文件的修改、更名、移动和删除)的支持。如果你的硬盘是ntfs文件系统,那么就需要使用ntfs-3g来挂载硬盘。如果你的硬盘是其他文件格式,请忽略此步骤。

sudo apt update & sudo apt install ntfs-3g

开机自动挂载

  1. 查看分区信息

    sudo fdisk -l //找到要挂载的硬盘并记住对应信息
  2. 创建挂载目录

    mkdir -p /media/WULU-HHD
  3. 修改/etc/fstab

    将下面的 /dev/sda1 替换为你的硬盘,/media/Wulu-HHD 替换为你要挂载硬盘的路径。

    /dev/sda1 /media/Wulu-HHD ntfs defaults,uid=1000,gid=1000,dmask=022,fmask=133 0 0

配置SMB

  1. 安装 samba

    sudo apt install samba
  2. 设置 smb 用户密码

    sudo smbpasswd -a ubuntu
  3. 修改 smb 配置文件

    sudo nano /etc/samba/smb.conf

    在最底下添加配置, 将 /media/Wulu-HHD 替换为你要共享的文件夹路径

    [share]
    comment = share folder
    browseable = yes
    path = /media/Wulu-HHD
    create mask = 0700
    directory mask = 0700
    valid users = ubuntu
    force user = ubuntu
    force group = ubuntu
    public = yes
    available = yes
    writable = yes
  4. 重启 samba服务

    sudo systemctl restart smbd

连接SMB服务器

  • Windows
    • 临时使用:win+R 打开 运行 输入 \\ip\path (例如\\192.168.1.100\share
    • 长期使用:在文件管理器打开 此电脑 在空白处点击鼠标右键选择 添加一个网络位置 输入 \\ip\path (例子同上)按照提示完成剩余步骤。最好提前给树莓派分配静态IP
  • Linux
  • Android
    • 文件管理器:MiXplorer和ES文件管理器等
    • 媒体播放器:MX Player 和 VLC 等
☑️ ⭐

Wekan安装-树莓派

上篇文章讲了如何利用Docker将Wekan部署在服务器上以及一些Wekan的基本操作。(如果你还不知道Wekan是啥,请看:链接)同时,也提到了在Wekan的官方文档里,无论是用Docker还是Snap部署Wekan,如果安全问题是很重要的,都不建议将Wekan暴露到外网(与内网相对)上。不想让服务器变成肉鸡或者暴露在危险下,正好Wekan也支持部署在树莓派上。那么,开始吧。

本文将分三部分:

  1. 在树莓派上部署Wekan
  2. 导出Wekan数据(从docker)
  3. 导入Wekan数据(到树莓派)

在树莓派上安装Wekan

参考链接:install-wekan-to-raspi3-raspi4-or-any-arm64-server

系统需求

README
Currently uses Node v12.16.2 and MongoDB v3.x or v4.x
Built on Ubuntu 19.10 64bit arm64 on RasPi4.
Should work on RasPi3 and RasPi4 on Ubuntu 19.10 64bit arm64.
Install info here:
https://github.com/wekan/wekan/wiki/Raspberry-Pi

简单地说,需要装ubuntu64位的系统

笔者树莓派的配置:

Raspberrypi4b 4gb
OS: Ubuntu 20.04 focal
Kernel: aarch64 Linux 5.4.0-1008-raspi

安装过程

下载和安装wekan所需要的

用浏览器打开: https://releases.wekan.team/raspi3/

查看README.txt文件如:

README
Currently uses Node v12.16.2 and MongoDB v3.x or v4.x
Built on Ubuntu 19.10 64bit arm64 on RasPi4.
Should work on RasPi3 and RasPi4 on Ubuntu 19.10 64bit arm64.
Install info here:
https://github.com/wekan/wekan/wiki/Raspberry-Pi

安装下列软件:

sudo apt-get update
sudo apt-get install npm mongodb-server mongodb-clients mongo-tools zip unzip

官方文档写的是:

sudo apt-get install npm mongodb-server mongodb-clients mongodb-tools zip unzip

但是在实际安装过程中提示E: Unable to locate package mongodb-tools,经过搜索觉得应该是mongodb-tools于是就做了替换,在后续的安装过程中也没有出现问题。

于是提了一个issue,目前正在等待回应。

接下来:

sudo npm -g install npm
sudo npm -g install n

在前文提到的README.txt文件查看Node版本,然后安装。比如此时,Node 的版本是12.16.2:

sudo n 12.16.2

接下来切换到你想储存wekan的目录,比如笔者习惯放在repo/xxx目录下:

cd ~/repo/wekan

查看上文让你打开的网站,下载Wekan(名字类似wekan-x.xx-arm64.zip),可以鼠标右键点击然后选择复制链接,比如笔者安装时是wekan-4.01-arm64.zip

wekan-pi-releases.webp
# ~/repo/wekan
wget https://releases.wekan.team/raspi3/wekan-4.01-arm64.zip

接下来下载最新的start-wekan.sh:

# ~/repo/wekan
wget https://raw.githubusercontent.com/wekan/wekan/master/start-wekan.sh

解压之前下载wekan压缩包:

unzip wekan-4.01-arm64.zip

解压完成后,你的wekan目录应如:

ls ~/repo/wekan
bundle  start-wekan.sh  wekan-4.01-arm64.zip

以服务的方式运行wekan

如果你想以非root用户将node运行在80端口:

首先,查看node的安装位置:

which node

赋予权限,比如笔者上一步得到的结果是/usr/local/bin/node

sudo setcap cap_net_bind_service=+ep /usr/local/bin/node

编辑/etc/systemd/system/wekan.service:

sudo nano /etc/systemd/system/wekan.service

添加下列内容:(注意WorkingDirectory后面的值应为前面解压的wekan-4.01-arm64.zip得到的bundle目录,比如/home/ubuntu/repo/wekan/bundle

[Unit]
Description=The Wekan Service
After=syslog.target network.target

[Service]
EnvironmentFile=/etc/default/wekan
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/repo/wekan/bundle
ExecStart=/usr/local/bin/node main.js
Restart=on-failure
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

查看你树莓派的ip地址:

ip address

记住你的ip地址形如192.168.x.x,下面呢以192.168.1.20为例子。

接下来编辑wekan的配置文件/etc/default/wekan,添加下列内容:(ROOT_URL改为树莓派的ip地址,为了更加方便,推荐在路由器上设置给你的树莓派分配固定ip)

sudo nano /etc/systemd/system/wekan.service
NODE_ENV=production
WITH_API=true
MONGO_URL=mongodb://127.0.0.1:27017/wekan
ROOT_URL=http://192.168.1.20
PORT=80

启动wekan:

sudo systemctl start wekan

设置开机自启:

sudo systemctl enable wekan

查看wekan运行状况:

sudo systemctl status wekan

打开浏览器访问之前设设置的ROOT_URL(比如笔者设置的是http://192.168.1.20)看到登陆界面就大功告成了。第一个注册的为管理员账户。如果你想知道更多的wekan操作,可以查看上一篇文章:免费开源看板软件Wekan安装与使用记录

如果你还需要还原wekan数据,请不要着急,继续往下看。

导出Wekan数据(从docker)

本文将介绍如何从docker导出wekan的数据,参考Export-Docker-Mongo-Data。其他安装方式安装的wekan数据的备份和还原请参考 Wekan-Wiki-Backup

停止运行wekan

这一步十分重要!

查看当前的docker进程:

docker ps

然后你将看到wekan-appwekan-db,关闭wekan-app

docker stop wekan-app

再次查看当前的docker进程确保wekan-app已经停止运行:

docker ps

导出数据

进入mongo容器:

docker exec -it wekan-db bash

切换到容器的根目录:

cd /

将数据导出到容器内的目录下:

mongodump -o /dump/

退出容器:

exit

将导出的数据保存当前目录:

docker cp wekan-db:/dump .

导入数据

停止本地运行wekan

为了避免不可预计的问题,请先停止本地运行的wekan!

sudo systemctl stop wekan

导入数据

从服务器上下载导出数据:(本文用scp下载,你也可用其他方法,关于scp的用法可以参考:从Linux服务器下载文件到本地)

scp -r user@youdomian.com:~/repo/wekan/dump /home/ubuntu/repo/wekan/

将数据还原到wekan的数据库:

mongorestore --drop --db wekan /home/ubuntu/repo/wekan/dump/wekan/

重新打开wekan:

sudo systemctl restart wekan

重新访问wekan,就可以直接用之前的账号登陆并且使用原来的看板了!

🔲 ⭐

Wekan安装与使用记录-Docker

wekan-logo.webp

本文记录在部署和使用Wekan(作为个人看板)中遇到的一些问题和解决的方法。一来,方便以后笔者本人再次部署或者遇到同样的问题;再者,可以给打算使用Wekan但是又不知从何起手的人做一个参考。如果你的英文足够好,还是建议参考Wekan的文档

本文将讲述如何将Wekan部署到服务器上,如果你想部署到树莓派上可以参考另一篇文章:将免费开源看板软件Wekan部署到树莓派4B

本文将结合笔者在实际使用中的经验介绍:

  • Wekan的安装部署(Docker)
  • Wekan模板的使用
  • Wekan规则的使用

Wekan 是啥?

Wekan在GitHub上的介绍:

Wekan is an completely Open Source and Free software collaborative kanban board application with MIT license.

Whether you’re maintaining a personal todo list, planning your holidays with some friends, or working in a team on your next revolutionary idea, Kanban boards are an unbeatable tool to keep your things organized. They give you a visual overview of the current state of your project, and make you productive by allowing you to focus on the few items that matter the most.

Since Wekan is a free software, you don’t have to trust us with your data and can install Wekan on your own computer or server. In fact we encourage you to do that by providing one-click installationde on various platforms.

简单地说,Wekan是一款遵循MIT协议完全开源的协作看板软件。它支持基于卡片的任务和待办事项管理,同时还允许多用户协同使用。你可以自由地将Wekan部署到你自己的计算机或者服务器(也可以部署在树莓派上哦~)然后使用它。官方Demo:链接。支持的平台:链接。Wekan的功能特性:链接

安装&初始化

Docker (无自动更新)

Keep backups, Docker is more complex than others above. Use only if you have time to test new release first, and it's critical nothing gets broken. Because Docker does not have automatic updates, please keep behind firewall, without any ports open to Internet, because Wekan gets new security etc updates to Node.js and other dependencies often.

根据官方的提示,「仅在能经常测试新版的情况下使用」,因为「Docker没有自动更新」,而Wekan依赖的库可能经常需要安全更新。笔者目前是使用Docker来部署的,一开始用docker安装是觉得用docker部署只用改改配置文件,现在看来更麻烦,估计很快就会转移到snap。接下来,就来讲讲如何用Docker来部署Wekan吧。Wekan的Docker版安装文档:链接

安装环境

  • OS: Ubuntu 18.04 bionic

  • Kernel: x86_64 Linux 4.15.0-99-generic

安装docker

略...

下载docker-compose.yml

如果你没有wget,先安装wget:

sudo apt update
sudo apt install wget

接下来,用wget下载配置文件:

wget https://raw.githubusercontent.com/wekan/wekan/master/docker-compose.yml

修改docker-compose.yml

其实在docker-compose.yml里,对于每个对应的设置都有很想详尽的描述.

这里提一下几个重要的配置:

  • ports

    ports:
          # Docker outsideport:insideport. Do not add anything extra here.
          # For example, if you want to have wekan on port 3001,
          # use 3001:8080 . Do not add any extra address etc here, that way it does not work.
          # remove port mapping if you use nginx reverse proxy, port 8080 is already exposed to wekan-tier network
          - 80:8080

    冒号前为外部端口,冒号后为内部端口,如果你想改变端口号,比如3001,那么只需要改成3001:8080即可

  • root_url

        environment:
          - MONGO_URL=mongodb://wekandb:27017/wekan
          #---------------------------------------------------------------
          # ==== ROOT_URL SETTING ====
          # Change ROOT_URL to your real Wekan URL, for example:
          # If you have Caddy/Nginx/Apache providing SSL
          #  - https://example.com
          #  - https://boards.example.com
          # This can be problematic with avatars https://github.com/wekan/wekan/issues/1776
          #  - https://example.com/wekan
          # If without https, can be only wekan node, no need for Caddy/Nginx/Apache if you don't need them
          #  - http://example.com
          #  - http://boards.example.com
          #  - http://192.168.1.100    <=== using at local LAN
          - ROOT_URL=http://localhost  #   <=== using only at same laptop/desktop where Wekan is installed

    如果只在本地使用那么就不用更改,ROOT_URL=http://localhost.例如使用默认设置,那么使用http://localhost就能访问Wekan。如果像上面的例子将端口改为了3001,那么就需要设置ROOT_URL=http://localhost:3001。如用要在外部访问或者通过域名访问,也是如此,以此类推。参考:链接

  • 关于邮箱系统

    参考:链接

    由于笔者是将Wekan做个人看版使用,所以不需要邮箱系统。在配置文件中删掉或者注释掉MAIL_URLMAIL_FROM即可。

运行

docker-compose.yml所在的目录下:

  • 前台运行

     docker-compose up		#启动
     docker-compose stop	#停止
  • 后台运行(无输出)

    docker-compose up -d	#启动 下面两行为启动成功的提示
    Starting wekan-db ... done
    Recreating wekan-app ... done
    docker-compose stop		#停止

    启动完成后,用浏览器访问对应的网址即可。第一个注册的账号为管理员账号。可在“点击头像”-“选择挂管理面板”打开管理面板对Wekan进行设置。如果只做个人使用,建议勾选禁止自主注册禁止自主注册

❌