用 Gatsby 写了一个券商推荐注册列表

放假在家,刚好刷 Twitter 的时候看到有人写了一个券商注册的页面,一个简单的列表,挂上了目前常用的美港股做新人推荐,顺便就看了一下源码,发现使用 [[Gatsby]] 和 [[TailwindCSS]] 写的,于是就抱着学习的态度,上手了一下 Gatsby,简单的了解了一下 Gatsby 也是一个静态网页生成器,用来 React 和 [[GraphQL]]。而 [[TailwindCSS]] 是一个 CSS 框架,通过简单的 class 就能实现不错的界面效果。

从了解一个新的技术,到上手的过程就不多说了,官网的新手教程非常详细。这里就想记录一下中间遇到的一些问题,以及解决的过程。以及结合之前看过的 [[费曼学习法]] 聊一聊学习的过程。

费曼学习法

首先先说一下什么叫做费曼学习法,如果用简单的话来说就是将复杂的知识简单化,用最通俗的语言去解释。

费曼学习法的具体内容很细致,但如果将学习划分几个步骤来的话,可以简化成这样几部:

  • 确定学习目标
  • 理解学习对象
  • 以输出代替输入
  • 回顾
  • 简化学习内容,再吸收

套用我了解学习 Gatsby 的过程,首先我的目标非常明确,就是制作一个简单的页面可以展示列表。

理解学习对象,在我看来就是通过查看其官网,文档,以及简单的 Wiki 了解 Gatsby 是什么,可以做什么。我这里要了解的内容有两部分,一个便是静态网站生成器 Gatsby,另一个是 CSS 框架 [[TailwindCSS]]。

静态网站生成器和 CSS 框架两个概念都不是很陌生,类似的技术也都非常多,当前的这个博客就是 Ruby 下的 Jekyll 生成的静态页面,而这个博客用的就是 Bootstrap CSS 框架。所以使用类比就能大致的对其有一定的了解。

第三步,用输出代替输入,这就是实践的部分。当然也是个人认为最重要的一步,再以前我往往就是忽视了这一步。所以直接根据官网的教程,先实现一遍新手任务,然后根据我的需要,先从官网初始化了一个最基本的项目,然后在本地跑起来,引入 Tailwind CSS,然后尝试对页面进行修改,先构建了一个基本的样式,将图中的一个样式实现,研究如何获取数据,如何实现循环。

最后定下的方案就是通过 YAML 文件 ,将页面中需要显示的内容配置在其中,因为 Gatsby 通过插件的方式可以非常方便的引入不同类型的数据源,所以看一下插件的介绍。在实践中花了最多时间的就是将图片动态的显示出来,直接使用 StaticImage 只能将固定的图片显示出来。所以继续阅读官网的文档。以 image 为关键字把所有搜出来的结果都看了,还是一头雾水,并且昨天状态也不太好就直接先睡了。今天起来从原理上简单的了解了一下 Gatsby 的插件,然后逐渐就有了一个思路。

在 Gatsby 中有三类插件:

  • 数据源插件,一般名字中会带 source,数据源插件负责从外部数据获取,然后将数据放在数据层中,方便应用通过 GraphQL 来获取使用
  • 数据转化插件, 名字中带 transformer,转换特定的格式,比如将 markdown 文件内容转换为对象
  • 功能插件,一般就叫做某某 plugin

我已经通过 gatsby-transformer-yaml 将 YAML 文件内容可以在界面中读取,剩下的就是将 YAML 配置中配置的文件路径在界面中展示出来,Gatsby 这一块做过一些 API 的调整,需要通过 GraphQL 查询出来之后再使用 GatsbyImage 来展示。

整个上面的过程完成之后就大致做了一个类似的列表页

回到费曼学习法的第四步,回顾,这一步也是正是我当前正在做的事情。

第五步,简化学到的内容,如果让我现在再去回忆我学到了什么,我脑海里首先会蹦出几个关键字,不是 Gatsby,也不是 [[TailwindCSS]],而是 React,GraphQL,基础的 CSS 长宽模型。我之前没有接触过 React,但是在使用的过程中大概的了解了其模块化的设计,并且界面和数据分离,通过 GraphQL 做数据绑定和交互整个这个过程就形成了 Gatsby 这个技术。而在使用 Tailwind CSS 的过程中最费我时间的就是调整页面中元素的位置。如果之前学习基础 CSS 的时候能够对 margin,padding 有更多的了解就好了。

什么是好的学习

在费曼学习法这本书中对学习的解释,让我对[[教育]]有了更加深刻的理解。上周末在吃饭的时候,朋友顺口聊起了什么是你认为的「好的教育」,在去探讨什么是「好的教育」之前,什么是学习,在过去的时间里,我常常认为记得比别人多,学的比人快就是好的学习。但学习,不是去比拼知识的储备,也不是去竞争学位的高低,而是思维方式的培养。学习不是为了记住什么,而是通过学习建立自己行之有效的思维方式,然后将知识应用到实际生活中去解决问题。那么回到我认为的「好的教育」,学习如果是主动发起的,那么往往会收获不错的结果。那么好的教育就是要让人激发出学习的兴趣。

在没有了解 Gatsby 之前我对静态网站的印象就停留在了 markdown 文件的渲染,但是我在了解的过程中发现 Gatsby 使用了一套不一样的实现思路,通过 GraphQL 的帮助,Gatsby 让 markdown 成为了其可以选择的一个数据源,只要做一层数据转换,那么其内容可以从任何的数据源中获取,比如从 WordPress 的数据库,从其他任何 CMS 的数据源。这样就使得 Gatsby 拥有了其他静态网站不一样的能力。

