利用 ruTorrent 与 rTorrent 限制单独种子的速度

之前的几篇文章就提到过 rTorrent 和 ruTorrent 是我最喜欢的 BT 客户端。之前几篇文章:

今天就再来分享一个非常简单的小技巧,那就是针对个别种子单独进行限速。通常情况下整体的限速,上传和下载,其他的客户端基本上都做得非常完善,基本上是任何一个客户端的基本功能,但是非常少的客户端可以针对个别的种子可以进行限速,而借助 rTorrent 和 ruTorrent 客户端,可以完美的实现。

众所周知有一些私有的 tracker 是会对上传速度做要求的,如果一直以非常高的速度上传可能会被误判,所以非常有必要对个别的种子进行上传的限速。而有些时候可能不希望下载过快以至于占满全部的带宽,尤其是在国内有限的下载带宽的情况下。

Channel

在 rTorrent 和 ruTorrent 的组合中可以通过 Channel 来实现。在 ruTorrent 的设置中,有 Channel 这样一个设定:

rutorrent setting channel

可以看到默认情况下有 10 个不同级别的速度限制,这里以第一条 up16 举例,表示的就是限制上传速度 16Kib/s 而下载不限制。同样 down 的也是类似。

然后在主界面中,右击单个种子就可以看到其中可以对 Channel 设置,比如设置上传不能超过 50MB/s,就可以选择 up50000

rutorrent right click menu

Ratio Rules

如果觉得上面的手动方式比较笨拙的话,ruTorrent 还可以通过 Ratio Rules 来自动设置限速。在菜单栏点击 Plugins,然后选择 Ratio Rules,会展示如下界面。

rutorrent ratio rules

在这个对话框中就可以根据自己的需要设定,如下的条件:

  • Torrent 的标签包含
  • Torrent 的 Tracker URL 包含
  • Tracker 是公开的
  • Tracker 是私有的

当满足这些条件的时候,设置 ratio 以及限速,其中 Set throttle to 就可以选择之前设置的 Channel 中的内容。

当然如果你使用的是 rTorrent 没有使用 ruTorrent 界面,也可以通过配置的方式来实现,这里就不再具体展开。可以参考我之前的文章,以及官网的内容自行设置。

reference


2022-02-19 rtorrent , rutorrent , bittorrent , bt , private-tracker , tracker , bittorrent

rTorrent 配置之根据用户标签移动完成的下载文件

好几年前从接触了 QNAP 上的 ruTorrent 开始就一直在用 [[rTorrent]] 和 ruTorrent 的组合。在 QNAP 上运行稳定,后来又迁移到 docker 上,中间还经历了从 LinuxServer 维护的 rTorrent 迁移到 crazymax/rtorrent-rutorrent 维护的镜像上。一直都没有出现过问题。

今天在 Twitter 上向人推荐的时候被问到能不能在完成之后将文件移动到特定的目录。我知道很多人会分门别类的管理自己的文件,并且希望在移动文件之后还能一直 seeding, 这个对于 rTorrent 来说也特别简单,这里就简单记录一下。

我个人对 rTorrent 的使用流程

之前的文章中也曾经提到过 rTorrent 是 C++ 实现的基于终端的 torrent 客户端,而 ruTorrent 是 rTorrent 的 WEB 界面。为了不引入更复杂的 ruTorrent 插件,这篇文章就仅仅围绕 rTorrent 的配置,通过几行简单的配置就能实现 rTorrent 在下载完成之后的目录规划。

我个人一般通过如下两种方式添加种子到 rTorrent:

  • watch directory,通过监听硬盘上的某一个目录,只要发现 *.torrent 文件自动加载并开始下载
  • 通过 Web 界面 ([[ruTorrent]])

而这两种方式都可以通过给种子文件添加 Label 的方式来实现。

配置 rTorrent 完成下载后移动目录

首先要先认识一下 rTorrent 的配置文件 .rtorrent.rc 文件,一般情况下会在 HOME 目录中,如果是通过 Docker 安装会出现在配置目录中。rTorrent 的文档非常详细,rTorrent 一般把这个配置称作 rTorrent Scripting

比如说最简单的限制下载和上传的速度,可以通过如下两行实现:

# Global upload and download rate in KiB. "0" for unlimited¬
throttle.global_down.max_rate.set_kb = 102400¬
throttle.global_up.max_rate.set_kb = 102400¬

简单了解了 rTorrent 的配置之后,那么就直接进入正题,要实现完成之后自动移动到相应的目录,首先需要给种子自动加上标签。

Watch directories

而我上面提到过,我通常使用 Watch 目录来自动添加种子。

通过配置不同的 watch 目录,每一个都对应着一个 category 或者 label,那么在 /path/to/rtorrent/watch/tvshows 中的 torrent 文件,就会自动有一个 custom1 的值,这个值在下一步会使用到。

注意下面的配置在 rTorrent 0.9 版本以后可用1

# TV shows
schedule2 = watch_directory_1,10,10,"load.start_verbose=/path/to/rtorrent/watch/tvshows/*.torrent,d.custom1.set=tvshows"

# Movies
schedule2 = watch_directory_2,10,10,"load.start_verbose=/path/to/rtorrent/watch/movies/*.torrent,d.custom1.set=movies"

# Comics
schedule2 = watch_directory_3,10,10,"load.start_verbose=/path/to/rtorrent/watch/comics/*.torrent,d.custom1.set=comics"

# Music
schedule2 = watch_directory_4,10,10,"load.start_verbose=/path/to/rtorrent/watch/music/*.torrent,d.custom1.set=music"

这些配置中有两个关键部分:

  • /path/to/rtorrent/watch/x 部分是 watch 的目录,注意这里需要根据自己的情况进行修改
  • set_custom1=后面的内容是需要设置的标签

然后需要再进行如下配置,设置的目的就是让种子下载完成之后移动到上面打标签的目录:

# Add new method to get finished dir
method.insert = d.get_finished_dir,simple,"cat=/path/to/rtorrent/finished/,$d.custom1="
method.set_key = event.download.finished,move_complete,"d.directory.set=$d.get_finished_dir=;execute=mkdir,-p,$d.get_finished_dir=;execute=mv,-u,$d.base_path=,$d.get_finished_dir="

第一行 method.insert 定义了一个方法 get_finished_dir 每一个 torrent 都会返回一个字符串 /path/to/rtorrent/finished/ 和一个标签(custom1 的值)。

带有标签 tvshows 的就会返回 /path/to/rtorrent/finished/tvshows,修改第一部分,就可以根据自己的需要移动到任何想要的目录。

