- Welcome to my blog
- 欢迎来到我的博客
- 记录 分享 成长
- 如果您有任何问题,请联系我
- ✉️ prosivest@hotmail.com
Docker中开放的端口使用firewall cmd --list all命令无法查到
参考chatgpt 5.2 因为它只列出 Firewalld 自己管理的规则,而不显示其他程序(如 Docker)直接插入到内核 iptables 表中的规则。 如何正确查看到这些端口规则? 虽然 firewall-cmd 查不到,但你可以通过以下几种底层方式验证端口是否在系统层面被开放: 1. 直接查看 iptables 的 nat 表(最底层真相) Docker 的端口映射主要在 nat 表中做 DNAT(目标地址转换)。你可以使用以下命令查看: 1 iptables -t nat -L -n | grep DOCKER 或者查看 Docker 专门的过滤链规则: 1 iptables -L DOCKER -n 2. 查看系统网络监听状态 使用 netstat 或 ss 命令可以看到 Docker 代理进程(docker-proxy)是否正在监听宿主机的端口: 1 2 3 netstat -tulnp | grep docker 或者 ss -tulnp | grep docker 3. 使用 Docker 命令查看 当然,最直接的方法是查询 Docker 自身的配置: ...
VPS通过Certbot自动申请及更新HTTPS网站SSL证书
参考:https://developer.aliyun.com/article/1676749 安装 Certbot 不同系统安装方式略有不同,这里给你 CentOS / RHEL 和 Debian / Ubuntu 的常用方法。 CentOS / RHEL 7/8/9 1 2 3 4 # 安装 EPEL sudo yum install epel-release -y # 安装 Certbot 和 Nginx 插件(如果用 Apache 就换成 python3-certbot-apache) sudo yum install certbot python3-certbot-nginx -y Debian / Ubuntu 1 2 sudo apt update sudo apt install certbot python3-certbot-nginx -y 申请 SSL 证书 如果你用 Nginx: 1 sudo certbot --nginx -d [example.com](http://example.com/) -d [www.example.com](http://www.example.com/) -d 参数后面写你的域名(可以多个) ...
Hugo侧边目录
1. 添加toc.html 在layouts/partials目录下新建toc.html文件,内容如下: 1 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 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 {{- $headers := findRE "<h[1-6].*?>(.|\n])+?</h[1-6]>" .Content -}} {{- $has_headers := ge (len $headers) 1 -}} {{- if $has_headers -}} <aside id="toc-container" class="toc-container wide"> <div class="toc"> <details {{if (.Param "TocOpen") }} open{{ end }}> <summary accesskey="c" title="(Alt + C)"> <span class="details">{{- i18n "toc" | default "Table of Contents" }}</span> </summary> <div class="inner"> {{- $largest := 6 -}} {{- range $headers -}} {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} {{- $headerLevel := len (seq $headerLevel) -}} {{- if lt $headerLevel $largest -}} {{- $largest = $headerLevel -}} {{- end -}} {{- end -}} {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} {{- $.Scratch.Set "bareul" slice -}} <ul> {{- range seq (sub $firstHeaderLevel $largest) -}} <ul> {{- $.Scratch.Add "bareul" (sub (add $largest .) 1) -}} {{- end -}} {{- range $i, $header := $headers -}} {{- $headerLevel := index (findRE "[1-6]" . 1) 0 -}} {{- $headerLevel := len (seq $headerLevel) -}} {{/* get id="xyz" */}} {{- $id := index (findRE "(id=\"(.*?)\")" $header 9) 0 }} {{- /* strip id="" to leave xyz, no way to get regex capturing groups in hugo */ -}} {{- $cleanedID := replace (replace $id "id=\"" "") "\"" "" }} {{- $header := replaceRE "<h[1-6].*?>((.|\n])+?)</h[1-6]>" "$1" $header -}} {{- if ne $i 0 -}} {{- $prevHeaderLevel := index (findRE "[1-6]" (index $headers (sub $i 1)) 1) 0 -}} {{- $prevHeaderLevel := len (seq $prevHeaderLevel) -}} {{- if gt $headerLevel $prevHeaderLevel -}} {{- range seq $prevHeaderLevel (sub $headerLevel 1) -}} <ul> {{/* the first should not be recorded */}} {{- if ne $prevHeaderLevel . -}} {{- $.Scratch.Add "bareul" . -}} {{- end -}} {{- end -}} {{- else -}} </li> {{- if lt $headerLevel $prevHeaderLevel -}} {{- range seq (sub $prevHeaderLevel 1) -1 $headerLevel -}} {{- if in ($.Scratch.Get "bareul") . -}} </ul> {{/* manually do pop item */}} {{- $tmp := $.Scratch.Get "bareul" -}} {{- $.Scratch.Delete "bareul" -}} {{- $.Scratch.Set "bareul" slice}} {{- range seq (sub (len $tmp) 1) -}} {{- $.Scratch.Add "bareul" (index $tmp (sub . 1)) -}} {{- end -}} {{- else -}} </ul> </li> {{- end -}} {{- end -}} {{- end -}} {{- end }} <li> <a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify -}}">{{- $header | safeHTML -}}</a> {{- else }} <li> <a href="#{{- $cleanedID -}}" aria-label="{{- $header | plainify -}}">{{- $header | safeHTML -}}</a> {{- end -}} {{- end -}} <!-- {{- $firstHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers 0) 1) 0)) -}} --> {{- $firstHeaderLevel := $largest }} {{- $lastHeaderLevel := len (seq (index (findRE "[1-6]" (index $headers (sub (len $headers) 1)) 1) 0)) }} </li> {{- range seq (sub $lastHeaderLevel $firstHeaderLevel) -}} {{- if in ($.Scratch.Get "bareul") (add . $firstHeaderLevel) }} </ul> {{- else }} </ul> </li> {{- end -}} {{- end }} </ul> </div> </details> </div> </aside> <script> let activeElement; let elements; window.addEventListener('DOMContentLoaded', function (event) { checkTocPosition(); elements = document.querySelectorAll('h1[id],h2[id],h3[id],h4[id],h5[id],h6[id]'); // Make the first header active activeElement = elements[0]; const id = encodeURI(activeElement.getAttribute('id')).toLowerCase(); document.querySelector(`.inner ul li a[href="#${id}"]`).classList.add('active'); }, false); window.addEventListener('resize', function(event) { checkTocPosition(); }, false); window.addEventListener('scroll', () => { // Check if there is an object in the top half of the screen or keep the last item active activeElement = Array.from(elements).find((element) => { if ((getOffsetTop(element) - window.pageYOffset) > 0 && (getOffsetTop(element) - window.pageYOffset) < window.innerHeight/2) { return element; } }) || activeElement elements.forEach(element => { const id = encodeURI(element.getAttribute('id')).toLowerCase(); if (element === activeElement){ document.querySelector(`.inner ul li a[href="#${id}"]`).classList.add('active'); } else { document.querySelector(`.inner ul li a[href="#${id}"]`).classList.remove('active'); } }) }, false); const main = parseInt(getComputedStyle(document.body).getPropertyValue('--article-width'), 10); const toc = parseInt(getComputedStyle(document.body).getPropertyValue('--toc-width'), 10); const gap = parseInt(getComputedStyle(document.body).getPropertyValue('--gap'), 10); function checkTocPosition() { const width = document.body.scrollWidth; if (width - main - (toc * 2) - (gap * 4) > 0) { document.getElementById("toc-container").classList.add("wide"); } else { document.getElementById("toc-container").classList.remove("wide"); } } function getOffsetTop(element) { if (!element.getClientRects().length) { return 0; } let rect = element.getBoundingClientRect(); let win = element.ownerDocument.defaultView; return rect.top + win.pageYOffset; } </script> {{- end }} 2. 添加css文件 在assets/css/extended目录下新建blank.css文件,内容如下: ...
终于把智齿拔了!!!
一个真正的勇士敢于一次拔三颗智齿!!! 一直想把左下的智齿拔掉,因为明显能感觉到那个智齿是横着长的,与前面的牙齿之前形成缝隙,每次吃东西就会塞进去,非常难受。 最近终于抢到一个比较好的医生的号(早上不到 6 点起来在手机上抢号),上周六就去医院了。先是拍了 CT,医生看了看牙的情况和离神经管的距离,说了拔的风险。原本预期是左边上下两个智齿一起拔了,后来听医生说上面的牙比较好拔而且痛苦不大,下决心把右侧上面的智齿也一起拔了(右侧下面的智齿大学时已经拔了)。最终需要拔三颗智齿。 拔的过程还是挺顺利,先是吃药、打麻药,等麻药劲儿上来了就开始了。拔上面的时候确实很快,感觉两三分钟就拔掉了,下面的因为是低位比较麻烦,拔了挺久。总共大概 40 分钟左右吧,过程中没有感觉,就是有点紧张,能听见器械切割、牙齿断裂的声音。 拔完之后咬着纱布在医院观察一个小时,之后看了看出血情况没什么问题,讲了一下注意事项、后续怎么吃药就可以回家了。但是这时候麻药劲儿过了,慢慢感觉到疼了。医生让吃个冰淇淋缓解疼痛,回家之后就吃了一个,还要一直用冰袋敷脸。疼的时间就大概不到一个小时,后来就是隐隐作痛能够接受了。 拔完之后吃饭是个大问题,当天基本没吃什么东西,后来就吃点软的面条、鸡蛋羹之类的。饿的好想吃肉。 总的来说这次拔牙还是比较顺利,疼痛可以接受,脸也没有肿,就是吃饭还是只能吃软的,等这周五拆了线应该就好了。感谢医生,让我以后不用在被智齿折磨了。 2025年7月18日,周五,早上去拆线了,拆的时候有一点疼,其他还好。后面要注意漱口,饭后一定记得漱口,希望可以尽快完全恢复。
摸鱼小游戏
收集几个摸鱼小游戏,供大家摸鱼时间娱乐 1. milkywayidle 银河奶牛放置 玩的精不如玩的久,玩的久不如活得久。————Stella 银河奶牛放置(MWI)是一款受经典大型多人在线角色扮演游戏启发的多人放置类 RPG。玩家可以创建角色并提升与资源采集、制作或战斗相关的各种技能。可以在网页或者Steam游玩,完全免费。在游戏里可以氪金或者完全零氪,靠采集、制作、战斗等等升级、赚钱,也可以获取离线收益,非常适合喜欢摸鱼的朋友。 官网:milkywayidle 可以使用插件,提升游戏体验。 必装插件: mwitools 价格走势图(长期):查询过去一段时间,某物品的价格走势/价格曲线图。(已不更新,可忽略) 价格走势图(短期):同上,但可查询的时间范围较短。(已不更新,可忽略) 持续更新中…
Hugo部署至github
1. 新建github仓库 注意:仓库名必须为用户名.github.io,这样后续就可以直接用https://用户名.github.io访问。 2. 将本地文件推送至github仓库 把本地已经调试好的hugo项目文件,推送到github仓库。使用以下命令: 1 2 3 git remote add origin git@github.com:用户名/用户名.github.io.git git branch -M main git push -u origin main 3. 配置Github Actions自动部署 使用actions-gh-pages这个项目,利用 GitHub Action 部署静态网站到 GitHub Pages。 3.1 在仓库根目录下新建.github/workflows文件夹,然后新建gh-pages.yml文件,内容如下: 1 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 name: GitHub Pages on: push: branches: - main # Set a branch name to trigger deployment pull_request: jobs: deploy: runs-on: ubuntu-22.04 permissions: contents: write concurrency: group: ${{ github.workflow }}-${{ github.ref }} steps: - uses: actions/checkout@v4 with: submodules: true # Fetch Hugo themes (true OR recursive) fetch-depth: 0 # Fetch all history for .GitInfo and .Lastmod - name: Setup Hugo uses: peaceiris/actions-hugo@v3 with: hugo-version: '0.147.9' - name: Build run: hugo --minify - name: Deploy uses: peaceiris/actions-gh-pages@v4 # If you're changing the branch from main, # also change the `main` in `refs/heads/main` # below accordingly. if: github.ref == 'refs/heads/main' with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./public 注意:github_token是github自动生成的,不需要自己创建。你也可以使用personal_token: ${{ secrets.PERSONAL_TOKEN }},需要自己创建一个PERSONAL_TOKEN。 1. 点击账号Settings->Developer settings->Personal access tokens->Generate new token,创建时注意期限选择永不过期,勾选repo和workflow权限。 ...