首页
壁纸
直播
友链
Search
1
Serv00搭建各种服务
4 阅读
2
CodeSandbox-Blog备份
2 阅读
3
git命令简明教程
2 阅读
4
Git的基本使用
2 阅读
5
joe主题设置
2 阅读
vps
paas
未分类
登录
/
注册
Search
标签搜索
codesandbox
serv00
git命令简明教程
Joe主题添加文章侧边栏目录
Git的基本使用
时沙
累计撰写
7
篇文章
累计收到
0
条评论
首页
栏目
vps
paas
未分类
页面
壁纸
直播
友链
搜索到
7
篇与
的结果
2024-07-17
joe主题设置
图片设置favctionlogo自定义缩略图(不填也行)自适应api缩略图懒加载joeloading火堆PC背景WAP背景首页设置https://img.972686389.xyz/img/2233.gif || https://qq927.972686389.xyz/ || 2233 https://www.dmoe.cc/random.php || https://www.dmoe.cc/random.php || 樱花二次元图片API https://api.echs.top/dn/index.php || https://api.echs.top/index.php || echsのAPI https://imgapi.xl0408.top/index.php || https://imgapi.xl0408.top/index.php || 超级小兔的随机图其他图片apisakurairo优化/外部API桌面端随机图片地址sakurairo外部API手机端随机图片地址
2024年07月17日
2 阅读
0 评论
0 点赞
2024-05-01
Git的基本使用
1、关于版本控制系统定义版本控制(Version control)是维护项目的标准作法,能追踪项目从诞生一直到定案的过程。此外,版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一程序文件都得到同步,记录项目内各个模块的改动历程,并为每次改动都编上序号。一种简单的版本控制形式如下:工程的初代版本为“1.0”,当做了第一次改变后,版本等级改为“1.1”,以此类推。因此,版本控制能提供给开发者将项目恢复到之前任一状态的选择权,这种选择权在设计过程进入死胡同时特别重要。版本控制的必要性:常会利用版本控制来追踪维护源代码、文件以及配置文件等的改动,并且提供控制这些改动控制权的程序;有时候,一个程序同时存有两个以上的版本,例如:在一个稳定版本中程序错误已经被修正、但没有加入新功能;在另一个开发版本则有新的功能正在开发、也有新的错误待解决,这使得同时间需要不同的版本;此外,为了找出只存在于某一特定版本中(由于修正了某些问题、或新加功能所导致)的程序错误,或找出程序错误出现的版本,开发者也需要比对不同版本的代码以找出问题的位置。常见的版本控制系统集中式版本控制系统:由一台或多台主计算机组成中心服务器,所有业务单元和项目版本库都集中存储在这个中心服务器上,开发时,要先从中央服务器取得项目最新的版本,一次开发完毕之后,再将工作量推送给中央服务器。就像是一个图书馆,如果要改一本书的内容,则需要把书先从图书馆借出来,然后修改,改完之后再放回图书馆。因此,集中式版本控制系统最的大缺点就是中央服务器出了问题,所有人都没法工作了。常见的集中式版本控制系统有SVN、CVS等。分布式版本控制系统:分布式版本系统没有绝对的中央服务器,每个人的电脑上都是一个完整的版本库,多个人进行协同工作时,只需将自己的修改与其他人的修改进行交换即可和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,其中一个人的电脑坏了不要紧,从其他人那里复制一个就可以了。Git就是常见的分布式版本控制系统之一,也是目前最流行的版本控制系统。2、Git与Github准确地说,Git与Github根本不是同一个概念。Git是指由Linus(就是那位二十多年前徒手撸出Linux内核的大佬)编写的分布式版本控制系统,于2005年以GPL发布。最初目的是为了更好地管理Linux内核开发。自2002年以来,Linus一直使用BitKeeper作为Linux内核主要的版本控制系统以维护代码。在Linux社区中,主张应该使用开放源代码的软件来作为Linux内核的版本控制系统。Linus曾考虑过采用现成软件作为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。2005年,Linux社区中的安德鲁·垂鸠写了一个可以连接BitKeeper的存储库的简单程序,BitKeeper著作权拥有者拉里·麦沃伊便认为安德鲁·垂鸠对BitKeeper内部使用的协议进行了逆向工程,决定收回无偿使用BitKeeper的许可。Linux内核开发团队与BitMover公司进行磋商无果后,Linus决定自行开发版本控制系统以替代BitKeeper,在十天的时间编写出git第一个版本。于是,世界上最流行的版本控制系统就这么戏剧式地诞生了。而GitHub是通过Git进行版本控制的软件源代码托管服务平台,由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath、P. J. Hyett和Thomas Preston-Werner使用Ruby on Rails编写而成,于2007年10月1日开始开发。beta版本开始上线于2008年2月,4月份正式上线。这是他们的logo,名字叫Octocat:截止到2020年1月,GitHub已经有超过4000万注册用户和1.9亿代码库(包括至少2800万开源代码库),事实上已经成为了世界上最大的代码存放网站和开源社区,国内很多人戏称为“全球最大同性交友网站”。2018年6月4日晚,微软宣布以75亿美元的股票收购GitHub。Github服务器在国外,处于半被墙的状态,有时正常访问,有时又打不开。与之类似的代码托管平台Gitee可以看做是国内版的Github,缺点是开源项目不如Github丰富,当然,由于在访问时速度更快,更适合国内用户托管代码。而且,部分开源项目是同时托管在这两个平台上的,所以碰到无法打开的Github项目时,在Gitee上找找也许会有惊喜。0x01.安装GitGit在全平台均可使用。Git官网:Git (git-scm.com)官方中文文档:Git - Book (git-scm.com)Windows系统Git安装包下载链接:Git - DownloadsLinux系统安装Git:Git - Download for Linux and UnixMac系统安装Git:Git - Download for macOS安装完成之后在控制台中输入git,如果出现如下输出说明安装成功:前面提到过,Git只是一个分布式版本管理软件,每个人的计算机都是一份完整的版本库,对这份版本库进行修改之后,将每个人的修改进行合并。但是如果不在同一个内网中,合并修改就会变得困难。此时也需要一个中央服务器来辅助进行代码的合并。这也就是Github、Gitee、Gitlab等平台最基本的作用。因此,我们还需要注册一个Github/Gitee账号,将我们的代码托管到平台上面(从某种角度上将它看成一个专门存放代码的云盘也未尝不可)。Github注册账号及用户界面介绍可以参考这篇文章:从0开始学习 GitHub 系列之「加入 GitHub」 (qq.com),本篇博客不再介绍。0x02.Github中的一些基本概念Repository仓库,即项目,要在GitHub上开源一个项目,那就必须要新建一个Repository。Issue问题的意思,举个例子,比如开源的项目,别人发现项目中有bug,或者哪些地方做的不够好,他就可以提个Issue,即问题,提的问题多了,也就是 Issues ,然后开发者看到了这些问题就可以去逐个修复,修复ok了就可以一个个的Close掉。Star就是给项目点赞,这个star的含金量还是挺高的。Fork这个可以翻译成分叉,你想在某个开源项目的基础上做些改进,然后应用到自己的项目中,这个时候就可以Fork这个项目,与此同时你的GitHub主页上就多了一个项目,只不过这个项目是基于这个开源项目(本质上是在原有项目的基础上新建了一个分支)。而你就可以随心所欲的去改进这个项目了,丝毫不会影响原有项目的代码与结构。Pull Request发起请求,这个其实是基于Fork的,还是上面那个例子,如果你在项目基础上做了改进,就可以把自己的改进合并到原有项目里,这个时候你就可以发起一个Pull Request(简称PR),原有项目开发者会收到这个请求,这个时候他会review代码,并且测试觉得OK了,就会接受PR,这个时候新的改进会被合并进原有项目。Watch可以理解为观察,如果Watch了某个项目,以后如果这个项目有更新,都会收到关于这个项目的通知提醒。Wiki一般来说,项目的主页有README文件基本就够了,但是有些时候项目的一些用法很复杂,就需要有详细的说明文档给使用者。这个时候就可以用Wiki,使用markdown语法即可进行编写。Gist如果没有项目可以开源,只是单纯的想分享一些代码片段,那这个时候Gist就派上用场了。0x03.添加SSH key当我们对代码进行提交时,Github/Gitee要怎么知道是我们提交的代码,而不是别人提交的呢,所以就需要进行授权来确认我们的身份。Github和Gitee服务器可以选择使用SSH公钥或GPG公钥来进行授权,这里采用SSH授权方式,提交代码之前需要先添加SSH key配置。大概步骤就是先在本地生成SSH key,然后将本地生成的SSH key添加到Github或者Gitee上。SSH(Secure Shell)是一种建立在应用层基础上的安全协议,一般用于远程登录会话和其他网络服务。由于在传输过程中对数据进行了加密和压缩,因此可以有效防止远程管理过程中的“中间人攻击”,传输速度也会更快,还能够防止”DNS欺骗“和”IP欺骗“等。生成SSH密钥:ssh-keygen -t rsa这句命令的意思是用RSA算法生成密钥(windows系统最好在Git Bash下执行,cmd终端可能并没有安装ssh),执行后出来三次提示均按回车,命令执行完会生成id\_rsa(密钥)和id\_rsa.pub(公钥)这两个文件。Linux/Mac系统在~/.ssh下,windows系统在C:\Users\用户名\.ssh(用户名是自己电脑的用户名)下,需要设置显示隐藏文件选项才能看到。将id\_rsa.pub用文本编辑器打开,复制里面的内容。添加公钥到Github/Gitee:进入Github/Gitee的设置界面,在左侧选项列表找到SSH keys选项将刚才复制的公钥粘贴上去,公钥标题可写可不写,然后保存,这样就完成了公钥的添加。0x04.克隆仓库说来惭愧,这是我接触到Github之后很长时间内最常用的操作(因为就只会这一个操作)。命令很简单:git clone [仓库链接]这个命令的作用就是从Github上下载别人仓库的项目文件,可能是从clone直接音译过来的原因,这个操作一般都称克隆,而不叫下载。克隆操作只需要有远程仓库链接即可,不需要Github账户也可以进行。克隆完之后项目文件的位置就是执行命令时所处的文件夹。远程仓库链接在项目主页就可以找到:0x05.初始化仓库所谓初始化本地仓库,个人理解就是向本地的项目根目录文件夹中加入一些Git配置文件,使其可以被Git识别以进行版本控制,因为项目文件夹是不能直接进行版本控制的。初始化本地仓库命令很简单,进入本地项目文件夹(或者用空文件夹),在该目录下执行:git init也可以在命令后面加入文件夹路径,将指定文件夹初始化成本地仓库:git init [项目文件夹名路径]项目初始化成功会有Initialized empty Git repository in xxxxxxx的提示,原项目文件夹中多出一个.git隐藏文件夹。此时初始化的本地项目还没有关联到远程仓库。当然,有本地仓库还不行,我们本意是要把本地仓库推送到远程仓库,因此,还需要在Github/Gitee上建一个远程仓库。点击网站右上角加号,找到“New Repository(新建仓库)”上图最后三项是用来初始化远程仓库的,如果这三项都不选就创建了仓库,就会提示用命令行来手动初始化远程仓库(所以建议对命令行不感冒的同学直接使用自带的初始化操作)。来记录一下用命令行手动初始化远程仓库的步骤:先在本地初始化好的Git项目中新建一个README.md项目说明文件(也可以是别的文件名)在项目目录下执行命令与远程仓库进行关联:git remote add origin [远程仓库链接]依次执行以下命令向暂存区加入修改文件,并编辑提交信息git add README.md # 引号中就是本次提交信息,可修改 git commit -m "first commit"向远程仓库推送本地仓库文件:Gitee只执行这条命令即可推送:git push -u origin master从2020年10月开始,Github的默认分支从master变成了main,因此还需要将本地默认主分支重命名为main才能推送成功:git branch -M main git push -u origin main如果不重命名主分支,就会出现“error: src refspec main does not match any,error: failed to push some refs to ..”的错误。上述命令执行完之后,再刷新远程仓库界面,就进入了初始化好的远程仓库:对于都已经初始化过的本地空仓库与远程仓库,使其建立关联可以这样做:# 先关联远程仓库 git remote add origin [仓库远程链接] # 再将远程仓库内容拉取到本地 git pull origin master0x06.提交修改所谓修改,就是相对于上次提交之后项目发生的改变(项目文件的增、删、改)。其中要涉及到push和pull这两个互为相反的概念:Push:直译就是“推”的意思,这个操作可以把本地代码推到远程仓库,这样本地仓库跟远程仓库就可以保持同步了。Pull:直译为“拉”的意思,如果别人提交代码到远程仓库,这个时候本地仓库代码与远程仓库代码并不一致,所以需要把远程仓库的最新代码拉下来,以保证两端代码的同步。同时,提交代码前最好设置一下提交者的名字与邮箱,方便在commit记录里显示:git config —global user.name "名字" git config —global user.email "邮箱"通常一次完整的提交过程如下:将修改过的文件加入暂存区:git add [修改的文件或者目录] # .表示此目录下所有文件,一次提交的文件较多时,可以使用此命令 git add .确认提交暂存区中的文件:# -m表示附加提交信息,后面的内容是关于提交的信息说明 git commit -m "提交信息"git add是先把改动添加到一个“暂存区”,可以理解成是一个缓存区域,临时保存改动,而git commit才是最后真正的提交。这样做的好处是防止误提交。最后将代码推送到远程仓库指定分支,即可完成一次代码提(其中注意,最后提交时Gitee与Github的分支名有所不同):# 推送代码到指定分支 git push origin [分支名] # Github默认分支是main,用以下命令: git push origin main # Gitee默认分支是master,用以下命令: git push origin master这里的origin是给远程仓库起的名字,当然名字并不唯一,可以是其他名字,只是因为习惯,一般都起名为origin。一般在多人协作时,为了不产生代码冲突,提交代码前最好进行一次Pull操作:git pull origin [分支名]查看git仓库当前状态,比如当前所在分支、被修改过的文件、未提交的文件等等:git status查看提交时产生的所有commit记录:git log0x07.分支操作branch即分支的意思,分支的概念在团队协作的时候很重要,假设两个人都在做同一 个项目,这个时候分支就是保证两人能协同合作的最大利器了。举个例子,A, B两人在做同一个项目不同的模块,这个时候A新建了一个分支叫a,B新建了一个分支叫b,这样 A、B做的所有代码改动都在各自的分支上,互不影响,等到都把各自的模块做完 了,最后再统一把分支合并到master主分支。在本地执行git init命令初始化仓库时默认生成一个主分支master。而远程仓库的情况就有所不同了,曾经Github远程仓库的默认主分支也是master,但是去年(2020)10月份之后Github将默认主分支名称从master改成了main(据说是因为master这个词意为奴隶的主人,含有种族歧视意味),这也是在前面手动初始化Github仓库时要将主分支名重命名为main的原因。而Gitee的主分支名称依然是master。查看分支查看本地分支列表:git branch查看远程分支列表:git branch -r建立新分支git branch [分支名]需要注意的是,新创建的分支的内容与当前所在的分支的内容相同,即新分支是基于当前所在的分支而创建的。当我们建立了新分支以后,默认不会切换到新分支上,当前做出的任何更改还是基于当前所在的分支,所以需要切换分支。切换分支git checkout [分支名] # 切换到新分支之后手动拉取最新内容 git pull origin [分支名]此时进行的改动就是在新分支下面了。当然,也有办法一步到位,加入-b参数即可。建立并切换到新分支git checkout -b [分支名]推送本地分支到远程仓库在本地建完新分支之后,就可以将本地新分支推送到远程仓库了,以保证两端同步git push origin [新分支名]如果本地推送到远程的分支想取另一个名字,那么可以用这条命令:git push origin [本地分支名]:[远程新分支名]但是强烈不建议这样,这会导致管理混乱,建议本地分支跟远程分支名要保持 一致。合并分支当团队中不同成员都完成了开发之后,就可以将改动都合并到一块了。# 首先切换到要合并到的分支上来,比如master(main)分支或是指定分支 git checkout [分支名]/main/master # 进行合并,将指定分支合并到当前所在的分支(即上一步切换到的分支)上来 git merge [指定分支]在没有冲突的情况下,代码就可以合并完成了。合并完记得把新代码push到远程仓库。删除分支分支建错或者该分支的代码已经顺利合并到其他分支的时候,就可以删除分支了:git branch -d [分支名]有些时候可能会删除失败,比如该分支的代码还没有合并到master或者其他分支,执行删除分支操作就会失败,Git会提示这个分支上还有未合并的代码,但是也可以强制删除分支:git branch -D [分支名]以上仅仅为删除本地分支,若要删除远程分支可以可以运行带有 --delete 选项的 git push 命令:git push origin --delete [远程分支名]重命名分支将A分支重命名为B分支:git branch -m A B类似于删除分支,无法重命名时,也可以强制重命名:git branch -M A B如果是重命名远程分支,推荐的做法是:删除远程待修改分支push本地新分支名到远程0x08.标签操作开发的时候经常有版本的概念,比如v1.0、v1.1之类的,不同的版本肯定对应不同的代码,所以给代码打上标签,标签名可以是版本号或者其它标记。Git 支持两种标签:附注标签(annotated)与轻量标签(lightweight)。附注标签附注标签是存储在Git数据库中的一个完整对象, 它们是可以被校验的,其中包含打标签者的名字、邮件地址、日期时间, 此外还有一个标签信息,并且可以使用GNU Privacy Guard(GPG)签名并验证。通常建议创建附注标签,这样就可以拥有以上所有信息添加附注标签信息用这条命令:git tag -a [标签名] -m "标签信息"-m参数为可选的,表示指定一条存储在标签中的信息。如果省略-m参数,那么Git会自动打开编辑器,让我们写一句标签信息,就像给提交写注解一样。利用git show命令可以查看标签信息与对应的提交信息:git show [标签名]输出会显示打标签者的信息、打标签的日期时间、附注信息与具体的提交信息。轻量标签如果只是想用一个临时的标签, 或者因为某些原因不想要保存这些信息,那么就可以用轻量标签。轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。 创建轻量标签,不需要使用 -a、-s 或 -m 选项,只需要提供标签名:git tag [标签名]同样的,利用git show命令查看标签信息与对应的提交信息,输出只会显示出提交信息,不会看到额外的标签信息。切换标签当要切换到某个tag时,命令与切换分支类似:git checkout [标签名];推送标签同样的,向远程仓库推送单个标签的命令与推送分支也是类似的:git push origin [标签名]如果一次推送多个标签,可以使用带有--tags的git push命令:git push origin --tags这条命令会将所有不在远程仓库服务器上的标签全部推送到远程仓库。删除标签删除本地标签:git tag -d [标签名]上述命令并不会从远程仓库中移除这个标签,从远程仓库移除标签有两种办法:git push <remote> :[标签名称]这种操作的含义是,将冒号前面的空值推送到远程标签名,从而实现删除的效果。第二种方式相对来说更直观:git push origin --delete [标签名]查看所有标签执行git tag命令,就可以列出所有标签:git tag默认是以字母顺序排列标签。当然,可带上可选的 -l 选项或者 --list选项,以匹配特定标签名:git tag -l "通配符" # 或者 git tag --list "通配符"例如,只查阅v2.*版本的标签名:git tag -l "v2.*"给提交打标签假设在过去某一个时刻提交了项目更改,后期才想起来忘记给项目打标签了,那么也可以在之后补上标签:git tag -a [标签名] [校验和]与创建标签命令不同,需要在标签名之后添加一个校验和选项(也可以是部分校验和)。通过以下命令可以查看每一次提交的校验和与对应的提交信息: > 参考资料: > > 微信公众号 - stormzhang:从0开始学习Github系列文章 > > [Git 教程 | 菜鸟教程 (runoob.com)](https://www.runoob.com/git/git-tutorial.html) > > [Git - Book (git-scm.com)](https://git-scm.com/book/zh/v2) > > [版本控制 - 维基百科,自由的百科全书 (wikipedia.org)](https://zh.wikipedia.org/wiki/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6) > > [git - 维基百科,自由的百科全书 (wikipedia.org)](https://zh.wikipedia.org/wiki/Git) >
2024年05月01日
2 阅读
0 评论
0 点赞
2024-05-01
Joe主题添加文章侧边栏目录
一、安装插件附件:MenuTree插件.zipGithub 仓库链接:plugins/MenuTree at master · typecho-fans/plugins · GitHub下载链接:https://github.com/typecho-fans/plugins/releases/download/plugins-M\_to\_R/MenuTree.zip二、插件使用编辑好的文件:打包好的文件.zip2.1、启用插件将下载好的插件放在 usr/plugins/ 目录中,确保文件夹名为 MenuTree;激活插件,设置内可勾选“嵌入模式”与“独立模式”:“嵌入模式”勾选时,编辑文章用按钮插入或手写 < !-- index-menu -->(插入按钮功能貌似是无效的,还有注意,别照抄这个标签,我在标签的 ! 前面加了一个空格,不然它就会被解析成目录了) 标签发布即可显示目录树;“独立模式”勾选时,修改模板文件如 post.php 中写入 <?php $this->treeMenu(); ?> 也可显示。需要注意的是,在文章中渲染出来的目录默认是没有任何样式的,所以需要我们自定义样式。为了使目录显示为侧边栏,并且样式与 Joe 本来的侧边栏风格保持一致,这里使用“独立模式”,并用相应的 CSS 与 JS 文件来定义其样式。2.2、CSS文件附件:将以下 CSS 代码保存至文件中,文件名为 menutree.css,文件放到主题目录的 assets/css 文件夹下。.menutree { position:sticky; top:60px; width:15%; margin:15px 15px 15px 0px; /* 溢出内容添加滚动条 */ overflow-y:auto; overflow-x:auto; background: var(--background); } /** 父元素<ul>与其中的子元素<li> **/ .index-menu-item { margin: 10px 0px; } .index-menu-list { margin: 5px 0px 5px 10px; } /** 所有<a>标签 **/ .index-menu-link{ color: var(--main); transition:all 0.2s ease-in-out 0s; padding:5px 0px; } .index-menu-link:hover { color: var(--theme); text-shadow: var(--text-shadow); font-weight:500; background-color:#efefef; } /* 锚点跳转定位 */ .menu-target-fix { display: block; position: relative; /* 偏移量 */ top:-100px; } /* 在宽度小于1000px的设备上隐藏短划线,以使目录的标题正常显示 */ @media screen and (max-width:1000px) { .joe_aside__item-title > .line { display:none; } } /* 在宽度小于800px的设备上隐藏目录侧边栏 */ @media screen and (max-width:800px) { .menutree{ display:none; } }2.3、JS文件将以下 JS 代码保存至文件中,文件名为 menutree.js,文件放到主题目录的 assets/js 文件夹下。/* 获取渲染好的目录的高度 */ menuHeight = document.getElementsByClassName("index-menu")[0].offsetHeight; /* 获取容器高度 */ containHeight = document.getElementsByClassName("joe_aside__item-contain")[0].offsetHeight; /* 获取容器 title 的高度 */ titleHeight = document.getElementsByClassName("joe_aside__item-title")[0].offsetHeight; /* 获取整个目录侧边栏对象 */ aside = document.getElementsByClassName("menutree")[0]; // 定义一个函数来修改目录的显示长度,从而使侧边栏能自适应目录的高度,避免出现大片空白部分 function changeMenuHeight(){ /* 调整容器高度 */ aside.style.height = titleHeight + containHeight + "px"; } // 如果目录的高度小于500px,调用函数将目录修改为实际高度,反之则将侧边栏的高度固定为500px if(menuHeight < 500){ changeMenuHeight(); } else { aside.style.height = "500px"; }2.4、修改 post.php 文件建议修改之前先备份 post.php 文件,如果修改失败可以随时还原回来。总共需要修改两个地方:导入 CSS 文件在文件前面的导入 CSS 文件:<!-- 导入目录的css文件 --> <link rel="stylesheet" href="<?php $this->options->themeUrl('assets/css/menutree.css'); ?>">添加目录代码然后在 <div class="joe_container"> 与 div class="joe_main joe_post"> 之间添加如下代码:<!-- 文章目录代码 --> <section class="joe_aside__item menutree"> <div class="joe_aside__item-title"> <svg t="1642997936013" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2169" width="128" height="128"><path d="M838.3 895.9H197.9c-53.9 0-97.7-43.8-97.7-97.7V236.7c0-53.9 43.8-97.7 97.7-97.7h640.3c53.9 0 97.7 43.8 97.7 97.7v561.4c0.1 53.9-43.7 97.8-97.6 97.8zM197.9 203.8c-18.1 0-32.9 14.8-32.9 32.9v561.4c0 18.1 14.8 32.9 32.9 32.9h640.3c18.1 0 32.9-14.8 32.9-32.9V236.7c0-18.1-14.8-32.9-32.9-32.9H197.9z" fill="#666666" p-id="2170"></path><path d="M695.1 455.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM695.1 578.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM695.1 701.2H341.2c-17.9 0-32.4-14.5-32.4-32.4s14.5-32.4 32.4-32.4h353.9c17.9 0 32.4 14.5 32.4 32.4s-14.5 32.4-32.4 32.4zM379.1 281.1c-17.9 0-32.4-14.5-32.4-32.4V115.4c0-17.9 14.5-32.4 32.4-32.4s32.4 14.5 32.4 32.4v133.2c0 17.9-14.5 32.5-32.4 32.5zM657.1 281.1c-17.9 0-32.4-14.5-32.4-32.4V115.4c0-17.9 14.5-32.4 32.4-32.4s32.4 14.5 32.4 32.4v133.2c0 17.9-14.5 32.5-32.4 32.5z" fill="#666666" p-id="2171"></path></svg> <span class="text">目录</span> <span class="line"></span> </div> <div class="joe_aside__item-contain"> <?php $this->treeMenu(); ?> </div> </section> <!-- 导入的js文件,必须在这里导入,否则不生效 --> <script src="<?php $this->options->themeUrl('assets/js/menutree.js'); ?>"></script>保存,刷新文章页面即可看到左边的侧边栏目录。以上的样式代码经过一定时间的使用,可以完美契合 Joe 主题,并且加入了部分响应式布局的代码,在移动设备上目录会自动隐藏,不会影响内容阅读。当然,如果是非 Joe 主题,样式可能需要重新设计。
2024年05月01日
1 阅读
0 评论
0 点赞
2024-05-01
git命令简明教程
git命令小结基本配置ssh生成ssh-key作为GitHub免密push的凭证#1. 执行 ssh-keygen #2. 连续回车,默认生成的路径在C:\Users\{用户名}\.ssh\id_rsa.pub #3. 将设置复制id_rsa.pub内容到github个人中心 #具体步骤,头像--setting--ssh and GPG keys--new ssh key--输入保存(add ssh key)即可 #4. 测试 ssh -T
[email protected]
# Attempts to ssh to GitHubconfig# 配置文件的生效采用就近原则,仓库>用户>全局 # 不同配置项同时生效,相同配置项优先级高的覆盖优先级低的 文件分别位于 # /etc/gitconfig Win:C:\Program Files\Git\mingw64\etc\gitconfig # ~/.gitconfig Win:C:\Users\{用户名}\.gitconfig # .git/config #查看系统config git config --system --list #查看当前用户(global)配置 git config --global --list #查看当前仓库配置信息 git config --local --list #新配置,定义用户名和邮箱,用户名一定是GitHub名字 git config --global user.name "qaiu" #名称 git config --global user.email "
[email protected]
" #邮箱 # 查看当前git版本 git --version常用命令#1.克隆 git clone https://github.com/xxx/xxx.git(项目地址) #2.初始化项目为git仓库 git init 目录名 #3.添加文件到暂存区 git add 文件/目录名 git add . #添加全部 #4.提交暂存区文件到本地仓库 git commit -m '提交消息' #5.添加远端地址 git remote add origin(远端的名字) https://github.com/xxx/xxx.git(项目地址) git remote #列出所有远端仓库 #6.推送到远端仓库 git push origin master(分支名) git push #第二次提交可以省略 远端名和分支名 #7.将远端和本地合并 git pull origin master git pull 分支管理创建和删除# 列出所有分支 git branch -[r,a,d,m] # 创建分支 git branch 分支名 # 删除本地分支 git branch -d 分支名 git branch -D 分支名 #强制删除 # 删除远端分支 git push origin :分支名称切换分支git checkout 分支名 # 或者不使用git branch新建,直接git checkout -b实现新建与切换 git checkout -b 分支名 拉取合并分支# 取回远程主机某个分支的更新,再与本地的指定分支合并。 git pull <origin> <远程分支名>:<本地分支名> git pull -p #在本地删除远程已经删除的分支 git push -u origin master #指定一个默认主机,这样后面就可以不加任何参数使用git push git push --all origin #将本地的所有分支都推送到远程主机 # 在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支 git fetch origin master:tmp # 来比较本地代码与刚刚从远程下载下来的代码的区别 git diff tmp # 合并temp分支到本地的master分支 git merge tmp # 如果不想保留temp分支 可以用这步删除 git branch -d temp版本管理#直接从暂存区删除文件,工作区则不做出改变 git rm --cached <file> #同时删除工作区和缓存区 git rm <file> #移除所有未跟踪文件 #一般会加上参数-df,-d表示包含目录,-f表示强制清除。 git clean [options] #版本树 git log git log --pretty=oneline #时光机 #保留源码,只回退回退commit和index信息 git reset {id} #完全回退 git reset --hard HEAD^^^.. git reset --hard HEAD~n git reset --head {id} git客户端Git-GuiGitHub DeskTop
2024年05月01日
2 阅读
0 评论
0 点赞
2024-04-19
CodeSandbox-Blog备份
在CodeSandBox上部署docker长期以来白嫖Replit已经成为习惯,突然Replit的政策改变让人猝不及防。虽然此前就已经知道了CodeSandBox这个平台,但苦于其公开性质,以及不可更换的会直接暴露公开容器的域名分配,一直以来对CodeSandBox的使用也是离不开Replit的——在CodeSandBox部署好服务之后,在Replit部署NGINX服务反代CodeSandBox提供的域名,一定程度上避免CodeSandBox容器的暴露。那么Replit即将无法白嫖的现状下,怎么快乐的使用CodeSandBox呢?第一时间我想到的是Cloudflare的Workers。但是Workers对于免费用户来讲额度太少,就此浪费掉未免也太可惜,那怎么办呢?虽说家中的软路由一直以来都使用Cloudflared打通Tunnel进行穿透,但是还得是fscarman2的各种PaaS平台搭建代理的仓库给了我灵感,可以在PaaS平台使用Cloudflared,像家里的软路由内网穿透一样,使用自己的域名。经过我反复尝试,总算找到了在CodeSandBox上能够比较稳定搭建各种服务的办法。如果你会操作,也可以自行构筑各种镜像进行部署,只需要在 docker-compose.yaml文件末添加Cloudflared部分即可。这里就以青龙面板为例,讲述一下CodeSandBox的白嫖方法。开始教程注册codesandbox编写docker-compose文件以青龙面板为例,在这里可以找到其docker-compose文件:version: '2' services: web: # alpine 基础镜像版本 image: whyour/qinglong:latest # debian-slim 基础镜像版本 # image: whyour/qinglong:debian volumes: - ./data:/ql/data ports: - "0.0.0.0:5700:5700" environment: # 部署路径非必须,以斜杠开头和结尾,比如 /test/ QlBaseUrl: '/' restart: unless-stopped稍作修改:version: '2' services: qinglong: image: whyour/qinglong:latest volumes: - /project/sandbox/ql/data:/ql/data ports: - "0.0.0.0:5700:5700" environment: QlBaseUrl: '/' restart: always主要修改了其 volumes的部分,因为CodeSandBox的文件目录在 /project/sandbox/下,所以我在此路径下创建 ./ql/data来存储青龙面板的数据,实现数据持久化。而Cloudflared部分,我是这样写的:cloudflared: restart: always network_mode: host environment: - TZ=Asia/Shanghai command: tunnel --edge-ip-version auto --protocol quic --heartbeat-interval 10s run --token [ARGO_TOKEN] container_name: cloudflared image: cloudflare/cloudflared:latest其中的 [ARGO_TOKEN]要替换成自己的token,后文将附上详细教程。所以整个 docker-compose.yaml的内容如下:version: '2' services: qinglong: image: whyour/qinglong:latest volumes: - /project/sandbox/ql/data:/ql/data ports: - "0.0.0.0:5700:5700" environment: QlBaseUrl: '/' restart: always cloudflared: restart: always network_mode: host environment: - TZ=Asia/Shanghai command: tunnel --edge-ip-version auto --protocol quic --heartbeat-interval 10s run --token [ARGO_TOKEN] container_name: cloudflared image: cloudflare/cloudflared:latest获取[ARGO\_TOKEN]详见群晖套件:Cloudflare Tunnel 内网穿透中文教程 支持DSM6、7。此处需要的[ARGO\_TOKEN]就是ey开头的那一串。然后在Cloudflare中设置好相应的域名和本地端口对应,一般协议用http即可。像此处,按照我的 docker-compose.yaml来看,我应该映射5700端口,所以我填的是 0.0.0.0:5700。创建Devbox在CodeSandBox中进入dashboard,然后点击”Create a Devbox”选择docker进入Devbox之后,在左侧的文件管理EXPLORER中可以看到有 .codesandbox和 .devcontainer两个文件夹先修改 .codesandbox中的 tasks.json文件,在 setupTasks中添加部署命令:"setupTasks": [ { "name": "Deploy", "command": "cd /project/sandbox/.devcontainer/ && docker compose up -d" } ],然后在 .devcontainer文件夹下新建 docker-compose.yaml文件,把上述的 docker-compose.yaml内容全部复制进去。最后点击左上角的方框打开菜单,选择”Restart Devbox”,等待容器重启后,你就可以看到青龙运行好了。再试一下刚刚在Cloudflare中映射的域名,也可以用了。一些问题不知道为什么,当我使用http2模式运行Cloudflared时,隧道断连后并不会重新连接,auto模式在quic模式断连后自动切换http2模式,再断连又会出现http2模式一样的问题。所以我只能指定其使用quic模式进行运行。原因未知,希望有人能找到原因。然后,必须保持容器活跃,Cloudflared掉线后才会重连,为保证其活跃,得使用网站监控器监控CodeSandBox自带的映射域名,形同 https://t6a4m-8080.csb.app/的那个。至于网站监控器,Uptime-Kuma、cron-job、UptimeRobot之类的都行。注意,有些PaaS平台(比如Glitch)已经禁止了自身服务器ip、公用网站监控器ip进行访问,所以上述的cron-job和UptimeRobot是否能行请自行测试,更加建议自己搭建Uptime-Kuma。后话在CodeSandBox上我已经尝试使用此方法部署了Alist、qinglong、Halo(本站就是)、Pandora\_Next以及自己构筑的个别镜像等多个应用,尽数成功。可玩性还是很高的。但是不得不提醒,这种方法只是避免了从域名上找到自己的容器而已,并不能确保自己的数据不会泄露,毕竟使用的是公共容器,请注意信息安全,不要存储私密信息,否则后果自负。另,宣传一下QQ群:受虐滑稽一些可以在CodeSandBox上配合Cloudflared使用的docker-compose以下任何一个配置,如果不需要Cloudflared打隧道,就把cloudflared部分删掉。另外,除了Cloudflared打隧道,现在有新的使用自己的域名的方法,详见仓库:k0baya/reserve-vercel。现在已经将Cloudflared部分从各配置中删除,如有需要请自行添加:version: '3.3' services: cloudflared: restart: always network_mode: host environment: - TZ=Asia/Shanghai command: tunnel --edge-ip-version auto --protocol quic --heartbeat-interval 10s run --token [ARGO_TOKEN] container_name: cloudflared image: cloudflare/cloudflared:latestQinglong映射5700端口version: '2' services: qinglong: image: whyour/qinglong:latest volumes: - /project/sandbox/ql/data:/ql/data ports: - "0.0.0.0:5700:5700" environment: QlBaseUrl: '/' restart: alwaysAlist映射5244端口如果需要使用Aria2实现离线下载,把第14行的 image指定的镜像更改为 xhofe/alist-aria2:main即可version: '3.3' services: alist: restart: always volumes: - '/project/sandbox/alist:/opt/alist/data' ports: - '5244:5244' environment: - PUID=0 - PGID=0 - UMASK=022 container_name: alist image: 'xhofe/alist:latest'Halo映射8090端口version: "3" services: halo: image: halohub/halo:2.11 container_name: halo restart: on-failure:3 depends_on: halodb: condition: service_healthy networks: halo_network: volumes: - /project/sandbox/data/halo2:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s command: - --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo - --spring.r2dbc.username=halo # PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。 - --spring.r2dbc.password=12345678 - --spring.sql.init.platform=postgresql # 外部访问地址,请根据实际需要修改 - --halo.external-url=http://localhost:8090/ halodb: image: postgres:15.4 container_name: halodb restart: on-failure:3 networks: halo_network: volumes: - /project/sandbox/data/db:/var/lib/postgresql/data ports: - "5432:5432" healthcheck: test: [ "CMD", "pg_isready" ] interval: 10s timeout: 5s retries: 5 environment: - POSTGRES_PASSWORD=12345678 - POSTGRES_USER=halo - POSTGRES_DB=halo - PGUSER=halo networks: halo_network:Pandora-Next映射端口8181version: '3.3' services: pandora-next: image: pengzhile/pandora-next container_name: PandoraNext network_mode: bridge restart: always ports: - "8181:8181" volumes: - /project/sandbox/pandora-next/data:/data - /project/sandbox/pandora-next/sessions:/root/.cache/PandoraNextUptime-Kuma映射端口3001version: '3.8' services: uptime-kuma: image: louislam/uptime-kuma:1 container_name: uptime-kuma volumes: - /project/sandbox/uptimekuma:/app/data ports: - "3001:3001" # <Host Port>:<Container Port> restart: alwaysKodBox映射端口8080version: '3.5' services: db: image: mariadb command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW volumes: - "/project/sandbox/db:/var/lib/mysql" environment: - "TZ=Asia/Shanghai" - "MYSQL_ROOT_PASSWORD=jiehdo!25165n" - "MYSQL_DATABASE=kodbox" - "MYSQL_USER=bodbox" - "MYSQL_PASSWORD=jiehdo!25165n" restart: always app: image: kodcloud/kodbox ports: - 8080:80 links: - db - redis volumes: - "/project/sandbox/site:/var/www/html" restart: always redis: image: redis:alpine environment: - "TZ=Asia/Shanghai" restart: always如果照搬上面的设置,初始化时数据库和redis的设置应该如图填写数据库类型:MySQL 服务器:db 用户名:root 密码:jiehdo!25165n 数据库:kodbox 存储引擎:InnoDB 系统缓存类型:Redis 服务器:redisZfile映射端口8080version: '3.3' services: zfile: container_name: zfile restart: always ports: - '8080:8080' volumes: - '/project/sandbox/zfile/db:/root/.zfile-v4/db' - '/project/sandbox/zfile/logs:/root/.zfile-v4/logs' - '/project/sandbox/zfile/file:/data/file' image: zhaojun1998/zfilePanIndex映射端口5238version: '3.3' services: panindex: container_name: panindex restart: always ports: - '5238:5238' volumes: - '/project/sandbox/PanIndex/data:/app/data' environment: - "PORT=5238" image: iicm/pan-index:latestShareList映射端口33001version: '3.3' services: sharelist: container_name: sharelist restart: always ports: - '33001:33001' volumes: - '/project/sandbox/sharelist:/sharelist/cache' image: reruin/sharelist:nextCloudreve映射端口5212进入容器需要先手动创建几个文件,在Terminal中输入以下指令即可:先运行文件中的shell命令shell.txtversion: "3.8" services: cloudreve: container_name: cloudreve image: cloudreve/cloudreve:latest restart: unless-stopped ports: - "5212:5212" volumes: - /project/sandbox/cloudreve/data:/data - /project/sandbox/cloudreve/cloudreve/uploads:/cloudreve/uploads - /project/sandbox/cloudreve/cloudreve/conf.ini:/cloudreve/conf.ini - /project/sandbox/cloudreve/cloudreve/cloudreve.db:/cloudreve/cloudreve.db - /project/sandbox/cloudreve/cloudreve/avatar:/cloudreve/avatar depends_on: - aria2 aria2: container_name: aria2 image: p3terx/aria2-pro restart: unless-stopped environment: - RPC_SECRET=jif1568dw87 - RPC_PORT=6800 volumes: - /project/sandbox/cloudreve/aria2/config:/config - /project/sandbox/cloudreve/data:/dataAria2的token默认为 jif1568dw87,如有需要自行修改初始账号和密码,请在Terminal中输入命令 docker logs cloudreve后在日志中查找。Typecho映射端口8080version: '3.7' services: typecho: image: joyqi/typecho:nightly-php7.4-apache container_name: typecho-server restart: always environment: - TIMEZONE=Asia/Shanghai ports: - 8080:80 volumes: - /project/sandbox/typecho:/app/usr depends_on: - mariadb mariadb: image: mariadb container_name: mariadb command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW volumes: - "/project/sandbox/db:/var/lib/mysql" environment: - "TZ=Asia/Shanghai" - "MYSQL_ROOT_PASSWORD=jiehdo!25165n" - "MYSQL_DATABASE=typecho" - "MYSQL_USER=typecho" - "MYSQL_PASSWORD=jiehdo!25165n" restart: always如果照搬此docker-compose.yaml,初始设置数据库时应该如此填写:数据库适配器:Mysql 原生函数适配器 数据库前缀:typecho\_ 数据库地址:mariadb 数据库用户名:root 数据库密码:jiehdo!25165n 数据库名:typechoBaota\_Panel端口8888为面板,2022为SSH端口,2021为FTP端口,2080和2443为网页服务预留端口,2888是官方给的,不知道作用。<version: '3' services: baota: image: gettionhub/baota-docker:ltd container_name: baota volumes: - /project/sandbox/www/website_data:/www/wwwroot - /project/sandbox/www/mysql_data:/www/server/data - /project/sandbox/www/vhost:/www/server/panel/vhost ports: - "8888:8888" - "2022:22" - "2021:21" - "2443:443" - "2080:80" - "2888:888" restart: unless-stopped面板入口为8888端口的那个网址后面加上 /baota,形同 https://t6a4m-8888.csb.app/baota。初始用户名、密码都为baota容器内root用户的ssh密码也是baotaWordPress映射端口8080version: '3.1' services: wordpress: image: wordpress restart: always ports: - 8080:80 environment: WORDPRESS_DB_HOST: db WORDPRESS_DB_USER: exampleuser WORDPRESS_DB_PASSWORD: examplepass WORDPRESS_DB_NAME: exampledb volumes: - /project/sandbox/wordpree/app:/var/www/html db: image: mysql:5.7 restart: always environment: MYSQL_DATABASE: exampledb MYSQL_USER: exampleuser MYSQL_PASSWORD: examplepass MYSQL_RANDOM_ROOT_PASSWORD: '1' volumes: - /project/sandbox/wordpree/db:/var/lib/mysqlMemos映射端口5230version: "3.0" services: memos: image: neosmemo/memos:latest container_name: memos volumes: - /project/sandbox/memos/:/var/opt/memos ports: - 5230:5230Ghost映射端口8080首次启动会反复重启几次等待数据库创建文件,是正常的。version: '3.1' services: ghost: image: ghost:4-alpine restart: always ports: - 8080:2368 environment: database__client: mysql database__connection__host: db database__connection__user: root database__connection__password: example database__connection__database: ghost url: http://localhost:8080 volumes: - /project/sandbox/ghost/app:/var/lib/ghost/content db: image: mysql:8.0 restart: always environment: MYSQL_ROOT_PASSWORD: example volumes: - /project/sandbox/ghost/db:/var/lib/mysqlNGINX-ui面板端口为8080。网页服务端口预留为8443。version: '3.3' services: nginx-ui: stdin_open: true tty: true container_name: nginx-ui restart: always environment: - TZ=Asia/Shanghai volumes: - '/project/sandbox/appdata/nginx:/etc/nginx' - '/project/sandbox/appdata/nginx-ui:/etc/nginx-ui' - '/project/sandbox/www:/var/www' ports: - 8080:80 - 8443:443 image: 'uozi/nginx-ui:latest'继续补充ing……在CodeSandBox中部署其他应用——以小雅为例对小雅容器的一些分析相信部署过小雅的朋友都一直苦恼于小雅的更新频繁,以及阿里网盘更新后的容量限制,给日常观影带来了很不好的体验。随着xiaoyakeeper的诞生,才迎来了转机——自动更新容器+自动清理转存文件,解决了小雅日常使用的痛点。但是,不论是小雅本身还是xiaoyakeeper,其部署方式都是一键式的脚本,而且部署方式限制的死死的——指定了端口、挂载卷等应该容许自定义的参数,使得其难以部署在各种PaaS平台上。此前我曾有过最简单的把小雅部署在PaaS平台上的方法构思——基于小雅原镜像进行修改。直接查看小雅的一键部署脚本不难发现,是通过提前创建 /etc/xiaoya路径,再把需要使用到的各项token、id等参数储存为TXT文本文件,放入 /etc/xiaoya后,使用 volume挂载进容器的 /data路径进行读取的。所以只要在原有镜像上进行修改,准备好自己的这些token、id后,将其全部复制到小雅镜像的/data路径,就应当可以在不使用volume挂载的情况下直接部署一个能够正常使用的小雅容器。但是,首先这个方案比起一键脚本操作复杂太多,而且在我仔细查看了xiaoyakeeper的脚本后,我发现这样操作会使得xiaoyakeeper无法读取docker命令的 -v项,就需要对xiaoyakeeper的脚本进行修改了。但是xiaoyakeeper的脚本又自带自动更新功能,如果一个更新覆盖了我的修改,又不得偿失;如果删掉自动更新的功能,那么如果阿里网盘的政策出现了改变,还得重新手动修改最新的xiaoyakeeper脚本进行替换,难以做到一劳永逸。通过观察xiaoyakeeper的脚本内容,其更新小雅容器的方法并不是运行小雅的一键更新脚本,而是读取当前小雅容器的各项参数之后,重新进行 docker pull、docker run,也就是说,小雅容器被安装好之后,通过xiaoyakeeper进行更新就能完全摆脱小雅一键脚本。而且,如果小雅容器没有被启动的话,xiaoyakeeper运行之后就会直接启动小雅容器。对CodeSandBox的分析摸索暂时比较少,Devbox(Docker)大概理解为一个 Ubuntu为底的,zsh为默认shell执行器的,有root权限的,预装了Docker的虚拟机。在 /project/sandbox/路径下的文件,即便重启也不会丢失。在CodeSandBox上部署小雅、xiaoyakeeper、Cloudflared部署小雅通过上述的分析,不难得出,可以修改小雅的一键部署脚本,然后直接在CodeSandBox的Devbox的Terminal中运行部署脚本,以将小雅部署到CodeSandBox上。小雅的一键脚本功能很简答,无非就是要求你输入 token、opentoken、folder_id,然后把他们储存在一个路径,再 Docker run,把这个路径挂载进容器。基本上不需要什么修改,唯一需要修改的就是把创建文件和挂载卷的路径改成在CodeSandBox中能够永久储存的路径,操作如下:下载小雅的部署脚本并替换其中的路径然后执行在Terminal中运行以下命令:code here...按照提示输入各种要求的变量即可。运行完毕后可以看到右侧弹窗窗口中对应5678端口的那个就是小雅了。注意,如果你遇到了运行后小雅路径下内没有 mytoken.txt、myopentoken.txt、temp_transfer_folder_id.txt,请不要一个劲重试浪费时间,自己把这三个文件建好并填入应有的内容再放入xiaoya路径下即可。小雅的配置文档中本身就有好几个文件需要手动建立并填入内容。部署xiaoyakeeper经我尝试,xiaoyakeeper部署在CodeSandBox上,如果使用Docker模式,会有很多问题,大概与CodeSandBox的 docker.sock配置有关,所以只能使用模式0:code here...如果需要TG推送,先把上述命令在Terminal中运行一遍,会要求接入TG推送,按照要求操作即可。接入完成后使用 Ctrl+c结束脚本。如果你不需要TG推送,或者已经运行了刚刚的命令接入了TG,那么就在左侧文件中新建一个名为”clear.sh”的文件,把上述命令最后的 -tg参数删除,粘贴进去,即为:code here...然后把执行这个脚本添加进容器启动时的任务中,即修改 .codesandbox下的 tasks.json中的 tasks部分:"tasks": { "xiaoyakeeper": { "name": "aliyun_clear", "command": "bash /project/sandbox/clear.sh", "runAtStart": true } }这样,当Devbox启动时,xiaoyakeeper就会启动,而xiaoyakeeper启动时就会启动小雅容器。部署Cloudflared如果你就个人使用,实际上没有必要加Cloudflared了,只要 .csb.app的域名和容器名不泄露,就和使用Cloudflared加自己的域名也没太大区别。这里就简单偷个懒,虽然也可以直接运行Cloudflared客户端解决,但是可以用docker,而且又早都写好了 docker-compose.yaml,那就继续用docker-compose部署吧:version: '3' services: cloudflared: restart: always network_mode: host environment: - TZ=Asia/Shanghai command: tunnel --edge-ip-version auto --protocol quic --heartbeat-interval 10s run --token [ARGO_TOKEN] container_name: cloudflared image: cloudflare/cloudflared:latestdocker-compose.yaml文件放在.devcontainer路径下,详细的设置请参考之前写的文章。这里依旧是修改 .codesandbox下的 tasks.json文件进行启动,加上启动xiaoyakeeper的修改,最终的的 task.json为:{ // These tasks will run in order when initializing your CodeSandbox project. "setupTasks": [ { "name": "Deploy", "command": "cd /project/sandbox/.devcontainer/ && docker compose up -d" } ], // These tasks can be run from CodeSandbox. Running one will open a log in the app. "tasks": { "xiaoyakeeper": { "name": "aliyun_clear", "command": "bash /project/sandbox/clear.sh", "runAtStart": true } } }注意,只有5678端口需要映射出来,另外两个端口是配合一些TV软件使用,这里用不上。如果你确实有需求且自己会配置,请自行研究,这里不做探讨。到这里就全部部署完成了,只需要Restart Devbox检查一下是否正常运行即可。附上Cloudflared的可执行文件使用命令行直接建立Tunnel的命令:./cloudflared tunnel --edge-ip-version auto --protocol quic --heartbeat-interval 10s run --token [ARGO_TOKEN]其他应用的部署通过以上的捣鼓可以发现,.codesandbox下的 tasks.json文件实际上与Replit的 replit.nix和 .replit两个文件的功能相近。在 setupTasks部分中你可以使用 apt-get install、npm install或者 pip install等命令进行软件包的安装,亦或者其他的部署指令。在 tasks部分你可以添加一些快捷命令,需要在启动时自动运行的,就把 runAtStart设置为 true即可。上述命令,无论是 setupTasks还是 tasks,都是在Terminal中直接运行的命令,区别是,如果 setupTasks没有执行完,Devbox不会启动,而 tasks只有在启动完成之后才能执行。那么就可以很简单的把Replit上之前部署的应用搬到CodeSandBox上了,replit.nix里需要的软件包,就去 setupTasks添加命令安装,.replit里定义的 Run的行为,添加到 tasks里去,并且把 runAtStart设置为 true,其他的文件照搬一下,原本使用 ${REPL_SLUG}、${REPL_OWNER}之类的变量确定的文件路径,统一修改为 /project/sandbox/下的任意路径即可。当然不建议直接照搬,因为CodeSandBox配置比Replit高不少而且支持docker,这里建议能用docker的都用docker部署,源仓库不提供用docker部署的,写dockerfile构筑docker部署。实在不会用docker,再考虑这样的照搬或者直接运行的方法。在CodeSandBox中使用Mirai-Console-Loader刚好发现了ttyd和filebrowser两款神器,感觉使用这两个工具就可以愉快便利的在CodeSandBox上使用Mirai-Console-Loader,遂试了一下,果然可行,记录一下部署过程。部署过程下载Mirai-Console-LoaderTerminal中运行一行命令解决:code here...如果和我一样有强迫症,看着时区不对很烦,毕竟CodeSandBox的服务器并不在UTC+8区,所以通过手动修改其启动脚本,即名为 mcl的那个文件,在执行jar包的命令前添加时区参数,即把最后一行改成:code here...修改Devbox的启动任务修改 .codesandbox路径下的 tasks.json文件,添加软件包的安装与所需工具的下载与运行命令,修改后的 tasks.json文件如下:code here...请不要直接复制粘贴,务必看一眼我写的批注,改成自己的信息后再复制粘贴。接着Restart Devbox,等待重启完毕即可。记得在Cloudflare面板里设置相应的端口对应,这里我使用的是21021和21022两个端口。接着打开自己映射的域名,输入自己设置的用户名和密码即可开始畅玩。后话Mirai-Console-Loader是目前最为成熟的QQ机器人使用方法之一了,其插件生态之完善带来了很高的可玩性,不论是之前部署的ChatGPT机器人、New Bing机器人,在Mirai-Console-Loader中基本都有相应的插件实现。也是得益于CodeSandBox比起Replit更为强大的机能,才使得Mirai-Console-Loader能够在平台上流畅的运行。关于Mirai-Console-Loader的使用方法、插件安装、登录问题等,其官方文档和论坛也已经记录的非常详细了,这里不多作讨论,只说这一点:我大概尝试发现的可行的登录方法就是在本地电脑也安装一个Mirai-Console-Loader,通过手表协议扫码登录之后能够获得一个登录记录的文件夹,把整个文件夹上传到CodeSandBox上的相应位置即可。原理和go-cqhttp通过上传 session.token文件进行登录是类似的。讨论群:738386033在CodeSandBox上搭建代理服务器使用的是3Kmfi6HP/nodejs-proxy这个仓库。部署方法新建Node.js为Template的Devbox,然后使用以下 tasks.json的内容覆盖原本的 tasks.json:1234567891011121314151617181920212223{ // These tasks will run in order when initializing your CodeSandbox project. "setupTasks": [ { "name": "Install Dependencies", "command": "npm i -g @3kmfi6hp/nodejs-proxy" } ], // These tasks can be run from CodeSandbox. Running one will open a log in the app. "tasks": { "dev": { "name": "Start Dev Server", "command": "npx @3kmfi6hp/nodejs-proxy", "runAtStart": true, "preview": { "port": 7860 }, "restartOn": { "files": ["./package-lock.json"] } } }}然后Restart Devbox,等待网页弹出即可。使用注意有个Bug,实际端口应该是443而不是80,所以要在导出的代理配置中把服务端口从80改为443才能正常连接,不然连不上。
2024年04月19日
2 阅读
0 评论
0 点赞
1
2