第二行配置是,当发生下载完成事件的时候,移动完成的内容,然后调用上一步定义好的 get_finished_dir 方法返回这个文件最终应该在的目录,并且通过 set_directory 方法设置最终的目录,如果最终的目录不存在则自动创建,最后再将 torrent 文件移动到最终的目录中。

  • 没有标签的 torrent 会被放到 rTorrent 定义的下载目录
  • 带有标签的 torrent 文件会被以移动到标签定义的目录,如果目录不存在则会自动创建

还有另外一种写法,下面的配置中,第二行配置定义了 move_to_complete 方法,接受两个参数,第一个参数是下载完成后的文件实际路径,第二个参数是要移动到的目录。然后在第三行配置中就直接调用该方法了:

# Move finished (no need Autotools/Automove plugin on ruTorrent)
method.insert = d.get_finished_dir, simple, "cat=$cfg.download_complete=,$d.custom1="
method.insert = d.move_to_complete, simple, "d.directory.set=$argument.1=; execute=mkdir,-p,$argument.1=; execute=mv,-u,$argument.0=,$argument.1=; d.save_full_session="
method.set_key = event.download.finished,move_complete,"d.move_to_complete=$d.data_path=,$d.get_finished_dir="

当以上配置生效之后,每当我将一部电影的种子放入到 /watch/movies 文件夹中的时候,该种子会自动被添加到 rTorrent 中,并且自动添加标签 movies,当完成下载后,会被放置到 /path/to/rtorrent/finished/movies 文件夹中。

通过上面的方式可以不需要依赖 [[ruTorrent]] 的 Autotools/Automove 插件。

完成了上面的操作之后有人就要问,那怎么把 torrent 文件自动放到对应的 watch 目录呢?那不妨看看我是如何用 flexget 来实现的。

reference


2022-02-17 rtorrent , rutorrent , config , rtorrent-config , bittorrent , torrent , private-tracker , tracker , bt

Pulsed Media seedbox 测评和使用

2022 年 6 月更新

不再推荐 Pulsed Media 这一家 Seedbox 服务提供商。服务提供商傲慢的态度,以及随意关停账号的行为,Pulsed Media 已经被 Reddit 禁言,在 LowEndBox 中也有非常多的关于不推荐 Pulsed Media 的帖子。

Pulsed Media 是一家 [[Seedbox]] 服务提供商,Seedbox 通常指的是专门为 Seeding(做种)而设计的下载上传服务器,通常有比较大的硬盘,带宽。Seedbox 通常有被称为「盒子」。

Pulsed Media 是一家共享盒子,也就是意味着多人共享一台独立主机,多人可能共享同一个 IP 地址。Pulsed Media 成立于 2009 年,机房在芬兰赫尔辛基。

我购买的是 12 周年促销款 V10G L,包含 8T 空间,8G RAM,10Gbps 带宽,以及 32000 GiB 的外部流量,无线的内部机房流量。价格是 11.99€ 一个月。

从官网及促销页面来看,自带支持 [[rTorrent]] 和 [[ruTorrent]],以及可以选择开启的 [[Dulege]] 和 [[qBittorrent]]。支持公开的 tracker。

自带 HTTP, HTTPS, FTP, SFTP, LFTP, SSH 访问。还允许安装使用 rclone, sonarr, pyload, resilio, syncthing, btsync (1.4 and 2.2), ffmpeg, fuse (unionfs, sshfs, s3fs etc.) 等等。

而串流支持 [[Jellyfin]] 和 [[Emby]],不支持 [[Emby]],因为创始人对于 Plex 曾经的一些行为不满。

购买及初始化使用

Pulsed Media 支持 Paypal,加密货币(BTC, LTC, XMR, ETH, DOGE 等等),购买 14 天内支持无条件退款。

在购买之后很快就会收到邮件,里面会包含后台登录地址,用户名和密码,以及登录 SSH,SFTP 等等的信息。

用里面的信息登录后台之后会发现 Pulsed Media 自己开发了一套 Seedbox 系统,在一台独立的主机上会开通分配多个用户。每一个用户都有一个自己独立的空间。可以通过简单的管理后台来启动一些简单的服务,比如 rTorrent, Deluge, qBittorrent 等等。

pulsed media dashboard services

在右上角可以看到当前的空间以及流量使用情况。

pulsed media quota info and traffic info

Pulsed Media 有一点非常不错的是,它会奖励始终用它服务的用户,看到上面截图 Quota Info 下面的一行 Bonus disk space 就是奖励的空间。Pulsed Media 会有脚本每小时执行两次检查,每一次都随机挑选 10 位用户,如果这些用户存在剩余空间,就会给用户一些额外的硬盘奖励。具体奖励的策略可以查看其官网

我购买 Pulsed Media 的一大理由就是其支持的服务,囊括了我曾经在博客中介绍过的非常好用的一些软件,比如自从发现了使用至今的 Syncthing,还有从 btsync 改名成 Resilio Sync 的同步工具。还有常常使用的 flexget。同时还支持很多我没有用过,但是一直想尝试一下的工具,比如 [[rclone]],[[Sonarr]], [[Radarr]] 等等。

下面就直接进入正题来记录一下我的使用过程及感受。

在 Pulsed Media 上使用 rTorrent 和 ruTorrent

Pulsed Media 最重要的就是 Seeding 了,登录后台之后能看到 Pulsed Media 默认就启用了 rTorrent 和 ruTorrent,我之前也说过,自从我在 QNAP 上发现了 rTorrent 和 ruTorrent 之后我就一直使用了这个组合。ruTorrent 的界面也非常的完善和强大,可以查看种子的 tracker 信息,制作信息,连接的 peers 信息,是我见过的显示信息最详细的一个客户端。并且 rTorrent 本身的配置就非常强大,通过简单的几行配置就可以实现按照标签自动移动完成的文件,也可以在不安装任何扩展的情况下实现 RSS 下载。总之我还有很多不懂的地方,每一次看 rTorrent 的文档总是会发现更多有趣的东西。

设定 Transdroid

[[Transdroid]] 是一款 Android 上的 rTorrent 控制端,可以对 rTorrent 等等其他客户端进行远程控制。

其中一些重要的配置如下:

Port 设置为 80 如果登录链接是: server.pulsedmedia.com/user-yourusername/ 那么在高级设置中记住设置 SCGI mount point: /user-yoursername/rutorrent/plugins/httprpc/action.php

如果登录链接是: username.server.pulsedmedia.com 那么设置 SCGI mount point: /rutorrent/plugins/httprpc/action.php

详细的步骤可以参考官网

后台最重要的功能我认为就是这些了,接下来用邮件中的信息来登录 SSH 后台看看。

同理如果要在 [[PT Plugin Plus]] 中配置下载服务器,也需要使用上面的配置,需要在个人的登录链接之后加上 SCGI mount point 的路径才能连接上。