最后

代码在 https://github.com/einverne/broker 界面在 https://broker.einverne.info


2021-10-01 broker , invest , static-site , gatsby , react , graphql

推荐几个 Rime 插件

切换到 Rime 输入法也好多年了,陆陆续续积累了不少的配置和词库,不过最近看到有朋友在 GitHub 上 star 了一个 Rime 的配置,点进去了一下,让我眼前一亮的是 Rime 通过插件的方式实现了一些非常不错的特性,虽然之前也陆陆续续的配置过 lua 扩展,但是这次看到还能让 Rime 加载预先训练的统计语言模型,所以就再次激起了我的兴趣。

之前的几篇文章,如果感兴趣也可以去看看:

接下来就整理一下目前我用到的三个 Rime 插件。

librime-lua

librime-lua 是我发现的第一个插件,之前看到有人提的一个 Feature Request 说到,能不能通过输入 date 或 「rq」这样的短语自动在候选词中出现当前的日期,后来发现果然可以。librime-lua 就是用来实现这样的功能的。

librime-lua 通过 Lua 扩展了 Rime 的能力,使得用户可以编写一定的 Lua 脚本来更改 Rime 候选词的结果。最常见的使用方式,比如当输入 date 的时候,在候选词中直接显示出当前的日期。

插件地址:https://github.com/hchunhui/librime-lua

安装 librime-octagram 插件

librime-octagram 可以让 Rime 使用训练好的统计语言模型

插件地址: https://github.com/lotem/librime-octagram

安装过程也比较简单,把插件以及模型放到 Rime 的配置文件夹中,然后在输入法配置方案,比如小鹤双拼 double_pinyin_flypy.custom.yaml 中加入:

patch:
  __include: grammar:/hant

如果之前有别的 patch,直接加入 __include 那一行即可。然后重新部署 Rime 输入法。

可以通过如下的方式验证是否安装成功,直接一次性输入下面的句子:

  • 各個國家有各個國家的國歌
  • 充滿希望的跋涉比到達目的地更能給人樂趣

BlindingDark/rime-lua-select-character

这一个以词定字的插件是在这一次再学习的过程中发现的,在某些特定的时候,往往是通过组词去输入某个单字的,因为汉语中同音字还是很多的,如果只用拼音输入一个字的话可能会需要翻页很多次才能找到对的那个字,但是如果这个字出现在词语里面可能可以一次性命中,这个插件就是为了解决这个问题的。

以词定字插件可以让你在输入一个词组后,选取这个词组的开头或结尾的一个字直接上屏,比如想要打“嫉”这个字,可以先打“嫉妒”再按 [ 键选择第一个字,如果要输入词语的第二个字,可以在词语出现之后按下 ]

插件地址: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 来切换候选词了。更多的快捷键自定义可以查看这篇文章

总结

使用这些插件请保证:

  • 鼠须管在 0.12.0 及以上版本
  • Linux 需根据需要自行编译安装 librime
  • Windows 没有在用,管不了了

2021-09-30 rime , librime , librime-lua , input-method , squirrel , macos

Traefik 入门使用

Traefik 是什么

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 节点处理。

功能:

  • 持续的更新配置,无需重启 Traefik 即可更新配置
  • 自动的服务发现与负载均衡
  • 支持多样的负载均衡算法
  • 完美支持 docker 基于 label 配置
  • 借助 Let’s Encrypt 实现 HTTPS
  • Circuit breakers, retry
  • 通过网页界面查看路由
  • Websocket, HTTP/2, GRPC ready
  • metrics 的支持,支持对 prometheusk8s 集成
  • 提供监控指标(Rest, Prometheus, Datadog, Statsd, InfluxDB)
  • 访问日志(JSON, CLF)
  • 提供 Rest API
  • 单一的二进制文件(Go 编写),提供官方的 docker 镜像
  • Dashboard 界面

概念

在进一步学习 Traefik 之前有几个在 Traefik 中的概念需要提前了解一下。

  • Providers 是 Traefik 的服务提供方,可以是 orchestrators 也可以是容器引擎,cloud prividers 或者 key-values 存储。Traefik 需要依赖这些服务的 APIs 来自动发现服务和路由,然后动态的更新路由。
  • Entrypoints 监听传入的流量,接口请求的端口
  • Routers 分析请求,将请求连接到对应的服务
  • Services,将请求转发给应用(load balancing),配置如何将流量最终传入这些 Services
  • Middlewares ,中间件,用来修改请求或根据请求来做判断(authentication,rate limiting,headers),Middlewares 附加在路由上,在请求发送到服务之前(或者在服务响应发送到客户端之前)对请求进行调整

Traefik 是如何发现服务的?

Traefik 能够通过 cluster API 自动发现服务,在 Traefik 的配置中,被称为 provider。比如 provider 配置了 Docker,那么 Traefik 会自动根据 Docker 提供的 API 来获取发现服务,并自动根据配置更新路由策略。

在 Docker 环境下使用 docker-compose 安装使用

为了了解最基本的使用,最好的方法就是实践自己启动一下。

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

Configuration

[[traefik-configuration]] 有两种配置方式:

  • 完全动态的配置 (dynamic configuration)
  • 静态初始配置(static configuration)

自动重定向到 https

所有到 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

部署举例

  • [[Traefik 部署 n8n]]
  • [[Traefik 部署 miniflux]]

