[{"content":"简单记一下hugo和主题的使用方法\n安装 最简单常用的方法(官网https://gohugo.io/ 安装指引) 方法1:下载可执行文件,然后设置path环境变量 方法2:管理包方式安装,但我一直没安装管理包工具\ngo程序一般不用安装,除非主题需要用go模块\n主题 方式1: 添加git子模块\ngit submodule add https://github.com/reponame/theme-name.git themes/theme-name 更新\ngit submodule update --remote 或\ncd themes/hugo-theme-luna git pull 方式2: 直接clone主题仓库到themes目录 更新:\ncd themes/hugo-theme-luna git pull 配置 hugo.toml是hugo的配置文件、主题配置文件一般是config.toml或config.yaml。 主题配置一般会替代hugo配置,如果要同时存在的话要在hugo上设置(还不了解), 一般用主题配置就行,如何配置详看主题说明,每个主题不一样。\n语言配置 如果站点有多种语言,要把文章分开放在不同的文件夹里,可以配置默认语言和文章目录\n内容 参考文档:大概了解就行\n内容组织 |雨 果 (gohugo.io)\n页面资源 |雨 果 (gohugo.io)\n图像处理 |雨 果 (gohugo.io)\n目录结构一目了然\n文档索引有两种方式,一是 path/target/index.md ,二是 path/target.md\n. └── content └── about | └── index.md // \u0026lt;- https://example.com/about/ ├── posts | ├── firstpost.md // \u0026lt;- https://example.com/posts/firstpost/ | ├── happy | | └── ness.md // \u0026lt;- https://example.com/posts/happy/ness/ | └── secondpost.md // \u0026lt;- https://example.com/posts/secondpost/ └── quote ├── first.md // \u0026lt;- https://example.com/quote/first/ └── second.md // \u0026lt;- https://example.com/quote/second/ hugo通过检测文档的layout方式来把文档渲染成目标html,如文章、主页、分类页、标签页、归档页、搜索页,以及主题定制的页面等。\n要访问分类、标签、归档、搜索页面,需在访问路径对应的目录下创建index.md文件:(以下例子是单语言环境下的说明)\ncontent/categories/index.md\ncontent/tags/index.md\ncontent/archives/index.md\ncontent/search/index.md\n或\ncontent/categories.md\ncontent/tags.md\ncontent/archives.md\ncontent/search.md\n并在md元数据中写明layout: \u0026quot;categories\u0026quot;等\n--- layout: \u0026#34;categories\u0026#34; --- 腾讯云cos-cdn刷新 腾讯云cos可以便捷地创建一个cdn自动刷新的云函数,但是云函数是收费服务,只要调用一次以上,下个月就得扣12元月费,不划算,可以自己使用腾讯的sdk来做这件事。\nsdk文档 https://cloud.tencent.com/document/sdk 示例 https://console.cloud.tencent.com/api/explorer?product=cdn\u0026amp;version=2018-06-06\u0026amp;action=purgepathcache\ncoding自动构建hugo并上传cos刷新cdn 创建项目 -\u0026gt; 持续集成 -\u0026gt; 构建计划(自定义构建过程)\n需要用到腾讯云api密钥,把它们设置为环境变量:“secret_id”和“secret_key”。\n构建流程文本:jenkinsfile(复制到构建计划配置文本中,可转为图形编辑界面)\npipeline { agent any stages { stage(\u0026#39;检出\u0026#39;) { steps { checkout([ $class: \u0026#39;gitscm\u0026#39;, branches: [[name: git_build_ref]], userremoteconfigs: [[ url: git_repo_url, credentialsid: credentials_id ]]]) } } stage(\u0026#39;hugo构建\u0026#39;) { steps { echo \u0026#39;自定义构建过程开始\u0026#39; sh \u0026#39;\u0026#39;\u0026#39;#echo \u0026#34;获取hugo压缩包 ####### 不稳定,改为仓库上传\u0026#34; #curl -lo https://github.com/gohugoio/hugo/releases/download/v0.116.1/hugo_extended_0.116.1_linux-amd64.tar.gz echo \u0026#34;解压hugo程序 #######\u0026#34; #tar -xf hugo_extended_0.116.1_linux-amd64.tar.gz tar -xf hugo.tar.gz echo \u0026#34;给予hugo执行权限\u0026#34; chmod +x hugo echo \u0026#34;开始构建...\u0026#34; #./hugo ./hugo -v --minify --cleandestinationdir\u0026#39;\u0026#39;\u0026#39; } } stage(\u0026#39;上传cos并刷新cdn\u0026#39;) { steps { usecustomstepplugin(key: \u0026#39;system:cos_upload\u0026#39;, version: \u0026#39;latest\u0026#39;, params: [local:\u0026#39;public/\u0026#39;,remote:\u0026#39;/\u0026#39;,secret_id:\u0026#39;$secret_id\u0026#39;,secret_key:\u0026#39;$secret_key\u0026#39;,region:\u0026#39;ap-guangzhou\u0026#39;,bucket:\u0026#39;xxxxx-1258145685\u0026#39;]) usecustomstepplugin(key: \u0026#39;system:exec_py_script\u0026#39;, version: \u0026#39;latest\u0026#39;, params: [script:\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;\u0026#34;,script_path:\u0026#39;./cos-cdn-flush.py\u0026#39;,requirements:\u0026#34;\u0026#34;\u0026#34;tencentcloud-sdk-python-cdn\u0026#34;\u0026#34;\u0026#34;,site_packages:true]) } } } } 要填好cos存储桶信息,把cdn刷新代码放在仓库目录下\n刷新cdn的python代码:cos-cdn-flush.py\nimport os import json from tencentcloud.common import credential from tencentcloud.common.profile.client_profile import clientprofile from tencentcloud.common.profile.http_profile import httpprofile from tencentcloud.common.exception.tencent_cloud_sdk_exception import tencentcloudsdkexception from tencentcloud.cdn.v20180606 import cdn_client, models try: # 实例化一个认证对象,入参需要传入腾讯云账户 secretid 和 secretkey,此处还需注意密钥对的保密 # 代码泄露可能会导致 secretid 和 secretkey 泄露,并威胁账号下所有资源的安全性。以下代码示例仅供参考,建议采用更安全的方式来使用密钥,请参见:https://cloud.tencent.com/document/product/1278/85305 # 密钥可前往官网控制台 https://console.cloud.tencent.com/cam/capi 进行获取 #cred = credential.credential(\u0026#34;secretid\u0026#34;, \u0026#34;secretkey\u0026#34;) # 从控制台(conding控制台)设置一组凭证类变量 cred = credential.credential( os.environ.get(\u0026#34;secret_id\u0026#34;), os.environ.get(\u0026#34;secret_key\u0026#34;)) # 实例化一个http选项,可选的,没有特殊需求可以跳过 httpprofile = httpprofile() httpprofile.endpoint = \u0026#34;cdn.tencentcloudapi.com\u0026#34; # 实例化一个client选项,可选的,没有特殊需求可以跳过 clientprofile = clientprofile() clientprofile.httpprofile = httpprofile # 实例化要请求产品的client对象,clientprofile是可选的 client = cdn_client.cdnclient(cred, \u0026#34;\u0026#34;, clientprofile) # 实例化一个请求对象,每个接口都会对应一个request对象 req = models.purgepathcacherequest() params = { \u0026#34;paths\u0026#34;: [ \u0026#34;https://oulh.top\u0026#34; ], \u0026#34;flushtype\u0026#34;: \u0026#34;flush\u0026#34; } req.from_json_string(json.dumps(params)) # 返回的resp是一个purgepathcacheresponse的实例,与请求对象对应 resp = client.purgepathcache(req) # 输出json格式的字符串回包 print(resp.to_json_string()) except tencentcloudsdkexception as err: print(err) ","date":"2023-07-30","permalink":"https://oulh.top/posts/hugo/usage-of-hugo/","summary":"简单记一下hugo和主题的使用方法 安装 最简单常用的方法(官网https://gohugo.io/ 安装指引) 方法1:下载可执行文件,然后设置PATH环境变量 方法2","title":"usage of hugo"},{"content":"现在有 docker 容器运行的两个 web 应用,两个域名,我希望只用80端口访问这两个web站点,其中一个要部署ssl。下面将通过 nginx 反向代理来实现。\n操作环境:\n主机:单台主机,一个公网ip\n相关容器\nnginxproxy 用作nginx反向代理 (版本:nginx/1.23.1)(镜像:nginx:alpine)\njenkins 站点1\nnginx-oulh 站点2\ndocker network 设定 给各个容器分配同一个网络,并且设置别名分别为nginxproxy、jenkins、nginx-oulh,可以直接使用别名来互相通信,也避免ip地址变动带来的麻烦\n[leo@centos7 ~]$docker network create webservice b099067fea347f8f710e0c4cc10ad1e63fc65694e46b714557f8cd0336453fef [leo@centos7 ~]$ [leo@centos7 ~]$docker network connect --alias nginxproxy webservice nginxproxy [leo@centos7 ~]$docker network connect --alias jenkins webservice jenkins [leo@centos7 ~]$docker network connect --alias nginx-oulh webservice nginx-oulh 各容器ip端口映射:\n[leo@centos7 ~]$docker ps -f network=webservice container id image command created status ports names c3f0f9a0086f oulh/nginxproxy:alpine \u0026#34;/docker-entrypoint.…\u0026#34; 21 hours ago up 17 minutes 0.0.0.0:80-\u0026gt;80/tcp, 0.0.0.0:443-\u0026gt;443/tcp nginxproxy 734a00cb48a0 nginx:alpine \u0026#34;/docker-entrypoint.…\u0026#34; 26 hours ago up 26 hours 0.0.0.0:7788-\u0026gt;80/tcp nginx-oulh cac54b64a4cf jenkinsci/blueocean \u0026#34;/sbin/tini -- /usr/…\u0026#34; 2 days ago up 40 hours 0.0.0.0:8080-\u0026gt;8080/tcp, 50000/tcp jenkins nginx 代理配置 被代理站点的配置不用改动,只需在 nginxproxy 容器中对两个站点进行代理设置就行了。\n创建两个conf文件\n[leo@centos7 ~]$docker exec -it nginxproxy sh / # cp /etc/nginx/conf.d/default.conf jenkins.conf / # cp /etc/nginx/conf.d/default.conf nginx-oulh.conf jenkins.conf\n注意,这里因为 jenkins 服务监听的是8080端口,所以要加上8080端口\n# jenkins.conf server { listen 80; listen [::]:80; server_name jks.oulh.ml; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://jenkins:8080; # proxy_pass http://172.17.0.3:8080; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } nginx-oulh.conf (不带ssl)\n# nginx-oulh.conf server { listen 80; listen [::]:80; server_name www.oulh.ml; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://nginx-oulh; # proxy_pass http://172.17.0.4; } # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 配置文件更改完后记得重载 nginx 服务 : nginx -s reload\n反向代理部署 ssl 在代理服务器上部署就行了,因为浏览器不知道、更不用理会代理服务器和站点服务器之间的通信。\n要么在代理服务器(nginxproxy 容器)上部署,要么两台服务器都部署,不能只在站点服务器(nginx-oulh 容器)上部署。\n把 oulh.ml 站点的ssl证书相关文件下载到代理服务器上,主要是 .crt 和 .key 两个文件。\n# nginx-oulh.conf server { listen 443 ssl; listen 80; # 绑定证书的域名 server_name www.oulh.ml; # 证书文件的相对路径或绝对路径 ssl_certificate conf.d/sslcrt/oulh.ml_bundle.crt; # 私钥文件的相对路径或绝对路径 ssl_certificate_key conf.d/sslcrt/oulh.ml.key; ssl_session_timeout 5m; ssl_protocols tlsv1.2 tlsv1.3; ssl_ciphers ecdhe-rsa-aes128-gcm-sha256:high:!anull:!md5:!rc4:!dhe; ssl_prefer_server_ciphers on; #access_log /var/log/nginx/host.access.log main; location / { proxy_pass http://nginx-oulh; # proxy_pass http://172.17.0.4; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 小坑:我把ssl文件放在了 /etc/nginx/conf.d/sslcrt 目录下,nginx-oulh.conf 文件位于/etc/nginx/conf.d/ ,但它似乎以 /etc/nginx 为根目录,当我填写相对路径 sslcrt/oulh.ml_bundle.crt 的时候会报错\n/etc/nginx/conf.d # nginx -t 2022/08/26 11:33:34 [emerg] 79#79: cannot load certificate \u0026#34;/etc/nginx/sslcrt/oulh.ml_bundle.crt\u0026#34;: bio_new_file() failed (ssl: error:02001002:system library:fopen:no such file or directory:fopen(\u0026#39;/etc/nginx/sslcrt/oulh.ml_bundle.crt\u0026#39;,\u0026#39;r\u0026#39;) error:2006d080:bio routines:bio_new_file:no such file) nginx: [emerg] cannot load certificate \u0026#34;/etc/nginx/sslcrt/oulh.ml_bundle.crt\u0026#34;: bio_new_file() failed (ssl: error:02001002:system library:fopen:no such file or directory:fopen(\u0026#39;/etc/nginx/sslcrt/oulh.ml_bundle.crt\u0026#39;,\u0026#39;r\u0026#39;) error:2006d080:bio routines:bio_new_file:no such file) nginx: configuration file /etc/nginx/nginx.conf test faile http 自动跳转 https 将 http 请求自动重定向到 https,可以通过以下操作设置:\n在页面中添加 js 脚本。 在后端程序中添加重定向。 通过 web 服务器实现跳转。 nginx 支持 rewrite 功能。若您在编译时没有去掉 pcre,您可在 http 的 server 中增加 return 301 https://$host$request_uri;,即可将默认80端口的请求重定向为 https # nginx-oulh.conf server { listen 80; server_name www.oulh.ml; return 301 https://$host$request_uri; } server { listen 443 ssl; # listen 80; # 绑定证书的域名 server_name www.oulh.ml; # 证书文件的相对路径或绝对路径 ssl_certificate conf.d/sslcrt/oulh.ml_bundle.crt; # 私钥文件的相对路径或绝对路径 ssl_certificate_key conf.d/sslcrt/oulh.ml.key; ssl_session_timeout 5m; ssl_protocols tlsv1.2 tlsv1.3; ssl_ciphers ecdhe-rsa-aes128-gcm-sha256:high:!anull:!md5:!rc4:!dhe; ssl_prefer_server_ciphers on; location / { proxy_pass http://nginx-oulh; # proxy_pass http://172.17.0.4; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } } 参考:\nssl 证书 国际标准 ssl 证书安装-证书安装-文档中心-腾讯云 (tencent.com)\nnginx 官方文档:\nproxy 模块说明\nssl 模块说明\n","date":"0001-01-01","permalink":"https://oulh.top/posts/docker-nginx-proxy/","summary":"现在有 docker 容器运行的两个 web 应用,两个域名,我希望只用80端口访问这两个web站点,其中一个要部署SSL。下面将通过 nginx 反向代理来实现。 操作环境: 主机:单台主机,一个","title":"docker容器间用nginx反向代理"},{"content":"关联git项目,只要push就自动构建,部署站点,像腾讯云托管、clouflare、netlify、vercel 等云服务商都有这样的服务。来看看在服务器上怎么实现这个过程。\n本文操作环境:\n腾讯云轻量应用服务器 docker v18.06 本文相关:\ndocker、jenkins、github、webhook、nginx、node.js、vuepress\ngithub 准备 创建 github personal access tokens personal access tokens 是 github 的用户令牌,可替代用户密码用于账号验证,可自由设置令牌权限和有效期。\n在本文中用于 github 仓库验证以及 github server 的验证。\n设置步骤:\ngithub 头像 - settings - developer settings - personal access tokens 选择 generate new token\n在 权限选择里 勾选 repo和admin:repo hook\n底下那串字符就是 access token,只出现一次,必须复制保存\nwebhook 设置 实现自动拉取git仓库的重要步骤,相当于一个触发器,当仓库push的时候,会立刻向jenkins服务器发送通知。\n设置步骤:\n在相应仓库的设置里,找到 webhooks ,add webhook,填写 payload url ,其他选项默认值就行。\npayload url 可以从 jenkins github服务器设置 的帮助信息中获取,默认一般是jenkins服务器地址/github-webhook/ 。最后面一定要加 /\njenkins 准备 本文使用 docker 版的jenkins,使用的是 jenkins 社区推荐的镜像:jenkinsci/blueocean\n安装 jenkins 创建并启动 jenkins 容器\ndocker run \\ --name jenkins \\ -d -u root -p 8080:8080 \\ -v jenkins-data:/var/jenkins_home \\ -v /var/run/docker.sock:/var/run/docker.sock \\ -v \u0026#34;$home/jenkins/home\u0026#34;:/home \\ jenkinsci/blueocean 同步容器时间\n该镜像的默认时间与中国大陆不同步,exec进入容器去更正一下\n# 进入容器shell [leo@centos7 jenkins]$docker exec -it jenkins bash # 在容器shell中创建指向上海时间的软链接 bash-5.1# ln -sf /usr/share/zoneinfo/asia/shanghai /etc/localtime 访问 jenkins 服务\n默认地址是 服务器地址:8080\n首次访问需要输入admin密码,获取方式:\n# 容器shell获取 bash-5.1# cat /var/jenkins_home/secrets/initialadminpassword 6909873bb98b455xxxxbe0c8a08361ec # 对应宿主机目录: /var/lib/docker/volumes/jenkins-data/_data/secrets/initialadminpassword 接着是安装插件,选择 推荐安装 就行;\n创建用户;\n登陆用户。\n更新和安装相关插件 安装 docker 相关插件\ndocker commons docker pipeline 插件管理 - 可选插件 - 搜索\n更新 git 相关插件\ngit client plugin 和 github plugin 是接下来的构建任务必要的插件,现这两个插件发布了警告,还是更新一下吧,以免影响后续步骤。\n在 插件管理 - “可更新” 选项里搜索 “git”,并勾选,点击“下载待重启后安装”\n更新插件需要重启 jenkins 。可在宿主机使用docker restart命令\n添加 github 凭证 添加两个凭证\n用于 github 仓库访问验证 选择 username with password 类型,username 填 github 用户名,password 填 github 的 personal access token\n用于 github server 设置,以验证 github webhook 发送的post请求\n选择 secret text 类型,secret 填写 github personal access token\n设置 github server 在系统配置中添加 github 服务器\n点击测试,显示图示这样表示连接成功。\ngithub 服务器 帮助信息中的url用于 webhook 设置\n创建 jenkins 任务 任务配置 新建任务,选择流水线\n填写 github 项目地址\n“构建触发器” 选择 github hook trigger for gitscm polling\n流水线设置,选择 scm - git ,设置仓库地址、凭证,指定分支\njenkinsfile 脚本路径,默认在根目录。\njenkinsfile 配置 jenkinsfile 用于定义构建流程,是 jenkins 自动构建的关键步骤。\n任务配置中设置了脚本路径为“./jenkinsfile”,所以我们要在项目的根目录下创建名为“jenkinsfile”的文件,写入构建流程:\n示例构建的是基于 vue3 的 vuepress2.0 静态站点\npipeline { agent { docker { image \u0026#39;node:lts-alpine3.15\u0026#39; } } stages { stage(\u0026#39;install modules\u0026#39;) { steps { sh \u0026#39;npm install\u0026#39; } } stage(\u0026#39;build\u0026#39;) { steps { sh \u0026#39;yarn docs:build\u0026#39; } } } } 任务步骤分析 根据任务配置,在 jenkinsfile 作用前,jenkins 会先通过 scm 拉取github 仓库的代码,并存在任务目录下:/var/jenkins_home/workspace/\u0026lt;任务名\u0026gt;\n根据 jenkinsfile ,接着 jenkins 会拉取node:lts-alpine3.15镜像,启动一个node容器,该node容器与jenkins共享数据卷,并以 /var/jenkins_home/workspace/\u0026lt;任务名\u0026gt; 为工作目录。接着在容器中运行npm install 和 yarn docs:build命令。\n根据 vuepress 的特点,build 之后会得到一个dist目录,存放在站点数据。\n本文最后目标就是将 dist 目录交付给 nginx 应用。\n构建和部署 任务构建 构建方式\n在 jenkins web 页面手动点击构建 push 代码到 github 仓库,自动触发构建 手动构建 有多处点击构建的按钮.左侧边栏选择\u0026quot;打开 blue ocean\u0026quot;,演示更加直观\n第一次构建失败了(乌龟 github,让我不得不动用 /etc/hosts,https://raw.hellogithub.com/hosts ,早知直接用 gitee 好了)\n看第二次\n自动构建 先行条件:\ngithub 正确设置了jenkins服务器的webhook地址 jenkins 设置了 github 服务器api地址和凭据,且连接测试成功 jenkins 任务的\u0026quot;构建触发器\u0026quot;勾选了\u0026quot;github hook trigger for gitscm polling\u0026quot; 自动构建过程:\npush 代码到 github\npush操作触发了 github webhook,并向 jenkins 服务器发送一个post请求\njenkins 收到 github 的信息,触发构建\njenkins 的轮询(scm)日志:\n值得注意的是,由于我push了两个分支,触发了两次 webhook\ngithub hosts (可选) 这次用的是国内的腾讯服务器,github访问很不稳定,故用更新 hosts 的方法提高稳定性。\n#!/bin/ash set -e if ! test -f /etc/hosts.bak then cp /etc/hosts /etc/hosts.bak else echo \u0026#34;hosts.bak is existed\u0026#34; fi cd /home/autotask if test -f hosts then wget -o newhosts https://raw.hellogithub.com/hosts else wget https://raw.hellogithub.com/hosts cat /etc/hosts.bak \u0026gt; /etc/hosts cat hosts \u0026gt;\u0026gt; /etc/hosts fi if test -n \u0026#34;`diff hosts newhosts`\u0026#34; then cat /etc/hosts.bak \u0026gt; /etc/hosts cat newhosts \u0026gt; hosts cat hosts \u0026gt;\u0026gt; /etc/hosts echo \u0026#34;github hosts changed\u0026#34; fi 设置 crontab 任务,每30分钟检测一次hosts更新\nbash-5.1# crontab -e bash-5.1# crontab -l # min\thour\tday\tmonth\tweekday\tcommand */30 * * * * /home/autotask/updatehostsforgithub.sh # 启动crond bash-5.1# find / -name crond /usr/sbin/crond bash-5.1# /usr/sbin/crond bash-5.1# ps |grep crond 2437 root 0:00 /usr/sbin/crond 2440 root 0:00 grep crond 创建nginx容器 docker run \\ --name nginx-mysite \\ -d \\ -p 80:80 \\ -v /var/lib/docker/volumes/jenkins-data/_data/workspace/mysite/docs/.vuepress/dist:/usr/share/nginx/html \\ nginx:alpine 前面由构建步骤获得了站点目录dist,现在只需创建一个nginx容器,把dist目录挂载到nginx容器的/usr/share/nginx/html目录就行了。\ndist 目录在宿主机的具体位置可以推演得到:\ndocker 容器的数据卷位置是 /var/lib/docker/volumes/\u0026lt;卷名\u0026gt;/_data 创建 jenkins 容器时挂载参数是 -v jenkins-data:/var/jenkins_home 本次 jenkins 任务名为“mysite”,所以该任务根目录是 /var/jenkins_home/workspace/mysite, vuepress项目默认构建的 dist 目录位于 docs/.vuepress/dist dist 目录在 jenkins 中的位置是:/var/jenkins_home/workspace/mysite/docs/.vuepress/dist\ndist 目录在 宿主机的位置是:/var/lib/docker/volumes/jenkins-data/_data/workspace/mysite/docs/.vuepress/dist\n","date":"0001-01-01","permalink":"https://oulh.top/posts/jenkins-docker-github-auto%E8%87%AA%E5%8A%A8%E6%9E%84%E5%BB%BA%E9%83%A8%E7%BD%B2/","summary":"关联git项目,只要push就自动构建,部署站点,像腾讯云托管、Clouflare、Netlify、Vercel 等云服务商都有这样的服务。来看看在服务器上怎么实","title":"jenkins+docker+github自动构建和部署站点"},{"content":"algolia 提供精确到正文每一个字的内容搜索服务,申请 algolia 的免费托管无果,故自己运行 algolia 的爬虫来爬取我的网站。\nalgolia 提供 docker 镜像来实现这件事,比较关键的是针对 docusaurus 的 config.json 配置。\n注册 algolia algolia 的 爬虫程序 config.json 配置建议 config.json 样例 docusaurus json 配置 如果config.json 配置不对,即使爬虫程序有命中记录,在前端也无法正常显示搜索结果。\n正确可行的配置(参考样例):\n{ \u0026#34;index_name\u0026#34;: \u0026#34;oulh\u0026#34;, \u0026#34;start_urls\u0026#34;: [ \u0026#34;https://www.oulh.ml\u0026#34; ], \u0026#34;sitemap_urls\u0026#34;: [ \u0026#34;https://www.oulh.ml/sitemap.xml\u0026#34; ], \u0026#34;sitemap_alternate_links\u0026#34;: true, \u0026#34;stop_urls\u0026#34;: [ \u0026#34;/tests\u0026#34; ], \u0026#34;selectors\u0026#34;: { \u0026#34;lvl0\u0026#34;: { \u0026#34;selector\u0026#34;: \u0026#34;(//ul[contains(@class,\u0026#39;menu__list\u0026#39;)]//a[contains(@class, \u0026#39;menu__link menu__link--sublist menu__link--active\u0026#39;)]/text() | //nav[contains(@class, \u0026#39;navbar\u0026#39;)]//a[contains(@class, \u0026#39;navbar__link--active\u0026#39;)]/text())[last()]\u0026#34;, \u0026#34;type\u0026#34;: \u0026#34;xpath\u0026#34;, \u0026#34;global\u0026#34;: true, \u0026#34;default_value\u0026#34;: \u0026#34;documentation\u0026#34; }, \u0026#34;lvl1\u0026#34;: \u0026#34;header h1\u0026#34;, \u0026#34;lvl2\u0026#34;: \u0026#34;article h2\u0026#34;, \u0026#34;lvl3\u0026#34;: \u0026#34;article h3\u0026#34;, \u0026#34;lvl4\u0026#34;: \u0026#34;article h4\u0026#34;, \u0026#34;lvl5\u0026#34;: \u0026#34;article h5, article td:first-child\u0026#34;, \u0026#34;lvl6\u0026#34;: \u0026#34;article h6\u0026#34;, \u0026#34;text\u0026#34;: \u0026#34;article p, article li, article td:last-child\u0026#34; }, \u0026#34;strip_chars\u0026#34;: \u0026#34; .,;:#\u0026#34;, \u0026#34;custom_settings\u0026#34;: { \u0026#34;separatorstoindex\u0026#34;: \u0026#34;_\u0026#34;, \u0026#34;attributesforfaceting\u0026#34;: [ \u0026#34;language\u0026#34;, \u0026#34;version\u0026#34;, \u0026#34;type\u0026#34;, \u0026#34;docusaurus_tag\u0026#34; ], \u0026#34;attributestoretrieve\u0026#34;: [ \u0026#34;hierarchy\u0026#34;, \u0026#34;content\u0026#34;, \u0026#34;anchor\u0026#34;, \u0026#34;url\u0026#34;, \u0026#34;url_without_anchor\u0026#34;, \u0026#34;type\u0026#34; ] } } 格式化config.json为字符串 **方法一:**jq 在线工具 :https://jqplay.org\n务必勾选 ”raw output“\n方法二: 用容器运行 jq工具\n1、dockerfile\nfrom alpine:latest arg jq_version=\u0026#39;1.5\u0026#39; run wget --no-check-certificate https://raw.githubusercontent.com/stedolan/jq/master/sig/jq-release.key -o /tmp/jq-release.key \u0026amp;\u0026amp; \\ wget --no-check-certificate https://raw.githubusercontent.com/stedolan/jq/master/sig/v${jq_version}/jq-linux64.asc -o /tmp/jq-linux64.asc \u0026amp;\u0026amp; \\ wget --no-check-certificate https://github.com/stedolan/jq/releases/download/jq-${jq_version}/jq-linux64 -o /tmp/jq-linux64 \u0026amp;\u0026amp; \\ apk add gpg gpg-agent \u0026amp;\u0026amp; \\ gpg --import /tmp/jq-release.key \u0026amp;\u0026amp; \\ gpg --verify /tmp/jq-linux64.asc /tmp/jq-linux64 \u0026amp;\u0026amp; \\ cp /tmp/jq-linux64 /usr/bin/jq \u0026amp;\u0026amp; \\ chmod +x /usr/bin/jq \u0026amp;\u0026amp; \\ rm -f /tmp/jq-release.key \u0026amp;\u0026amp; \\ rm -f /tmp/jq-linux64.asc \u0026amp;\u0026amp; \\ rm -f /tmp/jq-linux64 cmd [\u0026#34;/bin/sh\u0026#34;,\u0026#34;-c\u0026#34;,\u0026#34;echo $config_json |jq -r tostring\u0026#34;] 2、构建镜像\n$ docker build -t oulh/jqtool --no-cache --force-rm . 注:大陆访问 github 很不稳定,可能导致 jq 安装不成功,构建镜像之前添加最新的 github hosts 有所帮助\n更新 github hosts:\n#!/bin/bash set -e if ! test -f /etc/hosts.bak then cp /etc/hosts /etc/hosts.bak else echo \u0026#34;hosts.bak is existed\u0026#34; fi if [ $(command -v curl) ]; then curl -o githubhosts https://raw.hellogithub.com/hosts else wget -o githubhosts https://raw.hellogithub.com/hosts fi cat /etc/hosts.bak \u0026gt; /etc/hosts cat githubhosts \u0026gt;\u0026gt; /etc/hosts echo \u0026#34;/etc/hosts replaced\u0026#34; 3、运行容器处理 json\n通过 -e 把变量传给\n[leo@centos7 algolia]$docker run --rm -e \u0026#34;config_json=$(cat /path/to/config.json)\u0026#34; oulh/jqtool {\u0026#34;index_name\u0026#34;:\u0026#34;oulh\u0026#34;,\u0026#34;start_urls\u0026#34;:[\u0026#34;https://www.oulh.ml\u0026#34;],\u0026#34;sitemap_urls\u0026#34;:[\u0026#34;https://www.oulh.ml/sitemap.xml\u0026#34;],\u0026#34;sitemap_alternate_links\u0026#34;:true,\u0026#34;stop_urls\u0026#34;:[\u0026#34;/tests\u0026#34;],\u0026#34;selectors\u0026#34;:{\u0026#34;lvl0\u0026#34;:{\u0026#34;selector\u0026#34;:\u0026#34;(//ul[contains(@class,\u0026#39;menu__list\u0026#39;)]//a[contains(@class, \u0026#39;menu__link menu__link--sublist menu__link--active\u0026#39;)]/text() | //nav[contains(@class, \u0026#39;navbar\u0026#39;)]//a[contains(@class, \u0026#39;navbar__link--active\u0026#39;)]/text())[last()]\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;xpath\u0026#34;,\u0026#34;global\u0026#34;:true,\u0026#34;default_value\u0026#34;:\u0026#34;documentation\u0026#34;},\u0026#34;lvl1\u0026#34;:\u0026#34;header h1\u0026#34;,\u0026#34;lvl2\u0026#34;:\u0026#34;article h2\u0026#34;,\u0026#34;lvl3\u0026#34;:\u0026#34;article h3\u0026#34;,\u0026#34;lvl4\u0026#34;:\u0026#34;article h4\u0026#34;,\u0026#34;lvl5\u0026#34;:\u0026#34;article h5, article td:first-child\u0026#34;,\u0026#34;lvl6\u0026#34;:\u0026#34;article h6\u0026#34;,\u0026#34;text\u0026#34;:\u0026#34;article p, article li, article td:last-child\u0026#34;},\u0026#34;strip_chars\u0026#34;:\u0026#34; .,;:#\u0026#34;,\u0026#34;custom_settings\u0026#34;:{\u0026#34;separatorstoindex\u0026#34;:\u0026#34;_\u0026#34;,\u0026#34;attributesforfaceting\u0026#34;:[\u0026#34;language\u0026#34;,\u0026#34;version\u0026#34;,\u0026#34;type\u0026#34;,\u0026#34;docusaurus_tag\u0026#34;],\u0026#34;attributestoretrieve\u0026#34;:[\u0026#34;hierarchy\u0026#34;,\u0026#34;content\u0026#34;,\u0026#34;anchor\u0026#34;,\u0026#34;url\u0026#34;,\u0026#34;url_without_anchor\u0026#34;,\u0026#34;type\u0026#34;]}} jq tool wiki:installation · stedolan/jq wiki (github.com)\n通过 docker image 运行爬虫 .env 文件:\nalgolia的应用 id 和 api 密钥 ,以及上一步处理后的 config.json 内容。ps:api密钥必须是admin密钥。\napplication_id=rcztb3yfr0 api_key=af63446b8a0e08122332eb8085a05595 config={\u0026#34;index_name\u0026#34;:\u0026#34;oulh\u0026#34;,\u0026#34;start_urls\u0026#34;:[\u0026#34;https://www.oulh.ml\u0026#34;],\u0026#34;sitemap_urls\u0026#34;:[\u0026#34;https://www.oulh.ml/sitemap.xml\u0026#34;],\u0026#34;sitemap_alternate_links\u0026#34;:true,\u0026#34;stop_urls\u0026#34;:[\u0026#34;/tests\u0026#34;],\u0026#34;selectors\u0026#34;:{\u0026#34;lvl0\u0026#34;:{\u0026#34;selector\u0026#34;:\u0026#34;(//ul[contains(@class,\u0026#39;menu__list\u0026#39;)]//a[contains(@class, \u0026#39;menu__link menu__link--sublist menu__link--active\u0026#39;)]/text() | //nav[contains(@class, \u0026#39;navbar\u0026#39;)]//a[contains(@class, \u0026#39;navbar__link--active\u0026#39;)]/text())[last()]\u0026#34;,\u0026#34;type\u0026#34;:\u0026#34;xpath\u0026#34;,\u0026#34;global\u0026#34;:true,\u0026#34;default_value\u0026#34;:\u0026#34;documentation\u0026#34;},\u0026#34;lvl1\u0026#34;:\u0026#34;header h1\u0026#34;,\u0026#34;lvl2\u0026#34;:\u0026#34;article h2\u0026#34;,\u0026#34;lvl3\u0026#34;:\u0026#34;article h3\u0026#34;,\u0026#34;lvl4\u0026#34;:\u0026#34;article h4\u0026#34;,\u0026#34;lvl5\u0026#34;:\u0026#34;article h5, article td:first-child\u0026#34;,\u0026#34;lvl6\u0026#34;:\u0026#34;article h6\u0026#34;,\u0026#34;text\u0026#34;:\u0026#34;article p, article li, article td:last-child\u0026#34;},\u0026#34;strip_chars\u0026#34;:\u0026#34; .,;:#\u0026#34;,\u0026#34;custom_settings\u0026#34;:{\u0026#34;separatorstoindex\u0026#34;:\u0026#34;_\u0026#34;,\u0026#34;attributesforfaceting\u0026#34;:[\u0026#34;language\u0026#34;,\u0026#34;version\u0026#34;,\u0026#34;type\u0026#34;,\u0026#34;docusaurus_tag\u0026#34;],\u0026#34;attributestoretrieve\u0026#34;:[\u0026#34;hierarchy\u0026#34;,\u0026#34;content\u0026#34;,\u0026#34;anchor\u0026#34;,\u0026#34;url\u0026#34;,\u0026#34;url_without_anchor\u0026#34;,\u0026#34;type\u0026#34;]}} 万事俱备,跑起来\n[leo@centos7 algolia]$docker run --rm -it --env-file=.env algolia/docsearch-scraper \u0026gt; docsearch: https://www.oulh.ml 1 records) \u0026gt; docsearch: https://www.oulh.ml/docs/example/tutorial-extras/translate-your-site 19 records) \u0026gt; docsearch: https://www.oulh.ml/docs/example/tutorial-basics/congratulations 12 records) \u0026gt; docsearch: https://www.oulh.ml/docs/intro 17 records) \u0026gt; docsearch: https://www.oulh.ml/docs/category/%e9%98%bf%e9%87%8c%e4%ba%91-ecs 13 records) ... \u0026gt; docsearch: https://www.oulh.ml/blog 8 records) \u0026gt; docsearch: https://www.oulh.ml/bak/ 1 records) nb hits: 4702 最后在站点前端配置 algolia 的 api 信息就可以了\n参考 search | docusaurus\nalgolia: { // algolia 提供的应用 id appid: \u0026#39;yourappid\u0026#39;, // 公开 api 密钥 apikey: \u0026#39;yoursearchapikey\u0026#39;, indexname: \u0026#39;oulh\u0026#39;, ","date":"0001-01-01","permalink":"https://oulh.top/posts/run-algolia-rawler-for-docusauru/","summary":"Algolia 提供精确到正文每一个字的内容搜索服务,申请 Algolia 的免费托管无果,故自己运行 Algolia 的爬虫来爬取我的网站。 Algolia 提供 docker 镜像来实现这件事,比较关键的是针对 docusaurus 的 config.json 配置。 注册 Algolia Algolia 的","title":"为docusauru网站运行 algolia docsearch 爬虫"},]
✖