使用 SSH 登录

使用 SSH 登录后台之后可以看到用户 HOME 目录中非常干净,就这些目录。

❯ ls
data  rTorrentLog  session  watch  www

当然还有一些隐藏文件,比如 .rtorrent.rc, .rtorrent.rc.custom 等等,一眼看上去就是 rTorrent 的配置文件,其他的文件可以自行查看。上面的几个文件夹

  • data 是 rTorrent 的默认下载目录
  • watch 是 rTorrent 的监控目录,这个文件夹下的 torrent 文件都会被自动加载并下载,后文使用的 flexget 就可以将这个目录作为下载 torrent 的默认目录,另外也可以自行修改 .rtorrent.rc 来自定义监控目录

zsh

既然我可以登录 SSH,虽然我没有 sudo 和 root 权限,但是我也可以在我自己的 HOME 目录下使用 zsh。我之前的一键初始化脚本在 Pulsed Media 上无法使用,因为用到了 chsh 命令,这个需要 sudo 权限将默认的 SHELL 更换成 zsh。不过那也没有关系。Pulsed Media 默认是安装了 zsh 的,用 which zsh 可以确认。

我只需要在 $HOME 目录下创建 .bash_profile 文件,然后填入:

export SHELL=`which zsh`
[ -z "$ZSH_VERSION" ] && exec "$SHELL" -l

然后还是使用我的脚本:

git clone https://github.com/einverne/dotfiles.git
cd dotfiles
make bootstrap

会自动初始化我的基础配置,然后退出 SSH,然后重新登录,就会启用 zsh。

在 Pulsed Media 上使用 flexget

Pulsed Media 上无法使用 Docker,所以之前文章中的安装方式就不行了,但是 Pulsed Media 上默认已经安装了 flexget 工具,直接可以运行。

flexget 默认会按照下的顺序寻找配置文件 config.yml:

  • 当前目录
  • virtualenv 目录
  • ~/.flexget/
  • ~/.config/flexget

所以可以参考之前文章中的配置写法,在配置文件 .config/flexget/config.yml 中配置:

tasks:
  avistaz-free:
    rss: https://avistaz.to/rss/feed?fid=2&pid=722xxxx
    download: ~/watch
    accept_all: yes

schedules:
  - tasks: '*'
    interval:
      minutes: 30

然后 crontab -e 增加:

*/30 * * * * /usr/local/bin/flexget --cron execute

这样就会每隔 30 分钟执行一次,然后下载 torrent 到 ~/watch 目录。flexget 更多的配置详情可以参考之前的文章

在 Pulsed Media 上安装使用 Syncthing

Syncthing 和 flexget 也类似,机器上已经安装了 Syncthing,可以直接启动,同样我也把配置放在了 .config/syncthing 目录下。

/usr/bin/syncthing --no-browser --home="/home/einverne/.config/syncthing"

Syncthing 默认的配置在: $HOME/.config/syncthing 目录下。第一次启动会自动放入默认的配置。

启动之后再根据自己的情况修改 config.xml 配置。

通常情况下可以选择一个没有被占用的端口,修改如下行:

<address>0.0.0.0:18384</address>

因为 Syncthing 需要一直在后台运行所以我启用 Tmux,然后在 Tmux 中执行上面的命令。

如果你使用我的 dotfiles,那么可以直接

tm syncthing

会自动创建一个 syncthing 名字的 Session。

如果手动创建可以使用:

tmux new -s syncthing

然后在 Tmux 中执行命令。然后用 Ctrl+B 然后按 D 来是 Tmux Syncthing 在后台执行。更多的 Tmux 的使用可以参考这篇文章

在 Pulsed Media 上安装使用 Resilio Sync

同样 Resilio Sync 机器上也安装了,可以使用 whereis btsync 或者 whereis rslsync 来查看。

不过我嫌机器上安装的版本太老,所以自己去官网下载的一份最新的 rslsync 放到了 $HOME/einverne/bin 目录下,并且把这个 PATH 加入到了系统 PATH。

然后创建配置模板:

rslsync --dump-sample-config > .config/rslsync/rslsync.conf

然后修改模板配置,几个重要的配置:

{
   "device_name": "PM Sync Device",  // 自己设定名字
   "listening_port" : 17888, // 0 - 随机端口,或者自行配置未被占用的端口

/* storage_path dir contains auxilliary app files if no storage_path field: .sync dir created in current working directory */
 "storage_path" : "/home/einverne/rslsync",

/* set location of pid file */
 "pid_file" : "/home/einverne/var/run/resilio/resilio.pid",

/* use UPnP for port mapping */
  "use_upnp" : true,

/* limits in kB/s. 0 - no limit */
  "download_limit" : 10240,
  "upload_limit" : 10240,

/* proxy configuration */
// "proxy_type" : "socks4", // Valid types: "socks4", "socks5", "http_connect". Any other value means no proxy
// "proxy_addr" : "192.168.1.2", // IP address of proxy server.
// "proxy_port" : 1080,
// "proxy_auth" : false, // Use authentication for proxy. Note: only username/password for socks5 (RFC 1929) is supported, and it is not really secure
// "proxy_username" : "user",
// "proxy_password" : "password",

/* directory_root path defines where the WebUI Folder browser starts (linux only). Default value is / */
  "directory_root" : "/home/einverne/rslsync/MySharedFolders/",

/* directory_root_policy defines how directory_root is used (linux only).
   Valid values are:
     "all" - accepts directory_root and its subdirectories for 'getdir' and 'adddir' actions
     "belowroot" - accepts directory_root's subdirectories for 'getdir' and 'adddir' actions,
      but denies attempts to use 'adddir' to create directories directly within directory_root
   Default value is "all". */
//  "directory_root_policy" : "all",

  "webui" :
  {
    "listen" : "0.0.0.0:8888" // remove field to disable WebUI

/* preset credentials. Use password or password_hash */
  ,"login" : ""
  ,"password" : "" // (not recommended, better use 'password_hash_unified')
//  ,"password_hash" : "<crypt() 3 format password hash>" // (not recommended) Works on *nix only!
// Use either 'password_hash' or 'password_hash_unified' (recommended), but not both of them!
//  ,"password_hash_unified" : "<SHA2-256 hash in HEX format>" // Works on all platforms.
//  ,"password_hash_salt_unified" : "<any text>" // Salt for unified password's hash. Works on all platforms.
  ,"allow_empty_password" : false // Defaults to true
/* ssl configuration */
//  ,"force_https" : true // disable http
//  ,"ssl_certificate" : "/path/to/cert.pem"
//  ,"ssl_private_key" : "/path/to/private.key"

/* dir_whitelist defines which directories can be shown to user or have folders added (linux only)
   relative paths are relative to directory_root setting */
  ,"dir_whitelist" : [ "/home/einverne/rslsync/MySharedFolders/", "/home/einverne/rslsync" ]
  }

/* !!! if you set shared folders in config file WebUI will be DISABLED !!!
   shared directories specified in config file  override the folders previously added from WebUI. */
/*,
  "shared_folders" :
  [
    {
      "secret" : "MY_SECRET_1", // required field - use --generate-secret in command line to create new secret
      "dir" : "/home/user/resilio/sync_test", // * required field
      "use_relay_server" : true, //  use relay server when direct connection fails
      "use_tracker" : true,
      "search_lan" : true,
      "use_sync_trash" : true, // enable SyncArchive to store files deleted on remote devices
      "overwrite_changes" : false, // restore modified files to original version, ONLY for Read-Only folders
      "selective_sync" : false, // add folder in selective sync mode
      "known_hosts" : // specify hosts to attempt connection without additional search
      [
        "192.168.1.2:44444"
      ]
    }
  ]
*/

/* Advanced preferences can be added to config file. Info is available at "https://help.getsync.com/hc/en-us/articles/207371636"
For example see folder_rescan_interval below */
//, "folder_rescan_interval" : 600

}