reference


2021-09-28 traefik , nginx , cloud-native

espanso:Rust 编写的跨平台开源文本扩展工具

今天在 review tldr 提交的新命令的时候发现了一个新的工具 espanso,查看其官网发现是一个文本扩展的工具。在之前 macOS 上短暂的体验过 [[Keyboard Maestro]] 但因为其是 macOS 独占,所以之后再回到 Ubuntu 下的时候就渐渐不用了,并且其授权还挺贵的。然后就一直使用 RIME 配置自定义的短语来作为短语的快捷输入,比如输入 date 的时候自动在候选词中添加日期。但这样的问题便在于每一次更改 RIME 的配置文件都需要经历 RIME 部署这样一个漫长的过程。并且可扩展性也不强。于是想来体验一下 espanso 。

Espanso 是一个使用 Rust 实现的跨屏平台的 Text Expander,可以在任何编辑器中扩展短语。可以完美代替 [[Keyboard Maestro]] 的 Text Expand 功能。

官网地址:

特性:

  • 扩展功能强,可以通过 package 扩展
  • 响应速度快,我下载体验后没有任何卡顿
  • 支持 form 和 regex
  • 文档完善
  • 完成度高
  • 定义光标位置
  • 支持剪贴板
  • 可以自动填充图像
  • 支持扩展外部脚本(任何语言)
  • 用于特定程序匹配

安装

在 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"

Configuration

espanso 基于文本的配置文件对软件的行为进行设定,在不同操作系统上的路径:

  • Linux: ~/.config/espanso
  • macOS: /Users/einverne/Library/Preferences/espanso
  • Windows: C:\Users\user\AppData\Roaming\espanso

可以通过 espanso path 来快速获知路径。

default.yml 文件是 espanso 的主要配置文件,使用 YAML 语法。

更加详细的配置文件可以参考官方文档

自定义光标位置

在 espanso 的配置 replace 中可以使用 $|$ 作为占位符,表示光标。

比如想要输入 :div 的时候自动展开成为 <div></div> 然后将光标停留到中间,就可以使用:

  - trigger: ":div"
    replace: "<div>$|$</div>"

Package

Espanso 更加强大的地方在与其扩展性,通过安装其他包可以将 espanso 的能力扩展。比如从 espanso hub 安装 Basic Emojis :

espanso install basic-emojis

然后重启服务:

espanso restart

然后输入 :ok 就可看到文本被替换成了 Emoji。

![[Pasted image 20211013182143.png]]

更多的 package 可以看 espansohub

快捷键

一些非常有用的快捷键。

Toggle Key

可以通过连续按两次 ALT(macOS 下为 Option) 按键来临时禁用 espanso。可以看到通知 Espanso disabled。 再按两次可以开启。可以通过配置文件修改 Toggle Key

Backspace Undo

有些时候可能无意识中触发了 expansion,但又不想要这个结果,那么可以按一下 BACKSPACE 撤销这一次修改。

同步配置文件

可以使用软链接的方式将配置文件放在同步文件夹,或 git 仓库中保存管理。

ln -s "/home/user/Dropbox/espanso" "/home/user/.config/espanso"

配置

reference

  • [[Rust 开源项目]]

2021-09-17 linux , macos , keyboard , text-expander

rTorrent 和 ruTorrent 中自动下载 RSS Feed

自从在 QNAP 上遇到 ruTorrent 之后就发现这是我用过的最好用的 BitTorrent 客户端了,rTorrent 结合 ruTorrent 界面

可以参考我的 docker-compose.yml 进行安装。然后照之前的文章 启用 MaterialDesign,界面就非常漂亮。

rutorrent-20210910210121.png

RSS

首先 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 中会自动添加该影片。

一般在界面中找这样的图标即可。

添加 RSS 链接到 ruTorrent

右击 ruTorrent 中的 Feeds 板块:

然后点击添加 RSS Feed,输入框中填入 Feed URL,以及 Custom Alias。

![[rutorrent-add-rss-feed-20210910211430.png]]

那新添加的 Feed 会自动出现在 Feeds 板块。在 Feed 板块中可以点击查看到 Feed 中的内容。但是这个时候 Feed 中的内容不会自动下载。如果需要配置自动下载需要使用下面的 RSS Manager(或者也被称为 Download Manager)。

配置 RSS Manager

然后右击 Feeds,打开 RSS Manager

这个界面中有一些内容需要配置,可以新建一个 Filter,点击左边的 ADD

右边的配置分别是:

  • Filter, 过滤器,可以使用正则表达式来过滤 Feed 中需要下载的内容,使用 /^/ 就表示下载所有。
  • Exclude,排除,包含那些关键字的内容不会下载,也可以使用正则。
  • Check title field,上面配置的正则表达式,是否检查标题
  • Check description field,检查描述
  • Check link field,检查链接
  • RSS,选项选择刚刚添加的 RSS URL
  • Directory,下载目录
  • Label,自动添加设置的 Label
  • Min interval,最小间隔
  • RatioGroup, 分享率设置
  • Channel,通道

点击保存,过一会儿就能看到 RSS 中的种子自动开始下载了。

不过这里需要特别注意,千万不要把一个全站的 RSS Feed 添加到自动下载,并配置下载全部,除非你知道这样做的意义。

另外如果要更加详细的设置 RSS 的刷新频率,则需要修改 rTorrent 的配置,如果有需要再更新吧。

