• Docker 中安装WordPress

    由于Wordpress的关联比较多所以需要使用Docker-compose

    1,选定一个工作目录(wordpress),目录中新建两个相关的映射目录,比如(wp-content,db_data)

    2,创建compose.yml

    3,执行docker-compose up -d (停止和删除使用docker-compose down)

  • Docker中安装Jenkins

    使用以下方式可以在Jenkins中挂载企业CA,保证Jenkins的Git模块信任企业CA证书
    docker run -d -p 8080:8080 -p 50000:50000 \
    -v jenkins_home:/var/jenkins_home \
    -v /etc/localtime:/etc/localtime \
    -v /etc/ssl/certs/:/etc/ssl/certs/ \ #企业CA放在这个目录中映射到容器内
    –restart=on-failure jenkins/jenkins:lts-jdk21

    首次安装初始密码位置 cat /var/lib/docker/volumes/jenkins_home/_data/secrets/initialAdminPassword

  • AlmaLinux 安装官方源Docker

    sudo dnf config-manager –add-repo=https://download.docker.com/linux/centos/docker-ce.repo
    sudo dnf install docker-ce docker-ce-cli containerd.io
    sudo systemctl start docker
    sudo systemctl enable docker


    Dokcer 默认的映射卷位置 /var/lib/docker/volumes/

  • AlmaLinux 安装Nginx官方源主版本

    vi /etc/yum.repos.d/nginx.repo

    [nginx-stable]
    name=nginx stable repo
    baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=1
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

    [nginx-mainline]
    name=nginx mainline repo
    baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
    gpgcheck=1
    enabled=0
    gpgkey=https://nginx.org/keys/nginx_signing.key
    module_hotfixes=true

  • Docker命令清除无用镜像

    1. 使用Docker命令清除无用镜像

    
    #列出所有镜像
    docker images
    #清理无用镜像
    docker image prune -a
    

    上述命令使用 Docker CLI 工具清除所有无用镜像。其中,“docker images”命令列出所有镜像,“docker image prune -a”命令清除所有无用镜像。

    2. 使用Docker Compose清除无用镜像

    当使用 Docker Compose 管理多个容器时,可以使用以下命令清除无用的镜像。

    
    #列出所有镜像,包括未使用的镜像
    docker-compose images --all
    #清除所有无用镜像
    docker-compose image prune -a

    停止、删除所有的docker容器和镜像

    列出所有的容器 ID

    docker ps -aq

    停止所有的容器

    docker stop $(docker ps -aq)

    删除所有的容器

    docker rm $(docker ps -aq)

    删除所有的镜像

    docker rmi $(docker images -q)

    复制文件

    docker cp mycontainer:/opt/file.txt /opt/local/
    docker cp /opt/local/file.txt mycontainer:/opt/

    现在的docker有了专门清理资源(container、image、网络)的命令。 docker 1.13 中增加了 docker system prune的命令,针对container、image可以使用docker container prunedocker image prune命令。

    • docker image prune --force --all或者docker image prune -f -a` : 删除所有不使用的镜像
    • docker container prune -f: 删除所有停止的容器

  • Nvidia Jetson Orin Nano xrpd

    安装好xrdp之后,一旦链接就会退出,cat .xsession-errors 查看报错信息。

    /etc/X11/Xsession: 85: /home/xxxx/.xsessionrc: Syntax error: “(” unexpected (expecting “fi”)

    修改 .xsessionrc 文件 替换 84-94 行内容:

        if [ -e "/usr/bin/gnome-shell" ]; then
                remove_apps="thunderbird rhythmbox libreoffice-writer"
                favorite_apps="$(gsettings get org.gnome.shell favorite-apps)"
                for app in $remove_apps; do
                        favorite_apps="$(echo "${favorite_apps}" | sed -e "s/'${app}.desktop', //g" -e "s/, '${app}.desktop' / /g")"
                done
                gsettings set org.gnome.shell favorite-apps "${favorite_apps}"
        fi

  • Ollama服务相关

    安装Ollama:curl -fsSL https://ollama.com/install.sh | sh

    如果需要ollama服务监听0.0.0.0

    Windows中在环境变量中添加 OLLAMA_HOST 值为0.0.0.0,OLLAMA_MODELS 值为模型镜像的存储路径
     OLLAMA_KEEP_ALIVE:这个变量控制模型在内存中的存活时间。设置参数值为24h可以让模型在内存中保持24小时,提高访问速度.

    另外还有:OLLAMA_KEEP_ALIVE:这个变量控制模型在内存中的存活时间。设置参数值为24h可以让模型在内存中保持24小时,提高访问速度。
    OLLAMA_PORT:这个变量允许我们更改Ollama的默认端口。例如,设置参数值为8080可以将服务端口从默认的11434更改为8080。
    OLLAMA_NUM_PARALLEL:这个变量决定了Ollama可以同时处理的用户请求数量。设置参数值为4可以让Ollama同时处理两个并发请求。
    OLLAMA_MAX_LOADED_MODELS:这个变量限制了Ollama可以同时加载的模型数量。设置参数值为4可以确保系统资源得到合理分配。
    OLLAMA_ORIGINS: 允许的源列表,星号*或使用逗号分隔。

    Linunx中编辑 /etc/systemd/system/ollama.service 文件添加以下
    [Service]
    Environment=”OLLAMA_HOST=0.0.0.0:11434″
    然后systemctl daemon-reload & systemctl restart ollama
    升级Ollama: curl -fsSL https://ollama.com/install.sh | sh

  • AlmaLinux 9  安装配置WireGuard

    前言:相较于当下IPSec,OpenVPN等VPN技术,WireGuard被誉为下一代VPN技术,而且Linux的管理者Linus Torvalds已经将WireGuard合并至内核5.6中。所以所有使用新版本内核的服务器理论上都不需要安装WireGuard。参考的最佳实践链接 https://orcacore.com/install-configure-wireguard-almalinux-9/

    安装部分:您必须在服务器上启用“wireguard”内核模块。为此,您可以使用以下命令:

    sudo modprobe wireguard
    然后,使用以下命令验证您的模块是否已启用:
    lsmod | grep wireguard
    如果 WireGuard 模块已启用,您应该得到以下输出:

    Output
    wireguard 94208 0
    libblake2s 16384 1 wireguard
    ip6_udp_tunnel 16384 1 wireguard
    udp_tunnel 24576 1 wireguard
    curve25519_x86_64 36864 1 wireguard
    libcurve25519_generic 49152 2 curve25519_x86_64,wireguard

    现在您需要永久加载wireguard 模块。为此,请运行以下命令:
    sudo echo wireguard > /etc/modules-load.d/wireguard.conf
    该命令将在AlmaLinux 9上的系统启动时永久加载wireguard内核模块。
    最后,使用以下命令安装“wireguard-tools”软件包:
    sudo dnf install wireguard-tools -y #该软件包用于管理 Wireguard 服务器。

    配置部分1: 首先需要生成私钥与公钥对用于通信验证

    wg genkey | sudo tee /etc/wireguard/private.key #文件将会存在 /etc/wireguard/private.key
    sudo chmod 0400 /etc/wireguard/private.key #给文件定义权限
    sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.pub #通过私钥生成公钥
    如果没记住可以查询公钥私钥内容
    cat /etc/wireguard/private.key
    cat /etc/wireguard/public.pub

    如果需要在服务器上生成其它服务器或客户端的公私钥。
    mkdir -p /etc/wireguard/clients
    wg genkey | sudo tee /etc/wireguard/clients/client01.key
    cat /etc/wireguard/clients/client01.key | wg pubkey | tee /etc/wireguard/clients/client01.pub

    配置部分2:

    服务器端配置(服务器作为VPN的HUB节点需要有真实固定IP并且开放指定的UDP端口,端口号自行指定)如果只在WireGuard虚拟网络中通信。不需要路由到下面的其它子网则不需要 在配置文件中定义 PostUp = iptables -A FORWARD xxxxx 和 PostDown = iptables -D FORWARD xxxxxxx

    sudo vi /etc/wireguard/wg0.conf

    [Interface]
    Address = 10.100.200.1/24 # 此服务器在WireGuard网络中的IP地址和所属子网
    SaveConfig = false # 可以是true或者false(true的话会在此文件的peer配置里自动写入客户端公网ip)
    ListenPort = 12347 #服务器端监听的UDP端口
    PrivateKey = CLInDXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXPncWw= #服务器私钥
    PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

    [Peer]
    PublicKey = T90oXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXTQLbzc= #客户端1的公钥
    AllowedIPs = 10.100.200.11/32 #容许客户端连接的地址

    [Peer]
    PublicKey = T90o2XXXXXXXXXXXXXXXXXXXXXXXXXXXXaeTQLbzc= #客户端2的公钥
    AllowedIPs = 10.100.200.12/32 #容许客户端连接的地址

    配置部分3:

    客户端配置(客户端可以在多层NAT之后,如果客户端配置里没有指定UDP端口,则客户端会使用随机UDP端口与定义的服务器UDP端口通信)

    客户端如果是WireGuard客户端软件的话,在软件中创建空隧道就会自动创建密钥对(公钥和私钥)
    [Interface]
    Address = 10.100.200.2/24 (可以是/24也可以是/32不影响)
    PrivateKey = 8ExJ6XvuXXXXXXXXXXXXXXXXXXXEDZyou7X2U= #客户端主机的私钥(不是服务器的私钥)

    [Peer]
    Endpoint = 1.2.3.4:12347 # 目标服务器的公网地址及端口
    PublicKey = T90o2KXXXXXXXXXXXXXXXXXXXXXXXXXXe9aeTQLbzc= #注意:这里填服务器主机的公钥
    AllowedIPs = 0.0.0.0/1, 128.0.0.0/1 #客户端对外访问的路由地址范围,0.0.0.0/0 备选(/32的话会不通)
    PersistentKeepalive = 25

    启动与管理部分:

    sudo wg-quick up /etc/wireguard/wg0.conf
    sudo wg-quick down /etc/wireguard/wg0.conf
    systemctl enable wg-quick@wg0
    systemctl status wg-quick@wg0
    systemctl disable wg-quick@wg0

  • 在使用 Nginx 进行 WebSocket 负载均衡时的问题

    WebSocket 协议需要特定的 Nginx 配置来正确处理连接。确保你的 Nginx 配置文件中包含以下内容:

    Nginx 配置问题

    upstream websocket {
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    }
    
    server {
        listen 80;
    
        location /ws/ {
            proxy_pass http://websocket;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Host $host;
            proxy_send_timeout 3600;
            proxy_read_timeout 3600;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    }

    关键配置解释-WebSocket 协议升级

    WebSocket 协议通过 HTTP 协议进行初始握手,然后升级到 WebSocket 协议。确保 Nginx 正确处理了 UpgradeConnection 头。

    proxy_http_version 1.1; 是WebSocket连接必须的
    proxy_set_header Upgrade $http_upgrade; 之后这两行是将 头协议从HTTP协议级成WebSocket协议
    proxy_set_header Connection $connection_upgrade;

    超时设置

    WebSocket 连接通常是长连接,确保 Nginx 的超时设置足够长。
    proxy_send_timeout 300s;
    proxy_read_timeout 300s;
    proxy_connect_timeout 1d;
    proxy_send_timeout 3d;
    proxy_read_timeout 3d;

  • Linux中申请Let’s Encrypt通配符证书

    1. 使用的工具,使用certbot申请并使用acme-dns-client作为manual-auth-hook执行更新证书的验证工作。
    • 安装certbot:在不同的Linux发行版中可以使用apt install certbot, yum install epel-release 之后再yum install certbot以及 dnf install certbot
    • 安装certbot之后会有以下提示,自动证书更新服务没有启动,但是新版本的话当使用certbot申请证书后,certbot-renew.timer服务会自动开启

    ###Certbot auto renewal timer is not started by default.

    ###Run ‘systemctl start certbot-renew.timer’ to enable automatic renewals.

    systemctl status certbot-renew.timer

    • 使用acme-dns-client注册需要申请证书的域名,每一个执行一次并按提示修改DNS记录,因为CAA记录验证属于有风险操作所以 {必选参数 –dangerous},例子如下

    acme-dns-client register -d cn-it.org -s https://auth.acme-dns.io –dangerous

    acme-dns-client register -d 51azure.com -s https://auth.acme-dns.io –dangerous

    acme-dns-client register -d yuushatech.com -s https://auth.acme-dns.io –dangerous

    acme-dns-client register -d maoutech.com -s https://auth.acme-dns.io –dangerous

    acme-dns-client register -d 5i818.com -s https://auth.acme-dns.io –dangerous

    acme-dns-client register -d 51aws.com -s https://auth.acme-dns.io –dangerous

    每一次命令输入完都会有一个通过DNS验证域名所有权的过程,需要添加CNAME记录,如下

    _acme-challenge.cn-it.org.     IN      CNAME   6185f842-efb2-4c65-9813-a0c410ea36ac.auth.acme-dns.io

    • 在验证完CNAME记录之后会提示验证CAA记录,需要在DNS中添加CAA记录

    caa         @            letsencrypt.org 0 issue  (单域名证书验证记录)

    caa         @            letsencrypt.org 0 issuewild (通配符证书验证记录)

    阿里云DNS注意事项,DNS记录值中的 “letsencrypt.org” 一定要有””

    • 验证CNAME的过程中可能会有警告信息,说明这个服务器以前做过相同操作留有旧的账户信息。

    查看 /etc/letsencrypt/accounts/  目录下可能有两个账号,删掉老的。

    Do you wish to set up a CAA record with accounturi now? [y/N]: y

    [i] Found a total of 2 ACME account(s) on this system:

     [Certbot] URI: https://acme-staging-v02.api.letsencrypt.org/acme/acct/177419874

    • 在所有域名验证完成后,申请证书。Challenges模式是 dns,auth-hook 是acme-dns-client。由于新的证书安全性需要,通配符证书必须还要配合根域域名证书才能信任,所以要同时申请。

    certbot certonly –manual –preferred-challenges dns \

    –manual-auth-hook ‘acme-dns-client’ -d “*.cn-it.org” -d cn-it.org -d “*.51azure.com” -d 51azure.com -d “*.yuushatech.com” -d yuushatech.com -d “*.maoutech.com” -d maoutech.com -d “*.5i818.com” -d 5i818.com -d “*.51aws.com” -d 51aws.com

    • 如果之前的CNAME记录及CAA记录都完好可查的情况下,证书应该可以顺利签署。

    使用命令 certbot renew –dry-run 可以测试证书是否可以正常renew,使用命令 systemctl status certbot-renew.timer 可以查看自动renew服务的状态

    1. 关于配置文件及自动运行脚本

    配置文件位置 /etc/letsencrypt/renewal/cn-it.org.conf

    自动运行脚本 /etc/letsencrypt/renewal-hooks/post/pkcs12convert.sh

    脚本内容如下,每次自动更新证书后会自动运行renewal-hooks/post 中的脚本

    #!/bin/sh

    openssl pkcs12 -export -out /etc/letsencrypt/live/cn-it.org/cn-it.org.pfx -inkey /etc/letsencrypt/live/cn-it.org/privkey.pem -in /etc/letsencrypt/live/cn-it.org/cert.pem -certfile /etc/letsencrypt/live/cn-it.org/chain.pem -passout pass:XXXxxxXXX

    echo “pkcs#12 generated!”

    systemctl restart nginx

    echo “Nginx restarted”