注意根据自己的需要,设定用户名和密码。

然后启动 btsync:

btsync --config .config/rslsync/rslsync.conf --nodaemon

这个命令会以前台方式执行。通常用上面的方式放入到 Tmux 在后台执行。

一键安装其他组件

一键安装 Sonarr, Raddarr, Prowllar, SABnzbd and Jellyfin:

curl https://gist.githubusercontent.com/gsj1377/a7eb727e079a1cefc9baff4e130d8900/raw/app-installation.sh | bash && source ~/.bashrc

Pulsed Media 流量限制

在登录账号之后,在后台右上角可以看到最近 30 天的流量使用情况。在 Pulsed Media 这里,流量的充值日期并不是每个月初,而是滚动限制,也就是当前看到的是过去 30 天的流量使用情况,Pulsed Media 在一篇很久之前的文章中解释了这么做的理由。

总结

总之这么一顿折腾以及完全可以使用,并且可以自动下载一些 Free 的种子,剩余的空间我也可以用来同步自己的文件。

如果你也想购买可以点击我的邀请链接,目前官方的 12 周年几年活动还在继续,页面还有几台特价的机器。并且如果只是小需求,500GB 的套餐 V1000, 1TB 的套餐 M10G,等等首月还可以免费使用,不满意直接申请下个月不续费即可。

pulsed media 12th anniversary special first month free

如果需求比较大也可以购买 V10G

pulsed media 12th anniversary v10g

reference


2022-02-17 pulsedmedia , seedbox , torrent , btsync , resilio , resilio-sync , syncthing

使用 Nginx Proxy Manager 管理 Nginx 代理

Nginx Proxy Manager 是一个可以自动暴露网络服务,并申请 Let’s Encrypt 免费证书的 Nginx 反向代理。可以非常方便的和 Docker 一起使用。Nginx Proxy Manager 还提供了一个不错的界面。

在没有使用 Nginx Proxy Manager 之前我一直使用 Nginx Proxy 来自动暴露 Docker 服务,并生成 SSL 证书。

安装

首先创建 network:

docker network create nginx-proxy

docker-compose 配置:

version: "3"
services:
  nginx-proxy-manager:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      # These ports are in format <host-port>:<container-port>
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
      # Add any other Stream port you want to expose
      # - '21:21' # FTP
    environment:
      DB_SQLITE_FILE: "/data/database.sqlite"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt

使用 docker-compose up -d 之后,访问浏览器 IP:81 端口。

默认的用户名和密码:

  • admin@example.com
  • changeme

使用

创建一个 Nginx 反向代理到 81 端口,可以设置域名解析,将 npm.example.com 解析到 IP 地址,然后在 Nginx Proxy Manager 后台,创建 Proxy Host,按照自己的配置填入:

nginx proxy manager

等待 DNS 解析生效,访问 npm.example.com 即可登录管理后台。

使用 Docker network

在使用 Nginx Proxy Manager 的时候,可以不用让每一个容器都暴露一个端口,可以使用 Docker network 来将容器放到同一个网络下,然后使用名字来关联。

创建网络:

docker network create nginx-proxy

然后分别将 Nginx Proxy Manager 和其他服务放到同一个网络下,添加如下配置:

networks:
  default:
    external:
      name: nginx-proxy

以 Portainer 举例:

version: '3'
services:

  portainer:
    image: portainer/portainer
    privileged: true
    volumes:
      - './data:/data'
      - '/var/run/docker.sock:/var/run/docker.sock'
    restart: unless-stopped

networks:
  default:
    external:
      name: nginx-proxy

在配置中可以看到 Portainer 没有显示定义暴露的 9000 端口,这个时候可以在 Nginx Proxy Manager 后台,通过 portainer 作为 hostname 来创建反向代理,关联到这个容器。这种方法只需要保证每一个容器都有一个唯一的名字即可。

本地静态网站

首先添加一个额外的 Volume:

/opt/website:/var/www/website

Forward Hostname/IP 填写服务器 IP 地址。

在 Advanced 中配置:

location / {
  root /var/www/website;
}

保存。然后将静态网站内容放到宿主机的 /opt/website 中即可。

reference


2022-02-16 nginx , docker , docker-compose , linux , http , container , reverse-proxy

使用 PikaPods 一键搭建属于自己的在线服务

在逛 LET 的时候偶然间发现了一款叫做 PikaPods 的在线服务,看到作者将 Docker 容器作为一个服务出售给用户,并且当前注册用户可以免费享有一年的使用时间于是就试用了一下。[[PikaPods]] 是一个将容器平台化的网站,可以非常方便的一键搭建开源的服务。我只花了不到一分钟的时间就在 PikaPods 中搭建了一个 [[FreshRSS]] 服务,并且导入我的 1000 多条阅读源抓取效果也非常不错。

PikaPods 现在注册免费提供 3 个 Pods 以及 50GB 空间的存储。目前支持一些非常常用的服务:1

  • [[ArchiveBox]] 我之前也自己用 docker 搭建了一个
  • [[Changedetection.io]] 网页服务变动检测
  • [[Gitea]] 一个代码托管服务,这个是我之前自己用的 Gogs 的升级版
  • [[FreshRSS]] 一个 PHP 编写的在线 RSS 阅读器
  • [[Homer]] 一个可配置的在线静态导航页面
  • [[Jupyter]] 基于网页的 Python 交互式开发环境,笔记
  • [[NextCloud]] 文件同步工具
  • [[Navidrome]] 音乐文件在线串流服务
  • [[PhotoPrism]] 基于 AI 的在线照片工具
  • [[Umami]] 一个 [[Google Analytics]] 的代替方案
  • [[uptime-kuma]] 服务在线情况检测