另外如果使用的是类似于 Transmission 这样的客户端,并没有自带 RSS 管理,那也可以使用 Flexget 来间接实现 RSS 自动下载。配合 crontab,也可以实现相同的效果。


2021-09-10 rtorrent , rutorrent , linux , docker , rss , feed , private-tracker , torrent , bt

Docker Compose 中使用环境变量

通常在使用 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 中的内容。

Docker 使用环境变量

配置可以包含 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 选项

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 设置
  • Shell 中指定的环境变量
  • 环境文件 .env
  • Dockerfile
  • Variable is not defined

也就是说 compose 文件中定义的 environment 优先级是最高的。

reference


2021-08-29 docker , dockerfile , environment-variable , shell , linux

哪吒监控安装及简单使用说明

哪吒监控是一个使用 Go 和 Vue 实现的服务器监控探针,UI 简洁,可以自定义 CSS,一行命令就可以将新的服务器添加到监控面板。之前一直使用 nodequery,这个服务由于作者已经不再更新所以网站已经无法登录。

在没有遇到哪吒监控之前一直都是使用的 Netdata cloud 来监控 VPS,虽然 Natdata 非常强大,数据非常详细,后台界面也非常有设计感,还带邮件告警通知,但是 Netdata Cloud 后台访问速度实在有点慢,并且我没有找到办法在一个界面查看所有的网络状态。所以用哪吒监控相互弥补一下。

GitHub 地址:https://github.com/naiba/nezha

哪吒监控特性:

  • 支持 HTTP,TCP,Ping 监控报警
  • 监控报警:CPU、内存、硬盘、带宽、实时流量
  • 服务监控:HTTP,SSL 证书,Ping,TCP 端口
  • 自定义布局,LOGO,颜色,统计代码
  • 定时任务:备份、服务重启,定期运维

部署哪吒探针 Dashboard

可以使用官方提供的一键脚本,但我害怕这个脚本设定的环境对我不透明,所以我选择把里面的内容提取成 docker-compose 的配置,可以在这里 查看。

修改一下配置,直接 docker-compose up -d 即可。

部署 Agent 客户端

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 监控存在的问题

因为存储历史的数据可能会占用非常多的磁盘,所以 Nezha 监控目前只能显示这个时刻各个机器的资源占用,而不能查看单台机器历史资源的使用情况。

reference


2021-08-28 uptime , vps , monitor , open-source , go , grpc

使用 Archive Box 制作自己的互联网存档

在很多年前,我经常听到一句话—-互联网是有记忆的—-当然这么多年过去了,见过了无数的网站关停,也见到了中文互联网上无处不在的删贴,而常常上一秒才看过的内容之后便再也找不到。我的 WizNote 笔记中曾经摘录的豆瓣书评、影评,当我想再去看一下作者的状态的时候,大多评论已经找不到了。有的时候拿着网页 URL,还能从 Internet Archive 找到有幸被保存下来的珍贵文字,但那些还没有被爬虫,或Google索引的文章就这样从互联网上消失了。而这些被删除的内容里面有一些内容却值得被记住,那些发人深省的话值得被再一次阅读。

而这两天正好买了hosthatch 2核8G的VPS,在调查可以部署哪些服务的时候看到了 Archive Box。这是一个可供个人搭建的互联网存档,它可以用来记录网页链接、媒体资源等等,只需要提供一个链接便可以得到截图,PDF,影评,视频等等内容。完全可以还原当时的网页情况。

Docker install

Archive Box 使用 Python 编写,所以可以直接用 pip 安装,不过个人还是推荐用官方提供的镜像 Docker 安装。

使用 Docker compose 来安装,可以参考我的配置 或直接参考官方的文档

添加存档

在网页中添加

Archive Box 在启动之后会提供一个 HTTP 服务,我配置了一个域名 https://box.einverne.info 在界面上使用 + 号即可添加。

在手机上快速添加网址

虽然官方已经提供了非常多的添加方式,包括命令行,网页,桌面版,甚至 Python API,但是目前 RESTful 的接口暂时还是 alpha 阶段,所以在手机上目前也只能用网页版来保存。

如果有发现更好的方法欢迎告知。

查看存档

我使用 Docker 安装,将其数据映射到了 ${DATA_PATH} 目录中,然后使用 Syncthing 同步了,这样在这个目录中直接访问 index.html 即可在本地打开备份的网页。

延伸阅读

  • Hunchly,这是一款可以自动记录访问过的所有网页的工具,非常强大但是需要付费。

2021-08-27 archive , web-archive , archive-box , docker , linux , notes

使用 Poste 自行搭建邮件服务器

自建邮件服务器一直是我想做的事情,之前因为写了一个发送电子书到 Kindle 的 kindlepush bot ,要用到邮件服务器,当时为了不折腾,调研了 一番 就直接用了 [[Mailgun]],每个月 10000 封的邮件也足够了,但是云服务提供商就是那样不好,说改就改,直接把免费的发送额度取消了,虽然到现在为止量不大的情况下还可以继续用,但一旦量超就会发不出去,所以早之前想要 自己 通过 [[Postfix]] 和 [[Dovecot]] 来搭建一个[[邮件服务器]],但后来发现安装和维护成本太高了,所以就搁置了,但一直都想尝试搭建一个自己的邮件服务器,一来可以通过自己的域名邮箱发送邮件,而来也不会受到发送邮件数量的限制。一直在观察可用的可以 自行搭建的邮件服务器 ,发现了 [[Poste]]。

