0%

初次使用配置用户信息

1
2
3
4
5
6
7
8
9
git config --global user.name "malu"
git config --global user.email "malu@malu.me"

git config --global alias.l 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --no-merges -30'
git config --global alias.ll 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --stat -6'
git config --global alias.lll 'log --pretty=format:"%h %ad [%an] %s%d" --date=format:"%Y-%m-%d %H:%M" --stat --graph -10'

git config --global alias.s 'status --short'

使用HTTP basic auth clone

使用http方式去clone时,如果用户名密码包含特殊字符,则都需要URL encode

比如用户名含有邮箱的@符号时需要转换成%40

1
git clone https://malu%40malu.me:password@github.com/pingmalu/test.git 

git赋予文件权限

查看当前权限

1
2
[localhost]$ git ls-files --stage run.sh
100644 c1bda43ae2d82769f5e66404fdbe7d752ddb383b 0 run.sh

增加可执行权限

1
[localhost]$ git update-index --chmod +x run.sh

git添加多个远程仓库

添加新的远程仓库:

1
git remote add malu https://malu.me/project/xxx.git

将本地的所有分支推送到新的远程仓库:

1
git push --all malu

强制推送到新的远程仓库:

1
git push -f malu

git基本使用方法

查看远程仓库地址

1
git remote -v

查看所有分支

1
git branch -a

查看每次提交的所有文件列表

1
git log --stat

查看特定的commit id中的文件列表

1
git show --stat <commit id>

查看最近一次提交的文件列表

1
2
3
git show --stat

git log --stat -1

查看配置

1
git config -l

一次完整提交

1
2
3
git add .
git commit -m'修改BUG'
git push

使用代理

1
git config http.proxy http://user:pwd@server.com:port

http全局代理

1
git config --global http.proxy http://127.0.0.1:1080

http当前项目代理

1
git config --local http.proxy http://127.0.0.1:1080

socks5全局代理

1
git config --global http.proxy socks5://127.0.0.1:1080

socks5全局代理,只对github.com

1
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080

clone时使用代理

1
git clone https://github.com/xxx.git -c http.proxy=socks5://127.0.0.1:1080

clone时使用代理并取最新的

1
git clone https://github.com/xxx.git -c http.proxy=socks5://127.0.0.1:1080 --depth=1

取消代理

1
git config --global --unset http.proxy

取消只对github.com的代理

1
git config --global --unset http.https://github.com.proxy

查询

显示文件的每一行是在哪个版本最后修改。

1
git blame filename.c 

查找commit内容

1
git log  --pretty=onelinegrep 关键字

查看用户代码量

1
git log --stat --author='username'perl -ne 'END { print $c } $c += $1 if /(\d+) insertions/;'

分支

查看本地分支

1
git branch

查看所有分支 (加-v显示最后一次提交信息)

1
git branch -a -v

本地创建分支

1
git branch dev

将本地分支上传至远程

1
git push origin dev

下载在线的一个分支

1
git branch dev origin/dev

删除本地分支

1
git branch -d dev

删除远程分支

1
2
git branch -r -d origin/branch-name
git push origin :branch-name

切换本地分支到dev

1
git checkout dev

合并分支

1.开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支

1
2
3
4
5
git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master

2.当master代码改动了,需要更新开发分支(dev)上的代码

1
2
3
4
5
git checkout master 
git pull 
git checkout dev
git merge master 
git push -u origin dev

3.假设本地有2个分支dev master,要把dev合并到master 也可以

1
git merge dev master

4.把dev合并到master还可以

1
git rebase dev master

合并冲突解决

1.如果合并冲突取对方代码

1
git merge -s recursive -X theirs dev --allow-unrelated-histories

2.如果合并冲突取当前分支代码

1
git merge -s recursive -X ours dev --allow-unrelated-histories

–allow-unrelated-histories 把两段不相干的 分支进行强行合并

3.一个分支完全覆盖另一个分支

1
2
3
git checkout master  // 切换到旧的分支
git reset –hard dev // 将本地的旧分支 master 重置成 dev
git push origin master –force // 再推送到远程仓库

标签

本地新建标签

1
git tag -a only_apache -m "只有apache集成环境"

查看本地标签

1
git tag

切换至指定标签

1
git checkout only_apache

把所有本地标签提交到服务器

1
git push origin --tags

将标签only_apache提交到服务器

1
git push origin only_apache

切换远程分支,Git每次提交需要密码处理

把远程分支从https切换到ssh模式

1
2
3
4
5
6
# 先查看远程分支
git remote -v
# 删除远程分支
git remote rm origin
# 添加远程分支
git remote add origin git@github.com:pingmalu/test.git

Git 合并遇到冲突解决办法

1.使用栈保存编辑数据后pull下来再合并

1
2
3
4
5
6
git stash: 备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到Git栈中。
git pull: 暂存了本地修改之后,就可以pull了。
git stash pop: 从Git栈中读取最近一次保存的内容,恢复工作区的相关内容。由于可能存在多个Stash的内容,所以用栈来管理,pop会从最近的一个stash中读取内容并恢复。
git stash pop stash@{$num}: 如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1}
git stash list: 显示Git栈内的所有备份,可以利用这个列表来决定从那个地方恢复。
git stash clear: 清空Git栈。此时使用gitg等图形化工具会发现,原来stash的哪些节点都消失了。

2.从xxxx分支合并到dev

先把xxxx分支上的提交hash找出来,再去dev上执行cherry-pick:

1
2
git cherry-pick a2a544fd01c2578046b335636e4
git push origin dev

Git后悔药(慎用)

放弃本地修改

1
2
git reset --hard
git clean -df

其他:

1
2
3
4
5
6
7
git rm --cached <FILE>:已 add(tracked) 未 commit 的文件,使其回到未 add 状态(untracked)。
git rm -f <FILE>: 从本地删除已 add 的文件。
git checkout -- <FILE> :有修改的文件回到 tracked 状态,对已 tracked 的文件撤销修改。
git reset HEAD <FILE>:撤销 commit,回到 modified 状态。
git reset --soft HEAD^:撤销 commit,回到 tracked 状态。
git clean:删除所有 untracked 文件。

放弃本地修改,使用远程最新版本

1
2
3
git fetch --all
git reset --hard origin/master
git pull

如果只需要移除一个文件

1
git reset <文件名>

或者如果你想从暂存区移除所有没有提交的修改

1
git reset

放弃远程上一次提交的内容

1
2
3
4
git reset --hard HEAD^
或用:
git reset --hard HEAD~1

修改错误的提交信息

1
2
git commit --amend -m ”YOUR-NEW-COMMIT-MESSAGE”
git push <remote> <branch> --force

恢复某个文件到指定hash

1
git checkout fc0c4369b362a38 .\index.html

Stash未提交的更改

stash在本质上会取走所有的变更并存储它们为以备将来使用

1
git stash

检查stash列表,你可以运行下面的命令

1
git stash list

如果想要解除stash并且恢复未提交的变更

1
git stash apply

每个stash都有一个标识符,一个唯一的号码(尽管在这种情况下只有一个stash)。 如果只想留有余地进行apply stash,你应该给apply添加特定的标识符

1
git stash apply stash@{2}

如果想取出stash

1
git stash pop

取出指定stash

1
git stash pop stash@{2}

清除stash

1
git stash drop stash@{0}

清除所有stash

1
git stash clear

找回删除的stash

1
2
git fsck --lost-found
git show 8dd73fa8d14880182f11e24dc10bca570b6127d7

Ubuntu git升级到最新版

1
2
3
4
apt-get install software-properties-common
add-apt-repository ppa:git-core/ppa
apt-get update
apt-get install git

cmd下git log乱码

windows配置环境变量

1
LESSCHARSET 为 utf-8

统一配置:

1
2
3
git config --global i18n.commitencoding utf-8
git config --global i18n.logoutputencoding utf-8

gitk乱码问题

编辑C:\Users\Administrator\.gitconfig 全局文件(也可编辑项目目录.git/config用于设定单个项目):

1
2
3
4
[gui]
encoding = utf-8
[i18n]
commitencoding = {utf-8gbk}

[gui]用于设定gitk总的编码格式

[i18n]用于设定commit等编码,这个默认不需要去设置

Git Bash中查看log中文乱码

修改%Git%\etc\profile (Linux下为 ~/.bash_profile 文件),在末尾添加如下一行:

1
export LESSCHARSET=utf-8

要马上生效,直接设置该环境变量,或者重新登录

git diff乱码问题也可以用上面的设置

1
export LESSCHARSET=utf-8

git-bash 乱码临时转换

utf-8转gbk

1
git status  iconv -f utf-8 -t gbk

gbk 转 utf-8 输出

1
winpty ipconfig

解决 idea Terminal 配置 git bash 中文乱码

修改:C:\Program Files\Git\etc\bash.bashrc 文件,在这个文件末尾追加

1
2
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"

ERROR

git pull 报错:

Auto packing the repository for optimum performance. You may also run “git gc” manually. See “git help gc” for more information.

1
git gc

由于git本身不保存文件之前的差异文件.只保存每个文件的快照.所以在频繁修改大文件的情况下会造成git目录变得肥大不堪.git早就有了解决方案.git gc后,会在.git目录下生成一个packfile与idx文件.只保存文件差异

Git忽略规则及.gitignore规则不生效的解决办法

原因是.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

那么解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

1
2
3
git rm -r --cached .    #将会移除所有的缓存索引
git add .
git commit -m 'update .gitignore'

!!! 还有一种可能是.gitignore的文件编码问题导致

比如我遇到Unicode的编码,把它改成ANSI即可

git pull的时候遇到

Unlink of file ‘.git/objects/pack/pack-***.pack’ failed. Should I try again? (y/n) y

上面的问题,按n或者y都没有用,先Ctrl+C

再执行:

1
2
git gc --auto  #自动清理本地的文件
git repack -d -l #将版本库未打包的松散对象打包

openshift git clone Permission denied

openshift执行git clone ssh://xxx@xxx.rhcloud.com/~/git/xxx.git/ 时报错 :

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

fatal: Could not read from remote repository.

Please make sure you have the correct access rights

and the repository exists.

解决办法:

将密钥拷贝的.ssh目录下,改名id_rsa/id_rsa.pub(密钥/公钥)再执行克隆命令成功解决。

自动脚本

每次提交md笔记需要敲命令,感觉太麻烦了,于是有了这个windows BAT脚本

拉取:

1
2
3
4
5
@echo off
@echo ========================================================
@echo git pull
@echo ========================================================
git pull

提交:

1
2
3
4
5
@echo off
@echo ========================================================
@echo git push
@echo ========================================================
git add . && git commit -am 'update' && git push

部署gitlab服务器

docker安装:

https://docs.gitlab.com/omnibus/docker/

目前VPS商家提供的Debian 10系统基本上都是4.19.x.x的内核版本,站长本着用新不用旧的原则,在初次部署环境的时候,总是忍不住将系统内核版本升级到比较新的版本。

1、查看系统内核版本

uname -r

站长用于演示的这台Debian 10系统的VPS原始内核版本为:4.19.0-5-amd64

2、添加Debian官方 buster-backports 源

deb http://deb.debian.org/debian buster-backports main

编辑nano /etc/apt/sources.list,站长用nano编辑演示,默认如下图所示(有些商家默认有buster-backports源的,则略过):新手教程