PikaPods 的背后团队 peakford 之前就推出过 [[BorgBase]] 的备份存储服务,并且一直在贡献 Borg 的开源客户端 [[Vorta]]。

pikapods dashboard

关于收费情况,在当前测试环境是注册用户拥有一年的免费使用。之后的收费需要看具体的使用场景,另外 PikaPods 明确提到了相关的收入最后会回馈给这些开源服务的作者,分成比例大概在 10%~20% 左右。我觉的这个是我目前能想到的最好的开源社区回馈作者的方式了,像是 Amazon 那样直接将开源项目拿走的方式可能并不适合目前这类需要一定云服务基础设施的项目。如果 PikaPods 进入一个良性循环,那么我想大部分的 self-hosted 项目都可以被纳入进来。

为什么推荐 PikaPods

买一台 VPS 自己用 docker 和 docker-compose 来搭建和管理这些服务其实也非常简单,但唯一需要让我顾虑的就是安全性和数据备份。

安全性

如果完全由自己维护和更新,那么比如 log4j 这类型的大型漏洞我个人可能还会关注到,但是如果遇到没有那么严重的漏洞,极有可能造成我的 VPS 安全性问题。如果有专业的人员去管理这些服务,以及可能出现的异常,那么可能会比我个人管理强一些,毕竟我个人的精力是有限的

数据安全性

如果是我个人使用 VPS 搭建,那我所做的就是将 Docker 容器的数据 mount 到一个目录,然后定时使用 crontab 执行备份脚本,压缩并 rsync 到我的备份数据服务器上。

在 PikaPods 中,同样可以使用 SFTP,将 mount 的文件夹备份到其他服务器,不会锁定在这个平台上,使用起来也不会有后顾之忧。即使未来某一天 PikaPods 不再运维,那么也可以将数据 dump 到自己的服务器上使用 Docker 完全恢复一份一样的服务。

数据备份和存储

PikaPods 可以使用 [[SFTP]] 将数据备份出来,即使以后不再使用 PikaPods 那也只需要将数据挂载在 Docker 容器上直接使用即可。

中途遇到一点 SFTP 连接的问题,给作者反馈之后也非常快速的得到了响应,原来是我本地 SSH 配置的问题。 一定记得如果本地配置了 SSH,那么一定要记住记得使用密码,否则 SSH 会使用本地的 KEY 去尝试登录,多次错误之后可能会被服务端拒绝。

Linux 下可以使用命令登录 SFPT:

sftp -o PreferredAuthentications=password -o PubkeyAuthentication=no username@xxx.pikapod.net

简单使用总结

注册账后之后,我直接使用了我常用的 FreshRSS,在后台查看数据,我使用了 2 CPUs,2G Memory,10GB 空间,实际运行的时候只占用 2~3% CPU,内存使用在 7% 左右,空间不到 100 MB。

目前存在的问题

目前 PikaPods 只提供欧洲和美国的服务,也就是这个服务会部署到这两地的服务器上,这也就意味着当前某些地方的连接速度可能不是非常可靠。但就我个人的使用情况来看,加上代理 阅读 RSS,上传照片连接速度也还是非常不错的。平均延迟在 150ms 左右。


2022-01-28 self-hosted , pikapods , docker , container , freshrss

在线文件管理器 Filestash

[[FileStash]] 是一个在线的文件管理器,可以使用浏览器管理分布在各种服务,各种磁盘上的数据,支持包括 SFTP,FTP,S3,[[WebDAV]],[[Dropbox]],[[Google Drive]],[[Gogs]] 存储的内容。

Filestash 的目的在给存储层增加一层抽象,这使得我们可以通过一个简单的界面来管理我们所有的后端数据。

支持:

  • SFTP
  • FTP
  • [[WebDAV]]
  • [[Git]]
  • [[AWS S3]]
  • Dropbox
  • Google Drive

官网

特性:

  • 从浏览器管理各处文件
  • 支持 Org mode1
  • 灵活的分享机制
  • 视频播放器
  • 视频转码(mov, mkv, avi, mpeg 等等)
  • 图片预览
  • 图片转码 (Nikon 和 Canon 的 raw 格式)
  • 图片管理
  • 音频播放器
  • 全文检索
  • 跨网络驱动器的分享链接
  • 办公文档 (docx, xlsx 等等)
  • 移动界面友好
  • 速度快
  • 上传文件或创建文件夹
  • 支持多云存储提供商以及多协议
  • Nyan cat loader
  • 支持快速访问,频繁访问的文件夹会展示在首页
  • Emacs, VIM 和 Sublime 快捷键绑定

费用

如果自己的安装是完全无需费用的。

如果使用官方的托管,Pro 需要 50$ 一个月。如果需要更好的支持可以到官网 查看

安装

docker run --restart=always --name filetash -d -p 8334:8334 machines/filestash

或者通过 docker-compose:

version: '3'

services:
  filestash:
    image: machines/filestash
    container_name: filestash
    restart: always
    ports:
      - "8334:8334"

更加详细的配置可以参考我的 dockerfile

运行成功之后,会设置初始密码,之后访问 /admin 可以进入管理后台。

启用 Google Drive

需要获取 Google Drive API,点击 进入 管理后台。

点击 创建 OAuth 客户端 ID,

相较于同类的优点

  • 对图像支持比较友好,甚至支持 RAW 格式
  • 支持时评,可以进行转码
  • 可以进行全文检索
  • 支持与 OnlyOffice 集成

存在的问题

空间占用太多

/var/lib/docker/overlay2/

reference

  • [[AList]]

2022-01-28 selfhosted , self-hosted , self-hosting , file-manage , docker , stash , sftp , webdav

Fly.io 使用体验

Fly.io 是一个应用部署平台,和 [[Netlify]]、[[Vercel]] 不同之处在于 Fly.io 提供了数据库,这就使得在线托管一个小型动态网站成为了可能。Fly.io 是一个 [[Y combinator]] 孵化的项目

关于收费

Fly.io 是提供一定限额的免费使用额度的,他们的目标就是让小型的应用可以免费运行,而在需要扩展的时候支付一定的费用,而这笔费用也不会太昂贵。Fly.io 的应用会根据使用情况单独计费。

Fly.io 会根据单个用户或者组织计费,官方也说了,如果想要更多免费的应用,那么你可以创建多个组织。

免费限额