Poste 是一个用 Go 语言实现的可以自行搭建的[[邮件服务器]]程序,提供了后台管理,可以实现邮件收发,容量控制,邮件过滤等等工具。还提供了统计分析,SSL,邮件转发,邮件别名,通过 ClamAV 支持邮件病毒扫描等等功能。

Poste 使用 [[Haraka]] + [[Dovecot]] + [[SQLite]] 的组合实现。Haraka 是一个高性能的 [[SMTP]] 服务器,Dovecot 是一个开源的 IMAP 和 POP3 服务器,SQLite 是一个单文件的高性能关系型数据库。

Poste 运行大概需要 800MB 左右空间,只支持 64 位操作系统。 Poste 可以支持 Docker 安装,但是提供了 Free、Pro 和 Pro+ 版本,都需要按年订阅。

Poste 支持以下特性。

  • SPF、DKIM、DMARC、SRS 的原生实现,带有简单的向导
  • 用于检测木马、病毒、恶意软件的防病毒引擎 ( ClamAV )
  • 内置垃圾邮件过滤器( RSPAMD )
  • HTTPS 上的 Webmail 客户端(Roundcube)
  • 通过 Sieve 脚本进行电子邮件重定向、自动回复和其他过滤(电子邮件所有者管理,每个操作都可以编写脚本)
  • 用于限制邮箱空间或电子邮件数量的配额
  • 系统管理员、域管理员、电子邮件所有者具有不同权限的 Web 管理。
  • 内置 Microsoft 产品的自动发现功能,Thunderbird…
  • 帮助正确设置域和邮件服务器的诊断
  • SMTP - 端口 25、465 (TLS)、587
  • POP3 - 端口 110、995 (TLS)
  • IMAP - 端口 143、993 (TLS)
  • SSL TLS 无处不在,没有个人数据、电子邮件、登录信息通过互联网未加密。
  • 默认情况下,所有密码都存储为加盐 SHA512 哈希(5000 轮)。攻击者将很难破解您的密码。
  • 整个邮件服务器容器由 Docker 与其他应用程序隔离。

Prerequisite

准备工作:

  • 一台拥有独立 IP 的 VPS,IP 地址最好能够通过 Poste 提供的黑名单检测
    • 内存建议在 2G 以上
    • IP 没有被拉入黑名单,可以通过 链接1链接2 来查看
    • 25 端口开放,可以通过 telnet smtp.aol.com 25 命令来查看,如果能连接上并返回一些值表示 25 端口是可用的
  • VPS 服务提供商需要支持添加 rDNS,需要通过 IP 解析到邮件域名
  • 一个可以管理 DNS 的域名
  • Docker

DNS 解析配置

检查所有 Poste 需要的 DNS 配置。

以域名 domain.com 和 IP 1.1.1.1 为例,修改 domain.com 的 DNS 记录

类型 名称 内容 TTL
A mx 1.1.1.1 Auto
CNAME mail mx.domain.com Auto
CNAME smtp mx.domain.com Auto
CNAME pop mx.domain.com Auto
CNAME imap mx.domain.com Auto
MX @ mx.domain.com 优先级 10
TXT @ v=spf1 mx ~all Auto
TXT _dmarc.domain.com v=DMARC1; p=none; pct=100; rua=mailto: admin@DOMAIN.com; ruf=mailto: admin@DOMAIN.com Auto
TXT s20220321670._domainkey 安装完成后设置 AUTO

完成上面的配置之后可以通过 Poste 提供的检测服务检测:

其中涉及的知识可以通过维基百科搜寻 [[SPF]]、[[DMARC]]、[[DKIM]],或者参考这篇电子邮件是如何工作的

添加 SPF/DKIM/PTR 解析,可提高邮件可信度,从而降低邮件进入垃圾箱的几率。

DMARC 记录不是必须的,但是配置上会对于邮件送达有帮助。

设置 PTR 反向解析

PTR 全称 Pointer Record,是电子邮件系统中的一种数据类型,RFC 1035 定义。A 记录解析域名到 IP 地址,PTR 记录解析 IP 地址到域名。PTR 在 VPS 后台通常被称为 [[reverse DNS]],反向域名解析。

PTR 记录,是电子邮件系统中的邮件交换记录的一种;另一种邮件交换记录是 A 记录(在 IPv4 协议中)或 AAAA 记录(在 IPv6 协议中)。PTR 记录常被用于反向地址解析。

域名解析到 IP 被称为正向解析,而 IP 指向到域名,则被称为反向解析,反向解析需要在主机服务商处进行操作,具体请咨询主机服务商。

一般的 VPS 都可以直接在后台面板添加 PTR 反向解析,如果遇到问题可以直接开 ticket 咨询,配置将 IP 指向到邮件服务器域名,如 mail.your-domain.com

安装

使用 docker 命令:

docker run -d \
    -p 880:80 -p 8443:443 -p 25:25 -p 110:110 -p 143:143 -p 465:465 -p 587:587 -p 993:993 -p 995:995 -p 4190:4190 \
    -e TZ=Asia/Shanghai \
    -v /data/mail-data:/data \
    --name "mailserver" \
    -h "mail.your-domain.com" \
    --restart=always \
    -t analogic/poste.io

或者使用 docker-compose:

version: '3'
services:
  poste:
    image: analogic/poste.io
    hostname: mail.domain.com
    container_name: poste
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - ./data:/data
      - ./nginx/log:/var/log/nginx/
    restart: always
    ports:
      - "25:25"
      - "80:80"
      - "110:110"
      - "143:143"
      - "443:443"
      - "465:465"
      - "587:587"
      - "993:993"
      - "995:995"
      - "4190:4190"
    environment:
      - DISABLE_CLAMAV=TRUE
      - HTTPS=OFF