将 buster-backports 源添加进去,然后按Ctrl+X退出;新手教程

这里会提示保存,输入Y并回车;新手教程

直接按回车确认将buster-backports源写入,新手教程

3、安装官方最新5.1x.x内核

先更新系统,命令如下:

apt update

安装最新内核

apt install -t buster-backports linux-image-cloud-amd64 linux-headers-cloud-amd64

新手教程

更新启动内核版本

update-grub

新手教程

重启系统

reboot

4、卸载旧内核版本 输入uname -r即可看到内核版本已经是5.10.0-0.bpo.7-cloud-amd64;输入以下命令查看当前系统已经安装的内核版本;

dpkg –list grep linux-image

新手教程

使用apt purge命令卸载旧的内核版本(按实际卸载的内核版本修改命令):

apt purge linux-image-4.19.0-5-amd64

新手教程

输入以下命令查看当前系统已经安装的内核头文件;

dpkg –list grep linux-headers

新手教程

如果有4.19.x.x的内核头文件,也可以使用apt purge命令卸载,命令如下(按实际卸载的内核头文件版本修改命令):

apt purge linux-headers-4.19.0-5-amd64

最后再动更新一下启动内核版本,可以看到,只剩下5.10.0-0.bpo.7-cloud-amd64了。

update-grub

新手教程

搞定!收工!……等等,好像还没完呢,查看下方这篇文章开启BBR才算真正搞定!

WordPress是世界上最著名的博客及内容管理系统(CMS)之一,我们这个博客也是基于WordPress的。通常来说,从一个新装的系统搭建WordPress都是比较麻烦的,自己需要安装PHP, 数据库,服务器程序等等多个组件,装好WordPress大概需要一个多小时,而且性能优化也不能尽如人意。因此,我们今天介绍一行代码,可以从零开始,用一行代码帮你搭好WordPress系统。本文作者为香菇肥牛,原文链接为https://qing.su/article/146.html, 转载请注明原文链接,谢谢!

1, 服务器系统要求

 

今天的教程支持CentOS 6, 7; Debian 7, 8, 9; Ubuntu 14, 16, 18.  所有系统均需为64位操作系统。安装时需要root权限。

2, 安装的组件

 

这个一行安装代码将在您的服务器上安装LLsMP组件与Wordpress程序,即OpenLiteSpeed服务器,MariaDB数据库,及PHP.  OpenLiteSpeed是非常高效的服务器软件,其性能可以直接吊打Apache, 甚至还可以性能数倍于Nginx.  现在大部分主机商的虚拟主机都是搭建在LiteSpeed系统上的,因为它对高并发访问的支持是所有服务器程序里面最好的,同时还能兼容.htaccess这类比较方便的Apache功能。OpenLiteSpeed自带了人性化的后台控制面板,因此不仅高效,而且非常易用。服务器自带的LSCache更是毫无争议的效率最高的WordPress缓存系统。这个一行代码搭建出来的WordPress可以直接作为安全高效的生产环境。下面,我们开始介绍这个一行代码。

3, 安装Wordpress

 

代码如下:

1
wget --no-check-certificate https://raw.githubusercontent.com/litespeedtech/ols1clk/master/ols1clk.sh && bash ols1clk.sh -w --adminpassword mypassword --email myemail@qing.su --lsphp 73 --wordpressplus mydomain.qing.su --wordpresspath /srv/www/mydomain.qing.su/public_html/ --dbrootpassword myrootpassword --dbname mywordpressdb --dbuser mywordpressdbuser --dbpassword mywordpressdbpassword --listenport 80 --wpuser mywpuser --wppassword mywppassword --wplang zh_CN

我们依次解释一下这行代码里面用到的几个参数。

  • -w 安装wordpress
  • –adminpassword 后面加上你设定的OpenLiteSpeed后台管理员密码
  • –email 后面跟你的WordPress管理员邮箱
  • –lsphp 后面加上你想要安装的PHP版本,比如7.3就输入73, 5.6就输入56.
  • –wordpressplus 后面加上你的WordPress域名。请提前将该域名解析到这台VPS或者服务器上。
  • –wordpresspath 后面跟WordPress的安装路径。
  • –dbrootpassword 后面加上MariaDB数据库root用户的密码。
  • –dbname 后面加上你需要新建的WordPress的数据库名。
  • –dbuser 后面加上你需要新建的WordPress的数据库用户名。
  • –dbpassword 后面加上你需要新建的WordPress的数据库密码。
  • –listenport 后面加上网站的端口,默认是80。
  • –wpuser 后面加上你需要新建的WordPress的管理员用户名。
  • –wppassword 后面加上你需要新建的WordPress的管理员密码。
  • –wplang 后面加上WordPress语言,如果需要中文,填zh_CN; 如果需要英文,填en.

输入并执行这行命令之后,会出现下面这个页面,可以确认一下信息输入是否有误。

如果没有问题,回车即可开始安装啦,一般来说很快就能安装好。如果缺一些依赖环境,这行命令也会自动帮你安装。

安装完毕之后,登录你的域名,就能管理WordPress啦,比如如果你的安装域名是mydomain.qing.su, 那么登录WordPress后台的地址是mydomain.qing.su/wp-login.php.  在后台,你可以继续设置主题、插件,布置模块样式等。

如果需要登录OLS的后台添加其他网站,请访问你的域名:7080, 比如这里是mydomain.qing.su:7080, 用户名是admin, 密码是刚才设定的第二个参数。

今天就介绍到这里。这个一行代码安装WordPress的方法是不是很方便呢?如果您遇到任何问题,欢迎留言与我交流。本文作者为香菇肥牛,原文链接为https://qing.su/article/146.html, 转载请注明原文链接,谢谢!

EDIT: 新增SSL安全证书的安装

4. [可选]安装SSL安全证书