分类 限额 说明
VM: shared-cpu 每个月 2340 小时 可以全天候运行 3 个 256 MB 内存的共享 CPU 的 VM
Volumes 3GB 提供 3GB 永久存储
Bandwidth 160 GB/每月 根据各个地方不同分别计算 outbound 流量
Anycast IPs 无限的 IPv6, 每一个活跃的应用一个 IPv4 每一个额外的 IPv4 地址需要额外每个月 $2
Certificates 10 个活跃的证书 最多 10 个证书

亚洲和印度免费流量是 30G,美国和欧洲是 100G。

更加具体的价格可以参考官网

需要注意的是 Fly.io 需要绑定信用卡之后才能使用。

原理

Fly 根据其官网的简介可以看到其也是借助了 Docker,用户编写代码,并用其提供的工具打包成 Docker 镜像,然后部署到 Fly 的平台上,之后就是 Fly 平台处理的事情了。本质上来说 Fly 就是提供了一个平台化的容器运行时环境。

这个服务有点像是之前那篇文章介绍的 PikaPods,区别在于 Fly.io 允许用户自己编写代码部署,而 PikaPods 则是提供了现成的服务,简化了用户用命令行部署的过程。

具体的上手过程可以完全参考这篇官方的文档

几个重要的命令

每一个 Fly 应用都需要一个 fly.toml 来告诉系统如何部署这个服务。fly.toml 会通过 flyctl launch 自动生成。

然后可以通过 flyctl deploy 来部署。

查看部署的应用

通过 status 命令查看详情:

flyctl status
❯ flyctl status
App
  Name     = evhellofly          
  Owner    = personal            
  Version  = 0                   
  Status   = running             
  Hostname = evhellofly.fly.dev  

Deployment Status
  ID          = 7b99844a-c4be-5193-eac3-e5aaxxxxx3f3         
  Version     = v0                                           
  Status      = successful                                   
  Description = Deployment completed successfully            
  Instances   = 1 desired, 1 placed, 1 healthy, 0 unhealthy  

Instances
ID      	PROCESS	VERSION	REGION	DESIRED	STATUS 	HEALTH CHECKS     	RESTARTS	CREATED    
b164cc3d	app    	0      	nrt   	run    	running	1 total, 1 passing	0       	11m57s ago	

打开应用

flyctl open

reference


2022-01-26 flyio , netlify , vercel , deploy

Borg Backup 命令行增量备份工具使用

BorgBackup 是一个 Python 和 C 语言编写的命令行增量数据备份工具。

特性:

  • 高效存储
  • 加密
  • 支持多种压缩算法
    • LZ4 快,低压缩
    • ZSTD 高速低压缩、低速高压缩
    • ZLIB 中等速度,中等压缩
    • LZMA 低速 高压缩
  • 远程备份,数据可以通过 SSH 备份到远程机器
  • FUSE
  • 跨平台
  • 开源

客户端

Borg 本身是一个命令行工具,但是在 macOS 和 Linux 下可以使用 Vorta 这是一个跨平台的 GUI 客户端。

概念

BorgBackup 中有两个必须知道的概念:

  • repository, 备份仓库
  • archive 每次备份

安装

在 Debian/Ubuntu 下:

sudo apt install borgbackup -y

如果要 Python 环境,也可以使用 pip 安装:

pip install borgbackup

也可以手工安装(记得去官网获取最新版本):

wget https://github.com/borgbackup/borg/releases/download/1.0.12/borg-linux64
sudo mv borg-linux64 /usr/local/bin/borg
sudo chown root:root /usr/local/bin/borg
sudo chmod 755 /usr/local/bin/borg

验证:

borg --version
borg --help

其他更多系统的安装可以参考官网

使用

相关命令:

borg init -- 初始化一个仓库
borg create -- 创建一个archive到仓库中
borg list -- 列出所有的仓库或者某个仓库中某个archive的内容
borg extract -- 还原某个archive
borg delete -- 手动删除某个archive
borg config -- 获取或者设置某个配置

备份流程:

# 创建仓库存储目录
$ mkdir -p /tmp/backup/
# 初始化仓库
$ borg init --encryption=repokey /tmp/backup/borg_sample

初始化 repository 的时候,可以指定加密类型:

  • none 不加密
  • repokey 或 keyfile 的时候,使用 AES-CTR-256 加密
  • 其他的加密类型可以参考官网
# 创建测试备份内容
# 会被修改的文件file_change.txt,不会被修改的文件file_static.txt,二进制大文件random.dump
$ mkdir -p /tmp/data
$ cd /tmp/data
$ echo "here is the first line of file 1" >> file_change.txt
$ echo "here is the static file" >> file_static.txt
$ dd if=/dev/urandom of=random.dump bs=10M count=10
10+0 records in
10+0 records out
104857600 bytes (105 MB) copied, 0.950948 s, 110 MB/s
$
# 第一次备份
$ borg create --stats --progress /tmp/backup/borg_sample::first /tmp/data/
------------------------------------------------------------------------------
Archive name: first
Archive fingerprint: bd5ddf9ac944353bb209576c12a16652a18f866c9d033fef2eb582d288a3cff5
Time (start): Sat, 2022-01-29 10:48:07
Time (end):   Sat, 2022-01-29 10:48:07
Duration: 0.54 seconds
Number of files: 3
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:              104.86 MB            105.27 MB            105.27 MB
All archives:              104.86 MB            105.27 MB            105.27 MB

                       Unique chunks         Total chunks
Chunk index:                      42                   42
------------------------------------------------------------------------------

如果不传 --stats --progress 则静默输出。

在 create 的时候可以选择使用压缩算法:

borg create --compress zstd,1 /tmp/backup/borg_sample::2022-01-20 /tmp/data/

如果不指定压缩算法,默认会使用 LZ4,速度快,压缩比率低。

# 修改备份内容,修改file_change.txt, 新增file_new.txt,新增random_2.dump
$ cd /tmp/data
$ echo "here is the second line of file 1" >> file_change.txt
$ echo "here is new file for second backup" >> file_new.txt
$ dd if=/dev/urandom of=random_2.dump bs=10M count=10
10+0 records in
10+0 records out
104857600 bytes (105 MB) copied, 0.599837 s, 175 MB/s
$
# 第二次备份
$ borg create --stats --progress /tmp/backup/borg_sample::second /tmp/data/
------------------------------------------------------------------------------
Archive name: second
Archive fingerprint: 67b7f448698a471561ff2cf5de2b571cb40ddbce3f1a23669bfbec76d291c1b6
Time (start): Sat, 2022-01-29 10:50:35
Time (end):   Sat, 2022-01-29 10:50:35
Duration: 0.51 seconds
Number of files: 4
Utilization of max. archive size: 0%
------------------------------------------------------------------------------
                       Original size      Compressed size    Deduplicated size
