切换到 Rime 输入法也好多年了,陆陆续续积累了不少的配置和词库,不过最近看到有朋友在 GitHub 上 star 了一个 Rime 的配置,点进去了一下,让我眼前一亮的是 Rime 通过插件的方式实现了一些非常不错的特性,虽然之前也陆陆续续的配置过 lua 扩展,但是这次看到还能让 Rime 加载预先训练的统计语言模型,所以就再次激起了我的兴趣。
之前的几篇文章,如果感兴趣也可以去看看:
接下来就整理一下目前我用到的三个 Rime 插件。
librime-lua
是我发现的第一个插件,之前看到有人提的一个 Feature Request 说到,能不能通过输入 date 或 「rq」这样的短语自动在候选词中出现当前的日期,后来发现果然可以。librime-lua
就是用来实现这样的功能的。
librime-lua 通过 Lua 扩展了 Rime 的能力,使得用户可以编写一定的 Lua 脚本来更改 Rime 候选词的结果。最常见的使用方式,比如当输入 date 的时候,在候选词中直接显示出当前的日期。
插件地址:https://github.com/hchunhui/librime-lua
librime-octagram 可以让 Rime 使用训练好的统计语言模型。
插件地址: https://github.com/lotem/librime-octagram
安装过程也比较简单,把插件以及模型放到 Rime 的配置文件夹中,然后在输入法配置方案,比如小鹤双拼 double_pinyin_flypy.custom.yaml
中加入:
patch:
__include: grammar:/hant
如果之前有别的 patch,直接加入 __include
那一行即可。然后重新部署 Rime 输入法。
可以通过如下的方式验证是否安装成功,直接一次性输入下面的句子:
这一个以词定字的插件是在这一次再学习的过程中发现的,在某些特定的时候,往往是通过组词去输入某个单字的,因为汉语中同音字还是很多的,如果只用拼音输入一个字的话可能会需要翻页很多次才能找到对的那个字,但是如果这个字出现在词语里面可能可以一次性命中,这个插件就是为了解决这个问题的。
以词定字插件可以让你在输入一个词组后,选取这个词组的开头或结尾的一个字直接上屏,比如想要打“嫉”这个字,可以先打“嫉妒”再按 [
键选择第一个字,如果要输入词语的第二个字,可以在词语出现之后按下 ]
。
插件地址:https://github.com/BlindingDark/rime-lua-select-character
在这个模式下,当候选词出现在第二个的时候,我就使用 Tab
来将候选词位置挪到第二位,然后使用 [
或 ]
选择。不过默认情况下 Tab 绑定的快捷键是翻页:
- {accept: Tab, send: Page_Down, when: composing}
所以需要在 default.custom.yaml
中做一下调整:
patch:
key_binder:
bindings:
- {accept: "Control+p", send: Up, when: composing}
- {accept: "Control+n", send: Down, when: composing}
- {accept: "Control+b", send: Left, when: composing}
- {accept: "Control+f", send: Right, when: composing}
- {accept: "Control+a", send: Home, when: composing}
- {accept: "Control+e", send: End, when: composing}
- {accept: "Control+d", send: Delete, when: composing}
- {accept: "Control+k", send: "Shift+Delete", when: composing}
- {accept: "Control+h", send: BackSpace, when: composing}
- {accept: "Control+g", send: Escape, when: composing}
- {accept: "Control+bracketleft", send: Escape, when: composing}
- {accept: "Alt+v", send: Page_Up, when: composing}
- {accept: "Control+v", send: Page_Down, when: composing}
- {accept: ISO_Left_Tab, send: Page_Up, when: composing}
- {accept: "Shift+Tab", send: Page_Up, when: composing}
- {accept: Tab, send: Page_Down, when: composing}
- {accept: Tab, send: Right, when: has_menu}
- {accept: minus, send: Page_Up, when: has_menu}
- {accept: equal, send: Page_Down, when: has_menu}
- {accept: comma, send: Page_Up, when: paging}
- {accept: period, send: Page_Down, when: has_menu}
- {accept: "Control+Shift+1", select: .next, when: always}
- {accept: "Control+Shift+2", toggle: ascii_mode, when: always}
- {accept: "Control+Shift+4", toggle: simplification, when: always}
- {accept: "Control+Shift+5", toggle: extended_charset, when: always}
- {accept: "Control+Shift+exclam", select: .next, when: always}
- {accept: "Control+Shift+at", toggle: ascii_mode, when: always}
- {accept: "Control+Shift+numbersign", toggle: full_shape, when: always}
- {accept: "Control+Shift+dollar", toggle: simplification, when: always}
- {accept: "Control+Shift+percent", toggle: extended_charset, when: always}
- {accept: "Control+period", toggle: ascii_punct, when: always}
注意其中的
- {accept: Tab, send: Right, when: has_menu}
这样就可以使用 Tab 来切换候选词了。更多的快捷键自定义可以查看这篇文章。
使用这些插件请保证:
Traefik (音同 traffic),是一个 Cloud Native 的 HTTP reverse proxy(反向代理) 和 load balancer(负载均衡),反向代理服务器就是可以拦截流量并根据规则把流量导到特定的服务上。
在没有 [[Traefik]] 之前,如果在 orchestrator (比如 Swarm 或 Kubernetes) 或 service registry(比如 etcd 或 consul)下开发了一系列的微服务,并要让用户可以访问这些服务,你可能需要手动配置一个反向代理。传统的反向代理服务器(比如 Nginx)需要为每一个子域名到微服务服务进行配置。在一个每一天需要进行很多次增加,移除,升级,扩容的微服务环境下,传统的配置方式(基于配置文件)会变得非常繁琐。
Traefik 可以很好的和现存的基础架构结合到一起,包括 Docker, Swarm mode, Kubernetes, Marathon, Consul, Etcd, Rancher, Amazon ECS 等等
Traefik 会监听 service registry/orchestrator API 并且立即产生一个路由规则,这样微服务可以直接连接到外部的世界,不再需要额外的干预。
Kubernetes 负责把 Pod 容器自动分配到 Node 节点处理。
功能:
docker
基于 label
配置Websocket
, HTTP/2
, GRPC
readyprometheus
和 k8s
集成在进一步学习 Traefik 之前有几个在 Traefik 中的概念需要提前了解一下。
Traefik 能够通过 cluster API 自动发现服务,在 Traefik 的配置中,被称为 provider。比如 provider 配置了 Docker,那么 Traefik 会自动根据 Docker 提供的 API 来获取发现服务,并自动根据配置更新路由策略。
为了了解最基本的使用,最好的方法就是实践自己启动一下。
version: '3'
services:
traefik:
container_name: traefik
image: traefik:latest
restart: always
command: --api.insecure=true --providers.docker
ports:
- "80:80"
- "443:443"
- "8080:8080"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./ssl/:/data/ssl/:ro
- ./traefik.yml:/etc/traefik.yml:ro
- ./config/:/etc/traefik/config/:ro
# 先创建外部网卡
# docker network create traefik
networks:
traefik:
external: true
启动之后可以访问
上面的方式开启了 Traefik 的 Dashboard,可以直接访问 8080 端口。
然后使用 whoami
镜像做一下验证,该镜像会将请求的 header 信息输出在请求结果中。
version: '3'
services:
whoami:
# A container that exposes an API to show its IP address
image: traefik/whoami
labels:
- "traefik.enable=true"
# 设置Host 为 whoami.docker.localhost 进行域名访问
- "traefik.http.routers.whoami.rule=Host(`whoami.docker.localhost`)"
# 使用已存在的 traefik 的 network
networks:
default:
external:
name: traefik
当 whoami 的服务启动之后 Traefik 会自动根据 label 的配置,然后将 whoami.docker.localhost
的请求自动转发到 whoami 这个服务中。
然后修改一下本地的 /etc/hosts
文件,增加
127.0.0.1 whoami.docker.localhost
然后用浏览器访问 http://whoami.docker.localhost
就可以看到 whoami 这个服务的返回。
或者直接使用 curl 请求:
❯ curl http://whoami.docker.localhost/
Hostname: 20f1d26a6db0
IP: 127.0.0.1
IP: 172.30.0.3
RemoteAddr: 172.30.0.2:49750
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/7.58.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 172.30.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: ab231307712a
X-Real-Ip: 172.30.0.1
[[traefik-configuration]] 有两种配置方式:
所有到 80 端口的流量都会被重定向到 443 端口。
--entrypoints.web.address=:80
--entrypoints.web.http.redirections.entryPoint.to=websecure
--entrypoints.web.http.redirections.entryPoint.scheme=https
--entrypoints.web.http.redirections.entrypoint.permanent=true
--entrypoints.websecure.address=:443
DataGrip 是 JetBrains 出品的一款数据库管理工具。
从 2021.1 版本开始,可以在 Data Source 上按下 Ctrl/Cmd+C 复制,然后在其他的 IDE 中使用 Ctrl/Cmd+V 来粘贴。
粘贴板会包含 Data Source 的 XML 配置。
但使用 Cmd+C 的同步方式,粘贴板并不会粘贴密码内容,所以粘贴之后也还需要输入数据库密码进行验证。
虽然这种情况我自己很少操作,但是看了一下还是有很多有这样的需求,这里就记录一下,比如有两个环境,本地开发环境和线上环境,如果本地已经完成表结构的变更,想要将这个表结构的更新同步到线上的数据库中,可以直接利用 DataGrip 的同步表结构。
当然我个人推荐的做法是通过将 SQL 放入版本控制做好 Migration,或者使用自动化的 SQL 版本,比如 Python 下的 [[Alembic]] 来管理数据库表结构的版本,实现可以自动升级,降级等。
今天在 review tldr 提交的新命令的时候发现了一个新的工具 espanso,查看其官网发现是一个文本扩展的工具。在之前 macOS 上短暂的体验过 [[Keyboard Maestro]] 但因为其是 macOS 独占,所以之后再回到 Ubuntu 下的时候就渐渐不用了,并且其授权还挺贵的。然后就一直使用 RIME 配置自定义的短语来作为短语的快捷输入,比如输入 date 的时候自动在候选词中添加日期。但这样的问题便在于每一次更改 RIME 的配置文件都需要经历 RIME 部署这样一个漫长的过程。并且可扩展性也不强。于是想来体验一下 espanso 。
[[Espanso]] 是一个使用 Rust 实现的跨屏平台的 Text Expander,可以在任何编辑器中扩展短语。可以完美代替 [[Keyboard Maestro]] 的 Text Expand 功能。
官网地址:
特性:
在 macOS 上:
brew tap federico-terzi/espanso
brew install espanso
espanso --version
然后使用 espanso register
启用。
在 Linux 上:
sudo snap install espanso --classic
安装完成后执行:
espanso start
启动后台任务。这样在任何编辑器中输入 :espanso
会自动转变成 Hi there!
。
更多安装方式可以参考官网。
其官网有一个非常生动形象的 GIF,当输入:
:greet
自动变成 hello world
:date
自动产生日期:llo
变成一串 Emoji:ip
变成真实的 IP 地址执行 espanso edit
会自动使用默认的编辑器创建一个默认的配置文件到 ~/.config/espanso/default.yml
文件:
matches:
# Simple text replacement
- trigger: ":espanso"
replace: "Hi there!"
# Dates
- trigger: ":date"
replace: ""
vars:
- name: mydate
type: date
params:
format: "%m/%d/%Y"
# Shell commands
- trigger: ":shell"
replace: ""
vars:
- name: output
type: shell
params:
cmd: "echo Hello from your shell"
espanso 基于文本的配置文件对软件的行为进行设定,在不同操作系统上的路径:
~/.config/espanso
/Users/einverne/Library/Preferences/espanso
C:\Users\user\AppData\Roaming\espanso
可以通过 espanso path
来快速获知路径。
default.yml
文件是 espanso 的主要配置文件,使用 YAML 语法。
更加详细的配置文件可以参考官方文档。
在 espanso 的配置 replace
中可以使用 $|$
作为占位符,表示光标。
比如想要输入 :div
的时候自动展开成为 <div></div>
然后将光标停留到中间,就可以使用:
- trigger: ":div"
replace: "<div>$|$</div>"
Espanso 更加强大的地方在与其扩展性,通过安装其他包可以将 espanso 的能力扩展。比如从 espanso hub 安装 Basic Emojis :
espanso install basic-emojis
然后重启服务:
espanso restart
然后输入 :ok
就可看到文本被替换成了 Emoji。
![[Pasted image 20211013182143.png]]
更多的 package 可以看 espansohub。
一些非常有用的快捷键。
可以通过连续按两次 ALT
(macOS 下为 Option) 按键来临时禁用 espanso。可以看到通知 Espanso disabled
。 再按两次可以开启。可以通过配置文件修改 Toggle Key
有些时候可能无意识中触发了 expansion,但又不想要这个结果,那么可以按一下 BACKSPACE
撤销这一次修改。
可以使用软链接的方式将配置文件放在同步文件夹,或 git 仓库中保存管理。
ln -s "/home/user/Dropbox/espanso" "/home/user/.config/espanso"
我个人直接将配方放到 dotfiles 中管理。
Restic 是一款简单易用、快速、高效、安全,并且跨平台的开源备份程序。Restic 使用 Go 语言实现。集成了 rclone 可以轻松的备份到各类云端存储。
支持的存储类型:
Restic 是一个数据备份程序,其设计遵循以下原则:
Repository 称为存储仓库,备份期间产生的所有数据都以结构化形式发送并存储在存储库中,例如在具有多个子目录的文件系统层次结构中。
存储库实现必须能够完成许多操作,例如列出内容。v0.12.0 中已支持的存储服务包括:aws s3,minio server,Wasabi, Aliyun OSS, OpenStack Swift,Backlbaze B2,Azure Blob Storage,Google Cloud Storage,rclone
Blob 将多个数据字节与识别信息(如数据的 SHA-256 哈希及其长度),加密的数据块及元数据,其中元数据包括长度,SHA-256 哈希信息。数据块可以存放文件数据(data),也可以存放目录结构数据(tree)。Blob 的大小在 512KiB 到 8MiB 之间,因此小于 512KB 的文件不会被拆分。Restic 的实现目标是让 Blob 平均大小为 1MiB。
Pack 是一个包,结合了一个或多个 Blob,例如在单个文件中。Restic 中的单个数据文件,包括一个或多个 Blob,一旦创建不再修改。
一般只创建不删除,仅 prune 操作会删除不再被引用的数据。
Snapshot 快照代表在某个时间点已备份的文件或目录的状态。这里的状态是指内容和元数据,如文件或目录及其内容的名称和修改时间。
Debian/Ubuntu:
apt-get install restic
macOS:
brew install restic
通过二进制:
wget https://github.com/restic/restic/releases/download/v0.9.5/restic_0.9.5_linux_amd64.bz2
bzip2 -d restic*.bz2 && rm -rf restic*.bz2
chmod +x restic*
mv restic* /usr/local/bin/restic
restic version
升级可以通过:
restic self-update
初始化本地备份:
restic init --repo /path/to/backup_folder
配置 SFTP 存储,配置 SSH 免密码登录:
restic -r sftp:root@192.168.2.100:/path/to/backup_folder init
如果服务器的 SSH 端口不是 22,则需要配置 ssh
配置,编辑 ~/.ssh/config
然后配置:
Host 192.168.2.100
User root
Port 222
将目录 /var/www
备份到服务器的 /path/to/backup_folder
restic -r sftp:192.168.2.100:/path/to/backup_folder --verbose backup /var/www
查看备份快照:
restic -r sftp:192.168.2.100:/path/to/backup_folder snapshots
恢复备份:
restic -r sftp:192.168.2.100:/path/to/backup_folder restore latest --target /var/www
这里的 latest
可以替换为任意一次的备份 ID。
删除备份:
restic -r sftp:root@192.168.2.100:/path/to/backup_folder forget abc3123
上面的命令只是将快照清除了,但快照中包含的文件还在存储仓库中,可以使用 prune
命令来清理未被引用的数据:
restic -r sftp:root@192.168.2.100:/path/to/backup_folder prune
每隔 30 分钟备份一次
30 * * * * /usr/local/bin/restic -r sftp:root@192.168.2.100:/path/to/backup_folder backup --password-file /home/einverne/restic/resticpasswd -q /var/www; /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7
两个工具的设计目的是不一样的,Restic 更偏向备份工具,所以设计了很多备份、恢复、查看验证历史版本等等特性。而 Rclone 则更偏向于将网络硬盘挂载到机器中实现与云端存储的双向同步。二者各有所长。
自从在 QNAP 上遇到 ruTorrent 之后就发现这是我用过的最好用的 BitTorrent 客户端了,rTorrent 结合 ruTorrent 界面
可以参考我的 docker-compose.yml 进行安装。然后照之前的文章 启用 MaterialDesign,界面就非常漂亮。
首先 RSS 就不用多说了,在互联网早期就存在的一个分享格式,可以用于内容的聚合,虽然 Google Reader 关闭多年,但我个人依然还在重度的使用,从 InoReader 到自建 Tiny Tiny RSS 然后最终心属最简洁的 miniflux 可以说过去的 10 年里面一直都在使用 RSS。
这也使得在 Private Tracker 中使用 RSS 变得非常的容易,大部分的站点都是提供个人的 RSS feed 流的,我使用的 AvistaZ, PrivateHD,都是可以通过关键字订阅来生成自定义的 Feed 流的。
那就以 wishlist feed 流做一个例子,到对应的网站管理后台获取个人的 wishlist RSS feed, 一般是一个链接,当中包含了该 Feed 流的内容,比如说我的 Wishlist 就包含了我在网站中收藏的内容,这样只要我在浏览网站的时候将影片添加到 Wishlist,那么 Feed 中会自动添加该影片。
一般在界面中找这样的图标即可。
右击 ruTorrent 中的 Feeds 板块:
然后点击添加 RSS Feed,输入框中填入 Feed URL,以及 Custom Alias。
![[rutorrent-add-rss-feed-20210910211430.png]]
那新添加的 Feed 会自动出现在 Feeds 板块。在 Feed 板块中可以点击查看到 Feed 中的内容。但是这个时候 Feed 中的内容不会自动下载。如果需要配置自动下载需要使用下面的 RSS Manager(或者也被称为 Download Manager)。
然后右击 Feeds,打开 RSS Manager
这个界面中有一些内容需要配置,可以新建一个 Filter,点击左边的 ADD
右边的配置分别是:
/^/
就表示下载所有。点击保存,过一会儿就能看到 RSS 中的种子自动开始下载了。
不过这里需要特别注意,千万不要把一个全站的 RSS Feed 添加到自动下载,并配置下载全部,除非你知道这样做的意义。
另外如果要更加详细的设置 RSS 的刷新频率,则需要修改 rTorrent 的配置,如果有需要再更新吧。
另外如果使用的是类似于 Transmission 这样的客户端,并没有自带 RSS 管理,那也可以使用 Flexget 来间接实现 RSS 自动下载。配合 crontab,也可以实现相同的效果。
Kubernetes (简称 k8s)是 Google 基于其内部容器调度平台 Borg 的经验开发的一个开源的容器编排和管理平台。2014 年开源,并作为 CNCF(云原生计算基金会)的核心发起项目。旨在简化容器化应用的部署、扩展和管理。它提供了一种便捷的方式来组织、调度和管理容器化应用程序,并能够自动化地处理应用程序在集群中的部署、扩展、故障恢复和负载均衡等任务。
设计的目的是在主机集群之间提供一个能够自动部署、扩展、应用容器的可运营的平台。Kubernetes 通常结合 docker 容器一起工作。
Kubernetes 使用了一种称为 Pods 的抽象概念来组织应用程序的容器。Pod 是一个或多个相关容器的组合,它们共享同一个网络命名空间、存储卷以及其他资源。这样,它们可以共享网络配置、文件系统和其他依赖关系,从而更好地协同工作。
Kubernetes 还提供了一种称为 Replication Controller 的机制,用于自动扩展和管理 Pod 实例。Replication Controller 可以根据设置的规则自动复制和删除 Pod 实例,以适应负载变化,并确保应用程序始终处于所需的状态。
此外,Kubernetes 还提供了一种称为 Service 的机制,用于将后端 Pod 实例暴露给外部访问。Service 可以为后端 Pod 实例提供负载均衡、服务发现和稳定访问地址等功能。
Kubernetes 还支持水平扩展、滚动更新、故障恢复等功能,使得应用程序的部署和管理变得更加简单和可靠。它还提供了丰富的 API 和命令行工具,以便管理员和开发者可以方便地管理和监控集群中的应用程序。
功能:
Kubernetes 中的 Master 节点指的是集群控制节点,负责整个集群管理和控制。
Master 节点上运行着关键进程:
Kubernetes 集群中除去 Master 之外的节点被叫做 Node 节点(Agent),工作负载节点,执行 Master 分配的工作。当 Node 节点宕机时,工作负载会自动转移到其他节点。
Node 节点运行的关键进程:
可以使用如下命令查看集群中 Node:
kubectl get nodes
查看具体信息:
kubectl describe node kubernetes-minion1
k8s 最小调度单元,Pod 中运行业务相关的容器
Label 是 key=value 键值对,附加到资源对象上,Node,Pod,Service,RC 等等。资源对象可以定义任意数量 Label,同一个 Label 也可以被添加到任意数量的资源对象上。
Replication Controller(后简称 RC),定义了场景,声明某种 Pod 的副本数量在任意时刻都符合预期值。
定义包括几部分:
Service 就是「微服务」
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
spec:
ports:
- port: 8080
selector:
tier: frontend
tomcat-service
的 Servicetier=frontend
的 Pod 实例都属于它然后创建:
kubectl create -f tomcat-server.yaml
Namespace 命名空间,用于实现多租户的资源隔离。
kubectl get namespace
在 Kubernetes 中,所有对象都使用 manifest(yaml 或 json)来定义,比如一个简单的 nginx 服务可以定义为 nginx.yaml,它包含一个镜像为 Nginx 的容器:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
通常在使用 Docker compose 的时候会设置很多的环境变量来控制容器的使用。
很多情况下我们会直接写到 docker-compose.yml
文件中类似于下面 environment
中的:
version: "3"
services:
flarum:
image: mondedie/flarum:stable
container_name: flarum
volumes:
- ./flarum/extensions:/flarum/app/extensions
- ./flarum/assets:/flarum/app/public/assets
- ./flarum/storage/logs:/flarum/app/storage/logs
- ./flarum/nginx:/etc/nginx/flarum
ports:
- 8888:8888
environment:
- UID=1000
- GID=1000
- DEBUG=false
- FORUM_URL=https://forum.domain.tld
- UPLOAD_MAX_SIZE=20M
- DB_HOST=
- DB_PORT=3306
- DB_USER=
- DB_PASS=123456
- DB_NAME=
同样也可以使用 .env
文件来设定。Compose 会自动寻找 compose 文件同级目录的 .env
文件,并自动使用 .env
文件中的环境变量值覆盖 shell environment 中的内容。
配置可以包含 environment variables,Compose 会使用 Shell 的环境变量值作为这些配置值。
假设 Shell 中配置了 POSTGRES_VERSION=9.3
,那么如果有配置:
db:
image: "postgres:${POSTGRES_VERSION}"
当执行 docker-compose up
的时候,会自动将环境变量的值替换。上面的例子中就会自动使用 9.3 版本的配置。
如果环境变量没有配置,那么 Compose 会用一个空字符串替换。
如果要配置默认的环境变量,可以使用一个 .env
文件,Compose 会自动寻找项目目录下的该文件(和 docker-compose.yml 文件同级目录),Shell 环境变量中的值会覆盖 .env
文件中的。
$VARIABLE
和 ${VARIABLE}
两种语法都支持。
${VARIABLE:-default}
如果 VARIABLE 没有设置或是空,那么结果是 default${VARIABLE-default}
只有当 VARIABLE 没有设置的时候才为 default同样的,可以使用如下的语法强制要求用户设置:
${VARIABLE:?err}
如果 VARIABLE 没有设置,或者为空,那么会抛出移除信息 err${VARIABLE?err}
如果 VARIABLE 没有设置,会抛出 err--env-file
选项在命令行中指定 --env-file
路径。
docker-compose --env-file ./config/.env.dev up
和上一行命令等价的是,也可以使用 env_file
选项来将 env 文件配置到 docker-compose.yml
文件中:
web:
env_file:
- web-variable.env
上面提到了多种环境变量使用的方式,Compose 在选择环境变量时按照如下的优先级:
docker-compose.yml
文件中的 environment 设置.env
也就是说 compose 文件中定义的 environment 优先级是最高的。
哪吒监控是一个使用 Go 和 Vue 实现的服务器监控探针,UI 简洁,可以自定义 CSS,一行命令就可以将新的服务器添加到监控面板。之前一直使用 nodequery,这个服务由于作者已经不再更新所以网站已经无法登录。
在没有遇到哪吒监控之前一直都是使用的 Netdata cloud 来监控 VPS,虽然 Natdata 非常强大,数据非常详细,后台界面也非常有设计感,还带邮件告警通知,但是 Netdata Cloud 后台访问速度实在有点慢,并且我没有找到办法在一个界面查看所有的网络状态。所以用哪吒监控相互弥补一下。
GitHub 地址:https://github.com/naiba/nezha
哪吒监控特性:
可以使用官方提供的一键脚本,但我害怕这个脚本设定的环境对我不透明,所以我选择把里面的内容提取成 docker-compose 的配置,可以在这里 查看。
修改一下配置,直接 docker-compose up -d
即可。
Agent 客户端,可以在哪吒监控的后台通过添加新的节点,然后复制脚本执行即可。
数据都存储在 /opt/nezha
文件夹中,打包文件夹,在新环境解压。然后执行安装脚本即可。
如果出现首页服务器随机掉线的问题,需要通过服务器时间。
执行 ntpdate 0.pool.ntp.org
同步面板部署服务器的时间。
哪吒监控 管理脚本使用方法:
--------------------------------------------------------
./nezha.sh - 显示管理菜单
./nezha.sh install_dashboard - 安装面板端
./nezha.sh modify_dashboard_config - 修改面板配置
./nezha.sh start_dashboard - 启动面板
./nezha.sh stop_dashboard - 停止面板
./nezha.sh restart_and_update - 重启并更新面板
./nezha.sh show_dashboard_log - 查看面板日志
./nezha.sh uninstall_dashboard - 卸载管理面板
--------------------------------------------------------
./nezha.sh install_agent - 安装监控Agent
./nezha.sh modify_agent_config - 修改Agent配置
./nezha.sh show_agent_log - 查看Agent日志
./nezha.sh uninstall_agent - 卸载Agen
./nezha.sh restart_agent - 重启Agen
./nezha.sh update_script - 更新脚本
--------------------------------------------------------
因为存储历史的数据可能会占用非常多的磁盘,所以 Nezha 监控目前只能显示这个时刻各个机器的资源占用,而不能查看单台机器历史资源的使用情况。
在很多年前,我经常听到一句话—-互联网是有记忆的—-当然这么多年过去了,见过了无数的网站关停,也见到了中文互联网上无处不在的删贴,而常常上一秒才看过的内容之后便再也找不到。我的 WizNote 笔记中曾经摘录的豆瓣书评、影评,当我想再去看一下作者的状态的时候,大多评论已经找不到了。有的时候拿着网页 URL,还能从 Internet Archive 找到有幸被保存下来的珍贵文字,但那些还没有被爬虫,或Google索引的文章就这样从互联网上消失了。而这些被删除的内容里面有一些内容却值得被记住,那些发人深省的话值得被再一次阅读。
而这两天正好买了hosthatch 2核8G的VPS,在调查可以部署哪些服务的时候看到了 Archive Box。这是一个可供个人搭建的互联网存档,它可以用来记录网页链接、媒体资源等等,只需要提供一个链接便可以得到截图,PDF,影评,视频等等内容。完全可以还原当时的网页情况。
Archive Box 使用 Python 编写,所以可以直接用 pip 安装,不过个人还是推荐用官方提供的镜像 Docker 安装。
使用 Docker compose 来安装,可以参考我的配置 或直接参考官方的文档。
Archive Box 在启动之后会提供一个 HTTP 服务,我配置了一个域名 https://box.einverne.info 在界面上使用 + 号即可添加。
虽然官方已经提供了非常多的添加方式,包括命令行,网页,桌面版,甚至 Python API,但是目前 RESTful 的接口暂时还是 alpha 阶段,所以在手机上目前也只能用网页版来保存。
如果有发现更好的方法欢迎告知。
我使用 Docker 安装,将其数据映射到了 ${DATA_PATH}
目录中,然后使用 Syncthing 同步了,这样在这个目录中直接访问 index.html
即可在本地打开备份的网页。