这个脚本一键安装的WordPress是基于HTTP的,不带安全证书。如果您需要给网站加上安全证书,则还需要安装SSL.  刚开始用LiteSpeed的朋友们可能不清楚怎样安装SSL证书。我们这里假设用Let’s Encrypt生成好了证书,私钥储存在/etc/letsencrypt/live/domain.qing.su/privkey.pem, 证书储存在/etc/letsencrypt/live/domain.qing.su/fullchain.pem (这里我们使用全链,包含了证书和中间链)。然后,我们登录OpenLiteSpeed后台,地址是你的网址:7080, 比如example.com:7080, 用户名是admin, 密码是之前使用一键安装的时候设置的–adminpassword参数值。登录好之后,会看到类似下面的界面。

上面有服务器相关的基本信息。我们点击左侧的Listeners, 来到下图的界面。

然后点击图中的wordpressssl, 即可编辑我们刚刚安装的WordPress网站的相关设置。如下图。

我们点击头部的SSL选项卡,然后点击右上角小蓝色方框里面的图标,编辑第一个部分SSL Private Key & Certificate.  编辑的时候,我们在Private Key File里面填入服务器上私钥的地址,在Certificate File里面填入全链证书的地址,然后Chained Certificate选择Yes.

全部填好之后,保存并点击右上角绿色方框里的图标,重启LiteSpeed服务器。这样,我们就安装好SSL证书啦!

Mailu.io是一款免费开源且性能强大、功能丰富的域名邮箱系统。它基于Docker, 具有部署简单,可移植性高,备份方便等多种优势。之前,我们介绍过Poste邮箱系统的搭建;Poste已经很久不再更新了,而Mailu则是Poste的升级版,一直稳定更新。

今天,我们就来介绍如何搭建并使用Mailu.io域名邮箱。类似的域名邮箱系统,我们还推荐iRedMailZimbra, 您可以自行比较并选择喜欢的程序。本文作者为香菇肥牛,原文链接为https://qing.su/article/mail-hosting-with-mailu-io.html, 转载需注明原文链接。

1, 系统环境要求

由于Mailu基于Docker, 因此几乎可以在任何版本的Linux发行版上安装使用。安装前,请确保您的服务器有2 GB的内存,并拥有一个独立IP地址。

在安装之前,您需要确保您的VPS的25端口是开放的。您可以在您的VPS上执行下面的命令来测试25端口是否开放。

1

telnet smtp.aol.com 25

如果看到类似下面的回显,则说明端口是开放的:

1 2 3 4

Trying 74.6.141.50… Connected to smtp.aol.g03.yahoodns.net. Escape character is ‘^]‘. 220 smtp.mail.yahoo.com ESMTP ready

如果显示超时,说明25端口不开放;您需要向主机商申请开放25端口,或者更换一台VPS.

本文中,我们将在一台Ubuntu 20.04 LTS 64 bit操作系统的VPS中安装。在其他操作系统中的安装步骤类似。

2, 主机名与DNS设置

设置好主机名(服务器名, Hostname)是所有邮件服务器必不可少的一步,否则在发信时将会遇到各种错误。

如果您的域名为example.com, 那么我建议您的邮件服务器主机名可以设置为_mail.example.com或者mx.example.com_.  如果您不知道如何设置服务器名,请参考我们的图文视频教程

下文中,我们将以_mx.qing.su_作为主机名介绍整个系统的部署。当您设置好主机名之后(以mx.qing.su为例),在SSH中执行命令:

1

hostname

此时您应当看到系统显示_mx.  如果系统显示mx.qing.su_, 说明主机名设置错误,请重新设置。

在SSH中执行命令:

1

hostname -f

此时您应当看到系统显示_mx.qing.su_.

设置好主机名之后,您还需要设置DNS解析记录。DNS记录的设置分为两部分,一部分需要在搭建邮箱之前设置,另一部分(DKIM)在搭建邮箱之后设置。我们先介绍第一部分。假设您的服务器IP地址为88.88.88.88, 那么您需要到您域名的DNS服务提供商处,添加下面的五条记录:

  • 将域名_qing.su_设置任意一条A记录或者ALIAS记录,值为任意。如果您不使用该域名做网站,您可以设置一条A记录,解析到127.0.0.1.  请注意,根域名不能设置CNAME记录。
  • 将域名_mx.qing.su_设置A记录,解析到88.88.88.88
  • 将域名_qing.su_设置MX记录,优先级为10,解析值为mx.qing.su
  • SPF: 将域名_qing.su_设置TXT记录,解析值为”v=spf1 mx ~all”
  • DMARC: 将域名__dmarc.qing.su_设置TXT记录,解析值为”v=DMARC1; p=none; pct=100; rua=mailto:admin@qing.su

然后,您需要到您的VPS服务商处,为您的IP地址设置逆向DNS记录(Reverse DNS, PTR), 将88.88.88.88解析到mx.qing.su.

设置好这些之后,我们就可以开始部署Mailu域名邮箱了。

3, 安装Docker与Docker Compose