This archive:              209.72 MB            210.54 MB            105.27 MB
All archives:              524.30 MB            526.36 MB            210.55 MB

                       Unique chunks         Total chunks
Chunk index:                      85                  205
------------------------------------------------------------------------------

列出备份:

# 列出所有的备份
$ borg list /tmp/backup/borg_sample/
first                                Sat, 2022-01-29 10:48:07 [bd5ddf9ac944353bb209576c12a16652a18f866c9d033fef2eb582d288a3cff5]
second                               Sat, 2022-01-29 10:49:27 [6a5131bc1098d4ba46daabc6e440d6daf9211db94ac2d17893f996ce78840162]

$
# 列出第一次备份的内容
$ borg list /tmp/backup/borg_sample::first
drwxrwxr-x einverne einverne        0 Sat, 2022-01-29 10:47:39 tmp/data
-rw-rw-r-- einverne einverne 104857600 Sat, 2022-01-29 10:47:41 tmp/data/ramdom.dump
-rw-rw-r-- einverne einverne       11 Sat, 2022-01-29 10:47:11 tmp/data/file_change.txt
-rw-rw-r-- einverne einverne       12 Sat, 2022-01-29 10:47:21 tmp/data/file_static.txt
$

使用 info 获取存档信息:

borg info /tmp/backup/borg_sample/::first

恢复备份:

# 将第一次备份恢复, 查看file_change.txt内容,只包含第一次的内容
$ mkdir -p /tmp/restore/first
$ cd /tmp/restore/first
$ borg extract --list /tmp/backup/borg_sample::first
tmp/data
tmp/data/file_change.txt
tmp/data/file_static.txt
tmp/data/random.dump
$
$ cat tmp/data/file_change.txt
here is the first line of file 1
$
# 将第二次备份导出, 查看file_change.txt内容,其中包含了第二次新增加的内容
# 也包含了第一次新增的file_new.txt和random_2.dump
$ mkdir -p /tmp/restore/second
$ cd /tmp/restore/second
$ borg extract --list /tmp/backup/borg_sample::second
tmp/data
tmp/data/file_change.txt
tmp/data/file_static.txt
tmp/data/random.dump
tmp/data/file_new.txt
tmp/data/random_2.dump
$
$ cat tmp/data/file_change.txt
here is the first line of file 1
here is the second line of file 1
$
# 第一次备份是100M,第二次是200M, 但由于是增量备份的,random.dump没有改变,因此仓库的总容量只有200M
$ du -sh /tmp/backup/borg_sample/
201M	/tmp/backup/borg_sample/
$
# 删除第一次备份,恢复第二次的备份
# 可以看到再第一次和第二次备份中都有的file_static.txt和random.dump都可以恢复出来。
# 恢复出来的数据和之前恢复的数据是一样的
$ borg delete /tmp/backup/borg_sample::first
$ borg list /tmp/backup/borg_sample
second                               Tue, 2019-09-24 04:10:55 [a423a94e8a8f4352e72c0951e6a408f4f4f6d5f362518dcbcba77b9005dafa12]
$
$ mkdir -p /tmp/restore/second_back
$ cd /tmp/restore/second_back
$ borg extract --list /tmp/backup/borg_sample::second
tmp/data
tmp/data/file_change.txt
tmp/data/file_static.txt
tmp/data/random.dump
tmp/data/file_new.txt
tmp/data/random_2.dump
$
$ diff -r /tmp/restore/second /tmp/restore/second_back
$
$ cat tmp/data/file_change.txt
here is the first line of file 1
here is the second line of file 1
$
$ cat tmp/data/file_static.txt
here is the static file

查找备份和备份之间的差异,可以使用 diff 命令:

borg diff /tmp/backup/borg_sample::first second

重命名备份名:

borg rename /tmp/backup/borg_sample::first 2022-01-20

熟悉了 Borg 命令的时候之后,大部分情况下,我们可以使用 [[Borgmatic]] 来管理备份,Borgmatic 会将基础的配置,比如仓库的地址,压缩方法,源目录,passphrase 等等在一个地方进行管理,然后使用简单的命令即可执行。

Borgmatic

备份到远程

Borg 支持远程仓库,可以将数据通过 SSH 备份到任何远程主机中。

borg init user@hostname :/path/to/repo

同样使用 mountextract 的时候:

borg mount ssh://user@hostname:222/home/einverne/borg/backup /path/to/backup
borg extract ssh://user@hostname:222/home/einverne/borg/backup

2022-01-23 borg , borgbackup , backup , ssh , scp , rsync

GitHub Code Search 使用小技巧

前两天收到 GitHub Code Search 的申请通过邮件,现在可以使用 https://cs.github.com 来作为之前的搜索的代替了,从第一手直观的感受来看就是更加精准的搜索,能根据文件名,代码方法,编程语言等等来进行搜索。

这里就只简单的记录一下我的使用体验,更加详细的使用指南请参考官方文档

概念

在进入下面的使用体验之前先了解一下 GitHub Code Search 中的一些概念。

理解 Scope

在 GitHub Code Search 中可以通过 Scope 来定义搜索的范围。

Scope 在字典里面的解释也比较直观:

the range of things that a subject, an organization, an activity, etc deals with

中文一般翻译成「范围」。

