通常在使用 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
即可在本地打开备份的网页。
自建邮件服务器一直是我想做的事情,之前因为写了一个发送电子书到 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 支持以下特性:
准备工作:
检查所有 Poste 需要的 DNS 配置。
以域名 domain.com
和 IP 1.1.1.1
为例,修改 domain.com 的 DNS 记录
类型 | 名称 | 内容 | TTL |
---|---|---|---|
A | mx | 1.1.1.1 | Auto |
CNAME | 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 全称 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]] 来做反向代理,可以使用我的配置。
端口解释:
设置 DNS 说明:
mail.domain.com
指向服务器 IPsmtp.domain.com
, pop.domain.com
, imap.domain.com
指向 mail.domain.com
mail.domain.com
v=spf1 mx ~all
等待一会儿 Poste 启动之后 docker-compose logs -f
查看日志。然后访问域名 mail.domain.com
,可以看到初始化配置:
提交成功之后就可以进入 Poste 的管理后台。
在侧边栏 System settings 中可以申请 Let’s Encrypt 证书。
假如您的邮件域名为 mail.domain.com
,需要对这个域名申请 SSL 证书,在其它服务商申请 SSL 证书。
获得 SSL 证书后,打开 poste 后台 - System settings - TLS Certificate - 选择证书文件进行上传。
SSL 提供商会自动将中级证书合并到了证书文件(比如腾讯云),因此中级证书那个选项可以和证书一致,然后点保存,保存后需要重启容器生效:docker restart mailserver
在 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
,尽量避免使用不常用的后缀在 Poste.io 的基础上扩展了一些功能 dirtsimple/poste.io
:
Homer 是一款简单漂亮的静态个人导航站,通过简单的 YAML 配置就可以快速生成一个个人导航站。
特性:
/
搜索,Escape
退出搜索,Enter
打开第一个匹配,Alt/Option + Enter
在新标签页打开Docker 命令:
docker run -d \
--name homer \
-p 8080:8080 \
-v </your/local/assets/>:/www/assets \
--restart=always \
b4bz/homer:latest
docker-compose 配置见 GitHub
Homer 通过 YAML 配置:
---
title: "Homelab Dash"
subtitle: "always-on"
documentTitle: "Homelab Dash"
logo: "logo.png"
columns: 3
header: true
footer: false
connectivityCheck: false
theme: default
colors:
light:
highlight-primary: "#3367d6"
highlight-secondary: "#4285f4"
highlight-hover: "#5a95f5"
background: "#f5f5f5"
card-background: "#ffffff"
text: "#363636"
text-header: "#ffffff"
text-title: "#303030"
text-subtitle: "#424242"
card-shadow: rgba(0, 0, 0, 0.1)
link-hover: "#363636"
dark:
highlight-primary: "#1B3E88"
highlight-secondary: "#1b4d9e"
highlight-hover: "#2b579e"
background: "#121212"
card-background: "#1D1D1D"
text: "#eaeaea"
text-header: "#f7f7f7"
text-title: "#fafafa"
text-subtitle: "#f5f5f5"
card-shadow: rgba(0, 0, 0, 0.4)
link-hover: "#ffdd57"
links:
- icon: "far fa-edit"
url: "http://files.svr2:9800/files/homer/config.yml"
- icon: "fab fa-docker"
url: "http://files.server:9800/files/compose.yml"
- name: 2
icon: "fab fa-docker"
url: "http://files.svr2:9800/files/compose.yml"
#- icon: "fas fa-file-download"
# url: "http://torrent.svr2/"
- icon: "fas fa-fire"
url: "http://prometheus.server" # Prometheus
- icon: "fas fa-wifi"
url: "http://routerlogin.net"
- icon: "fas fa-satellite-dish"
url: "http://satellite.lan"
- icon: "fas fa-cloud-download-alt"
url: "http://qbt-oc1.svr2/" # qBittorrent (oracle1)
- icon: "fas fa-project-diagram"
url: "http://oracle1:81/" # Nginx proxy manager
# - icon: "fas fa-shield-alt"
# url: "http://oracle1:3000" # AdGuard Home
# - icon: "fas fa-traffic-light"
# url: "http://oracle1:90/" # Traefik
- icon: "fas fa-play-circle"
url: "http://oracle1:31337/" # Kitana
# - name: "Page 2"
# icon: "fas fa-columns"
# url: "#additionnal-page"
services:
- name: "Media"
icon: "fas fa-film"
items:
- name: Radarr
subtitle: "Movie collection manager"
url: "http://radarr.server/"
logo: "assets/homer-icons/png/radarr.png"
- name: Radarr4K
subtitle: "Manage 4K movies"
url: "http://radarr4k.server/"
logo: "assets/img2/4k-film-2.svg"
tag: oc1
- name: Sonarr
subtitle: "TV shows automator"
url: "http://sonarr.server/"
logo: "assets/homer-icons/svg/sonarr.svg"
- name: Overseerr
subtitle: "Media discovery tool"
url: "http://overseerr.server/"
logo: "assets/homer-icons/svg/overseerr.svg"
tag: oc1
- name: Flood
subtitle: "Beautiful torrent GUI"
url: "http://flood-torrent.server/"
logo: "assets/homer-icons/png/flood.png"
# - name: Petio
# subtitle: "Plex companion"
# url: "http://petio.svr2/"
# logo: "https://raw.githubusercontent.com/petio-team/petio/master/frontend/public/favicon/android-icon-192x192.png"
# tag: oc1
- name: Tautulli
subtitle: "Plex graps & stats"
url: "http://tautulli.server/"
logo: "assets/homer-icons/png/tautulli.png"
- name: Hosted
icon: "fas fa-rocket"
items:
- name: Speedtest tracker
subtitle: "Automated speed tests"
url: "http://speedtest.svr2/"
logo: "assets/custom/speedtest-tracker.png"
- name: Code-server
subtitle: "Browser-based editor"
url: "http://code.server/"
logo: "assets/custom/code-server.png"
- name: Mealie
subtitle: "Pantry for recipes"
url: "http://mealie.server/"
# logo: "assets/homer-icons/png/mealie.png"
logo: "assets/custom/food-2.png"
- name: Nextcloud
subtitle: "Cloud-hosted file storage"
url: "https://agneev.duckdns.org/"
logo: "assets/homer-icons/png/nextcloud.png"
tag: oc1
- name: Home Assistant
subtitle: "Next-gen smart home"
url: "http://assistant.server:8123/"
logo: "assets/custom/home-assistant.png"
- name: Homebridge
subtitle: "HomeKit all things"
url: "http://homebridge.svr2/"
logo: "assets/homer-icons/png/homebridge.png"
- name: Manage
icon: "fas fa-user-shield"
items:
- name: AdGuard Home
subtitle: "Network ad-blocker"
url: "http://adguard.svr2/"
logo: "assets/homer-icons/svg/adguardhome.svg"
- name: Portainer
subtitle: "Advanced Docker GUI"
url: "http://portainer.svr2/"
logo: "assets/homer-icons/png/portainer.png"
- name: Grafana
subtitle: "Visualized stats"
url: "http://grafana.server/"
logo: "assets/homer-icons/png/grafana.png"
- name: Chronograf
subtitle: "Metrics visualizations"
url: "http://chronograf.server"
logo: "assets/homer-icons/png/chronograf.png"
# - name: Smokeping
# subtitle: "Graph network latency"
# url: "http://smokeping.svr2/smokeping/?target=DNSPing"
# logo: "assets/custom/monitor.png"
- name: Router
subtitle: "Stats from router Netdata"
url: "http://routerlogin.net:19999#menu_net_submenu_brwan;theme=slate"
logo: "assets/homer-icons/png/netdata.png"
- name: Nginx manager
subtitle: "Main network proxy"
url: "http://npm.svr2/nginx/proxy"
logo: "assets/homer-icons/png/nginxproxymanager.png"
# - name: Pi-hole
# subtitle: "DNS blackhole"
# url: "http://pihole.svr2/admin"
# logo: "assets/homer-icons/png/pihole.png"
# tag: oc1
- name: "Files"
icon: "fas fa-hdd"
items:
- name: aria2
subtitle: "Ultra-fast HTTP downloader"
url: "http://aria.server/"
logo: "assets/homer-icons/png/ariang.png"
# - name: Plexdrive
# subtitle: "Encrypted cloud drive"
# url: "http://plexdrive.svr2:9800/files/plexdrive/"
# logo: "assets/homer-icons/png/plexdrive.png"
- name: File Browser
subtitle: "Browse files on NAS server"
url: "http://files.server:9800/files/"
logo: "assets/homer-icons/svg/filebrowser.svg"
- name: qBittorrent
subtitle: "Best torrent client"
url: "http://qbittorrent.server/"
logo: "assets/homer-icons/png/qbittorrent.png"
- name: Scrutiny
subtitle: "Visualized SMART data"
url: "http://scrutiny.server/"
logo: "assets/homer-icons/png/scrutiny.png"
- name: "Server"
icon: "fas fa-server"
items:
- name: InfluxDB
subtitle: "Modern metrics recorder"
url: "http://influxdb.server"
logo: "assets/custom/influxdb.png"
# - name: Uptime-kuma
# subtitle: "Status monitoring"
# url: "http://uptime.svr2/"
# logo: "https://github.com/louislam/uptime-kuma/raw/master/public/icon.svg"
- name: always-on
subtitle: "Netdata on DNS server"
url: "http://netdata.svr2:19999/"
logo: "assets/homer-icons/png/netdata.png"
- name: falcon
subtitle: "Netdata on media server"
url: "http://netdata.server/"
# logo: assets/img2/server-folder.svg
logo: "assets/custom/netdata-alt.png"
- name: NPM (falcon)
subtitle: "Docker net reverse proxy"
url: "http://npm.server/nginx/proxy/"
logo: "assets/homer-icons/png/nginxproxymanager.png"
# - name: Cockpit
# subtitle: "Server manager"
# url: "http://cockpit.server:9090/"
# logo: "assets/homer-icons/png/cockpit.png"
- name: "Tools"
icon: "fas fa-toolbox"
items:
- name: Prowlarr
subtitle: "Indexer manager"
url: "http://prowlarr.server/"
logo: "assets/homer-icons/svg/prowlarr.svg"
- name: Bazarr
subtitle: "Subtitles for all media"
url: "http://bazarr.svr2/"
logo: "assets/homer-icons/svg/bazarr.svg"
tag: oc1
# - name: Node-RED
# subtitle: Programming tool
# url: "http://node-red.server/"
# logo: "assets/homer-icons/png/nodered.png"
- name: Jackett
subtitle: "All indexers in one place"
url: "http://jackett.svr2/"
logo: "assets/homer-icons/png/jackett.png"
tag: oc1
- name: OpenSpeedTest
subtitle: "LAN speed tests"
logo: "assets/homer-icons/png/openspeedtest.png"
url: "http://openspeedtest.svr2:8200/"
更多的配置可以参考 官网
services:
- name: "Media"
icon: "fas fa-cloud"
items:
- name: "Plex"
logo: "assets/tools/plex.png"
subtitle: "TV Shows & Movie Collection"
tag: "app"
url: "http://192.168.68.137:32400/web/index.html"
target: "_blank" # optional html a tag target attribute
- name: "Netflix"
logo: "assets/tools/netflix.png"
subtitle: "Streaming Service"
tag: "app"
url: "https://netflix.com"
- name: "Youtube"
logo: "assets/tools/youtube.png"
tag: "app"
url: "https://youtube.com"
- name: "Downloads"
icon: "fas fa-cloud-download-alt"
items:
- name: "Sonarr"
logo: "assets/tools/sonarr.png"
subtitle: "TV Show Indexer"
tag: "app"
url: "http://192.168.68.137:8989/"
target: "_blank" # optional html a tag target attribute
- name: "Radarr"
logo: "assets/tools/radarr.png"
subtitle: "Movie Indexer"
tag: "app"
url: "http://192.168.68.137:7878/"
- name: "NZBGet"
logo: "assets/tools/nzbget.png"
subtitle: "Usenet Downloader"
tag: "app"
url: "http://192.168.68.137:6789/"
到 FontAwesome 搜索 Icon。
或者看看这里的 SuperTinyIcons 或者 homer-icons
前些天偶然间获知了一款叫做 Time out 的应用,他实现的功能特别简单,就是可以定时(15 分钟,50 分钟)来提醒使用 macOS 的用户起来休息一下,或者看看远方,不过它使用的方式有些一些强制,当时间到了之后电脑屏幕会缓缓升起一个屏保,虽然可以跳过,但会强制让使用者注意到时间的片段。之前,我曾经多次尝试番茄时钟工作法 ,但我常常发现,无法很好的遵守自己定下的阶段小任务,要不是任务比较大无法拆分,要不就是无法整理出思路卡顿很久,番茄时钟推荐的细分任务是 25 分钟一个小片段,但往往发现无法在单一一个 25 分钟内完成,于是一拖再拖,然后可能就在电脑前一坐就是几个小时。然后整个一天之后就非常疲惫。
Time out 的界面非常简单,功能用一句话也能说明,就是可以设置提醒间隔。免费版可以设置两个间隔时间点,默认的是每 15 分钟休息 15 秒,每 50 分钟休息 10 分钟。届时屏幕会强制升起屏幕保护。
Time out 已经被收录在了 [[Setapp]] 中了,订阅了 Setapp 的用户可以直接下载使用,而其他用户也可以在作者的官网 或者 App Store 中下载使用。
两个礼拜前买过一个月 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,通常会在论坛或者邮件中通知有优惠。
今天回到家突然发现刚买的一台 VPS 根目录空间 100% 被占用了,使用 du 一层层查看占用最后发现是 /var/lib/docker/containers
下有一个 json 日志文件占用了 20G 大小。
简单的查了一下发现 Docker 容器的日志都会被记录在宿主机的 /var/lib/docker/containers/
路径下。而我有一个容器因为不停地输出日志,没多久就占了很大空间。
在默认情况下 Docker 容器的日志会输出到一个 json-file 文件中,容器输出到 stdout
和 stderr
的内容加上时间戳会被记录到宿主机。
这些日志文件在宿主机的 /var/lib/docker/containers/
文件夹下,以这样的形式命名:
/var/lib/docker/containers/<container id>/<container id>-json.log
修改 Docker 配置 vi /etc/docker/daemon.json
{
"log-driver": "json-file",
"log-opts": {"max-size": "10m", "max-file": "3"}
}
注意修改之后需要重启 Docker 使之生效 sudo systemctl restart docker
。
或者针对个别容器设置,在 docker-compose.yml
中:
注意需要版本2及以上
version: '2'
services:
app:
container_name: app
image: node
restart: always
logging:
driver: "json-file"
options:
max-file: "5" // number of files or file count
max-size: "10m" // file size
或者命令行:
docker run --log-opt max-size=10m --log-opt max-file=5 my-app:latest
应用自己去管理自己的日志,比如使用 Logging Framework,在 Java 中通常使用 log4j 将日志打印到一个远端的中心化地方,这样就可以绕过 Docker 和操作系统。这种方式给予了开发者更多的控制权。
为了保存日志数据,你可以配置一个持久化的存储或将日志转发到一个远程日志的系统,比如 Elastic Stack 或 Sematext Cloud,但是基于应用的日志框架存在的问题便是如果部署了多个容器,那么你需要一个方式来告诉日志系统,哪些日志属于哪个容器。
你可以在容器内部创建一个目录,然后将该目录挂载到宿主机上,那么一些长期或共享使用的数据可以长久的存储。你可以复制,备份,或者从其他容器访问这些数据。也可以在多个容器之间共享这些 volume。
但是使用 Data Volume 存在的问题是,很难将这些容器迁移到其他宿主机而不丢失数据。
在 Docker 下,另外一个记录日志的方式是使用 logging drivers。不像 Data Volumes, Docker logging driver 会从容器的 stdout 和 stderr 输出中直接读取数据。默认的配置会将这些日志记录到宿主机的一个文件中,但是改变 logging driver 可以允许你将事件转发给 syslog, gelf, journald 或其他 endpoints。
因为容器不再需要读写日志文件,可以提升一定的性能。但是也有一些弊端,Docker log 命令只能在 json-file
log driver 下使用;log diver 有一些功能限制,日志文件只能被传输而不能被解析;当 TCP 服务不可达时,容器会 shut down。
另一个解决方案是通过一个专用的、独立的日志容器来记录和手机日志,这非常适用于微服务架构。这个优势在于这完全不依赖与宿主机。相反,专用的日志容器可以允许你在 Docker 的环境中管理日志文件。他会自动从其他容器收集日志,监控,分析,并且将他们转存到一个中心存储上。
这种方式使得我们可以轻易地将容器在不同的宿主机中移动,并且可以非常轻松的扩展日志基础设施,只需要增加日志容器即可。
和专用的日志容器类似,使用日志容器,但是不同点在于,每一个应用容器都有专用的日志容器,允许你对每一个应用的日志进行自定义。第一个容器会将日志文件打印到 volume,然后日志文件会日志容器打上标签,然后再被传送到日志管理系统。
使用 sidecar 的一个主要的优势是,你可以为每一个 log 增加额外自定义的标签,可以更好地确定其来源。
同样也有一些劣势,设置或扩容可能会变得非常复杂和困难,并且需要更多的资源。你需要确保应用容器和 sidecar 容器是一起进行工作的,否则可能会造成数据丢失。
Logging driver 是 Docker 用来才运行的容器和服务中收集数据的机制,这使得数据更容易进行分析。当一个新的容器被创建,Docker 会自动使用 json-file log driver 作为默认。同时,你可以使用 logging driver plugins 来和其他日志工具进行交互。
下面是一个通过自定义 logging driver 来和 syslog 交互的例子:
docker run -–log-driver syslog –-log-opt syslog-address=udp://syslog-server:514 alpine echo hello world
有两个选项:
上面提过,默认的 logging driver 是 JSON 文件,其他选项有 logagent, syslog, fluentd, journald, splunk 等等。你可以通过修改 Docker configuration 文件 来进行配置:
# /etc/docker/daemon.json
{
"log-driver": "journald"
}
然后再执行:
systemctl restart docker
使之生效。
或者,你可以通过命令来为每一个容器单独设置
docker run --log-driver syslog --log-opt syslog-address=udp://syslog-server:514 alpine echo hello word
选项解释:
n8n 是一个开源自动化工作流程序,类似 IFTTT,发音为 nodemation,模仿了 k8s 的命名规则。
n8n 可以互联的服务包括 Github、Google、RSS、Slack、Telegram、Gitlab、Redis、RabbitMq、数据库等等上百种服务1。
优点:
用过 IFTTT 的人都应该知道,IFTTT 可以非常方便的实现跨应用和服务的交互,我经常做的事情,比如在 Trello 中打开一个卡片,按一下空格,会自动加入该卡片,这个时候因为触发了加入卡片的动作,IFTTT 就会自动在我的 Google Calendar 上添加一个 Event,时间就是当下。
n8n 使用 TypeScript 编写,支持 npx 直接运行,安装 nodejs 运行以下命令即可运行。
任何可以自动化的流程都可以用其连接起来:
n8n 上集成了上百个不同的服务,其功能强大程度完全取决于你的想象力。
如果你还没有想到你想做的自动化的事情,官方的 workflow 页面提供了一大批的流程可以参考。
使用 Docker 安装:
在 n8n 中节点是自动化的关键,节点可以做一些事情,通过节点和节点的连接就产生了流。
在节点和节点之间通过 Connections 连接到一起,通过连接可以传输数据。
Start 节点是流程的第一个节点。
Vagrant 是一个使用 Ruby 编写,基于纯文本文件自动化创建和配置虚拟机的工具。
基于 VirtualBox 和 [[VMware]] ,通过 Vagrant 去控制虚拟机。
Vagrant 是 hashicorp 公司的产品。该公司有大量的开源项目。
Vagrant 提供了 vagrant 命令,通过 Vagrantfile
文件声明虚拟机配置。
按照官网的介绍安装。
brew cask install virtualbox
brew cask virtualbox-extension-pack
brew cask install vagrant
下载一个虚拟机:
vagrant box add ubuntu/trusty64
初始化一个 Ubuntu 镜像:
vagrant init ubuntu/trusty64
在初始化之后可以在当前目录下找到 Vagrantfile
:
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
config.vm.box = "ubuntu/trusty64"
end
ubuntu/trusty64 是在 Vagrant 官网搜索到的虚拟机的镜像。
启动虚拟机:
vagrant up
❯ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'ubuntu/trusty64' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Loading metadata for box 'ubuntu/trusty64'
default: URL: https://vagrantcloud.com/ubuntu/trusty64
==> default: Adding box 'ubuntu/trusty64' (v20190514.0.0) for provider: virtualbox
default: Downloading: https://vagrantcloud.com/ubuntu/boxes/trusty64/versions/20190514.0.0/providers/virtualbox.box
Download redirected to host: cloud-images.ubuntu.com
==> default: Successfully added box 'ubuntu/trusty64' (v20190514.0.0) for 'virtualbox'!
==> default: Importing base box 'ubuntu/trusty64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/trusty64' version '20190514.0.0' is up to date...
==> default: Setting the name of the VM: vagrant_default_1630040745169_54425
==> default: Clearing any previously set forwarded ports...
Vagrant is currently configured to create VirtualBox synced folders with
the `SharedFoldersEnableSymlinksCreate` option enabled. If the Vagrant
guest is not trusted, you may want to disable this option. For more
information on this option, please refer to the VirtualBox manual:
https://www.virtualbox.org/manual/ch04.html#sharedfolders
This option can be disabled globally with an environment variable:
VAGRANT_DISABLE_VBOXSYMLINKCREATE=1
or on a per folder basis within the Vagrantfile:
config.vm.synced_folder '/host/path', '/guest/path', SharedFoldersEnableSymlinksCreate: false
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
default:
default: Vagrant insecure key detected. Vagrant will automatically replace
default: this with a newly generated keypair for better security.
default:
default: Inserting generated public key within guest...
default: Removing insecure key from the guest if it's present...
default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: The guest additions on this VM do not match the installed version of
default: VirtualBox! In most cases this is fine, but in rare cases it can
default: prevent things such as shared folders from working properly. If you see
default: shared folder errors, please make sure the guest additions within the
default: virtual machine match the version of VirtualBox you have installed on
default: your host and reload your VM.
default:
default: Guest Additions Version: 4.3.40
default: VirtualBox Version: 6.1
==> default: Mounting shared folders...
default: /vagrant => /home/einverne/Git/vagrant
修改 Vagrant 可以自定义虚拟机网络,内存和 CPU 等等。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
machine_box = "ubuntu/trusty64"
config.vm.define "local-env-1" do |machine|
machine.vm.box = machine_box
machine.vm.hostname = "local-env-1"
machine.vm.network "private_network", ip: "192.168.33.11"
machine.vm.provider "virtualbox" do |node|
node.name = "local-env-1"
node.memory = 2048
node.cpus = 2
end
end
config.vm.define "local-env-2" do |machine|
machine.vm.box = machine_box
machine.vm.hostname = "local-env-2"
machine.vm.network "private_network", ip: "192.168.33.12"
machine.vm.network "forwarded_port", guest: 26379, host: 26380
machine.vm.provider "virtualbox" do |node|
node.name = "local-env-2"
node.memory = 2048
node.cpus = 2
end
end
end
启动之后可以通过 vagrant ssh $name
登录虚拟机。
在虚拟机启动后 /vagrant
目录会挂载宿主机的同级目录。文件是同步的,这样就可以通过该目录来共享文件。
在 Vagrantfile 中可以如下语法:
config.vm.provision :shell, path: "bootstrap.sh"
会执行 bootstrap.sh
脚本。
Vagrant Box 相对于 Vagrant,就像是 Docker Image 对应于 Docker。
可以使用:
vagrant box add name
来添加 Box。
升级 Box
vagrant box update --box name
删除 Box
vagrant box remove name
常用命令有:
和 Docker 类似,Vagrant 也有几种不同的网络配置:
端口映射,将宿主机端口映射到虚拟机端口,宿主机 8080 端口映射到虚拟机 80 端口:
config.vm.network "forwarded_port", guest: 80, host: 8080
私有网络(host-only),只有宿主机能访问虚拟机,多个虚拟机在同一个网段,相互可以访问:
config.vm.network "private_network", ip: "192.168.21.4"
公有网络(bridge),虚拟机和宿主机相当于局域网中独立的主机,设置静态IP:
config.vm.network "public_network", ip: "192.168.1.120"
如果使用 public_network 而不配置 IP,那么会 DHCP 自动获取 IP 地址。
设置共享目录,Vagrant 使用 rsync 来同步文件:
config.vm.synced_folder "/directory/of/host_machine", "/directory/of/guest_machine"
虚拟机实例启动之后,通过工具自动设置,支持 Shell,Puppet,Chef,Ansible 等等:
config.vm.provision "shell", run: "always", inline: <<-SHELL
sudo yum install -y net-tools
SHELL
run: “always”表示每次vagrant up的时候,都执行Provision。
引用外部脚本:
config.vm.provision "shell", path: "script.sh
并非每次vagrant up的时候,都会执行Provision。只有在下面3种情况下Provision才会执行:
使用 Ansible
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
end
使用虚拟机内部的 Ansible:
Vagrant.configure("2") do |config|
# Run Ansible from the Vagrant VM
config.vm.provision "ansible_local" do |ansible|
ansible.playbook = "playbook.yml"
end
end
vagrant package --output hadoop_master.box hadoop_master
hadoop_master是虚拟机实例名称,hadoop_master.box是box名。
在创建box的时候,如果虚拟机实例正在运行,vagrant会先halt,然后再export。
将box添加到本地仓库:
vagrant box add hadoop_master hadoop_master.box
查看本地仓库的box列表:
$ vagrant box list
centos7 (virtualbox, 0)
hadoop_master (virtualbox, 0)
创建并且切换到用于测试的项目目录:
mkdir ~/test_vagrant && cd ~/test_vagrant
创建Vagrantfile,并使用刚才新创建的hadoop_master.box作为box:
vagrant init -m hadoop_master
创建,并启动虚拟机:
vagrant up
登陆到虚拟机:
vagrant ssh
可以看到和创建box之前的虚拟机是一模一样的