为Conda环境下的命令编写Service文件

本文以用户dedfaf,运行ocr环境下的uvicorn main:app --host 0.0.0.0 --port 8001为例 首先找到conda的激活脚本位置,用需要执行的用户输入 conda info --base 例: /home/dedfaf/miniconda3,一般激活脚本位于/home/dedfaf/miniconda3/etc/profile.d/conda.sh 编写.service文件,按顺序执行激活和需要执行的命令即可 [Unit] Description=Nanonets-OCR-s for ocr service After=network.target [Service] Type=simple User=dedfaf WorkingDirectory=/home/dedfaf/OCRdeploy/ ExecStart=/bin/bash -c \ "source /home/dedfaf/miniconda3/etc/profile.d/conda.sh && \ conda activate ocr && \ uvicorn main:app --host 0.0.0.0 --port 8001" Restart=always RestartSec=5 [Install] WantedBy=multi-user.target

July 7, 2025

Hugo上传构建自动化

在上一篇搭建Hugo网站中,我们完成了静态网站的搭建。为了实现网站的持续更新,这一篇我们来实现编写-上传-构建-部署的自动化流程 由于hugo的构建和部署是分开的,因此可行的思路非常开阔。笔者将提供几种思路以供参考 首先,不建议使用hugo server部署至web端口或将web端口转发至hugo server的方式。hugo server仅为本地开发调试而设计,其默认行为不具备生产环境所需的安全性与性能优化 对博客的版本管理 无论使用什么方式,都建议对内容与配置进行版本管理。版本控制不仅有助于追踪修改历史、恢复误删内容,也便于多设备协作、自动化部署等操作。在本文我们使用git进行版本管理,其余的CVS工具可以使用类似的思路 在建立git仓库时,建议排除public/(或者仓库目录中你规定的其他输出路径(你为什么要这么干))目录。.gitignore中加入 public/ 本地部署 如果你的web服务就部署在本地,那么每次编辑完后手动构建一次目标目录即可 远程部署 本地构建 + 上传构建文件(不推荐) 当然,你可以选择本地build完后,上传publc/等输出仓库至服务器的方式。这也可以通过让git管理输出目录来完成上传的部分,思路和下文类似 本地上传修改 + 远程构建 先看需求:我们需要在完成编辑时,先将本地的修改上传,然后在远程自动触发一次构建,并且使用nginx等工具来运行web server。 能完成需求的思路都是好思路,这里提供两个 建立公共远程仓库,服务器同步并构建 graph LR A[本地] --push--> B(公共仓库) --pull--> C[Web Server] --build & run--> D([用户]) 笔者选择的方式,因此这部分个人的经验会多一些 首先选择一个公共的远程仓库,需要你的本地和服务器都可以访问到。笔者的服务器位于中国大陆且不想配置代理,因此将仓库建立在了自己托管的git平台上。接下来在服务器建立仓库并添加远程,过程不再赘述。 WebServer从公共仓库的同步也可以采取多种思路。最简单的方式就是规定时间自动拉取。笔者采用了当公共仓库的主分支变动时,向服务器发送一个Webhook并触发拉取和构建的流程,笔者团队托管的gitea自带发送Webhook的功能,这部分也可以用其他平台的类似服务代替。 Webhook的客户端,可以使用apt库中的webhook。为Webhook写一个配置文件, // hooks.json [ { "id": "DFSiteHook", "execute-command": "/home/dedfaf/DF-Site/build.sh", "command-working-directory": "/var/www/DF-Site", "response-message": "Hugo rebuild.", "trigger-rule": { "match": { "type": "value", "secret":"xxx", "value": "refs/heads/master", "parameter": { "source": "payload", "name": "ref" } } } } ] 令其接收到hooks后执行脚本 ...

July 7, 2025

搭建Hugo网站

