[{"content":"创建 Github 远程 Repo 这里使用 Github 存储 Waline 服务端, 因此需要先创建它对应的 Github 远程 Repo.\n 注意:\n为行文方便, 这里以 waline-railway.blog.zhaijia.fun 作为示例的域名和 Repo 名.\n请勿照抄, 务必将其替换为你自己的域名!\n 你必须要有一个 Github 账号, 如果没有, 点击此处免费注册.\n登录 Github 后, 进入此处创建新的 Repo.\n 这里将此 Repo 的类型设置为 \u0026ldquo;Private\u0026rdquo; (私有的), 意为其中存放的目录/文件只对你自己可见.\n 部署 Waline 服务端至 Railway  Railway 是一个可免费使用的 Serverless 部署平台, 免费套餐包含 5 美元/月的免费额度, 且仅限当月使用, 不累计. 一旦运行中的部署的花费超过当月的免费额度, 其将被关闭.\n 为 Railway 授权 点击此处部署.\n创建 Railway App 在进行下一步之前先去 Github 删除刚才创建的存储库 waline-railway.blog.zhaijia.fun.\n这是因为本着权限最小化原则, 此前为 Railway 授权时只指定了一个存储库, 也就是 waline-railway.blog.zhaijia.fun, 但 Railway 接下来必须创建而不能选择该存储库, 因此必须先将其删除, 再由 Railway 重新创建.  这里将此 Repo 的类型设置为 \u0026ldquo;Private\u0026rdquo; (私有的), 意为其中存放的目录/文件只对你自己可见.\n 其余的 PostgreSQL 数据库的配置无需修改, 直接点击右下角的 \u0026ldquo;Deploy\u0026rdquo; 开始部署.\n等待直至部署完毕, 并记下地址 (图中红线所示的部分), 类似: xxx.xxx.railway.app 初始化数据库 点击左侧的 \u0026ldquo;PostgreSQL\u0026rdquo;, 再点击右侧的 \u0026ldquo;Query\u0026rdquo;, 粘贴下列 SQL 语句:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59  CREATESEQUENCEwl_comment_seq;CREATETABLEwl_comment(idintcheck(id\u0026gt;0)NOTNULLDEFAULTNEXTVAL(\u0026#39;wl_comment_seq\u0026#39;),user_idintDEFAULTNULL,commenttext,insertedAttimestamp(0)withtimezoneNOTNULLDEFAULTCURRENT_TIMESTAMP,ipvarchar(100)DEFAULT\u0026#39;\u0026#39;,linkvarchar(255)DEFAULTNULL,mailvarchar(255)DEFAULTNULL,nickvarchar(255)DEFAULTNULL,pidintDEFAULTNULL,ridintDEFAULTNULL,stickybooleanDEFAULTNULL,statusvarchar(50)NOTNULLDEFAULT\u0026#39;\u0026#39;,\u0026#34;like\u0026#34;intDEFAULTNULL,uatext,urlvarchar(255)DEFAULTNULL,createdAttimestamp(0)withtimezoneNULLDEFAULTCURRENT_TIMESTAMP,updatedAttimestamp(0)withtimezoneNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id));CREATESEQUENCEwl_counter_seq;CREATETABLEwl_counter(idintcheck(id\u0026gt;0)NOTNULLDEFAULTNEXTVAL(\u0026#39;wl_counter_seq\u0026#39;),timeintDEFAULTNULL,urlvarchar(255)NOTNULLDEFAULT\u0026#39;\u0026#39;,createdAttimestamp(0)withtimezoneNULLDEFAULTCURRENT_TIMESTAMP,updatedAttimestamp(0)withtimezoneNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id));CREATESEQUENCEwl_users_seq;CREATETABLEwl_users(idintcheck(id\u0026gt;0)NOTNULLDEFAULTNEXTVAL(\u0026#39;wl_users_seq\u0026#39;),display_namevarchar(255)NOTNULLDEFAULT\u0026#39;\u0026#39;,emailvarchar(255)NOTNULLDEFAULT\u0026#39;\u0026#39;,passwordvarchar(255)NOTNULLDEFAULT\u0026#39;\u0026#39;,typevarchar(50)NOTNULLDEFAULT\u0026#39;\u0026#39;,labelvarchar(255)DEFAULTNULL,urlvarchar(255)DEFAULTNULL,avatarvarchar(255)DEFAULTNULL,githubvarchar(255)DEFAULTNULL,twittervarchar(255)DEFAULTNULL,facebookvarchar(255)DEFAULTNULL,googlevarchar(255)DEFAULTNULL,weibovarchar(255)DEFAULTNULL,qqvarchar(255)DEFAULTNULL,\u0026#34;2fa\u0026#34;varchar(32)DEFAULTNULL,createdAttimestamp(0)withtimezoneNULLDEFAULTCURRENT_TIMESTAMP,updatedAttimestamp(0)withtimezoneNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(id));   该 SQL 语句的最新版本在此处.\n 点击 \u0026ldquo;Run query\u0026rdquo;.\n注册管理员 点击地址 (图中红线所示的部分) 再点击 \u0026ldquo;登录\u0026rdquo; -\u0026gt; \u0026ldquo;用户注册\u0026rdquo; (实际地址类似: https://xxx.xxx.railway.app/ui/register), 完成首个用户的注册.\n注册完成后, 该用户即为管理员.\n点击管理员的名字或在浏览器中访问类似 https://xxx.xxx.railway.app/ui 的地址并使用刚才注册的管理员账号登录后即可对评论, 用户数据进行管理, 也可导入/导出数据. 手动集成 Waline v2.x Stack 主题 (v3.11.0) 本身已集成 Waline v1.6.0, 但版本较旧.\n这里手动集成 Waline v2.x.\n1 2 3 4 5  #### 进入对应的博客网站项目目录 cd blog.zhaijia.fun #### 创建布局目录, 路径类似 themes/hugo-theme-stack 下的同名目录 mkdir -p layouts/partials/comments/provider   在该目录下创建文件 waline.html:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38  \u0026lt;!-- 脚本文件 --\u0026gt; \u0026lt;script src=\u0026#34;https://unpkg.com/@waline/client@v2/dist/waline.js\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;!-- 样式文件 --\u0026gt; \u0026lt;link rel=\u0026#34;stylesheet\u0026#34; href=\u0026#34;https://unpkg.com/@waline/client@v2/dist/waline.css\u0026#34; /\u0026gt; \u0026lt;div id=\u0026#34;waline\u0026#34; class=\u0026#34;waline-container\u0026#34;\u0026gt;\u0026lt;/div\u0026gt; \u0026lt;style\u0026gt; .waline-container { background-color: var(--card-background); border-radius: var(--card-border-radius); box-shadow: var(--shadow-l1); padding: var(--card-padding); } .waline-container .vcount { color: var(--card-text-color-main); } \u0026lt;/style\u0026gt; {{- with .Site.Params.comments.waline -}} {{- $config := dict \u0026#34;el\u0026#34; \u0026#34;#waline\u0026#34; \u0026#34;dark\u0026#34; `html[data-scheme=\u0026#34;dark\u0026#34;]` -}} {{- $replaceKeys := dict \u0026#34;serverurl\u0026#34; \u0026#34;serverURL\u0026#34; \u0026#34;requiredmeta\u0026#34; \u0026#34;requiredMeta\u0026#34; \u0026#34;wordlimit\u0026#34; \u0026#34;wordLimit\u0026#34; \u0026#34;pagesize\u0026#34; \u0026#34;pageSize\u0026#34; \u0026#34;avatarcdn\u0026#34; \u0026#34;avatarCDN\u0026#34; \u0026#34;avatarforce\u0026#34; \u0026#34;avatarForce\u0026#34; -}} {{- range $key, $val := . -}} {{- if $val -}} {{- $replaceKey := index $replaceKeys $key -}} {{- $k := default $key $replaceKey -}} {{- $config = merge $config (dict $k $val) -}} {{- end -}} {{- end -}} \u0026lt;script\u0026gt; /// Waline client configuration see: https://waline.js.org/guide/client/intro.html  Waline.init({{ $config | jsonify | safeJS }}); \u0026lt;/script\u0026gt; {{- end -}}   该文件相比主题内置的 themes/hugo-theme-stack/layouts/partials/comments/provider/waline.html 适配了 Waline v2.x.\n 这里虽然有两个 waline.html, 但 Hugo 会优先使用 layouts/partials/comments/provider/waline.html.\n 在网站配置 config.yaml 中 设置 Waline 只需在 config.yaml 中查找并修改相关的配置即可.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32  # Waline client configuration see: https://waline.js.org/guide/client/intro.htmlwaline:# Waline 的服务端地址serverURL:https://xxx.xxx.railway.app# 语言lang:zh-CN# 表情设置emoji:- https://unpkg.com/@waline/emojis@1.0.1/weibo- https://unpkg.com/@waline/emojis@1.0.1/bilibili# 设置必填项requiredMeta:- nick# 登录模式状态login:enable# 评论字数限制. 设置为 0 时无限制.wordLimit:0# 评论列表分页, 每页条数.pageSize:10# 禁用图片上传imageUploader:false# 是否显示页脚版权信息copyright:true# 文章评论数统计, 填入字符串时会作为 CSS 选择器.comment:false# 文章浏览量统计, 填入字符串时会作为 CSS 选择器.pageview:falselocale:# 评论框默认文字placeholder:请留言⌨️# 评论区为空时的显示文字sofa:欢迎留言👏  启用评论并切换至 Waline:\n1 2 3  comments:enabled:trueprovider:waline  页面效果: ","date":"2022-05-17T12:45:39+08:00","image":"https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-3/feat-img_hu9f19ba8de9f74043546f214af6100cef_72099_120x120_fill_q75_box_smart1.jpg","permalink":"https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-3/","title":"实战教程: 个人博客问题修正 pt.3"},{"content":"目前, Stack 主题并不支持博客文章的社交分享, 因此需要自行集成.\n这里选择适用性极广的 Addthis. 不过它有一个缺点, 就是可能被浏览器的某些扩展 (比如 uBlock Origin) 屏蔽, 所以请自行决定是否使用它.\n 你必须要有一个 Addthis 账号, 如果没有, 点击此处免费注册.\n 修改 profile 名称 登录到 dashboard, 点击右上角的 \u0026ldquo;Profile Settings\u0026rdquo; -\u0026gt; \u0026ldquo;General\u0026rdquo; -\u0026gt; \u0026ldquo;Rename Profile\u0026rdquo; 输入一个好记的名字, 比如: blog-zhaijia-fun\n 该名称不能包含 \u0026ldquo;.\u0026rdquo;, 因此这里将域名 blog.zhaijia.fun 中的 \u0026ldquo;.\u0026rdquo; 替换为 \u0026ldquo;-\u0026rdquo; 之后, 再设置为 profile 名称.\n 设置分享按钮 点击左上角的 \u0026ldquo;Tools\u0026rdquo; -\u0026gt; \u0026ldquo;Add a New Tool\u0026rdquo; -\u0026gt; \u0026ldquo;Share Buttons\u0026rdquo; 按钮类型这里选择 \u0026ldquo;Inline\u0026rdquo;, 然后点击 \u0026ldquo;Continue\u0026rdquo;.\nSharing Services 点击 \u0026ldquo;Selected by You\u0026rdquo; 自定义所需的分享服务.\n点击 \u0026ldquo;ADD MORE SERVICES\u0026rdquo; 添加更多分享服务.\n右侧同时显示实时预览效果. Design 设置为圆角图标, 隐藏分享服务名称. Behavior 在 \u0026ldquo;Show on Only These Pages\u0026rdquo; 下方的输入框中输入:\n1  https://blog.zhaijia.fun/p/*  意为只在博客文章中显示分享按钮. 最后点击 \u0026ldquo;Activate Tool\u0026rdquo; 保存设置. 手动集成 Addthis 社交分享 获取分享代码 点击 \u0026ldquo;GET THE CODE\u0026rdquo;, 拷贝页面显示的两段代码, 例如:\n1 2 3 4 5  \u0026lt;!-- Go to www.addthis.com/dashboard to customize your tools --\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-xxxxxxxxxxxxxxxx\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;!-- Go to www.addthis.com/dashboard to customize your tools --\u0026gt; \u0026lt;div class=\u0026#34;addthis_inline_share_toolbox\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;   添加移除分享追踪的代码:\n1 2 3 4 5 6  \u0026lt;!-- Removing Hashtags, Anchors, and Tracking Codes --\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; var addthis_config = addthis_config||{}; addthis_config.data_track_addressbar = false; addthis_config.data_track_clickback = false; \u0026lt;/script\u0026gt;   替换 pubid 的值, 也就是 \u0026ldquo;ra-xxxxxxxxxxxxxxxx\u0026rdquo; 为 \u0026ldquo;{{ .Site.Params.share.addthisid }}\u0026rdquo;\n得到完整的分享代码:\n1 2 3 4 5 6 7 8 9 10 11 12  \u0026lt;!-- Go to www.addthis.com/dashboard to customize your tools --\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34; src=\u0026#34;//s7.addthis.com/js/300/addthis_widget.js#pubid={{ .Site.Params.share.addthisid }}\u0026#34;\u0026gt;\u0026lt;/script\u0026gt; \u0026lt;!-- Removing Hashtags, Anchors, and Tracking Codes --\u0026gt; \u0026lt;script type=\u0026#34;text/javascript\u0026#34;\u0026gt; var addthis_config = addthis_config||{}; addthis_config.data_track_addressbar = false; addthis_config.data_track_clickback = false; \u0026lt;/script\u0026gt; \u0026lt;!-- Go to www.addthis.com/dashboard to customize your tools --\u0026gt; \u0026lt;div class=\u0026#34;addthis_inline_share_toolbox\u0026#34;\u0026gt;\u0026lt;/div\u0026gt;    请记下 pubid 的原值, 也就是 \u0026ldquo;ra-xxxxxxxxxxxxxxxx\u0026rdquo;, 后面会用到.\n 创建布局目录 1 2 3 4 5  #### 进入对应的博客网站项目目录 cd blog.zhaijia.fun #### 创建布局目录 mkdir -p layouts/_default layouts/partials/share   创建 layouts/_default/single.html 文件内容为:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50  {{ define \u0026#34;body-class\u0026#34; }} article-page {{/* Enable the right sidebar if - Widget different from \u0026#39;TOC\u0026#39; is enabled - TOC is enabled and not empty */}} {{- $HasWidgetNotTOC := false -}} {{- $TOCWidgetEnabled := false -}} {{- range .Site.Params.widgets.page -}} {{- if ne .type \u0026#34;toc\u0026#34; -}} {{ $HasWidgetNotTOC = true -}} {{- else -}} {{ $TOCWidgetEnabled = true -}} {{- end -}} {{- end -}} {{- $TOCManuallyDisabled := eq .Params.toc false -}} {{- $TOCEnabled := and (not $TOCManuallyDisabled) $TOCWidgetEnabled -}} {{- $hasTOC := ge (len .TableOfContents) 100 -}} {{- .Scratch.Set \u0026#34;TOCEnabled\u0026#34; (and $TOCEnabled $hasTOC) -}} {{- .Scratch.Set \u0026#34;hasWidget\u0026#34; (or $HasWidgetNotTOC (and $TOCEnabled $hasTOC)) -}} {{ end }} {{ define \u0026#34;main\u0026#34; }} {{ partial \u0026#34;article/article.html\u0026#34; . }} {{ if .Params.links }} {{ partial \u0026#34;article/components/links\u0026#34; . }} {{ end }} {{ if and (.Site.Params.share.enabled) (isset .Site.Params.share \u0026#34;addthisid\u0026#34;) }} {{ partial \u0026#34;share/addthis.html\u0026#34; . }} {{ end }} {{ partial \u0026#34;article/components/related-contents\u0026#34; . }} {{ if not (eq .Params.comments false) }} {{ partial \u0026#34;comments/include\u0026#34; . }} {{ end }} {{ partialCached \u0026#34;footer/footer\u0026#34; . }} {{ partialCached \u0026#34;article/components/photoswipe\u0026#34; . }} {{ end }} {{ define \u0026#34;right-sidebar\u0026#34; }} {{ if .Scratch.Get \u0026#34;hasWidget\u0026#34; }}{{ partial \u0026#34;sidebar/right.html\u0026#34; (dict \u0026#34;Context\u0026#34; . \u0026#34;Scope\u0026#34; \u0026#34;page\u0026#34;) }}{{ end}} {{ end }}   该文件是基于 themes/hugo-theme-stack/layouts/_default/single.html 修改的, 添加了:\n1 2 3  {{ if and (.Site.Params.share.enabled) (isset .Site.Params.share \u0026#34;addthisid\u0026#34;) }} {{ partial \u0026#34;share/addthis.html\u0026#34; . }} {{ end }}   以集成 Addthis 社交分享.\n创建 layouts/partials/share/addthis.html 文件内容即为前面的完整的分享代码.\n在网站配置 config.yaml 中 设置 Addthis 社交分享 在 \u0026ldquo;params\u0026rdquo; 尾部新增:\n1 2 3 4 5  params:......share:enabled:trueaddthisId:ra-xxxxxxxxxxxxxxxx   请替换 addthisId 的值, 也就是 \u0026ldquo;ra-xxxxxxxxxxxxxxxx\u0026rdquo; 为 pubid 的原值.\n 页面效果: ","date":"2022-05-17T12:45:30+08:00","image":"https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-2/feat-img_hu1259e6b5569e2b687aa30e46acc37e74_70068_120x120_fill_q75_box_smart1.jpg","permalink":"https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-2/","title":"实战教程: 个人博客问题修正 pt.2"},{"content":" 本文同时发布于知乎回答: 挂机可以赚钱吗，有什么好的挂机项目？\n 我的 QNAP NAS 通常都是 24 小时开机的, 虽然平时主要用于家庭网盘,下载以及看片. 也就是说有相当一部分资源平常大都处于闲置中, 但电费却一分钱都不能少. 所以与其空耗电费, 不如想办法薅点羊毛, 能补贴一点是一点.\n挂机软件简介 挂机软件有多种, 有好有坏. 这里选取的都是利用你的闲置带宽来换钱, 而不是偷用算力挖矿的挂机软件, 请放心使用:\nHoneygain 最少需要 $20 才能提现.\nIproyalpawns 通常, 最少需要 $5 才能提现.\nEarnapp 需要使用 Google 账号注册. 需要设置自动兑换以接收付款:\n PayPal: $5 起兑 Amazon 礼品卡: $50 起兑  Peer2profit 最低提现金额取决于支付方式. 通常, 最少需要 $2 到 $14 才能提现.\n关于提现 各个挂机软件在提现时一般都需要手续费, 费率通常由支付方式而定, 具体的费率这里不作说明, 请到官网查看或自行搜索.\n安装 Docker 这里使用 Docker 来运行所有的挂机软件, 安装过程参见:\nQNAP NAS 安装 Docker (Container Station)\n创建目录 1 2 3  cd /share/CACHEDEV1_DATA/docker-apps mkdir ol-earnings cd ol-earnings    ol-earnings 作为一个挂机 app, 里面可以包含多个挂机软件, 这里创建它的专属同名子目录.\n Earnapp 1  mkdir earnapp    这里为 earnapp 创建它的专属子目录, 用于保存它的专属配置及数据. 例如: UUID 文件, 保存了节点 ID, 用于链接到 earnapp dashboard.\n 创建文件 下面将要创建多个文件以供各个挂机软件使用.\n如果你熟悉 vi, 可直接使用它创建所需的文件, 否则可以先在本地电脑端创建所需的文件, 再上传到 ol-earnings 目录内.\n.env 文件 该文件用于保存各个挂机软件所需的账号信息.\n1 2 3 4 5 6 7 8 9 10 11 12 13  ################ honeygain ################ HONEYGAIN_EMAIL=\u0026lt;honeygain 用户名(即邮箱)\u0026gt; HONEYGAIN_PASSWD=\u0026lt;honeygain 密码\u0026gt; ################ honeygain ################ ################ iproyalpawns ################ IPROYALPAWNS_EMAIL=\u0026lt;iproyalpawns 用户名(即邮箱)\u0026gt; IPROYALPAWNS_PASSWD=\u0026lt;iproyalpawns 密码\u0026gt; ################ iproyalpawns ################ ################ peer2profit ################ PEER2PROFIT_EMAIL=\u0026lt;peer2profit 用户名(即邮箱)\u0026gt; ################ peer2profit ################    将 \u0026ldquo;=\u0026rdquo; 后面的部分替换为你自己的账号信息, 注意不要包含 \u0026ldquo;\u0026lt;\u0026rdquo; 和 \u0026ldquo;\u0026gt;\u0026rdquo;, 它们在这里只作说明用.\n docker-compose.yml 文件 该文件用于保存各个挂机软件的 Docker 配置.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37  version:\u0026#34;3\u0026#34;services:################ honeygain ################honeygain_1:image:honeygain/honeygain:latestcontainer_name:honeygain_1restart:alwayscommand:-tou-accept -email \u0026#39;$HONEYGAIN_EMAIL\u0026#39; -pass \u0026#39;$HONEYGAIN_PASSWD\u0026#39; -device \u0026#39;honeygain_1\u0026#39;################ honeygain ################################ iproyalpawns ################iproyalpawns_1:image:iproyalpawns/pawns-cli:latestcontainer_name:iproyalpawns_1restart:alwayscommand:-accept-tos -email=\u0026#39;$IPROYALPAWNS_EMAIL\u0026#39; -password=\u0026#39;$IPROYALPAWNS_PASSWD\u0026#39; -device-name=\u0026#39;iproyalpawns_1\u0026#39;################ iproyalpawns ################################ earnapp ################earnapp_1:image:fazalfarhan01/earnapp:latestcontainer_name:earnapp_1restart:alwaysprivileged:truevolumes:- /sys/fs/cgroup:/sys/fs/cgroup:ro- ./earnapp:/etc/earnapp################ earnapp ################################ peer2profit ################peer2profit_1:image:peer2profit/peer2profit_x86_64:latestcontainer_name:peer2profit_1restart:alwaysenvironment:- P2P_EMAIL=$PEER2PROFIT_EMAIL################ peer2profit ################   这里使用的映像 (image) 都是挂机软件厂商官方或开源的映像 (image), 不必担心其安全性.\n 验证配置 1  docker-compose config    该命令可显示替换了环境变量之后的 docker-compose.yml\n 启动容器 首次启动 1  docker-compose up    以前台进程的方式启动, 随时按 Ctrl + C 中止.\n启动时会有日志输出, 包括错误日志.\n 常规启动 1  docker-compose up -d    以后台进程的方式启动, 无日志输出.\n 可执行下列命令查看日志:\n1 2 3 4 5  #### 查看所有日志 docker-compose logs #### 查看所有日志, 并等待新的日志, 随时按 Ctrl + C 中止. docker-compose logs -f   查看 Dashboard 访问各个挂机软件的 Dashboard, 查看它们的运行情况以及所获得的收益.\nHoneygain 访问: dashboard\nIproyalpawns 访问: dashboard\nEarnapp 执行下列命令获取 UUID:\n1  docker exec -it earnapp_1 earnapp showid    UUID 是以 \u0026ldquo;sdk-node-\u0026rdquo; 开头的一个字符串.\n 访问: dashboard\n链接该 UUID: Peer2profit 访问: dashboard\n写在最后 挂机的羊毛不好薅, 至少就我的亲身体验是如此.\n相比而言, Honeygain 还算好的, 每天还有一次抽奖, 一般可抽 10+ 积分, 而其他几个挂机软件累积积分的速度更是慢. 只能说不要抱太大希望吧.\n","date":"2022-05-02T11:52:54+08:00","image":"https://blog.zhaijia.fun/p/make-online-earnings-on-qnap-nas/feat-img_hu8f4c333804f3ffc77870926b9ef3c215_148046_120x120_fill_q75_box_smart1.jpg","permalink":"https://blog.zhaijia.fun/p/make-online-earnings-on-qnap-nas/","title":"QNAP NAS 运行挂机项目"},{"content":" 本文同时发布于知乎文章: 威联通 QNAP NAS 安装 Docker (Container Station)\n 前提 不是所有的 QNAP NAS 都支持安装 Docker (Container Station), 请先务必确认你的 QNAP NAS 是否满足安装要求.\n安装 Docker (Container Station) 登录 NAS Web 端, 进入 \u0026ldquo;App Center\u0026rdquo;, 查找并安装 \u0026ldquo;Container Station\u0026rdquo;.\n基本上一路点击下一步, 直至完成.\n允许 SSH 连接  这一步是为了后面执行相关的命令而准备的, 毕竟有时候命令行更方便.\n 进入 \u0026ldquo;控制台\u0026rdquo; -\u0026gt; \u0026ldquo;网络 \u0026amp; 文件服务\u0026rdquo; -\u0026gt; \u0026ldquo;Telnet / SSH\u0026rdquo; :\n勾选 \u0026ldquo;允许 SSH 连接(只有管理者群组可远程登录)\u0026rdquo;, 并点击 \u0026ldquo;应用\u0026rdquo;:\n验证 Docker 安装 以 管理员 身份 SSH 登录 NAS, 执行:\n1  docker version   可得到类似如下的输出:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28  Client: Version: 20.10.3 API version: 1.41 Go version: go1.13.15 Git commit: c52c09e6b8 Built: Fri Feb 26 03:34:21 2021 OS/Arch: linux/amd64 Context: default Experimental: true Server: Engine: Version: 20.10.3 API version: 1.41 (minimum version 1.12) Go version: go1.13.15 Git commit: 4c417df92a Built: Fri Feb 26 04:02:45 2021 OS/Arch: linux/amd64 Experimental: false containerd: Version: v1.4.3 GitCommit: 269548fa27e0089a8b8278fc4fc781d7f65a939b runc: Version: 1.0.0-rc93 GitCommit: 12644e614e25b05da6fd08a38ffa0cfe1903fdec docker-init: Version: 0.19.0 GitCommit: de40ad0   安装 Docker Compose  Docker Compose 可以将一个或多个容器以服务 (services) 的方式来运行, 只需一个配置文件即可控制所有这些容器的生命周期, 免除了需要记忆或以后忘记 docker 命令的烦恼.\n 1 2  curl -L \u0026#34;https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)\u0026#34; -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose   验证 Docker Compose 安装 1  docker-compose version   可得到类似如下的输出:\n1 2 3 4  docker-compose version 1.27.4, build 40524192 docker-py version: 4.3.1 CPython version: 3.7.7 OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019    虽然安装命令指定的是版本 1.24.1, 但实际安装的是版本 1.27.4.\n 创建目录 1  mkdir /share/CACHEDEV1_DATA/docker-apps   docker-apps 目录是所有使用 docker 运行的 apps 的根目录, 每个 app 都应在其下创建对应于自己的子目录.\n在子目录中创建属于 app 的 Docker Compose 配置文件 (通常为 docker-compose.yml) 之后, 就可以使用 docker-compose 命令控制 app 的运行了.\n","date":"2022-05-02T11:26:29+08:00","image":"https://blog.zhaijia.fun/p/install-docker-on-qnap-nas/feat-img_huf9ee05684eafa9528b6a214328fe0b4e_55358_120x120_fill_q75_box_smart1.jpg","permalink":"https://blog.zhaijia.fun/p/install-docker-on-qnap-nas/","title":"QNAP NAS 安装 Docker (Container Station)"},{"content":"在完整经历了下面三个部分的系列教程后, 任何人应该已可访问你的静态博客:\n pt.1 - 创建本地博客网站项目  使用 Hugo 构建静态博客.   pt.2 - 同步静态博客至 QNAP NAS  使用 Qsync 从本地将静态博客同步至 QNAP NAS 上专属虚拟主机目录下.   pt.3 - 同步静态博客至 Backblaze B2 和 Cloudflare  使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.    一切看上去都很完美, 不论是 Hugo 构建, Qsync 同步 还是 HBS 3 (Hybrid Backup Sync 3) 同步.\n但在深入查看了同步至 Backblaze B2 的静态博客文件后, 却发现其中存在着不需要的隐藏文件, 比如 .bzEmpty, 或者某些深层次的错乱目录结构. 虽然这并不影响对静态博客的访问, 但同步这些文件却要消耗事务次数以及更多的时间.\n另外, 由于每当 Hugo 构建时, 都会更改图片等文件的修改时间, 这导致 Qsync 和 HBS 3 (Hybrid Backup Sync 3) 均认为相应的文件被更新, 从而触发上传/同步. 这同样会消耗事务次数以及更多的时间.\n以上这些问题暂时没法解决, 那么就只好从其他角度考虑解决方案了.\n这里暂时搁置 Qsync 同步的问题, 毕竟 QNAP NAS 通常部署在 LAN, 因此即便多些同步时间还是可忍受的, 而 HBS 3 (Hybrid Backup Sync 3) 却可使用 rclone 来代替, 唯一的缺点是暂时不能在 QNAP NAS 上运行 rclone.\n 注意:\n为行文方便, 本教程以 blog.zhaijia.fun 作为示例的静态博客域名和 Repo 名.\n请勿照抄, 务必将其替换为你自己的域名!\n 安装 Kapitainsky rclone browser Kapitainsky rclone browser 是一个跨平台, 带 UI 的 rclone 应用, 支持主流的桌面系统:\n MacOS GNU/Linux BSD family Windows  这里以 MacOS 为例, 演示该应用的安装和使用.\n1  brew install kapitainsky-rclone-browser --cask   使用 Kapitainsky rclone browser 配置 首次启动 Kapitainsky rclone browser (应用名为 Rclone Browser), 可能会提示无法确认 rclone 的版本, 并弹出设置窗口.  rclone location: /usr/local/bin/rclone\nrclone.conf location: 填写一个你方便记忆的路径, 比如: ~/rclone.conf, 这个文件无需创建, 可直接使用后面的示例文件.\n 点击 \u0026ldquo;OK\u0026rdquo;.\n此时可点击 \u0026ldquo;Config\u0026hellip;\u0026rdquo; 创建 rclone.conf, 这是一个冗长的过程, 其中可以设置很多选项. 不过大部分选项其实只使用默认值即可, 因此可直接使用下面的 rclone.conf, 保存到前面设置窗口里的 rclone.conf location 即可:\n1 2 3 4 5 6  [B2-blog-zhaijia-fun] type = b2 account = \u0026lt;Backblaze B2 中已创建的 keyID\u0026gt; key = \u0026lt;Backblaze B2 中已创建的 applicationKey\u0026gt; hard_delete = true download_url = https://blog.zhaijia.fun    第一行是配置名称, 随意.\naccount, key 请按说明填写.\nhard_delete = true, 删除远程存储库文件时, 真正删除而不是转为隐藏文件.\n 点击 \u0026ldquo;Refresh\u0026rdquo;, 即可显示出上面的配置.\n创建同步任务 选中该配置, 点击 \u0026ldquo;Open\u0026rdquo;, 会在一个新的标签页中打开它. 等待一会儿, 直到远程存储库加载完毕, 选中它, 点击工具栏上的 \u0026ldquo;Upload\u0026rdquo;.  Source: 选择本地 Hugo 构建静态网站的默认发布目录 public, 末尾必须要添加一个 \u0026ldquo;/\u0026rdquo;.\nDestination: 远程存储库名, 必须以 \u0026ldquo;/\u0026rdquo; 结尾.\nMode: 勾选 \u0026ldquo;Sync\u0026rdquo;.\n勾选 \u0026ldquo;Compare\u0026rdquo; (该项默认为选中), 右侧下拉, 选择 \u0026ldquo;Size \u0026amp; checksum\u0026rdquo;.\nTask description: 同步 blog.zhaijia.fun\n 点击 \u0026ldquo;Save task\u0026rdquo;.\n运行同步任务 模拟运行 点击 \u0026ldquo;Dry Run\u0026rdquo;, 只是模拟并未真正运行. 查看日志, 可看到类似:\n1  2022/05/01 13:10:53 NOTICE: p/tutorial-how-to-build-a-personal-blog-part-3/.bzEmpty: Skipped delete as --dry-run is set (size 0)   意为将从远程存储库删除该文件, 但实际上略过了, 因为现在是模拟运行 (\u0026ndash;dry-run).\n最后可看到类似:\n1  2022/05/01 13:10:53 INFO : There was nothing to transfer   意为当前并无可同步的目录/文件.\n这是因为 rclone 通过文件大小与校验和 (Size \u0026amp; checksum) 的检查发现两方的目录/文件是相同的, 即使两方的修改时间不同. 这种检查方式相比 Qsync 和 HBS 3 (Hybrid Backup Sync 3) 更加精确, 高效.\n正式运行 点击 \u0026ldquo;Run\u0026rdquo;, 真正执行同步.\n查看日志, 即可浏览同步详情.\n","date":"2022-05-01T18:37:23+08:00","image":"https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/feat-img_hu34f4204f53c4d494f21a493ab3e14a43_54341_120x120_fill_q75_box_smart1.jpg","permalink":"https://blog.zhaijia.fun/p/tutorial-how-to-fix-a-personal-blog-part-1/","title":"实战教程: 个人博客问题修正 pt.1"},{"content":" 本系列教程为你展示搭建个人博客的技巧, 分为三个部分:\n pt.1 - 创建本地博客网站项目  使用 Hugo 构建静态博客.   pt.2 - 同步静态博客至 QNAP NAS  使用 Qsync 从本地将静态博客同步至 QNAP NAS 上专属虚拟主机目录下.   pt.3 - 同步静态博客至 Backblaze B2 和 Cloudflare (本文)  使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.     在经历了第二部分的实战教程: 搭建个人博客 pt.2 - 同步静态博客至 QNAP NAS后, 你的静态博客应该已可用于测试且相当于多了一个备份. 但这并非最终目的, 因为它还未公开发布.\n要想公开发布一个博客网站, 就必须准备一个类似 QNAP NAS 的部署环境, 不同之处在于它必须是对任何人都可访问的.\n通常可以使用服务器或虚拟主机空间作为部署环境, 但为了节省成本 (毕竟只是搭建个人博客), 这里选择将静态博客部署至 Backblaze B2 和 Cloudflare.\n非常幸运的是可以使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.\nBackblaze B2 云存储简介 Backblaze B2 云存储是一个类似 Amazon S3 的对象存储服务, 但价格却低很多:\n           存储空间 ($/GB/月) 0.021 GB/月 0.005 GB/月 76%+ 降低成本   下载 ($/GB) 0.05 GB/月 0.01 GB/月 成本降低 80% 以上    此外, 它还提供免费额度:\n 存储  前 10GB 的存储空间是免费的. 超过 10GB, 收取 $ 0.005 /GB/月的费用, 大约是其他领先的云对象存储 (比如 S3) 成本的四分之一. 存储成本按小时计算, 没有最低保留要求, 按月计费.   下载流量  每天下载的前 1GB 流量是免费的. 超过 1GB, 收取 $ 0.01 /GB, 但是通过 CDN 和计算合作伙伴 (Cloudflare 就是其中之一) 下载是免费的.   事务  每个下载操作都算作一个 B 类事务. 每天前 2,500 个 B 类事务是免费的. 超过 2,500 个 B 类事务, 按 $ 0.004/10,000 个事务的费率收费.   没有 \u0026ldquo;惊喜\u0026rdquo; 账单  如果你已经注册了 Backblaze B2, 你可能已经注意到你不必提供信用卡号. 你的 10GB 免费存储空间永不过期, 你也不会意外产生任何费用.    由于 Backblaze B2 和 Cloudflare 的合作伙伴关系, 二者之间的流量无需客户付费. 再加上 Cloudflare 本身的 CDN 功能会大大减少回源 (事务) 次数, 因此只需通过 Cloudflare 访问部署于 Backblaze B2 的静态博客, 就近乎于全免费, 这也是选择 Backblaze B2 的重要原因之一.\n设置 Backblaze B2 注册 B2 账号 点击此处进行注册, 这里 Region 选择 \u0026ldquo;US-West\u0026rdquo;.\n绑定手机号 登录后, 提示要给手机发验证码, 目前支持中国大陆的手机号, 接收时可能会有比较大的延迟, 比如延迟 1~2 小时, 但也可能立即收到.\n验证码的有效期是 24 小时, 如遇延迟, 请等待.\n创建存储库 (Bucket) 绑定了手机号再次登录后, 默认进入 \u0026ldquo;Buckets\u0026rdquo; 页, 也可点击此处进入该页.\n现在创建一个存储库 (Bucket), 点击 \u0026ldquo;Create a Bucket\u0026rdquo;:  Bucket Unique Name: blog-zhaijia-fun, 不能包含 \u0026ldquo;.\u0026rdquo;, 即不能与域名同名, 最少6个字符, 且需在 Backblaze B2 全站范围内唯一.\nFiles in Bucket are: 选择 \u0026ldquo;public\u0026rdquo;, 表示对所有人都是可访问的.\n其他选项保持默认值即可.\n 获取存储库的域名 随意上传一张示例图片, 例如: smiley.png 并查看其信息: 记下其中的域名 (图中红线所示的部分), 即: f000.backblazeb2.com, 你的可能和示例不同, 请以你自己的为准.\n创建 App Key 为使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 首先要创建一个 App Key.\n进入 \u0026ldquo;App Keys\u0026rdquo; 页, 也可点击此处进入该页.  Name of Key: NAS-HBS\nAllow access to Bucket(s): 允许访问的存储库 (Bucket), 只选中 blog-zhaijia-fun\n其他选项保持默认值即可.\n 点击 \u0026ldquo;Copy to Clipboard\u0026rdquo;, 会将 applicationKey 的值拷贝至剪贴板.\n 该值只在此处显示一次, 以后将无法查到.\n强烈建议你将 applicationKey 和相对应的 keyID 保存至安全的地方, 它们是执行同步所需的关键参数, 千万不要泄露!\n 设置 Cloudflare 加速  你必须要有一个 Cloudflare 账号, 如果没有, 点击此处注册.\n你必须要有一个域名并按照 Cloudflare 的指引将其导入 Cloudflare.\n  注意:\n为行文方便, 本教程以 blog.zhaijia.fun 作为示例的静态博客域名和 Repo 名.\n请勿照抄, 务必将其替换为你自己的域名!\n 登录 Cloudflare 后, 选择域名 zhaijia.fun .\n设置 SSL/TLS 切换到 \u0026ldquo;SSL/TLS\u0026rdquo; 项.\n点击右侧的 \u0026ldquo;Full (strict)\u0026quot;,确保它被选中: 设置 DNS 切换到 \u0026ldquo;DNS\u0026rdquo; 项.\n添加一个类型为 \u0026ldquo;CNAME\u0026rdquo; 的解析项目: 这里将域名 (子) blog.zhaijia.fun 作为前面找到的 f000.backblazeb2.com 的别名 (CNAME).\n也就是说访问 blog.zhaijia.fun 就相当于访问 f000.backblazeb2.com.\n请确保最右侧的开关是打开的 (图中红线所示的部分), 并点击 \u0026ldquo;Save\u0026rdquo; 保存.\n 此 CNAME 的 DNS 解析可能需要一定的时间才能生效, 请耐心等待.\n 此时, 拷贝示例图片的 Friendly URL, 并将其中的域名替换为 blog.zhaijia.fun, 可得:\nhttps://blog.zhaijia.fun/file/blog-zhaijia-fun/smiley.png.\n如果一切正常, 在浏览器中访问新的图片 URL, 你将看到这张图片.\n设置 Transform Rules 切换到 \u0026ldquo;Rules\u0026rdquo; -\u0026gt; \u0026ldquo;Transform Rules\u0026rdquo; 项.\n缩减 URL 点击 \u0026ldquo;Create transform rule\u0026rdquo; -\u0026gt; \u0026ldquo;Rewrite URL\u0026rdquo;:  Rule name: fix url path 1\n 然后点击 \u0026ldquo;Edit expression\u0026rdquo;, 并在下方输入框中输入:\n1  notstarts_with(http.request.uri.path,\u0026#34;/file/blog-zhaijia-fun\u0026#34;)andnotends_with(http.request.uri.path,\u0026#34;/\u0026#34;)    该文本中的 blog-zhaijia-fun 为存储库 (Bucket) 名称\n 点击 \u0026ldquo;Path\u0026rdquo; 下方的 \u0026ldquo;Rewrite to\u0026hellip;\u0026rdquo; -\u0026gt; \u0026ldquo;Dynamic\u0026rdquo;, 并在右侧的输入框中输入:\n1  concat(\u0026#34;/file/blog-zhaijia-fun\u0026#34;,http.request.uri.path)   最后点击 \u0026ldquo;Deploy\u0026rdquo;.\n现在删除示例图片 URL 中的 \u0026ldquo;/file/blog-zhaijia-fun\u0026rdquo;, 可得:\nhttps://blog.zhaijia.fun/smiley.png\n如果一切正常, 在浏览器中访问新的图片 URL, 你将看到这张图片.\n至此, 该 URL 将被用作示例图片的最终 URL .\n自动搜索索引文件 Backblaze B2 提供的云存储服务并不像 Web 服务器那样在收到一个以 \u0026ldquo;/\u0026rdquo; 结尾的 URL 时会自动搜索索引文件, 比如: index.html, 而是返回 HTTP 404 (Not Found) 错误. 不过只需创建特定的 Transform Rule 就可模拟自动搜索索引文件.\n类似前面的创建过程, 再次创建一个 \u0026ldquo;Rewrite URL\u0026rdquo; 规则:\n Rule name: fix url path 2\n 然后点击 \u0026ldquo;Edit expression\u0026rdquo;, 并在下方输入框中输入:\n1  notstarts_with(http.request.uri.path,\u0026#34;/file/blog-zhaijia-fun\u0026#34;)andends_with(http.request.uri.path,\u0026#34;/\u0026#34;)    该文本中的 blog-zhaijia-fun 为存储库 (Bucket) 名称\n 点击 \u0026ldquo;Path\u0026rdquo; 下方的 \u0026ldquo;Rewrite to\u0026hellip;\u0026rdquo; -\u0026gt; \u0026ldquo;Dynamic\u0026rdquo;, 并在右侧的输入框中输入:\n1  concat(\u0026#34;/file/blog-zhaijia-fun\u0026#34;,http.request.uri.path,\u0026#34;index.html\u0026#34;)   最后点击 \u0026ldquo;Deploy\u0026rdquo;.\n从响应中删除 Backblaze B2 HTTP 标头 通常, 下面的 Backblaze B2 HTTP 标头将被包含在响应中:\n x-bz-file-name x-bz-file-id x-bz-content-sha1 x-bz-upload-timestamp x-bz-info-src_last_modified_millis  删除它们, 除了可以防止某些信息的泄露之外, 还能减少网络传输的字节数.\n点击 \u0026ldquo;Create transform rule\u0026rdquo; -\u0026gt; \u0026ldquo;Modify Response Header\u0026rdquo;:  Rule name: remove b2 headers\n 然后点击 \u0026ldquo;Edit expression\u0026rdquo;, 并在下方输入框中输入: true 点击 \u0026ldquo;Select item\u0026hellip;\u0026rdquo; -\u0026gt; \u0026ldquo;Remove\u0026rdquo;, 并在右边的输入框中输入某个 Backblaze B2 HTTP 标头.\n可通过点击 \u0026ldquo;Set new header\u0026rdquo;, 添加另一个待删除的 Backblaze B2 HTTP 标头.\n重复这个过程, 直至上面的 5 个 Backblaze B2 HTTP 标头都被添加: 最后点击 \u0026ldquo;Deploy\u0026rdquo;.\n通过 ETag HTTP 标头优化缓存效率 编辑刚才创建的规则 \u0026ldquo;remove b2 headers\u0026rdquo;, 点击 \u0026ldquo;Set new header\u0026rdquo;, 选择 \u0026ldquo;Set dynamic\u0026rdquo;, 在下方的两个输入框中分别输入:\n 左边:  1  ETag    右边:  1 2 3  concat(http.response.headers[\u0026#34;x-bz-content-sha1\u0026#34;][0], http.response.headers[\u0026#34;x-bz-info-src_last_modified_millis\u0026#34;][0], http.response.headers[\u0026#34;x-bz-file-id\u0026#34;][0])    这表示使用所访问资源的 sha1, src_last_modified_millis 和 file-id 构造 ETag HTTP 标头.\n 最后, 点击 \u0026ldquo;Save\u0026rdquo; 保存.\n创建 HBS 3 同步任务 登录 QNAP NAS Web 端, 打开 \u0026ldquo;HBS 3 Hybrid Backup Sync\u0026rdquo;.\n点击 \u0026ldquo;同步\u0026rdquo; -\u0026gt; \u0026ldquo;立即同步\u0026rdquo; -\u0026gt; \u0026ldquo;单向同步作业\u0026rdquo;:  名称: B2 blog-zhaijia-fun\nkeyID: Backblaze B2 中已创建的 keyID\n应用程序密钥: Backblaze B2 中已创建的 applicationKey\n  作业名称: 同步 blog.zhaijia.fun\n描述: 从 QNAP NAS 将静态博客同步至 Backblaze B2\n操作: 镜像, 意为同步后, QNAP NAS 和 Backblaze B2 两方的目录/文件是相同的, 而 Backblaze B2 方存储的其他数据将被删除.\n 点击左侧 \u0026ldquo;添加配对文件夹\u0026rdquo; 右边的 \u0026ldquo;+\u0026rdquo;, 选择 QNAP NAS 上的目录: Web/blog.zhaijia.fun 点击右侧 \u0026ldquo;添加配对文件夹\u0026rdquo; 右边的 \u0026ldquo;+\u0026rdquo;, 选择 Backblaze B2 上的目录: /  保持默认选项 \u0026ldquo;没有计划\u0026rdquo;, 意为手工运行该同步任务.\n 点击 \u0026ldquo;下一步\u0026rdquo;, 查看任务摘要, 并 \u0026ldquo;创建\u0026rdquo;: 至此, 同步任务创建完毕.\n任何时候, 只要点击图中的 \u0026ldquo;立即同步\u0026rdquo; 即可将静态博客从 QNAP NAS 同步至 Backblaze B2.\n浏览静态博客 现在从浏览器中访问 https://blog.zhaijia.fun, 看看成果吧!\n","date":"2022-04-21T10:24:11+08:00","image":"https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/feat-img_hu490df5433bffee8f68822e4ff9ec55b1_299883_120x120_fill_box_smart1_3.png","permalink":"https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-3/","title":"实战教程: 搭建个人博客 pt.3"},{"content":" 本系列教程为你展示搭建个人博客的技巧, 分为三个部分:\n pt.1 - 创建本地博客网站项目  使用 Hugo 构建静态博客.   pt.2 - 同步静态博客至 QNAP NAS (本文)  使用 Qsync 从本地将静态博客同步至 QNAP NAS 上专属虚拟主机目录下.   pt.3 - 同步静态博客至 Backblaze B2 和 Cloudflare  使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.     在经历了第一部分的实战教程: 搭建个人博客 pt.1 - 创建本地博客网站项目后, 你的静态博客应该已经在本地构建完毕了.\n虽然在启动本地博客网站 (Hugo 调试环境) 时可通过浏览器调试博客文章, 但这仅限于你自己. 如果你希望别人 (尤其是团队中的其他人) 也能帮忙测试这个静态博客, 你需要将它部署到一个提供有限访问权限的环境中, 且需要一个提供 Web 服务的软件, 例如: Apache Web Server, Nginx 或 Caddy 等.\n综合下面这几个理由, 这里选择将静态博客部署至 QNAP NAS:\n QNAP NAS 通常部署在 LAN, 非常适合用作提供有限访问权限的测试环境. QNAP NAS 内置了 Apache Web Server, 且易于使用. QNAP NAS 易于连接至 Backblaze B2, 可以很方便地将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速 (即本系列教程的第三部分). 部署于 QNAP NAS 上的静态博客, 也相当于多了一个备份.   注意:\n为行文方便, 本教程以 blog.zhaijia.fun 作为示例的静态博客域名和 Repo 名.\n请勿照抄, 务必将其替换为你自己的域名!\n 创建共享文件夹 为避免繁琐且容易失误的手工上传方式, 这里使用 Qsync 将静态博客从本地同步至 QNAP NAS, 这需要先在 QNAP NAS 上创建一个用于同步的共享文件夹.\n打开 \u0026ldquo;File Station\u0026rdquo;, 点击左侧目录树中 \u0026ldquo;Web\u0026rdquo; 的上级, 比如 \u0026ldquo;DataVol1\u0026rdquo; 右边的三个竖点, 然后点击 \u0026ldquo;创建共享文件夹\u0026rdquo;:  文件夹名称: blog.zhaijia.fun\n点选 \u0026ldquo;手动输入路径\u0026rdquo;, 并在其下的输入框中输入: /Web/blog.zhaijia.fun\n 为共享文件夹启用同步  必须启用 Qsync Central 才能同步文件. 此应用程序默认启用, 必须保持启用状态以进行文件同步.\n必须启用对共享文件夹的同步访问, 以在文件夹和设备之间同步文件. 共享文件夹默认没有同步访问权限.\n  打开 Qsync Central, 然后转到 \u0026ldquo;共享文件夹\u0026rdquo;. 在右边的列表中找到行 \u0026ldquo;blog.zhaijia.fun\u0026rdquo;, 点击其 \u0026ldquo;允许\u0026rdquo; 列的按钮, 启用同步访问权限.   启用虚拟主机 为方便管理, 这里在 QNAP NAS 内置的 Web 服务器 (即 Apache Web Server) 上为静态博客创建专属虚拟主机.\n进入 \u0026ldquo;应用程序\u0026rdquo; -\u0026gt; \u0026ldquo;Web 服务器\u0026rdquo; -\u0026gt; \u0026ldquo;虚拟主机\u0026rdquo;, 勾选 \u0026ldquo;启用虚拟主机\u0026rdquo;, 最后点击 \u0026ldquo;应用\u0026rdquo;: 创建专属虚拟主机 点击 \u0026ldquo;创建虚拟主机\u0026rdquo;:  主机名称: test.blog.zhaijia.fun\n根目录: /Web/blog.zhaijia.fun (该目录必须位于 Web 文件夹下)\n端口号: 该端口号与 Web 服务器所使用的端口号相同, 通常为 80.\n请注意这里是将主机名称 test.blog.zhaijia.fun 的虚拟主机映射到目录 blog.zhaijia.fun, 意为该虚拟主机用于测试目的.\n 安装 Qsync 客户端 根据 QNAP 官网的描述:\n Qsync 让您方便地在 QNAP NAS 及绑定设备间进行文件同步, 适用于PC主机, 笔记本电脑与移动设备. 您可在所有设备上存取实时数据, 并轻松分享给工作团队或家庭成员.\n 点击下载 Qsync (Windows® 及 macOS®、Android™ 及 iOS®), 并安装.\n使用 Qsync 客户端 打开 Qsync 客户端, 连接并登录.\n该过程只需执行一次, 之后可通过点击 Qsync 客户端的系统托盘图标打开主界面.\n打开主界面 新增配对文件夹 在 QNAP NAS 上查看同步结果 浏览测试环境的静态博客  为了能够正常浏览测试环境的静态博客 (即虚拟主机网站), 请先添加测试域名 test.blog.zhaijia.fun 的 DNS 解析记录. 可以使用 SwitchHosts, 或者直接修改本地的 hosts 文件, 例如:\nLinux/MacOS: /etc/hosts\nWindows: C:\\WINDOWS\\system32\\drivers\\etc\\hosts\n在其中添加行:\n\u0026lt;QNAP NAS IP 地址\u0026gt; test.blog.zhaijia.fun\n 使用浏览器访问: http://test.blog.zhaijia.fun 以浏览/测试静态博客.\n至此, 每当在本地新增/删除/修改博客并执行 Hugo 构建之后, 你的静态博客将会被立即同步至 QNAP NAS 上专属虚拟主机目录下.\n如果想暂停此同步: ","date":"2022-04-20T09:32:15+08:00","image":"https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/feat-img_hubf87b098c64b3035ead3fd0d03202a4c_210623_120x120_fill_q75_box_smart1.jpg","permalink":"https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-2/","title":"实战教程: 搭建个人博客 pt.2"},{"content":" 本系列教程为你展示搭建个人博客的技巧, 分为三个部分:\n pt.1 - 创建本地博客网站项目 (本文)  使用 Hugo 构建静态博客.   pt.2 - 同步静态博客至 QNAP NAS  使用 Qsync 从本地将静态博客同步至 QNAP NAS 上专属虚拟主机目录下.   pt.3 - 同步静态博客至 Backblaze B2 和 Cloudflare  使用 HBS 3 (Hybrid Backup Sync 3) 从 QNAP NAS 将静态博客同步至 Backblaze B2, 并设置 Cloudflare 加速.     创建 Github 远程 Repo 本教程使用 Github 同步/备份所创建的博客网站项目, 因此需要先创建它对应的 Github 远程 Repo.\n 注意:\n为行文方便, 本教程以 blog.zhaijia.fun 作为示例的静态博客域名和 Repo 名.\n请勿照抄, 务必将其替换为你自己的域名!\n 你必须要有一个 Github 账号, 如果没有, 点击此处免费注册.\n登录 Github 后, 进入此处创建新的 Repo.\n 这里将此 Repo 的类型设置为 \u0026ldquo;Private\u0026rdquo; (私有的), 意为其中存放的目录/文件只对你自己可见.\n如果将来需要部署至某些要求 Repo 必须是 \u0026ldquo;Public\u0026rdquo; 的静态网站托管服务, 比如 Netlify, 请修改为 \u0026ldquo;Public\u0026rdquo;.\n 安装 Hugo 进入此处查看并下载最新版本的 Hugo.\n如果你的本地系统是 macOS, 可按照下面的简洁方式快速安装 Hugo:\n1 2 3 4 5 6 7 8 9  #### 安装 brew install hugo #### 查看版本 hugo version 例如: hugo v0.97.3+extended darwin/amd64 BuildDate=unknown    注意: 必须是扩展版本的 Hugo, 即: extended\n 创建博客网站项目 1 2 3 4 5 6 7 8  #### 在某个指定的目录下执行: hugo new site blog.zhaijia.fun #### 进入对应的博客网站项目目录 cd blog.zhaijia.fun #### git 初始化 git init   安装主题 请查看此处或自行搜索你喜欢的主题, 然后按照相关的说明文档安装并配置.\n安装 Stack 主题 这里选择安装 Stack 主题:\n1 2 3 4 5 6 7 8 9  #### 以子模块的方式安装 git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack #### 使用样例配置作为开始, 以后可在此基础上再次按需修改 cp themes/hugo-theme-stack/exampleSite/config.yaml . cp -R themes/hugo-theme-stack/exampleSite/content . #### 删除默认的配置文件 config.toml, 因为已经有了 config.yaml rm config.toml   基本配置 网站配置 config.yaml 忽略某些目录/文件 这里创建 .gitignore, 在其中放入不需要同步至 Github 的目录/文件, 例如:\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26  #### .gitignore #### lock for building /.hugo_build.lock #### public 是 Hugo 构建静态网站的默认发布目录. /public/ #### Hugo 资源目录 /resources/ #### 图片, 视频, 音频等体积较大的文件, 仅限目录 /content/post/** /content/post/**/*.jpg /content/post/**/*.jpeg /content/post/**/*.png /content/post/**/*.gif /content/post/**/*.webp /content/post/**/*.mp4 /content/post/**/*.mov /content/post/**/*.mp3 /content/post/**/*.m4a #### 任意的 .DS_Store (macOS) **/.DS_Store   此示例意为在同步至 Github 时, 将 Hugo 构建静态网站的默认发布目录 public, Hugo 资源目录, 文章所引用的图片, 视频, 音频等体积较大的文件和任意的 macOS 保存目录自定义属性的隐藏文件 .DS_Store 排除在外.\n启动本地博客网站 (Hugo 调试环境) 1  hugo server -D --disableFastRender --noHTTPCache   如果一切正常, 去浏览器查看本地博客网站: http://localhost:1313/.\n  -D 意为也对标记为草稿的文章生成页面. 由于本主题使用了 Hugo 中的 .Scratch 来实现一些特性, 非常建议你为 hugo server 命令添加 \u0026ndash;disableFastRender 参数来实时预览你正在编辑的文章页面. --noHTTPCache 意为阻止服务器端的缓存, 总是向浏览器发送内容而不是提示内容已最新 (HTTP 304). 按下 Ctrl + C 退出 Hugo 调试环境.   如果需要带域名启动, 只需添加参数 \u0026ndash;baseURL, 例如:\n1  hugo server -D --disableFastRender --noHTTPCache --baseURL http://blog.zhaijia.fun    将会提示: Web Server is available at http://blog.zhaijia.fun:1313/ (bind address 127.0.0.1)\n此时需将域名 blog.zhaijia.fun 本地解析到 127.0.0.1 才能在浏览器中正常访问上面的地址.\n 首次同步至 Github 远程 Repo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23  #### 配置连接 Github 时的账户信息 #### #### 配置默认账户,即多个 Repo 共享的 Github 账户 git config --global user.email \u0026#34;your-email\u0026#34; git config --global user.name \u0026#34;your-user-name\u0026#34; #### 配置仅用于连接当前 Repo 的 Github 账户 git config user.email \u0026#34;your-email\u0026#34; git config user.name \u0026#34;your-user-name\u0026#34; #### 添加当前目录下的所有目录/文件 git add . #### 提交并进行注释 git commit -m \u0026#34;首次提交\u0026#34; #### 切换至主分支 (main) git branch -M main #### 链接到远程 Repo git remote add origin https://github.com/your-user-name/blog.zhaijia.fun.git #### 同步本地的目录/文件至 Github git push -u origin main    配置连接 Github 时的账户信息, 有两种情况:\n 你只有一个 Github 账户, 则使用带 \u0026ndash;global 的版本. 你有多个 Github 账户, 则使用不带 \u0026ndash;global 的版本.  请替换 your-email 为你自己的 Github 账户邮箱.\n请替换 your-user-name 为你自己的 Github 账户用户名.\n提示输入密码时, 请输入你的 personal access token 而非 github 账户密码, 此规定已于 2021-8-13 启用, 详见: https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/\n请查看此处来生成一个 personal access token.\n 至此, 你的博客网站项目已经创建完毕并可随时同步至 Github (通过 git 命令).\n进阶配置 网站配置 config.yaml 网站域名 baseurl 例如: baseurl: \u0026ldquo;https://blog.zhaijia.fun\u0026rdquo;\n网站名称 title: 快乐宅家\n首页显示的文章数 paginate 设置为简体中文  languageCode: zh-cn DefaultContentLanguage: zh-cn hasCJKLanguage: true 注释掉 languages 以取消多语言设置  网站图标 params.favicon 请把 favicon.ico 放在网站根目录的 static 文件夹下, 这里填写 /favicon.ico .\n左侧边栏 params.sidebar emoji 头像底部的 Emoji, 留空不显示.\n网站介绍 subtitle subtitle: 非常用心地随便写\n头像 avatar  enabled: true 显示头像. local: true 使用本地头像文件. src:  本地头像: 请把图片放在网站根目录的 assets/img 文件夹下. 例如 assets/img/avatar.png, 并填入 img/avatar.png 外部头像: 头像文件网址.    文章 params.article 协议 license 显示在页面底部\n enabled: 是否在所有文章底部显示协议信息. 可以在文章的 Front Matter 插入 license: false 来单独关闭. default: 默认文章协议. 可以在文章的 Front Matter 插入 license: \u0026ldquo;My custom licence\u0026rdquo; 来单独关闭.  default: ZHAIJIA.FUN All Rights Reserved.\n评论系统 params.comments 是否启用评论 enabled enabled: false\n服务提供商 provider  disqus disqusjs utterances remark42 vssue waline twikoo cactus giscus gitalk cusdis  小部件 params.widgets 主页 homepage 普通页 颜色模式 params.colorScheme 是否显示切换按钮 toggle 默认模式 default 可选项:\n auto 自动 light 亮色 dark 暗色  自定义菜单 menu  identifier: Id name: 名称 url: URL weight: 权重 params: icon: 图标 newTab: 是否在新 tab 中打开   主题自带的 SVG 图标来自 Tabler Icons, 存放在 assets/icons 目录下.\n你可以在网站根目录下新建同名文件夹, 并下载更多的图标.\n主题使用了 params.icon 字段来指定菜单项的图标. params.icon: \u0026ldquo;archives\u0026rdquo; 会输出 assets/icons/archives.svg 图标.\n 融合的菜单 左侧边栏此时有5个菜单项:\n 主页: 非可自定义项, 自动添加且无法删除, 并按当前语言 (zh-cn) 本地化. 关于: 融合自 content/page/about/ Archives: 融合自 content/page/archives/ Search: 融合自 content/page/search/ Links: 融合自 content/page/links/  后 4 个菜单项都是融合而来的, 且 \u0026ldquo;关于\u0026rdquo; 菜单项已按当前语言 (zh-cn) 本地化.\n查看目录 content/page/about/ 可以发现其中有两个文件: index.md 和 index.zh-cn.md, 分别对应本地化语言 en (默认语言) 和 zh-cn. 它们都含有 menu Front Matter, 这使得它们出现在左侧边栏的菜单列表中. 此时只需删除该 menu Front Matter 即可移除对应的菜单项.\n如果只需要单一语言菜单项, 比如 zh-cn, 则可只保留 index.md 并对其进行本地化.\n最好在 index.md 中设置英文的 slug Front Matter, 比如 slug: \u0026ldquo;about\u0026rdquo;, 否则将生成类似 http://localhost:1313/关于/ 的 url.\n给分类 / 标签添加图片和简介 创建分类子目录: content/categories/分类名.\n创建标签子目录: content/tags/标签名.\n然后在该子目录下新建文件 _index.md, 内容如下:\n1 2 3 4 5  ---title:\u0026#34;分类名\u0026#34;description:\u0026#34;简介 Blablabla\u0026#34;image:\u0026#34;nichijou.jpg\u0026#34;---   description: 这里是简介.\nimage: 这里是图片, 和 _index.md 放在同一目录下.\n 有关 Stack 主题的更多配置, 请参考此处.\n修改原型 使用以下的 Markdown 代码替换 Hugo 生成的默认原型文件 archetypes/default.md 的内容:\n1 2 3 4 5 6 7 8 9 10 11 12 13  ---title:\u0026#34;{{ replace .Name \u0026#34;-\u0026#34; \u0026#34;\u0026#34; | title }}\u0026#34;description:\u0026#34;\u0026#34;date:{{.Date }}slug:\u0026#34;\u0026#34;draft:trueimage:\u0026#34;\u0026#34;tags:[]categories:[]---\u0026lt;!--more--\u0026gt;   该 default.md 默认设置了下列的 Front Matter 字段:\ntitle: 标题, 即将文件名中的 \u0026ldquo;-\u0026rdquo; 替换为 \u0026quot; \u0026quot; 后的字符串.\ndescription: 副标题.\ndate: 创建时间.\nslug: 自定义 url, 若为 \u0026quot;\u0026quot; (默认值), 则使用文件名作为 url.\ndraft: 是否为草稿, 默认为是.\nimage: 特色图片 (头图), 若为 \u0026quot;\u0026quot; (默认值), 则表示无图.\ntags: 标签数组, 默认为空数组.\ncategories: 分类数组, 默认为空数组.\n\u0026lt;!--more--\u0026gt;: 其上一行 (默认为空行) 作为手工摘要, 但 Stack 主题目前并不在各种列表中显示它.\n Hugo 将为创建的新文章自动添加上述的 Front Matter 字段.\n创建一篇文章 创建示例  以下的命令必须在博客网站项目的根目录下执行!\n 1 2 3 4 5  hugo new post/`date \u0026#34;+%Y/%m\u0026#34;`/my-page-bundle-post/index.md 可得到: Content \u0026#34;/path_to/blog.zhaijia.fun/content/post/2022/02/my-page-bundle-post/index.md\u0026#34; created   这将在 Hugo 的内容目录 /path_to/blog.zhaijia.fun/content 下创建新的 Page Bundle my-page-bundle-post (入口为 index.md), 它的原型是 post, 最终存放于按年份和月份区分的子目录 2022/02 下.\n新的文章 (index.md) 创建完毕后, 只需一个 Markdown 编辑器就可开始写作.\n Page Bundle 是一种内容组织的方式, 它分为:\n Leaf Bundle Branch Bundle  这里使用第一种, 即 Leaf Bundle, 表现为:\n 一个自定义名称的子目录 (此处为 my-page-bundle-post). 一个入口 Markdown 文件 (即 index.md). 一个或多个资源文件 (即图片等文件, 这些文件应该被 Markdown 文件引用).  关于 Page Bundle 的更多信息, 请参考此处.\n 查看该入口文件 (index.md):\n1 2 3 4 5 6 7 8 9 10 11 12 13  ---title:\u0026#34;My Page Bundle Post\u0026#34;description:\u0026#34;\u0026#34;date:2022-02-24T18:49:02+08:00slug:\u0026#34;\u0026#34;draft:trueimage:\u0026#34;\u0026#34;tags:[]categories:[]---\u0026lt;!--more--\u0026gt;  可以看到 Hugo 为其自动添加并初始化了来自默认原型文件 archetypes/default.md 的 Front Matter 字段.\n同步至 Github 远程 Repo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17  #### 查看所有更新的目录/文件 (包括增删改) git status 例如: Untracked files: (use \u0026#34;git add \u0026lt;file\u0026gt;...\u0026#34; to include in what will be committed) content/ #### 添加更新项 git add content/ #### 提交并进行注释 git commit -m \u0026#34;添加了新文章\u0026#34; #### 同步至 Github git push   至此,你的博客网站项目的更新已经同步至 Github (通过 git 命令).\n构建静态博客 1 2 3 4  #### 清空 public 目录 rm -fr public/* hugo --gc --minify   该命令构建静态博客, 并存放在默认的发布目录 public 中. ","date":"2022-04-18T09:49:47+08:00","image":"https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-1/feat-img_huf1a505233af4921ce1e4c63cabe3fe25_529789_120x120_fill_q75_box_smart1.jpg","permalink":"https://blog.zhaijia.fun/p/tutorial-how-to-build-a-personal-blog-part-1/","title":"实战教程: 搭建个人博客 pt.1"}]