官方文档在此: https://poste.io/doc/getting-started

如果你使用 [[traefik]] 来做反向代理,可以使用我的配置

端口解释:

  • 25,SMTP server for incoming emails
  • 110, POP3 server (STARTTLS required)
  • 143, IMAP server (STARTTLS required)
  • 443,Administration and webmail HTTPS server
  • 587, Submission server(STARTTLS SMTP server for clients)
  • 993, IMAP server(implicit TLS)
  • 995, POP3 server(implicit TLS)
  • 4190,Sieve server(optional)

设置 DNS 说明:

  • 设置 A 记录,mail.domain.com 指向服务器 IP
  • 设置 CNAME,将 smtp.domain.com, pop.domain.com, imap.domain.com 指向 mail.domain.com
  • 配置 MX 记录,指向 mail.domain.com
  • 配置 TXT 记录,v=spf1 mx ~all

等待一会儿 Poste 启动之后 docker-compose logs -f 查看日志。然后访问域名 mail.domain.com,可以看到初始化配置:

  • Mailserver hostname
  • Administrator email
  • Password

提交成功之后就可以进入 Poste 的管理后台。

设置 TLS SSL

在侧边栏 System settings 中可以申请 Let’s Encrypt 证书。

假如您的邮件域名为 mail.domain.com,需要对这个域名申请 SSL 证书,在其它服务商申请 SSL 证书。

获得 SSL 证书后,打开 poste 后台 - System settings - TLS Certificate - 选择证书文件进行上传。

SSL 提供商会自动将中级证书合并到了证书文件(比如腾讯云),因此中级证书那个选项可以和证书一致,然后点保存,保存后需要重启容器生效:docker restart mailserver

配置 DKIM

在 Virtual Domains 中点击域名获取 DKIM Key。然后将值配置到 DNS 解析。

登录与管理

启用 SSL 后,可通过域名进行访问:https://mail.domain.com/,默认是登录 webmail,可以在 webmail 发信、收信等操作。

如果需要登录系统管理,可将地址修改为 https://mail.your-domain.com/admin/login

注意这里默认安装的时候已经可以直接访问 https,如果你使用 Nginx ,或 [[traefik]] 等等方向代理,需要自行配置证书。

客户端

配置邮件客户端访问。

SMTP 25,465,587 smtp.domain.com.com IMAP 993,143 imap.domain.com.com POP 995,110 pop.domain.com.com

邮件客户端可以根据上面的配置添加账号。

邮件发送测试

个人建议

在准备自建邮件服务之前,有一些注意事项需要知晓,以下是一些个人经验总结:

  • 使用可信度、流行度较高的域名后缀,如 .com/.net/.org,尽量避免使用不常用的后缀
  • 使用英文字母的域名,尽量避免使用纯数字域名
  • 域名注册时间越长越好,最低注册时间建议大于 7 天
  • 使用一个干净的 IP,可通过 https://poste.io/dnsbl 查询
  • 找一个支持配置 PTR(rDNS)的主机托管商,VPS 后台配置 PTR 反向解析

进阶

在 Poste.io 的基础上扩展了一些功能 dirtsimple/poste.io:

相关自建方案

  • [[Mailu]]

2021-08-26 poste , linux , email , smtp , pop , email-host , email-server , mail-server

HostHatch VPS 测评及使用

两个礼拜前买过一个月 A400 互联 的 VPS,但是因为其提供商不是非常靠谱,所以尽管在使用,但还只是用作流量转发,并没有把重要的数据放在上面。这两天在 LowEndTalk 上正好看到 HostHatch 扩展新加坡业务,发布新机器 2核4G 1T流量的机器只需要 35$ 一年,而且两年付还可以得到两倍的内存,空间和流量,所以就立即下了一单。

2 CPU cores (50% dedicated, burstable up to 200%)
4 GB RAM
20 GB NVMe SSD
1 TB bandwidth
$35 per year
Pay for two years - get doubled RAM, storage, and bandwidth

中间还发生了一点小小问题,因为付款的 Paypal 很久没有使用,付款之后 HostHatch 没有处理,开了 Ticket 之后回复说因为 Paypal on-hold 了这笔订单需要等待 24 小时,等 Paypal 处理之后 HostHatch 才会开始处理。所以等待的期间我又用信用卡下了一单,然后过了一天,我突然发现账号下面有两台机器。不过也好,两台机器做个主备。

机器性能

bench 的结果:

----------------------------------------------------------------------
 CPU Model             : Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz
 CPU Cores             : 2
 CPU Frequency         : 3000.000 MHz
 CPU Cache             : 16384 KB
 Total Disk            : 39.0 GB (18.0 GB Used)
 Total Mem             : 7976 MB (2120 MB Used)
 Total Swap            : 1023 MB (5 MB Used)
 System uptime         : 24 days, 17 hour 59 min
 Load average          : 0.21, 0.12, 0.10
 OS                    : Ubuntu 18.04.5 LTS
 Arch                  : x86_64 (64 Bit)
 Kernel                : 4.15.0-20-generic
 TCP CC                : cubic
 Virtualization        : Dedicated
 Organization          : AS63473 HostHatch, LLC
 Location              : Singapore / SG
 Region                : Singapore