Hugo是一个网站编译器,所负责的工作就是把你的内容(主要是md文件),用你规定的主题来构造一个静态网站。只需要把构建好的网站(一个文件夹)扔到web服务器上就可以被访问了 对于那些还拿不准使用哪种静态网站构建器的人,Hugo的优势在于构建速度最快,配置简单,主题较多。可以翻一翻Hugo主题库,只要有看上眼的选择Hugo不会有错 因此,部署Hugo的思路比较多样化: 在本地安装Hugo,在本地编写内容,构建网站后上传服务器 在服务器安装Hugo,在本地编写内容后上传内容,在服务器完成构建(当然在本地预览内容还是要在本地安装Hugo的) 如果方便访问服务器,直接在服务器编写构建也可以 如何维护Hugo,建立自动上传构建的流程,不在本文详解,参考Hugo上传构建自动化 安装Hugo https://gohugo.io/installation/ 根据你选择的思路在本地或远程安装hugo P.S. 笔者使用的Debian目前apt库中的Hugo版本较老,至少已经不支持我的主题了,建议在Release里找最新版安装 建站流程 非常建议参考Hugo Doc - QuickStart 创建项目 找个目录运行 hugo new site 网站名 [--format xxx.yaml] cd 网站名 git init hugo会建立一个网站的基本结构,可以用--format指定hugo的配置文件格式,配置文件需要大量填内容,所以选你熟悉的格式 几个重要的文件夹: content: 放置内容的地方,后续写的文章将放于此 static: 放置静态资源。这里的文件可以通过https://your.url/文件名来直接访问,可以拿来放网站的背景图等资源 public:放置构建后的网站。构建后将这个文件夹设为网站根目录网站就能运行 接下来需要安装主题,主题文件夹需要置于themes/中 先在https://themes.gohugo.io/找一个主题,然后 git clone:从主题仓库clone到themes/ 使用git submodule(推荐) 使用hugo module JUST PACK & DOWNLOAD A FKING .ZIP 推荐使用submodule的方式,因为方便管理(出错时更新和回退)主题的版本 git submodule add https://主题仓库.git themes/主题名 git submodule update --init --recursive P.S. 在clone仓库后,默认不会clone submodule中的文件,在部署至别处时需要注意 如果不熟悉submodule,就记住在需要更新主题时进入主题目录跑git pull就可以了,别忘记在外部git提交对子模块的更新。 另:对于经常爆改theme的人,可以适当性的考虑不使用子模块(因为需要频繁的在本地和远程更新子模块),只要明白自己在做什么(能自己解决问题),可以尝试由一整个git来管理 在配置文件(默认hugo.toml,或别的格式)中添加: ...

July 4, 2025

搭建RDP

最近有远程办公的需要,同时工作通勤距离较远,而且工作的笔记本必须用Windows系统,于是决定搭一个RDP工作站,能够随时连接远程桌面 准备RDP 在一切开始前,建议先了解关于OS中用户和会话的关系。在新版Windwos中,也支持多用户多会话的使用计算机,因此要先考虑好自己搭建远程桌面的目标是单会话还是多会话的,选择合适的RDP服务端 主要需要注意,在我的Windows10企业版中,自带的RDP只支持单会话操作,而大部分RDP服务端都是可以自行设置的 本文章只是本人的技术总结,仅供参考,务必根据自身情况选择合适的技术方案。 Linux 使用xrdp Windows 先查看Windows版本,在专业版及以上的Windows自带RDP服务器,在设置里打开即可 而家庭版的RDP服务是被毙掉的,因此就又到了和微软勾心斗角的环节。可以使用RDPwrap来绕过限制 RDPwrap安装比较简单,下最新release脚本一键装即可,之后开RDPConf.exe调设置,如果Listener state一直不是Listening,大概率是配置文件要更新(毕竟本体很多年没维护了) 在RDPwrap.ini中下载合适的版本然后替换掉原本的,Windows中默认位置为C:\Program Files\RDP Warp,注意每次Windows更新后,尽量检查是否仍然起效 无法替换?service.msc中暂停rdp服务 内网解析 有在内网远程访问主机的需要,但是主机可能随时启停,ip不固定,所以为其分配一个动态dns域名来随时解析至主机 使用ddns-go ddns-go在Windows上的部署很方便,能够单命令安装服务,有web端的配置界面,基本属于傻瓜操作 如何操作在ddns-go的文档中写的非常详细了,在此简单带过,不再赘述 在dns服务商注册apikey,保存好填入配置 我们需要拿到内网地址,获取ip的方式选通过网卡获取,找到对应内网ip的网关。域名填写apikey对应账号可以操控的域名,如果你的DNS服务商api不支持新注册域名解析,就先创建一个域名解析让ddns修改 也可直接编辑yaml。可以在有图形化配置的地方保存后导入。下给出一例: dnsconf: - name: "" ipv4: enable: true gettype: netInterface url: https://myip.ipip.net, https://ddns.oray.com/checkip, https://ip.3322.net, https://4.ipw.cn, https://v4.yinghualuo.cn/bejson netinterface: 以太网 cmd: "" domains: - omen.dedfaf.tech ipv6: enable: false gettype: netInterface url: https://speed.neu6.edu.cn/getIP.php, https://v6.ident.me, https://6.ipw.cn, https://v6.yinghualuo.cn/bejson netinterface: "" cmd: "" ipv6reg: "" domains: - "" dns: name: alidns id: secret: ttl: "" user: username: password: webhook: webhookurl: "" webhookrequestbody: "" webhookheaders: "" notallowwanaccess: true lang: zh 内网穿透 有外网远程访问主机的需要,使用frp将3389端口暴露至公网 ...

March 14, 2025

关于Code2Ghost

