XiFanU 发布的文章

Debian 10 安装 docker

通过 HTTPS 添加新存储库所需的软件包

# 更新软件包
apt update -y
# 通过 HTTPS 添加新存储库所需的软件包
apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common

使用以下 curl 命令导入存储库的 GPG 密钥

curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -

将稳定的 Docker APT 存储库添加到系统的软件存储库列表中

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
# 再次更新软件包
apt update -y

# 安装 docker
apt install docker-ce

安装完成后, Docker 服务会自动启动,并默认开机自启。

# 查看docker服务的状态
systemctl status docker

# 查看docker开机自启状态
systemctl is-enabled docker

解决 docker 与 ufw 的冲突

  • ufw 防火墙默认本地路由转发默认为关,需要修改为开;

    vi /etc/default/ufw
    
    # 将DEFAULT_FORWARD_POLICY修改为
    DEFAULT_FORWARD_POLICY="ACCEPT"
    
    # ufw 防火墙规则重载
    ufw reload
  • docker默认直接修改iptables规则,需要关闭,从而使 UFW 防火墙规则生效;

    vi /etc/default/docker
    
    # 修改文件配置项DOCKER_OPTS,该项默认为注释状态
    DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4 -iptables=false"
    
    # 重启 docker
    systemctl restart docker

    部署一个容器后,它将不再改变iptables并且严格遵守UFW防火墙的设置规则。

caddy.png

本文介绍了在 Debian 10 环境下,Caddy 2 的编译、安装及配置。

看完本文后,你将可以使用 Caddy2 的:

  • HTTP
  • HTTPS
  • 反向代理
  • WebDav
  • DNSPod DNS api
  • ...
    等功能。
本文部分内容转自 https://mritd.com/2021/01/07/lets-start-using-caddy2/

一、编译 Caddy2

注意: 在 Caddy1 时代,Caddy 官方发布的预编译二进制文件是不允许进行商业使用的,Caddy2 以后已经全部切换到 Apache 2.0 License,具体请参考 issue#2786

在默认情况下 Caddy2 官方提供了预编译的二进制文件,以及自定义 build 下载页面,不过对于需要集成一些第三方插件时,我们仍需采用官方提供的 xcaddy 来进行自行编译;以下为具体的编译过程:

1.1、Golang 环境安装

本部分编译环境默认为 Debian 10 系统,使用 root 用户,其他环境请自行调整相关目录以及配置;

编译时请自行处理好科学上网相关配置,也可以直接用国外 VPS 服务器编译。

首先下载 go 语言的 SDK 压缩包,其他平台可以从 https://golang.org/dl/ 下载对应的压缩包:

cd ~
wget https://golang.org/dl/go1.16.3.linux-amd64.tar.gz

下载完成后解压并配置相关变量:

# 解压
tar -zxvf go1.16.3.linux-amd64.tar.gz

# 移动到任意目录
mkdir -p /opt/devtools
mv go /opt/devtools/go

# 创建 go 相关目录
mkdir -p ${HOME}/gopath/{src,bin,pkg}

# 调整变量配置,将以下变量加入到 shell 初始化配置中
# bash 用户请编辑 ~/.bashrc
export GOROOT='/opt/devtools/go'
export GOPATH="${HOME}/gopath"
# 如果是国内机器,需要导入添加代理
# export GOPROXY='https://goproxy.cn' 
export PATH="${GOROOT}/bin:${GOPATH}/bin:${PATH}"

# 让配置生效
# 重新退出登录也可以
source ~/.bashrc

配置完成后,执行 go version 有返回信息:

go version

# 屏幕输出
go version go1.16.3 linux/amd64

1.2、安装 xcaddy

按照官方文档直接安装即可:

# 使用官方命令安装 xcaddy
go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest

apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key' |  tee /etc/apt/trusted.gpg.d/caddy-xcaddy.asc
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/debian.deb.txt' | tee /etc/apt/sources.list.d/caddy-xcaddy.list
apt update
apt install xcaddy