----------------------------------------------------------------------
 I/O Speed(1st run)    : 495 MB/s
 I/O Speed(2nd run)    : 731 MB/s
 I/O Speed(3rd run)    : 715 MB/s
 Average I/O speed     : 647.0 MB/s
----------------------------------------------------------------------
 Node Name        Upload Speed      Download Speed      Latency     
 Speedtest.net    3295.69 Mbps      2583.03 Mbps        0.65 ms     
 Shanghai   CU    219.87 Mbps       629.33 Mbps         214.01 ms   
 Guangzhou  CT    18.45 Mbps        113.17 Mbps         229.08 ms   
 Guangzhou  CU    424.10 Mbps       587.32 Mbps         203.09 ms   
 Hongkong   CN    2560.67 Mbps      1094.98 Mbps        33.92 ms    
 Tokyo      JP    294.63 Mbps       614.84 Mbps         74.30 ms    
----------------------------------------------------------------------

YABS 的结果:

# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #
#              Yet-Another-Bench-Script              #
#                     v2021-06-05                    #
# https://github.com/masonr/yet-another-bench-script #
# ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## ## #

Wed Aug 25 00:46:05 BST 2021

Basic System Information:
---------------------------------
Processor  : Intel(R) Xeon(R) CPU E5-2690 v2 @ 3.00GHz
CPU cores  : 2 @ 2999.998 MHz
AES-NI     : ✔ Enabled
VM-x/AMD-V : ❌ Disabled
RAM        : 3.9 GiB
Swap       : 1024.0 MiB
Disk       : 18.7 GiB

fio Disk Speed Tests (Mixed R/W 50/50):
---------------------------------
Block Size | 4k            (IOPS) | 64k           (IOPS)
  ------   | ---            ----  | ----           ----
Read       | 237.97 MB/s  (59.4k) | 1.78 GB/s    (27.9k)
Write      | 238.59 MB/s  (59.6k) | 1.79 GB/s    (28.0k)
Total      | 476.57 MB/s (119.1k) | 3.58 GB/s    (55.9k)
           |                      |
Block Size | 512k          (IOPS) | 1m            (IOPS)
  ------   | ---            ----  | ----           ----
Read       | 2.85 GB/s     (5.5k) | 2.87 GB/s     (2.8k)
Write      | 3.00 GB/s     (5.8k) | 3.07 GB/s     (2.9k)
Total      | 5.85 GB/s    (11.4k) | 5.94 GB/s     (5.8k)

iperf3 Network Speed Tests (IPv4):
---------------------------------
Provider        | Location (Link)           | Send Speed      | Recv Speed
                |                           |                 |
Clouvider       | London, UK (10G)          | 1.11 Gbits/sec  | 412 Mbits/sec
Online.net      | Paris, FR (10G)           | 1.37 Gbits/sec  | 993 Mbits/sec
WorldStream     | The Netherlands (10G)     | 788 Mbits/sec   | 638 Mbits/sec
Biznet          | Jakarta, Indonesia (1G)   | 3.41 Gbits/sec  | 2.55 Gbits/sec
Clouvider       | NYC, NY, US (10G)         | 628 Mbits/sec   | 562 Mbits/sec
Velocity Online | Tallahassee, FL, US (10G) | 476 Mbits/sec   | 238 Mbits/sec
Clouvider       | Los Angeles, CA, US (10G) | 930 Mbits/sec   | 908 Mbits/sec
Iveloz Telecom  | Sao Paulo, BR (2G)        | busy            | 348 Mbits/sec

Geekbench 5 Benchmark Test:
---------------------------------
Test            | Value
                |
Single Core     | 593
Multi Core      | 1191
Full Test       | https://browser.geekbench.com/v5/cpu/9485985

使用

数据库

因为看 LET 上对 HostHatch 的评价还好,并且这是一家长期做生意的提供商,所以我就陆陆续续把其他平台上的 MySQL 数据迁移过来了,并且正好两台机器配置了一下Master Master Replication

应用

和之前在 A400 的机器一样,用 Docker 来管理各个服务。基本上也是同步一下数据,更改一下配置就可以起来。