前面说过,Mailu基于Docker.  这里我将以Ubuntu 20.04 LTS操作系统为例,简要记录Docker与Docker Compose的安装。如果您对Docker非常了解,可以跳过这一部分。如果您使用的是其他操作系统,可以在这里(https://docs.docker.com/engine/install/, https://docs.docker.com/compose/install/)找到对应的安装步骤。

安装Docker Engine:

1 2 3 4 5 6

apt-get update && apt-get upgrade apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg  apt-key add - add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” apt-get update apt-get install docker-ce docker-ce-cli containerd.io

安装Docker Compose:

1 2

curl -L “https://github.com/docker/compose/releases/download/1.27.2/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose

 

4, 配置Mailu服务器

Mailu服务器提供了一个自动生成配置文件的网页,非常方便。因此,我们将使用这个网页来生成配置文件。它的地址是https://setup.mailu.io/

打开网页后,第一步是选择版本与Docker管理方式。这里我们选择最新版1.7, Docker管理方式选择Docker.

设置Mailu版本与Docker

第二步,需要设置路径与域名信息。请按照下图填写,并替换为您的域名。请注意,Main mail domain and server display name应该填写您的根域名,比如我这里是qing.su; 而Linked Website URL, 则填写您的邮件服务器主机名,这里我们填写https://mx.qing.su.  在TLS certificates这里,我们选择letsencrypt, 系统将会自动帮我们生成Let’s Encrypt证书。您也可以选择自己提供证书。下方的Enable the admin UI请务必勾选,否则系统将不会安装Web管理面板。

设置Mailu路径与管理员信息

第三步,选择网页邮箱的面板。这里可以选择Roundcube和Rainloop, 您可以根据个人偏好来选择。我这里推荐Rainloop,它更美观,且对移动端的适配更好。Rainloop支持中文显示。下面的三个选项分别是杀毒、WebDAV、邮件代收,您可以根据自己的需要来勾选。

第四步,配置IP与主机名。请在IP listen address中填写您服务器的IP地址,比如88.88.88.88.  第二行是设置Docker的子网,一般保持默认即可。IPv6建议不启用。Unbound resolver建议启用。最后一栏,填写您的服务器的长主机名,我这里是mx.qing.su.

配置IP地址与主机名

第五步,也是最后一步,选择数据库。这里我们选择最简单的Sqlite即可。您也可以选择其他的数据库,比如MySQL或者PostgreSQL.

选择数据库

选择完毕后,点击Setup Mailu, 系统就会自动帮你生成好配置文件了,如下图。

系统生成的Mailu配置文件

5, 运行Mailu服务器

按照上述步骤生成好Mailu配置文件,就可以运行Mailu服务器了。回到SSH, 执行:

1 2

mkdir /mailu cd /mailu

然后找到之前那个页面生成的配置文件链接,下载到/mailu文件夹中:

1 2

wget http://setup.mailu.io/1.7/file/edda7279-qing-su-qing-su-04773fdf23f9/docker-compose.yml wget http://setup.mailu.io/1.7/file/edda7279-qing-su-qing-su-04773fdf23f9/mailu.env

最后,使用Docker compose运行。

1

docker-compose -p mailu up -d

初次使用,系统将会下载几个Docker镜像,需要数分钟的时间。等系统提示完成后,Mailu就处于运行状态了。

部分朋友在初次运行Mailu的时候会遇到类似于下图的报错:

Mailu运行报错

如果遇到这种情况,您可以编辑_docker-compose.yml_文件,删除掉所有绑定了**[::1]**地址与端口的行,然后重新运行上面的命令即可。

6, 使用Mailu域名邮箱

在第一次登录Mailu服务器后台面板之前,需要新建一个管理员账户。在SSH中执行:

1

docker-compose -p mailu exec admin flask mailu admin hello example.com qing.su

这样,我们就创建了一个用户名为hello@example.com, 密码为qing.su的管理员账户。请替换为您需要的值。

创建完毕,您就可以在浏览器中访问https://mx.qing.su/admin登录您的管理员面板了,如下图。

Mailu后台面板

点击左侧Mail Domains, 就能管理我们的邮箱域名。在域名管理界面,点击右上角New domain, 即可添加域名。点击下图中的红框部分,即可添加用户;点击绿框部分,则进入域名详情页。

管理邮箱域名

点击上图中的红框,进入用户管理界面,如下图:

添加邮箱用户

这里我们可以输入邮箱前缀,密码,姓名。下方的Features and quotas可以设置邮箱容量,并且可以设置是否允许IMAP和POP3客户端登录收信。设置完毕后,点击Save, 就添加好了用户。

在域名管理界面,点击之前那张图的绿框部分,则进入了域名详情页。我们点击右上角的Generate keys, 即可生成DKIM记录。如下图。

根据上图的信息,您需要去您的DNS服务器运营商设置域名的DKIM记录。比如,以我的qing.su域名为例,我需要设置下面的DKIM记录:

  • 将域名_dkim._domainkey.qing.su_设置TXT记录,解析值为”v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDK8nX8NbQ/16bb7zUqZif39emugOQpBDTXeLTqKhmrhPHFt5RgrDj9ibL18ovXKsQONjXZ+qNE407+KQZWcVLFvCQ6jtl1ojSfnJGeltGRqgfjw0nIAFQ9P6UVO5fiyrnxR4NZ+MDKvsv33NMgJxpEH6O8hQ/K2mDM+mDcIIbOwQIDAQAB”

这样,我们就完成了全部的DNS设置。此时,您的域名邮箱已经全部搭建并配置完毕,可以收发信了。

访问https://mx.qing.su就会自动跳转到网页邮箱的登录界面。如果您在配置时选择了Rainloop, 则第一次登录时可以在界面上选择语言,比如简体中文。

我们使用mail-tester.com测试发信,可以看到评分为满分10分。

Mail-tester邮件测试

Linux 下软件安装基本都是在终端下进行的…. 虽说安装软件基本上选对源就没有无法安装的,但是 Archlinux 下的 yaourt 安装就是社区打包的软件了. 软件来源各种各样,有的是 Google code 上的,有的是 GitHub 上的,有的就是 sourceforge 上的了. 但是在中国的大环境下不能保证上面网站的正常访问 QAQ Google 的话有 hosts 的情况下基本上是 把 http 修改成 https 就可以下载了,其余两个就只能代理进行下载软件并安装了.

#代理

首先科学上网的话就需要代理,SSH 这样进行端口监听的比较不错.VPN 是全局代理就不用讲述了. 不过 VPN 也可以走路由表进行部分代理(不在本文讨论范围之内)SSH 的话在 Linux 下就是简单的一句 ssh -NfD 127.0.0.1:7070 user@server 因为 SSH 不是 HTTP 代理,所以需要转发,如果是纯 HTTP 代理的话直接配置环境变量即可. 前面写的是本机代理的端口,后面是服务器的用户名和服务器 IP 地址.

#转发

SSH 是 SOCKET5 代理,但是下载的话基本上就是 HTTP 代理怎么转发呢? 这里就需要一个软件叫做Privoxy(opens new window) Privoxy 可以把 SOCKET5 转 HTTP 代理, 首先安装它 sudo pacman -S privoxy 然后进行配置 sudo vim /etc/privoxy/config在配置文件里面添加 forward-socks5 / 127.0.0.1:7070 . 注意后面有个点,容易忽略. 这个是转入的 SOCKET5 代理,指的是 SSH 的代理监听的端口号. 配置文件里面有句话是 listen-address 127.0.0.1:8118 这个是转发出去的 HTTP 代理的端口号. 这样写好之后, 启动服务 sudo systemctl start privoxy.service

#配置环境变量

转发实现之后就可以应用在终端里面了, 在终端里面输入

1
2
3
export https_proxy=127.0.0.1:1080 
export http_proxy=127.0.0.1:1080
export ALL_proxy=socks5://127.0.0.1:1080

这样就完成代理的设置了.

测试 IP 获取,如无意外,此时会返回国外服务器的IP地址。全局出国。

1
curl ip.gs

取消代理

1
2
unset http_proxy
unset https_proxy

pacman是arclinux中的软件管理工具,可以直接从网络上的软件仓库下载安装及删除软件,自动处理依赖关系,类似ubuntu中的apt-get。pacman也是widows上msys2默认的软件管理工具。

安装软件

  • pacman -S 软件名: 安装软件。也可以同时安装多个包,只需以空格分隔包名即可。
  • pacman -S --needed 软件名1 软件名2: 安装软件,但不重新安装已经是最新的软件。
  • pacman -Sy 软件名:安装软件前,先从远程仓库下载软件包数据库(数据库即所有软件列表)。
  • pacman -Sv 软件名:在显示一些操作信息后执行安装。
  • pacman -Sw 软件名: 只下载软件包,不安装。
  • pacman -U 软件名.pkg.tar.gz:安装本地软件包。
  • pacman -U http://www.example.com/repo/example.pkg.tar.xz : 安装一个远程包(不在 pacman 配置的源里面)。

更新系统

  • pacman -Sy: 从服务器下载新的软件包数据库(实际上就是下载远程仓库最新软件列表到本地)。
  • pacman -Su: 升级所有已安装的软件包。

pacman 可以用一个命令就可以升级整个系统。花费的时间取决于系统有多老。这个命令会同步非本地(local)软件仓库并升级系统的软件包:

1
pacman -Syu

在msys2中 pacman -Syu后需要重启一下msys2(关掉shell重新打开即可)。

在Arch linux中,只支持系统完整升级,不支持部分升级。所以即使在msys2中,pacman -Syu也会升级整个系统。可以观察一下,即使新安装的msys2,pacman -Syu后,msys2安装目录占用空间立马变大很多。

如果升级时,网络比较慢,觉得既浪费时间又浪费硬盘,实在不想升级那么多东西,可以逐个软件包升级。用下面命令可以升级核心包:

1
pacman -S --needed filesystem msys2-runtime bash libreadline libiconv libarchive libgpgme libcurl pacman ncurses libintl

卸载软件

  • pacman -R 软件名: 该命令将只删除包,保留其全部已经安装的依赖关系
  • pacman -Rv 软件名: 删除软件,并显示详细的信息
  • pacman -Rs 软件名: 删除软件,同时删除本机上只有该软件依赖的软件。
  • pacman -Rsc 软件名: 删除软件,并删除所有依赖这个软件的程序,慎用
  • pacman -Ru 软件名: 删除软件,同时删除不再被任何软件所需要的依赖

搜索软件

  • pacman -Ss 关键字: 在仓库中搜索含关键字的软件包(本地已安装的会标记)
  • pacman -Sl <repo>:
    • 显示软件仓库中所有软件的列表
    • 可以省略,通常这样用:`pacman -Sl 关键字`
  • pacman -Qs 关键字: 搜索已安装的软件包
  • pacman -Qu: 列出所有可升级的软件包
  • pacman -Qt: 列出不被任何软件要求的软件包

参数加q可以简洁方式显示结果,比如pacman -Ssq gcc会比pacman -Ss gcc显示的好看一些。

pacman -Sl gccpacman -Ssq gcc很接近,但是会少一些和gcc有关但软件名不包含gcc的包。

查询软件信息

  • pacman -Q 软件名: 查看软件包是否已安装,已安装则显示软件包名称和版本
  • pacman -Qi 软件名: 查看某个软件包信息,显示较为详细的信息,包括描述、构架、依赖、大小等等
  • pacman -Ql 软件名: 列出软件包内所有文件,包括软件安装的每个文件、文件夹的名称和路径

软件包组

  • pacman -Sg: 列出软件仓库上所有的软件包组
  • pacman -Qg: 列出本地已经安装的软件包组和子包
  • pacman -Sg 软件包组: 查看某软件包组所包含的所有软件包
  • pacman -Qg 软件包组: 和pacman -Sg 软件包组完全一样

很多人建议通过安装软件组来安装工具链,例如:

  • pacman -S mingw-w64-x86_64-toolchain
  • pacman -S mingw-w64-i686-toolchain
  • pacman -S mingw-w64-x86_64-qt5
  • pacman -S base-devel

但是这样比较浪费空间。实际上如果把gcc, qt, clang等安装上,msys2就要占掉超过10G的硬盘空间,所以个人很少直接安装软件组。

清理缓存

  • pacman -Sc:清理未安装的包文件,包文件位于 /var/cache/pacman/pkg/ 目录。
  • pacman -Scc:清理所有的缓存文件。

最常用的pacman命令小结

pacman命令较多,作为新手,将个人最常用的命令总结如下:

  • pacman -Syu: 升级系统及所有已经安装的软件。
  • pacman -S 软件名: 安装软件。也可以同时安装多个包,只需以空格分隔包名即可。
  • pacman -Rs 软件名: 删除软件,同时删除本机上只有该软件依赖的软件。
  • pacman -Ru 软件名: 删除软件,同时删除不再被任何软件所需要的依赖。
  • pacman -Ssq 关键字: 在仓库中搜索含关键字的软件包,并用简洁方式显示。
  • pacman -Qs 关键字: 搜索已安装的软件包。
  • pacman -Qi 软件名: 查看某个软件包信息,显示软件简介,构架,依赖,大小等详细信息。
  • pacman -Sg: 列出软件仓库上所有的软件包组。
  • pacman -Sg 软件包组: 查看某软件包组所包含的所有软件包。
  • pacman -Sc:清理未安装的包文件,包文件位于 /var/cache/pacman/pkg/ 目录。
  • pacman -Scc:清理所有的缓存文件。

参考文章

前几天在网上看到了一篇 《BBR vs BBRplus vs BBR2 一般网络速度对比》 的文章,文章中指出了高版本内核下 BBR 速度有较大提升。

BBR vs BBR2 vs BBR Plus — 引用至原文

于是就心血来潮想要升级下 Debian 内核,在此记录。

更新内核

以下过程都需要有 root 权限!

添加 Backports 源

1
2
echo "deb http://deb.debian.org/debian buster-backports main" > /etc/apt/sources.list.d/backports.list
apt update

安装新内核

1
2
3
apt -t buster-backports install linux-image-amd64
apt -t buster-backports install linux-headers-amd64
update-grub

然后 重启 并查看内核是否已经更新:

1
uname -r

截止目前 Debian 的最新内核是:5.10.0-0.bpo.3-amd64,返回形如此的内容及更新成功。

卸载旧内核

1
dpkg --list  grep linux-image

输出形式如下:

1
2
3
ii  linux-image-5.10.0-0.bpo.3-amd64    5.10.13-1~bpo10+1            amd64        Linux 5.10 for 64-bit PCs (signed)
ii linux-image-4.19.0-14-amd64 4.19.171-2 amd64 Linux 4.19 for 64-bit PCs (signed)
ii linux-image-amd64 5.10.13-1~bpo10+1 amd64 Linux for 64-bit PCs (meta-package)

从中可以看出旧内核为:linux-image-4.19.0-14-amd64

在确保剩余至少一个最新内核下,删除旧内核:

1
apt purge linux-image-4.19.0-14-amd64

其他情况同理。同时也可以删除旧内核头文件:

1
2
dpkg --list  grep linux-headers
apt purge linux-headers-4.19.0-14-amd64

❗注意:卸载了旧内核后一定要确保剩余至少一个最新内核:

1
update-grub

在输出中至少能看到一个内核。

一般来说,日常使用只要记住下图6个命令,就可以了。但是熟练使用,恐怕要记住60~100个命令。

下面是我整理的常用 Git 命令清单。几个专用名词的译名如下。

  • Workspace:工作区
  • Index / Stage:暂存区
  • Repository:仓库区(或本地仓库)
  • Remote:远程仓库

一、新建代码库

1
2
3
4
5
6
7

# 在当前目录新建一个Git代码库
$ git init

# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]

二、配置

Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。

1
2
3
4
5
6
7

# 显示当前的Git配置
$ git config --list

# 编辑Git配置文件
$ git config -e [--global]

三、增加/删除文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 添加指定文件到暂存区
$ git add [file1] [file2] ...

# 添加指定目录到暂存区,包括子目录
$ git add [dir]

# 添加当前目录的所有文件到暂存区
$ git add .

# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p

# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...

# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]

四、代码提交

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 提交暂存区到仓库区
$ git commit -m [message]

# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]

# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a

# 提交时显示所有diff信息
$ git commit -v

# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]

五、分支

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

# 列出所有本地分支
$ git branch

# 列出所有远程分支
$ git branch -r

# 列出所有本地分支和远程分支
$ git branch -a

# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]

# 新建一个分支,并切换到该分支
$ git checkout -b [branch]

# 新建一个分支,指向指定commit
$ git branch [branch] [commit]

# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]

# 切换到指定分支,并更新工作区
$ git checkout [branch-name]

# 切换到上一个分支
$ git checkout -

# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]

# 合并指定分支到当前分支
$ git merge [branch]

# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]

# 删除分支
$ git branch -d [branch-name]

六、标签

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

# 列出所有tag
$ git tag

# 新建一个tag在当前commit
$ git tag [tag]

# 新建一个tag在指定commit
$ git tag [tag] [commit]

# 删除本地tag
$ git tag -d [tag]

# 删除远程tag
$ git push origin :refs/tags/[tagName]

# 查看tag信息
$ git show [tag]

# 提交指定tag
$ git push [remote] [tag]

# 提交所有tag
$ git push [remote] --tags

七、查看信息

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

# 显示有变更的文件
$ git status

# 显示当前分支的版本历史
$ git log

# 显示commit历史,以及每次commit发生变更的文件
$ git log --stat

# 搜索提交历史,根据关键词
$ git log -S [keyword]

# 显示某个commit之后的所有变动,每个commit占据一行
$ git log [tag] HEAD --pretty=format:%s

# 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
$ git log [tag] HEAD --grep feature

# 显示某个文件的版本历史,包括文件改名
$ git log --follow [file]
$ git whatchanged [file]

# 显示指定文件相关的每一次diff
$ git log -p [file]

# 显示过去5次提交
$ git log -5 --pretty --oneline

# 显示所有提交过的用户,按提交次数排序
$ git shortlog -sn

# 显示指定文件是什么人在什么时间修改过
$ git blame [file]

# 显示暂存区和工作区的差异
$ git diff

# 显示暂存区和上一个commit的差异
$ git diff --cached [file]

# 显示工作区与当前分支最新commit之间的差异
$ git diff HEAD

# 显示两次提交之间的差异
$ git diff [first-branch]...[second-branch]

# 显示今天你写了多少行代码
$ git diff --shortstat "@{0 day ago}"

# 显示某次提交的元数据和内容变化
$ git show [commit]

# 显示某次提交发生变化的文件
$ git show --name-only [commit]

# 显示某次提交时,某个文件的内容
$ git show [commit]:[filename]

八、远程同步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

# 下载远程仓库的所有变动
$ git fetch [remote]

# 显示所有远程仓库
$ git remote -v

# 显示某个远程仓库的信息
$ git remote show [remote]

# 增加一个新的远程仓库,并命名
$ git remote add [shortname] [url]

# 取回远程仓库的变化,并与本地分支合并
$ git pull [remote] [branch]

# 上传本地指定分支到远程仓库
$ git push [remote] [branch]

# 强行推送当前分支到远程仓库,即使有冲突
$ git push [remote] --force

九、撤销

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

# 恢复暂存区的指定文件到工作区
$ git checkout [file]

# 恢复某个commit的指定文件到暂存区和工作区
$ git checkout [commit] [file]

# 恢复暂存区的所有文件到工作区
$ git checkout .

# 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
$ git reset [file]

# 重置暂存区与工作区,与上一次commit保持一致
$ git reset --hard

# 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
$ git reset [commit]

# 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
$ git reset --hard [commit]

# 重置当前HEAD为指定commit,但保持暂存区和工作区不变
$ git reset --keep [commit]

# 新建一个commit,用来撤销指定commit
# 后者的所有变化都将被前者抵消,并且应用到当前分支
$ git revert [commit]

十、其他

1
2
3

# 生成一个可供发布的压缩包
$ git archive

因为是虚拟机下使用,下载虚拟机专用的镜像

https://alpinelinux.org/downloads/    Virtual板块下载86_64镜像

当前 http://dl-cdn.alpinelinux.org/alpine/v3.12/releases/x86\_64/alpine-virt-3.12.1-x86\_64.iso

创建虚拟机 当前alpine内核是5.4,虚拟机创建及初始化过程略过

apk update && apk upgrade && apk add sudo nano

下载并安装smartdns  from https://github.com/pymumu/smartdns

wget https://github.com/pymumu/smartdns/releases/download/Release33/smartdns.1.2020.09.08-2235.x86\_64-linux-all.tar.gz
tar xvf smartdns.1.2020.09.08-2235.x86_64-linux-all.tar.gz && cd smartdns && chmod +x ./install && mkdir mkdir /etc/default && ./install -i

rc-service smartdns stop

mv /etc/smartdns/smartdns.conf /etc/smartdns/smartdns.conf.bak
nano /etc/smartdns/smartdns.conf
server-name smartdns
bind :53
bind-tcp :53
cache-size 1536
prefetch-domain yes
serve-expired yes
log-level info
server-tls 208.67.222.222:853
#server-https https://dns.twnic.tw/dns-query
server-tls 45.32.55.94:853
server-https https://cloudflare-dns.com/dns-query
server-https https://neatdns.ustclug.org/resolve
server-https https://doh.dns.sb/dns-query
server-https https://public.dns.iij.jp/dns-query
server-https https://dns.rubyfish.cn/dns-query
server-https https://dns.dns-over-https.com/dns-query
server-https https://jp.tiar.app/dns-query
server-https https://i.233py.com/dns-query
server 223.5.5.5:53
server 114.114.114.114:53
conf-file /tmp/whitelist.conf
conf-file /tmp/blacklist.conf
ipset /tracker.publicbt.com/block
ipset /tracker.publicbt.com/b-
address /tracker.publicbt.com/-
address /publicbt.com/-
address /www.publicbt.com/-
address /*.publicbt.com/-

取消DHCP DNS自动覆盖

nano /usr/share/udhcpc/default.script
用#注释RESOLV_CONF=”/etc/resolv.conf”

修改本地DNS为127.0.0.1

nano /etc/resolv.conf
nameserver 127.0.0.1

启动smartdns并测试

/usr/sbin/smartdns
测试
nslookup -querytype=ptr smartdns

开机启动,默认的服务没法启动,未知

/usr/sbin/smartdns

nano /etc/local.d/init_nextcloud.start
#!/bin/sh
/usr/sbin/smartdns
chmod +x /etc/local.d/init_nextcloud.start

rc-update add local

添加守护

apk add monit
mv /etc/monitrc /etc/monitrc.bak
nano /etc/monitrc
set daemon 10 #10s循环监控
set logfile syslog
check process smartdns with pidfile /var/run/smartdns.pid
start program = “/usr/sbin/smartdns” with timeout 10 seconds
stop program = “/usr/bin/killall smartdns” with timeout 10 seconds
chmod 0700 /etc/monitrc
测试守护配置
monit -t
启动
rc-service monit start
monit start all
#忽略有个报错
添加启动
rc-update add monit

1
2
3
4
5
git代理设置方法解决
如果执行:git config --global https.proxy http://127.0.0.1:1080 时出现:fatal: not in a git directory

请先执行:git init