Nginx Proxy Manager 使用 Let’s Encrypt 获取 SSL 证书报错 Internal Error
Nginx Proxy Manager 使用 Let’s Encrypt 获取 SSL 证书报错 Internal Error现象 解决方案进入容器执行以下命令:find / -type f -name ".certbot.lock" -exec rm {} \; 方案来自https://github.com/NginxProxyManager/nginx-proxy-manager/issues/918
《数据密集型应用系统设计》(DDIA)阅读笔记
前言《数据密集型应用系统设计》(Designing Data-Intensive Applications,简称 DDIA)是分布式系统领域的经典著作,深入探讨了数据系统的底层原理、分布式计算的实践挑战,以及如何构建可靠、可扩展、可维护的应用。本文是我阅读本书后的核心要点记录与思考。 结论先行本书的核心价值在于:帮助技术决策者理解各种数据系统和架构方案背后的权衡取舍。无论是存储引擎的选择、数据复制策略、还是分布式事务的处理,都不存在银弹,只有在具体场景下的最优解。理解这些权衡的本质,才能做出明智的技术决策。 一、数据系统的底层原理数据的存储结构对于如何在磁盘上组织数据,有两个主要的数据结构:B-Tree 和 LSM-Tree。两者各有优劣,适用于不同的场景。 LSM-Tree(日志结构合并树) 这是一张描述 LSM-Tree 存储结构的图,出自这篇文章。该作者的 mini-bitcask 项目基于 LSM-Tree 实现了一个简单的数据库,非常适合新手学习。 核心思想: LSM-Tree 的核心思想是以追加日志的形式组织数据,在内存中维护索引,索引保存的是一条数据在日志文件中的偏...
《SRE Google运维解密》阅读笔记
前言《SRE: Google 运维解密》(Site Reliability Engineering)是 Google 首次公开其运维方法论的经典著作。本书揭示了 Google 如何通过工程化手段保障海量服务的可靠性,涵盖监控、容量规划、故障处理、过载保护等核心主题。本文记录了我阅读本书时的关键要点与实践思考。 结论先行SRE 的核心理念是:通过工程化手段和自动化工具来保障系统可靠性,而不是依赖人工运维。 其中最重要的实践包括:用监控黄金指标量化系统健康度、通过流量抛弃和优雅降级避免过载、合理设计重试和超时机制防止雪崩。 一、监控体系监控的 4 个黄金指标Google 认为,衡量一个系统的健康状况,应该关注以下 4 个核心指标: 延迟(Latency):请求的响应时间 流量(Traffic):系统的 QPS(每秒查询数) 错误(Errors):请求失败率 饱和度(Saturation):系统的瓶颈指标(如 CPU 利用率、内存利用率),也可以理解为”水位” 这 4 个指标简洁而全面,能够快速反映系统的运行状态。 保持监控系统简单核心原则:系统越简单,可以发生故障的地方就越少,就...
简单但是代码“说不清”的功能,不如让AI来实现!
简单但是代码“说不清”的功能,不如让AI来实现!场景想象你是一个售卖软件激活码的商家,在收款后把激活码通过邮件的方式发送到客户的邮箱里,你的美好生活就这样一单一单地继续着。 直到有一天,你的好朋友说他给你介绍了个大生意,有几百个客户要从你这里购买软件,他给你发来了几张手写下来的便签照片、几段格式杂乱的文本,上面记录了你所需要的信息:用户的名字和邮箱。 在你被迫转行干这个之前,你是个程序员,你给自己开发了个录入客户信息自动发货的系统。可是,这几百单要是一单一单录入的话要花很久。你摩拳擦掌地拿起ocr、正则表达式准备将这个苦差事自动化时,问题出现了: ocr解析从图片里解析出来的文本还是乱糟糟的,错别字、无关的字符…显然ocr并不知道它要处理的是人名和邮箱,它只管识别图片里的字符,有一个算一个! 记录客户信息的文本,有的前面有序号,有的没有,有的用逗号作为分隔符,有的用句号,有的人名和邮箱分开了两行…本来你的正则就是上网抄的水平,如何用正则匹配格式这么灵活的文本真让你犯了难 幸运的是,在2024年,AI已经足够聪明来解决这样的问题。 我将用上面的例子介绍我是如何在一个CRUD的小...
Maven 2024年3月大改版后,我该如何把自己的jar包发布到中央仓库?
Maven 2024年3月大改版后,我该如何把自己的jar包发布到中央仓库?简介如果你想让自己编写的java库可以被别人使用,你应该把它打包成jar并上传至Maven中央仓库,这样其他人就可以通过一个gav坐标引用你的库了,就像下面这样: 12345<dependency> <groupId>com.baizhukui</groupId> <artifactId>warmup-springboot3-starter</artifactId> <version>1.0.1</version></dependency> 网上的教程数不胜数,但当我实操时却遇到了种种困难,我查阅Maven中央仓库官方文档后,发现 Maven 在2024年3月作出了巨大的改变(详见以下引文),网上的教程(尤其是中文互联网)大多都在介绍基于 OSSRH 的旧方法,我决定写一篇博客为有类似需求的朋友节省时间。 From March 12th, 2024, all registration wi...
使用 Coolify 极简运维你的项目和数据库
使用 Coolify 极简运维你的项目和数据库2025年3月8日更新coolify现在变得很复杂,建议用dpanel 引言本文将介绍一个名为 Coolify 的开源软件,基于 Docker 提供了托管网站、数据库等服务的功能,功能丰富强大,操作简单。官方自称是Heroku / Netlify / Vercel 的开源替代。 我在试用了以后立即决定抛弃之前 nginx proxy manager + docker-compose 的运维方案,全面拥抱 Coolify,因为它真是太好用了。 安装官网提供了一个简单的安装命令,将自动安装 docker 和 Coolify 的几个必备容器。包括下图中的容器。其中 Traefik 是整个系统的 http 和 https 网关,coolify-server 是软件主体,redis、postgres、soketi 是 coolify 的依赖项。 安装完成后会提示你去访问服务器的 8000 端口,这是 coolify 的 http 端口,我们可以暂时使用它来进行一些基本配置。之后我们会使用 https 去访问它。 配置网关我...
告别笨重的 ELK,试试用 Loki 处理日志吧!
告别笨重的 ELK,试试用 Loki 处理日志吧!日志领域主流解决方案是 elk,但是这一套部署复杂、资源占用高,不适合个人开发者使用,如果你需要一个比命令行漂亮一些的日志查看工具,loki 就非常合适了。 promtail从 k8s/docker 中收集容器标准输出日志,发送到 loki 存储,grafana 在网页端对日志进行搜索和展示。非常轻量级,200MB 左右的内存就可以搞定。 安装首先在一个安装了 docker 的服务器部署 loki、grafana 和收集本机 docker 容器日志的promtail: 12345678910111213141516171819202122232425262728293031323334353637383940414243version: '3'services: grafana: image: grafana/grafana-enterprise container_name: grafana restart: unless-stopped networks: - ...
使用 VueGraggablePlus 实现 el-table 等第三方组件的拖拽排序
使用 VueGraggablePlus 实现 el-table 等第三方组件的拖拽排序引言当我们有一些表格数据需要可以调整顺序时,最直观的做法是拖拽(正如大部分 APP 的做法一样)。 我主要使用 vue3 + element plus 进行开发,当遇到这个需求时网上最常见的解决方案是 vue draggable,可惜这个项目已经 3 年没更新了,而另一个实现了类似功能并且还在积极更新的项目是 vue-draggable-plus,用法非常简单,而且可以很简单地支持第三方组件(例如 el-table)的拖拽排序。 可惜网上对于这个库的介绍非常有限,大多数就是照抄本就简略的官方文档。本文将介绍它在实际开发中的使用方法,帮助有类似需求的朋友节省时间。 演示安装:npm install vue-draggable-plus 以下代码写了一个表格,并将其用VueDraggable包裹起来以实现拖拽排序。并且在下方展示了数据的真实顺序。 1234567891011121314151617181920212223242526272829303132<template> <...
登录验证码发送间隔限制的设计与实现
登录验证码发送间隔限制的设计与实现引言在小项目设计登录模块时,一个常见的思路是账号与邮箱/手机号绑定,通过邮件/短信验证码的方式登录/注册。相比于传统的口令式注册/登录有以下优点: 用户不需要记住密码:只要邮箱/手机号还能用,就可以登录。 系统不需要考虑太多安全问题:数据库不存储敏感信息,安全性由邮箱/电信运营商保障。 登录、注册合一:简化开发。 发送邮件/短信验证码一般都要通过云厂商的服务来实现,如果有人恶意刷接口就会产生大量费用。而且登录验证码本身也是一段时间内有效的,不需要频繁调用。所以我们需要对发送验证码的接口做调用时间间隔的限制。 本文用 vue3 + element plus + springboot 的技术栈举例。重点在分享思路,在使用其他技术栈的情况下也可以套用。 后端目的:对于同一个邮箱来说,一分钟内最多发送一次验证码。 思路:使用 Caffeine 库的 Cache 类,过期策略是写后 1 分钟过期。key 存放邮箱,value 存一个 new Object()(我们可以称之为 time...
马督工自媒体课程学习笔记
马督工自媒体课程学习笔记目的理性、深刻地认识新闻和世界。让自己输出的内容更有逻辑。 原则 适度自信:媒体人要承认在其他领域自己是普通人,是外行。不需要达到专家的程度,达到一个足以给观众进行科普的程度就可以,而这是一个普通人可以通过短期快速学习做到的。可以类比大学期末突击。 积极利用学术资源:TODO 这一点的具体操作方式我还是不清楚。例如,马督工在学习戈尔巴乔夫时,是从“国家哲学社会科学文献中心”翻阅了所有关于戈尔巴乔夫的资料。 保持合理的内容深度:过于深奥将会失去传播力,过于通俗将会失去严谨性。需要做到一个合理的折中。 提出清晰的定义:如果语焉不详就会造成“一被批评就打太极拳”的情况。 提出通用的法则:通用法则允许我们用同一套思维去理解不同的新闻,抓住不变的要点,降低复杂度。 一个新闻稿的构成 共同的信息场:一个观众熟悉的新闻背景能让人更好地接受、传播 最新的变化:新闻主要内容。当速度上难以获得优势时,深度就是主要竞争力。 提出建议(可选) 接近义务教育水平的知识门槛校园文化是几乎所有人都共有的,这是最大的共同信息场。 义务教育是大部分观众的文化水平。想要让文稿便于理解,就...