❯ docker ps -a
CONTAINER ID   IMAGE                                    COMMAND                  CREATED        STATUS                    PORTS                                                                      NAMES
5c9f15d2f6fd   cflask_simple_worker                     "/bin/sh -c 'celery …"   4 days ago     Up 6 hours                                                                                           cflask_simple_worker_1
b9d05a0aab65   cflask-production                        "/bin/bash shell_scr…"   4 days ago     Up 6 hours                0.0.0.0:5000->5000/tcp, :::5000->5000/tcp                                  cflask_flask-prod_1
fe5babd77ff8   technosoft2000/calibre-web               "/bin/bash -c /init/…"   2 weeks ago    Up 2 days                 8083/tcp                                                                   calibre-web
27bb97742691   funkwhale/all-in-one:1.1.4               "/init"                  2 weeks ago    Up 2 days                 80/tcp                                                                     funkwhale
9f167b8f1a27   umputun/remark42:latest                  "/init.sh /srv/remar…"   2 weeks ago    Up 2 days (healthy)       8080/tcp                                                                   remark42
966776d9c62c   luminoleon/epicgames-claimer             "python3 -u main.py …"   2 weeks ago    Up 2 days                                                                                            epic
11f2ab0251a3   gogs/gogs:0.12.3                         "/app/gogs/docker/st…"   4 weeks ago    Up 2 days                 3000/tcp, 0.0.0.0:10022->22/tcp, :::10022->22/tcp                          gogs
2490f033f39d   wordpress:latest                         "docker-entrypoint.s…"   4 weeks ago    Up 2 days                 80/tcp                                                                     wordpress_blog
8f11b6177487   kmb32123/youtube-dl-server:latest        "python -u ./youtube…"   4 weeks ago    Up 2 days                 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp                                  youtube-dl-server_youtube-dl-server_1
ed9cc80eac6a   ghcr.io/naiba/nezha-dashboard            "/dashboard/app"         4 weeks ago    Up 2 days                 80/tcp, 0.0.0.0:5555->5555/tcp, :::5555->5555/tcp                          nezha_dashboard_1
6654066f6c09   wallabag/wallabag                        "/entrypoint.sh wall…"   4 weeks ago    Up 2 days (healthy)       80/tcp                                                                     wallabag
406190504fd3   phpmyadmin/phpmyadmin                    "/docker-entrypoint.…"   4 weeks ago    Up 2 days                 80/tcp                                                                     phpmyadmin_phpmyadmin_1
8c902e165528   chevereto:latest                         "docker-php-entrypoi…"   7 weeks ago    Up 2 days                 80/tcp                                                                     chevereto
fcca09be33e6   redis:4-alpine                           "docker-entrypoint.s…"   7 weeks ago    Up 2 days                 0.0.0.0:6379->6379/tcp, :::6379->6379/tcp                                  redis
b7c7844143ed   fengkx/postgres:13-alpine                "docker-entrypoint.s…"   2 months ago   Up 2 days (healthy)       0.0.0.0:5432->5432/tcp, :::5432->5432/tcp                                  postgres
129bede6f06c   linuxserver/bookstack                    "/init"                  2 months ago   Up 2 days                 80/tcp, 443/tcp                                                            bookstack
6901eecc15c8   diygod/rsshub                            "dumb-init -- npm ru…"   2 months ago   Up 2 days                 1200/tcp                                                                   rsshub_rsshub_1
9229265c93de   yourls                                   "docker-entrypoint.s…"   2 months ago   Up 2 days                 80/tcp                                                                     yourls
4f935d65a3fc   hurlenko/filebrowser                     "/filebrowser --root…"   2 months ago   Up 2 days                 8080/tcp                                                                   filebrowser
8ab377d558e3   wordpress:latest                         "docker-entrypoint.s…"   2 months ago   Up 2 days                 80/tcp                                                                     wordpress
4fa2aad47f10   miniflux/miniflux:latest                 "/usr/bin/miniflux"      3 months ago   Up 2 days                 8080/tcp                                                                   miniflux
47b8ad4f0d41   netdata/netdata                          "/usr/sbin/run.sh"       3 months ago   Up 2 days (healthy)       0.0.0.0:19999->19999/tcp, :::19999->19999/tcp                              netdata
87f802cee469   f6f2296798e9                             "docker-entrypoint.s…"   3 months ago   Up 2 days                 6379/tcp                                                                   rsshub_redis_1
37898721ec5b   browserless/chrome:1.43-chrome-stable    "./start.sh"             3 months ago   Up 2 days                 3000/tcp                                                                   rsshub_browserless_1
79e7d9774b63   b4bz/homer                               "/bin/sh /entrypoint…"   3 months ago   Up 2 days                 8080/tcp                                                                   homer
f505c56e7a24   jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   3 months ago   Up 2 days                                                                                            letsencrypt-nginx
97486b8aa958   jwilder/nginx-proxy                      "/app/docker-entrypo…"   3 months ago   Up 2 days                 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp   nginx-proxy

可以看到即使跑了这么多应用,内存连一半都没有用完。CPU 也不过刚刚 1/4,性能还是挺满意的。

hosthatch monitor

日常可以注册一下 HostHatch,通常会在论坛或者邮件中通知有优惠。

reference

  • [[HostHatch]]

2021-08-24 vps , linux , hosthatch , management , ubuntu

电子书

最近文章

  • 逃离豆瓣之豆瓣代替服务 这篇笔记新建的时间是 2020 年 12 月 29 号,想来从那个时间点开始我就一直想着怎么离开豆瓣了。过去一年时间里面陆陆续续也发现了不少不错的网站,甚至有一些比豆瓣都要好用。这里就再整理一下。
  • Proxmox 扩展 VM 虚拟机磁盘容量 之前在 Proxmox 上给 Ubuntu 划分了 64GB 的空间,运行一段时间之后磁盘空间剩余不多,就抽时间扩展一下。本文就记录一下给 Proxmox VE 的虚拟机扩展的过程。其实之前的文章里面也略微提到过一些,但是没有完整记录。
  • 使用 lux 下载哔哩哔哩视频 Lux 是一个使用 Go 语言编写的视频下载命令行工具,支持的平台很多,提供了包括 macOS、Windows、Linux 等等平台的命令行支持,安装和使用非常简单的。Lux 原来的名字是叫做 Annie(安妮),对标的是 macOS 上一款非常著名的视频下载软件叫做 Downie(唐尼)。但后来改名成了 Lux。
  • 图片压缩工具 Squoosh 离线版 Squoosh 是 Google 推出的一个图片压缩工具。之前整理macOS 初始化设置 的时候就说过,基本上算是必不可少的一个压缩工具了。
  • 每天学习一个命令:umask 命令简单介绍 在使用 LinuxServer 的 Docker 镜像的时候经常会需要设置 umask 值,这个值的具体作用一直不太清楚,正好整理一下。