Github: https://github.com/dedfaf/Code2Ghost 这个项目源自于我搭完ghost后,发现其没有直接上传或者同步博客仓库的方法,也没有合适的上传工具,索性自己写一个VScode的上传插件 ghost的api功能相当强大,不过目前只用到了上传博客的功能。之后有精力的话,可以写一个在code里完全管理ghost的图形化插件 现在的进度直接看TODO吧 对本人而言,之前其实并没有写VScode插件的经验,这个项目也属于是学习项目,欢迎提出意见 原理 https://ghost.org/docs/admin-api/#creating-a-post 通过vscode插件api读取当前编辑器的内容,通过marked转换为html,通过正则判断<h1>获得标题,然后删去标题留下正文,打包上传api front-matter通过gray-matter读取 获得博文内容基本相反,拉下博文的html还有其他信息,通过turndown转换为md,再把需要的属性直接写成yaml填到front-matter里 目前的难点 / TODO 2025.2.25 这几天完成了 Get(拉取所有帖子,然后选择一个在编辑器打开) Update(将本地文件的内容推送到与本地文件front-matter中id对应的帖子) Sync(先读取本地文件front-matter中的id,然后用服务器上的文章覆盖本地(如果服务器与本地的updated_at不一致,即更新过)) 发布了0.1.0版本,自认为应该算是及格的编辑器了 今天才发现创建/更新后如果不同步全文,那么本地文件的图片路径仍是本地,每次都会上传一份图片,索性每次创建/更新后都直接Sync一遍.. 目前开学了比较忙,目前的进度已经完全足够我个人使用了。这个项目大概会放一段时间,暂时先看Ghost论坛里反响强不强吧 2025.2.24 目前基本完成了之前设想的功能 图片直接正常插入md,插件将自动解析上传并在正文中替换链接为ghost图床链接 标题、作者、标签可以通过markdown的front-matter来添加,同时也做了Get Post,修改然后Update这套流程相关的命令,怎么Update在仓库的README里已经写过了 接下来要做: 更好的标签栏管理,之后将尝试将本地文件与在线博文关联,实现自动更新等操作 一键编辑作者标签?不应该让end user直接碰yaml这种东西,毕竟不是谁都看过api文档。不过这个难度很大,考虑到能用我这个插件的估计也不会有小白,所以暂时先不弄? 或许之后有时间可以重写一下,直接将本插件做成ghost在VScode的客户端。不过这个项目作为在一个Ghost编辑器的功能性还是足够的(前提是没bug,等测试吧,对自己程序的鲁棒性完全没信心) 2025.1.26 上传图片,需要先通过ghost图片api上传ghost图床,然后在文章中引用 插件中只做了标题的确认,实际上作者,标签等都应该在上传时确认 更新,删除,发布文章 至于其他的功能,目前不在本插件的考虑范围内,理应直接在ghost后台操作

February 25, 2025

Ghost:添加目录栏

对于复杂的技术博文没有侧边目录栏基本看不下去,然而ghost并不自带目录栏功能,所以我们只能通过改主题文件来实现。 不过好在ghost的主题文件并不复杂,这里完全可以依照官方教程把代码粘贴进去就能用了,强烈建议先看官方教程。这篇博客主要讲解一些细节 官方教程:https://ghost.org/tutorials/adding-table-of-contents 我的博客主题修改自source,仓库:https://github.com/dedfaf/DF-Blog-Theme 教程讲解 官方教程使用了ToCBot来实现目录栏 可以用ghost install local安装本地测试环境,在其上修改后再push到生产环境 一些简单的样式调整 这里讲解一些官方教程操作完后的一些细节调整,也可以直接参考文末我的代码 默认展开所有目录 默认情况下,之后浏览到的目录只会展开当前标题的子标题,需要在脚本中加入 <script> tocbot.init({ // ... collapseDepth: 6, // ... }); </script> 去除序号前缀 脚本中加入 <script> tocbot.init({ // ... orderedList: false, // Ensures the list is not ordered // ... }); </script> 去除链接下划线 CSS: .toc-list .toc-list-item a { text-decoration: none; /* remove underline */ } 调整目录的位置 默认的目录位置是紧贴正文的,可以修改css中目录栏的上级.gh-sidebar的偏移量来调整目录的位置。我的目录原本在左侧紧贴正文,我将其向左偏移了px,仅供参考 @media (min-width: 1300px) { .gh-sidebar { position: absolute; top: 0; bottom: 0; margin-top: 4vmin; grid-column: wide-start / main-start; /* Place the TOC to the left of the content */ margin-left: -192px; /* add offset */ } .gh-toc { position: sticky; /* On larger screens, TOC will stay in the same spot on the page */ top: 4vmin; } } 个人最终生成的代码 请重点关注两个{{!– ToC –}}注释后的部分,其余的部分和casper的代码是一样的 ...

February 6, 2025