# 查看 xcaddy 版本
xcaddy version

1.3、编译 Caddy2

编译之前系统需要安装 jqcurlgit ,没有请使用 apt install -y curl git jq 命令安装;

自行编译的目的是增加第三方插件方便使用,其中官方列出的插件可以从 Download 页面获取到。

其他插件可以从 GitHub 上寻找或者自行编写,整理好这些插件列表以后只需要使用 xcaddy 编译即可:

# 获取最新版本号,其实直接去 GitHub realse 页复制以下就行
# 这里转化为脚本是为了方便自动化

#获取caddy2的最新版本号,并导入变量version
export version=$(curl -s "https://api.github.com/repos/caddyserver/caddy/releases/latest" | jq -r .tag_name)

# 使用 xcaddy 编译
xcaddy build ${version} --output ./caddy_${version} \
        --with github.com/abiosoft/caddy-exec \
        --with github.com/caddy-dns/cloudflare \
        --with github.com/caddy-dns/dnspod \
        --with github.com/caddy-dns/namecheap \
        --with github.com/caddy-dns/alidns \
        --with github.com/caddy-dns/duckdns \
        --with github.com/caddy-dns/gandi \
        --with github.com/caddy-dns/route53 \
        --with github.com/greenpau/caddy-auth-jwt \
        --with github.com/greenpau/caddy-auth-portal \
        --with github.com/greenpau/caddy-trace \
        --with github.com/hairyhenderson/caddy-teapot-module \
        --with github.com/kirsch33/realip \
        --with github.com/porech/caddy-maxmind-geolocation \
        --with github.com/caddyserver/format-encoder \
        --with github.com/mholt/caddy-webdav

编译过程较慢,稍等片刻后将会生成编译好的二进制文件。

编译完成后,会出现一个 caddy_v2.3.0 的文件;

编译成功后可以通过 ./caddy_v2.3.0 list-modules 子命令查看被添加的插件是否成功编译到了 caddy 中:

# 查看被添加的插件
./caddy_v2.3.0 list-modules

# 屏幕输出
admin.api.load
admin.api.metrics
caddy.adapters.caddyfile
caddy.listeners.tls
caddy.logging.encoders.console
caddy.logging.encoders.filter
caddy.logging.encoders.filter.delete
caddy.logging.encoders.filter.ip_mask
caddy.logging.encoders.formatted
caddy.logging.encoders.json
caddy.logging.encoders.logfmt
caddy.logging.encoders.single_field
caddy.logging.writers.discard
caddy.logging.writers.file
caddy.logging.writers.net
caddy.logging.writers.stderr
caddy.logging.writers.stdout
caddy.storage.file_system
dns.providers.cloudflare
dns.providers.dnspod
dns.providers.duckdns
dns.providers.gandi
dns.providers.route53
exec
http
http.authentication.hashes.bcrypt
http.authentication.hashes.scrypt
http.authentication.providers.http_basic
http.authentication.providers.jwt
......
Copy

二、安装 Caddy2

2.1、宿主机安装

宿主机安装 Caddy2 需要使用 systemd 进行守护,幸运的是 Caddy2 官方提供了各种平台的安装包以及 systemd 配置文件仓库

目前推荐的方式是先采用包管理器安装标准版本的Caddy2,然后替换自编译的可执行文件:

# 安装标准版本 Caddy2,默认配置文件目录: /etc/caddy/Caddyfile
apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/gpg/gpg.155B6D79CA56EA34.key' | apt-key add -
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/cfg/setup/config.deb.txt?distro=debian&version=any-version' |  tee -a /etc/apt/sources.list.d/caddy-stable.list
apt update
apt install caddy

# 替换二进制文件:将编译的 /root/caddy_v2.3.0 文件移至 /usr/bin/caddy 
systemctl stop caddy
rm -f /usr/bin/caddy
mv ./caddy_v2.3.0 /usr/bin/caddy
# 查看caddy是否安装成功
caddy version