GitHub 有一些约定:

  • 必须登录 GitHub 账号才可以搜索全部公开的仓库
  • 在 forks 中的代码只有当 stars 数超过父仓库时才会被列入索引,当需要搜索 star 数超过父项目的仓库时,需要使用 fork:true 或者 fork:only 参数。更多可以参考如何搜索forks
  • 只有默认的分支会被索引
  • 只有小于 384KB 的文件会被索引
  • 只有小于 500000 个文件的仓库能被搜索
  • 只有在过去一年中有活动的,或者在搜索结果中有记录的仓库才能被搜索
  • 除了 filename 的搜索,必须至少有一个关键字才能搜索,比如,搜索 language:javascript 不是合法的,只有 amazong language:javascript 才是合法的
  • 搜索结果中只会显示同一个文件的两个片段,但是有可能在文件中会存在更多的符合结果的内容
  • 搜索中不能包含

      . , : ; / \ ` ' " = * ! ? # $ & + ^ | ~ < > ( ) { } [ ] @
    

qualifiers

Code Search 中提供了一些修饰语语法,可以用来对搜索结果做限定。

  • 限定在某仓库中 (eg. repo:github/primer)
  • 限定在组织中 (eg. org:github 或者 user:colinwm)
  • 限定语言 language:python
  • 限定文件路径 path:README.md
  • Symbol qualifier symbol:scanbytes
  • 限定内容 content:hello

正则

Code Search 还支持使用正则表达式来搜索:

/git.*push/

正则表达式需要使用 / 作为范围,上面的搜索词就会搜索所有以 git 开头 push 结束的内容。

记住如果要在其中使用 / 那么需要进行转义,比如搜索目录 App/src

/^App\/src\//

正确匹配

正常情况下搜索 hello world 相当于搜索 hello AND world 这两个词可能不连在一起,如果要精确地查找搜索词,可以使用双引号:

"hello world"

Boolean operations

Code search 支持几种常用的搜索连接词:

  • AND
  • OR
  • NOT

可以使用括号来改变优先级:

(language:ruby OR language:python) AND NOT path:"/tests/"

可以点击这里加入到 waitlist

使用

搜索样例

过去几天我最常用的就是搜索学习别人是如何写 docker-compose.yml 文件的,因为最近在学习 Traefik 入门使用 所以把历史上用 Nginx-proxy 反向代理的一些服务重新配置了一下。因为 Traefiki 的配置语法略微复杂,我先阅读了一遍 Traefik 官网的文档,了解了一些基础概念,然后因为官网没有整体配置的一个样例,我就觉得直接看完整的项目配置比较快,所以直接用 Code Search 搜索一些完整的配置进行学习。

比如把 [[Vaultwarden]],[[NextCloud]] 等,这个时候我就使用搜索语法:

bitwarden path:docker-compose.yml
nextcloud path:docker-compose.yml

搜索出来一些结果然后学习,然后配置的过程中还发现了不少很好的项目。

搜索配置

之前在配置 ArchiveBox 服务的 ArchiveBox.conf 的时候,直接搜索该文件直接可以找到对应的官网仓库的样例配置,依照样例配置进行自己的修改。

关键字搜索

我常用的另外一个比较多的场景就是搜索错误代码或者错误描述,常常在 IDE 中当然也能搜索,但是有些大型的库常常我本地没有索引所以搜索起来可能比较慢,这个时候拿到错误直接到界面搜索,反而可以更快的定位到问题。这个时候只需要限定仓库的位置,然后加上错误描述即可。

reference


2022-01-21 github , code , code-search

小米平板 5 Pro 初体验及设置

年初的时候去线下做了一下体验,觉得小米平板 5 在影音和阅读方面还能胜任,所以就购入了一台小米平板 5 Pro,日常可能就用来阅读 PDF 和用来看视频。

选购思路

为什么买 Android 平板?

因为我重度使用的应用,比如 [[Syncthing]], [[Obsidian]], [[静读天下 Moon+Reader]] 等等在 Android 下运行良好,我也不需要 iPad 那些独占的功能。

而且 Android 的开放性比较好,安上 Termux,甚至能够在 Android 环境下使用 Linux ,简单的 ssh 命令也可以瞬间让平板成为一个连接远程服务器的利器。

小米平板对比三星,联想平板?

说实话在没有体验小米平板 5 之前,我一直观望的是三星的平板,毕竟在那几年里面,Android 平板几乎消失,在这两年 iPad 生态逐渐强大,各大 Android 厂商才又将 Android 平板拿起来,但 Android 平板和 iOS 的差距很快就被系统的扩展性赶上了,虽然应用的适配和兼容性可能无法赶上 iPad,一些精品的应用体验,比如书写,绘画可能也无法短时间内追赶上 iPad,但是在体验了一番 MIUI 之后,感觉小窗模式,分屏模式还是稍微超出了我的预期,所以,想买过来深度再体验一下。

小米平板 5 对比 5 Pro 版本?

在硬件方面,

  • Pro 版本采用 870 芯片,略强于 860
  • 扬声器方面,内置八个扬声器,外加杜比音效,好过 5 的四个扬声器
  • 运行内存,Pro 版本 LPDDR5+UFS 3.1,普通版本 LPDDR4x+UFS 3.1,但这一点差距似乎对整体影响并不突出
  • 后置摄像头,Pro 版本后置双摄1300万像素+500万景深镜头,5 只有单摄 1300 万像素,不过好像我也不会拿平板去拍照,这个不太重要
  • Pro 支持蓝牙 5.2,普通版本只支持蓝牙 5.0
  • 充电方面,Pro 支持 67W 快充,5 默认带 33W 充电
  • Pro 版本带有指纹解锁
  • Pro 版本电池 8600 毫安,而 5 略微大一些,为 8720 毫安

而二者的屏幕都是一块 11 英寸的 IPS LCD,带 120Hz 的刷新率,分辨率是 1600*2560.

Pro 版本多出了一个指纹解锁,CPU 更好一些,我愿意为这点升级补差价。

Termux 初始化

之前就已经知道 Termux 可以在 Android 上模拟出一套 GNU/Linux 环境,所以直接更新一套初始化脚本到我的 dotfiles

配件

小米平板 5 Pro 自带的两个配件有一只笔和一个键盘,当时买完就脑袋一发热买了一个键盘,虽然日常还是会用到,但感觉似乎任何一个蓝牙键盘都可以代替,除了便携性好一些之外没有太多想说的。键盘的手感也只是能用而已。

笔的话,我没有购买,因为我觉得不会在这个平板上面来写字做笔记,如果是看 PDF 的需求,我还有 Boox Note 2 ,自带的笔已经够用了。


2022-01-18 xiaomi , xiaomi-pad , xiaomi-pad-5-pro , android , termux , pad

电子书

本站提供服务

最近文章

  • AI Shell 让 AI 在命令行下提供 Shell 命令 AI Shell 是一款在命令行下的 AI 自动补全工具,当你想要实现一个功能,敲一大段命令又记不住的时候,使用自然语言让 AI 给你生成一个可执行的命令,然后确认之后执行。
  • 最棒的 Navidrome 音乐客户端 Sonixd(Feishin) Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。 Sonixd 是一款跨平台的音乐播放器,可以使用 [[Subsonic API]],兼容 Jellyfin,[[Navidrome]],Airsonic,Airsonic-Advanced,Gonic,Astiga 等等服务端。
  • 中心化加密货币交易所 Gate 注册以及认证 Gate.io 是一个中心化的加密货币交易所。Gate 中文通常被称为「芝麻开门」,Gate 创立于 2013 年,前身是比特儿,是一家致力于安全、稳定的数字货币交易所,支持超过 1600 种数字货币的交易,提供超过 2700 个交易对。
  • 不重启的情况下重新加载 rTorrent 配置文件 因为我在 Screen 下使用 rTorrent,最近经常调试修改 rtorrent.rc 配置文件,所以想要找一个方法可以在不重启 rTorrent 的情况重新加载配置文件,网上调查了一下之后发现原来挺简单的。
  • Go 语言编写的网络穿透工具 chisel chisel 是一个在 HTTP 协议上的 TCP/UDP 隧道,使用 Go 语言编写,10.9 K 星星。