启动

# 开机自启
systemctl enable caddy

# 启动caddy2
systemctl start caddy

# 停止caddy2
systemctl stop caddy

# 重载配置caddy配置文件(修改配置文件后执行)
systemctl reload caddy

# 查看caddy运行状态
systemctl status caddy

2.2、Docker 安装

Docker 用户可以通过 Dockerfile 自行编译 image ...

三、配置 Caddy2

Caddy2 的配置文件核心采用 json,但是 json 可读性不强;

关于 Caddyfile 的完整语法请查看官方文档 https://caddyserver.com/docs/caddyfile,本文仅做一些基本使用的样例。

3.1、配置示例

编辑默认的配置文件: /etc/caddy/Caddyfile

修改配置文件后,使用 systemctl reload caddy 重载配置;

  1. 静态网页配置:

    https://yourdomain.com {
        root * /home/www/website
        file_server
        tls your@email.com
    }

    ​ 使用自定义SSL证书:

    https://yourdomain.com {
        root * /home/www/website
        file_server
        tls /etc/caddy/cert/ssl.pem /etc/caddy/cert/ssl.key
    }
  2. 文件列表配置:

    https://yourdomain.com {
        root * /home/files
        file_server browse
        tls your@email.com
    }
  3. 反向代理配置:

    https://yourdomain.com {
        reverse_proxy https://hexo.io {
            header_up Host {http.reverse_proxy.upstream.hostport}
            header_down Access-Control-Allow-Headers *
            header_down Access-Control-Allow-Origin *
        }
        tls your@email.com
    }
  4. Websocket反向代理配置:

    https://ws.yourdomain.com {
        ## HTTP 代理配置
        ## 此时访问 ws.yourdomain.com,实际访问的是 127.0.0.1:8080/app/ 的内容
        reverse_proxy / 127.0.0.1:8080/app/
    
        ## WebSocket 代理配置
        ## 客户端请求的 wss://ws.yourdomain.com/ws, 实际为 wss://127.0.0.1:8080/ws
        reverse_proxy /ws 127.0.0.1:8080
    }
  5. WebDav配置

    先使用命令将明文密码进行加密:

    caddy hash-password --plaintext yourpasswd
    
    # 屏幕输出密文,后续的配置文件中使用
    JDJhJDE0JEdoTFhJbjhDaUEzM3kvV3pKYVFCdHVPeEg0V3NQQnl3a2pNNkNSd0Y0MmtFWFl3bUJaaXdt

    编辑配置文件:

    {
        order webdav last
    }
    https://webdav.yourdomain.com {
        webdav {
            root /home/webdav
        }
        
        # 密码不能为明文,可以使用自带的工具加密:
        # caddy hash-password --plaintext yourpasswd
        # 用户名为:username,密码为:yourpasswd
        basicauth {
            username JDJhJDE0JEdoT...
        }
        
        tls your@email.com
    }

四、其他说明

caddy2 默认配置文件的目录位置,证书位置:
配置文件目录:/var/lib/caddy/.config/caddy
SSL证书文件目录:/var/lib/caddy/.local/share/caddy

环境信息:

  • 宝塔7.5.2
  • 腾讯云COS对象存储

一、注册腾讯云COS并开启API密钥

1.1、注册腾讯云账号

使用微信或QQ进行注册即可;

1.2、新建COS对象存储桶

进入COS对象存储控制台:https://console.cloud.tencent.com/cos5

查看存储桶列表:https://console.cloud.tencent.com/cos5/bucket

新建一个存储桶,填写存储桶名称(Bucket Name)、地域(region),访问权限设置为私有读写

1.3、开启腾讯云密钥

进入腾讯云API密钥管理:https://console.cloud.tencent.com/cam/capi

新建密钥,会获得 SecretIdSecretKey ,请安全保管好;

二、宝塔安装腾讯云COS插件

进入 宝塔--软件商店--系统工具,搜索 “COS”,找到下面的官方工具:

腾讯云COS 4.8:将网站或数据库打包备份到腾讯云COS对象存储空间

安装此工具,并配置腾讯云COS账户,你需要分别填入以下信息:

  • secret_id:腾讯云API_id
  • secret_key:腾讯云API_key
  • region:存储桶地域
  • Bucket:存储桶名称

三、设置计划任务

进入 宝塔--计划任务;

新建第一个任务,任务类型选择 “备份数据库”,配置好执行时间;

新建第二个任务,任务类型选择 “备份网站”,配置好执行时间和排除的目录;

立即执行上面两个任务,查看任务日志,再去腾讯云COS查看备份文件,确保备份成功。

UFW,或称Uncomplicated Firewall,是iptables的一个接口,为不熟悉防火墙概念的初学者提供了易于使用的界面,同时支持IPv4和IPv6,广受欢迎。

使用UFW来管理防火墙规则,十分方便好用。

安装UFW

# Ubuntu & Debian使用以下命令
apt-get install ufw -y

# CentOS使用以下命令
yum install epel-release -y
yum install --enablerepo="epel" ufw -y

UFW安装后,可以通过以下命令来启动UFW服务并使其在启动时启动(一般在完成默认配置后再重启):

ufw enable

使用以下命令检查UFW的状态:

ufw status 

禁用UFW防火墙:

ufw disable

如果你决定要重新开始,则可以使用reset命令:

ufw reset

这将禁用UFW并删除之前定义的任何规则。

UFW配置文件目录:

  • /etc/default/ufw

UFW常用命令

默认情况下,UFW默认策略设置为阻止所有传入流量并允许所有传出流量。

一般的,我们先设置放行的端口和IP,最后设置入、出规则。

ufw reset
ufw allow 22 # SSH 端口
ufw allow 80
ufw allow 443
ufw allow 15566
ufw allow from 123.123.123.123  # 放行的白名单IP
ufw allow from 106.106.106.0/24  # 放行的白名单IP段
# 阻止所有传入流量并允许所有传出流量
ufw default deny incoming
ufw default allow outgoing
ufw enable

UFW可以基于TCP或UDP协议来过滤数据包,命令如下:

ufw allow 80/tcp
ufw allow 21/udp

最后,使用以下命令查看已添加规则的状态:

ufw status verbose

应该可以看到如下输出:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
To                         Action      From
80/tcp                     ALLOW IN    Anywhere
21/udp                     ALLOW IN    Anywhere
80/tcp (v6)                ALLOW IN    Anywhere (v6)
21/udp (v6)                ALLOW IN    Anywhere (v6)

还可以使用以下命令随时拒绝指定端口任何传入和传出的流量:

ufw deny 80
ufw deny 21

如果要删除规则,只需在原始规则前加上delete即可,如下所示:

ufw delete deny 80
ufw delete deny 21

也可以按编号删除规则,使用以下命令查看规则及其编号:

ufw status numbered

输出:

OutputStatus: active
     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     ALLOW IN    Anywhere
[ 2] 443/tcp                    ALLOW IN    Anywhere
[ 3] 22/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 4] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

删除编号为3的规则:

ufw delete 3

要允许某个IP地址连接特定的某个端口,可以运行以下命令:

ufw allow from 62.13.209.36 to any port 8080

进一步的,可以指定特定的IP段和TCP/UDP协议:

ufw deny from 62.13.209.33 to any port 22
ufw allow from 62.13.209.0/24 to any port 8080 proto tcp

查看UFW防火墙的日志:

tail -f /var/log/ufw.log

更多姿势请查看UFW官方文档:

https://wiki.ubuntu.org.cn/Ufw%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8D%97

宝塔面板 7.2.5+ 取消强制绑定账号;

# 去除绑定弹框
sed -i "s|if (bind_user == 'True') {|if (bind_user == 'REMOVED') {|g" /www/server/panel/BTPanel/static/js/index.js

rm -rf /www/server/panel/data/bind.pl