LOADING

加载过慢请开启缓存 浏览器默认开启

新部署服务器

2023/10/10

用的Ubuntu 22.04

首先还是更新一下镜像源先,用的清华源

cp /etc/apt/sources.list /etc/apt/sources.list.bak先备份
然后用这个https://mirrors.tuna.tsinghua.edu.cn/help/ubuntu/

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse

# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse

deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse

然后apt update一下

关闭系统内部的防火墙,防止和云服务器厂商的冲突

sudo ufw status    //检查防火墙状态,inactive,则表示防火墙为关闭状态; active,则表示防火墙为开启状态
sudo ufw disable   //关闭防火墙

sudo ufw enable    //如有需要可以打开防火墙

放开端口,在云服务器的管理界面

把80 443 之类的放开,然后再放开一下自己需要的

apt update和apt upgrade更新一下

配置一下ssh

服务器总不能搬个凳子在那敲吧,配置一下ssh远程连接,首先在自己的电脑这边用ssh-keygen -t ed25519
有这些密钥可以选择image.png
选ed25519而不是rsa是因为前者比较短一点
生成好了之后进去~/.sshwindows就在用户的文件夹下的.ssh文件夹,里面有个id_ed25519.pub,复制里面的内容,然后去到服务器的.ssh目录(一般都会安装ssh,没有的话就自己安一个),里面有一个authorized_keys(没有的话就创建一个),在里面把公钥复制上去就行了。
如果需要别名的话就在控制的电脑上的ssh目录新建一个config文件,然后加这样的内容

Host linux
    HostName xxxxxx
    Port 22
    User root
    IdentityFile C:/Users/gdd/.ssh/id_rsa
    ServerAliveInterval 30
    TCPKeepAlive yes

第一行就是别名,后面可以直接ssh linux进行连接

安装所需要的软件 主要是LAMP

这些在阿里云官方文档里其实就有写https://help.aliyun.com/zh/ecs/use-cases/build-a-lamp-stack-on-ubuntu-20-instances

  • php 8.1和php8.1-fpm(php进程管理器)
  • apache2 包括 libapache2-mod-php8.1 扩展包
  • mysql-server 包括 php8.1-mysql 扩展包
  • nginx
  • docker和docker-compose
  • java 记得加环境变量
  • tomcat 可以用软连接和shell脚本实现命令启动
  • nodejs
  • npm
  • git
  • phpmyadmin
  • lynx web浏览器
  • nvm 用curl安装,不行的话就用gir,记得添加环境变量(curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash)记得先卸载nodejs,然后还要source一下.bashrc

注意的点

  • 有一些东西不是直接apt install 名字就可以了,可以查查怎么安
  • nginx和apache安装了都会占用80端口两个不能同时用不然会启动失败,可以用netstat -tulnp|grep 80看看是谁在用,要换的话用service xxxx stop一下就好了
  • 在配置mysql的时候要布置安全策略,有点多,可以上网查查这里就不写了
  • tomcat安装之后是要用startup.sh,所以直接创建一个alias链接就好了

alias tomcat=/opt/tomcat/tomcat.sh

#!/bin/bash
tomcat_start(){
    echo "tomcat starting..."
    /opt/tomcat/apache-tomcat-8.5.95/bin/startup.sh
}
tomcat_stop(){
    echo "tomcat stopping..."
    /opt/tomcat/apache-tomcat-8.5.95/bin/shutdown.sh
}
if [ $1 == "start" ];then
    tomcat_start
elif [ $1 == "stop" ];then
    tomcat_stop
else
    echo "Invalid argument. Usage: tomcat [start|stop]"
fi
  • php-frm要指定php版本
  • nvm的安装脚本的命令curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

部署网站

现在已经安了nginx和php,可以在nginx和apache的配置文件里看下网页根目录在哪,一般是在/var/www/html,打开了80端口之后直接访问服务器公网ip就可以了,可以放个index.html试试

安装部署博客需要的

hexo

就正常安装没啥好说的
配置文件需要设置一下copy的部署方式,还需要安装一个扩展npm install hexo-deployer-copy --save

elog

·

npm install @elog/cli -g

这玩意需要node版本是16以上的,直接用nvm弄个18点几的就好了

然后记得修改一下配置文件,修改一下入站规则,让2005端口能被访问,最后用screen运行一下tongbu.py就好了

配置nginx能访问网站

用不同端口号访问不同文件

首先要在nginx的配置那里~~/etc/nginx/nginx.conf~~可以按照如下进行设置,添加到http下
其实不是这样,在nginx.conf里有一句这个include /etc/nginx/sites-enabled/*;,其实最好的办法是在/etc/nginx/sites-available里配置,里面有一个default,是80端口的,为什么nginx.conf里面没有80端口的配置其实就是在这里面,nginx是先读nginx.conf作为主要配置文件,然后再去sites-enabled里面读其他的配置文件,然后这里的文件是通过sites-available软连接过去的,所以只需要在sites-available添加配置文件nginx就会自己读取,也能达到同样的效果,而且这样不会改主配置文件。
所以我们可以在sites-available新建一个ports文件,不用后缀也行,然后添加下面的内容,如果要加别的端口直接在后面加就可以了,虽然也可以新建一个文件但是难免会有些乱,所以我就只用两个文件一个存ports一个存domains就可以了
然后完事了就直接ln /etc/nginx/sites-available/* /etc/nginx/sites-enabled软连接过去就可以了(软连接连接的文件就跟快捷方式一样,在上面的命令中建立的软连接就是在源文件里改的话软连接的文件也会同步修改,但是反之不行,这样保证了安全并且留了个底)
或者也可以在**nginx/conf.d**里面整,因为sites可能ln会断,在nginx.conf里面同样有一句include /etc/nginx/conf.d/*.conf;,所以同样可以在里面添加domains.conf,这样default同样会在sites里面加载,然后自己的配置就在conf.d

server {
                listen 12345; #监听的端口
                server_name 127.0.0.1; # 服务器名称,用服务器的ip就可以
                root /var/www/test; # 指定根目录,可在location里
                index index.html index.htm index.php;# 指定默认的索引文件,可在location里
                location / { #匹配后缀
                        try_files $uri $uri/ /index.php?$args;
                }
                location ~ \.php$ {
                        include fastcgi_params;
                        include fastcgi.conf;
                        fastcgi_split_path_info ^(.+\.php)(/.+)$;
                        fastcgi_pass 127.0.0.1:9000;
                        fastcgi_index index.php;
                        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                }
        }

记得/var/www/test要给读取权限
然后service nginx reload一下

然后因为php的网站需要转发到php-frm,所以要在/etc/php/8.1/fpm/pool.d/www.conf里的listen要改成127.0.0.1:9000(其实好像不改直接unix:/run/php/php8.1-fpm.sock也可以,就是上面的nginx配置要改一下,详细的可以看下面的default文件),然后sudo service php8.1-fpm restartnet -tulnp | grep 9000就会发现他已经开了,他也有可能和其他应用冲突,需要注意。这样当访问php页面的时候他就会自动定位转发到fpm进行php的解析
对于上面的sites-available文件,其实在里面的default文件是可以直接开的,很多功能直接取消注释就行了,如果要不同端口或者域名的话可以直接照抄

# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
 
 # pass PHP scripts to FastCGI server
    #
    #location ~ \.php$ {
    #	include snippets/fastcgi-php.conf;
    #
    #	# With php-fpm (or other unix sockets):
    #	fastcgi_pass unix:/run/php/php7.4-fpm.sock;
    #	# With php-cgi (or other tcp sockets):
    #	fastcgi_pass 127.0.0.1:9000;
    #}

最后还要注意一下路径问题,直接访问文件的话可能会403,如果index索引或者根目录指定的不对的话会出现404错误

用域名访问不同端口或者文件

访问端口的话就需要反代了,也是在nginx里配置就好了

server {
        listen 80; 
        server_name test.pan-gdd.live; #域名,只要发过来的host是这个就可以用这个server块解析
        location / {
            proxy_pass http://localhost:3000;  #反代的端口,自己给自己localhost就行了
            proxy_http_version 1.1; #http协议版本
            proxy_set_header Upgrade $http_upgrade; #这行和下一行一起允许 WebSocket 连接
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host; #保证了转发的请求使用原始请求的 Host 头
            proxy_cache_bypass $http_upgrade; #禁止了对 WebSocket 连接的缓存
        }
    }

还有一种location

location / {
      proxy_pass http://127.0.0.1:3000;
            proxy_set_header Host $http_host;
            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;
            proxy_set_header Range $http_range;
            proxy_set_header If-Range $http_if_range;
            proxy_redirect off;
        }

最后只需要在域名dns那里配置一个A记录名称是test指向服务器就好了

访问文件的话不需要反代,就是上面那个改一下server_name就好了

对了正常dns解析A记录之后是可以直接在域名后面跟端口的,例如上面那个如果没有配置反代的话就直接A记录连接到服务器,test.pan-gdd.live:3000就可以直接访问,上面是嫌麻烦不打3000的话就配一个反代。
再提一嘴那个listen的问题,server_name只是看host对不对的上,listen那个是server_name是在这个端口就会匹配,例如我上面那个是80端口是要在test.pan-gdd.live 被访问80的时候才会反代,想上面那个用不同端口号访问文件也是要访问服务器ip的那个端口才可以

配置https

可以用acme.sh来配置 (可以参考https://u.sb/acme-sh-ssl/ https://www.ahdark.blog/technology/1951.shtml

sudo apt install socat #安装依赖
curl https://get.acme.sh | sh -s email=username@example.com 
source ~/.bashrc
acme.sh --upgrade --auto-upgrade #自动更新
acme.sh --set-default-ca --server letsencrypt #换个CA
mkdir /etc/nginx/ssl #不能直接在.acme的文件夹里用,得换个地方部署

然后就是证书签发,下面的第一个是文件验证的方法,第二个是dns(dns需要在环境变量里配dns解析网站的上获取apihttps://github.com/acmesh-official/acme.sh/blob/master/dnsapi/README.md
-d后面是需要的域名 --webroot就是文件位置(如果不需要的话就可以使用去掉然后单独--standalone让acme.sh自己创建一个 80 端口的 HTTP 服务器进行监听,记得关了nginx先,然后域名dns要指向服务器)

acme.sh --issue -d *.example.com --standalone

acme.sh --issue \ 
        -d www.example.com \
        --webroot /var/www/html/

acme.sh --issue --dns \
        -d example.com \
        --yes-I-know-dns-manual-mode-enough-go-ahead-please
acme.sh --renew \
        -d example.com \
        --yes-I-know-dns-manual-mode-enough-go-ahead-please

然后就需要在nginx里部署安装(提一嘴证书文件名的关系,一般 .acme配置的文件都是.cer,这是证书文件,还有其他的例如.crt .pem的格式,然后.key文件就是私钥文件,.csr就是证书签名请求)

acme.sh --install-cert -d example.com \
--key-file       /etc/nginx/ssl/example.com.key  \
--fullchain-file /etc/nginx/ssl/example.com.cer \
--ca-file        /etc/nginx/ssl/example.com.ca.cer \
--reloadcmd     "service nginx force-reload"

然后需要在nginx的配置文件里添加如下值,跟上面的对应就好了,记得在nginx/conf.d的对应文件改,直接在server里面加就好了( Nginx 的配置 ssl_certificate 要使用证书链/etc/nginx/ssl/fullchain.cer,就是上面–fullchain-file的那玩意,在.acme的域名下是叫fullchain.cer,不能用普通的证书文件)

ssl_certificate /etc/nginx/ssl/example.com.cer;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_trusted_certificate /etc/nginx/ssl/example.com.ca.cer;

或者用/root/.acme.sh的对应文件,这个不太安全,但是有时候上面那个方式会行不通,注意这里的是fullchain.cer
ssl_certificate /root/.acme.sh/pan-gdd.live_ecc/fullchain.cer;
ssl_certificate_key /root/.acme.sh/pan-gdd.live_ecc/pan-gdd.live.key;

还可以加点缓存和限制啥的

ssl_session_cache shared:le_nginx_SSL:10m;
ssl_session_timeout 1440m;
ssl_session_tickets off;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers off;
ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384";

这样就没问题了,可以访问测试下,最后的conf配置是这样(记得要加443端口的监听和ssl)

server {
        listen 80;
        listen 443 ssl;
        server_name chat.pan-gdd.live;
        ssl_certificate /etc/nginx/ssl/chat.pan-gdd.live.crt;
        ssl_certificate_key /etc/nginx/ssl/chat.pan-gdd.live.key;
        ssl_trusted_certificate /etc/nginx/ssl/chat.pan-gdd.live.ca.crt;
        location / {
            proxy_pass http://localhost:3000;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection 'upgrade';
            proxy_set_header Host $host;
            proxy_cache_bypass $http_upgrade;
        }
}

如果可以访问https但是正常访问域名还只是http的话就配一个强制跳转,可以用301重定向实现,下面这个server块就放刚才的server块下面就行,填上域名,再把上面的listen 80;给删了,这样访问域名的时候就会自己从80跳转到443了

server {
    listen 80;
    server_name www.xxx.com;  #填写绑定证书的域名
    return 301 https://$host$request_uri;  #把http的域名请求转成https
}

最后加一个自动化(正常的话会自动加,crontab -l 看看)

15 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null

注意:如果加载不到的话可以看看conf加的东西有没有被加载,说不定他只是加载了default,还可以通过一些dns解析查看 ssl测试 或者certificate check(https://www.geocerts.com/ssl-checker)去检查一下,default里面的ssl配置不会覆盖因为有**server_name _;**只对其他server配置以外的有效。之前我就是用sites没有软连接成功导致只加载default然后自己配的东西根本出不来,排查了好久(。完事了这个之后我发现这玩意的原理就是域名指向服务器,服务器的nginx对指向到他的流量进行过滤,如果host跟他的conf配置里的一样,就执行对应的server块,然后按照里面的端口监听,如果是域名的443端口的话就会使用.acme给nginx安装的证书,就可以https了。

域名的一些事

  • 国内的域名一定是要备案的,指向国内服务器的国外域名也是要备案的
  • 如果国内的dns解析出来的记录跳来跳去那可能是dns被污染了,去https://myssl.com/dns_check.html查查,看看不同地区的一不一样
  • hosts的优先级是比dns服务器的高的,所以在hosts里面改东西可以解决上面的dns污染的问题

docker的一些事

容器跑起来

一般就是

docker run -d \ 
--name xxx
-p 80:80
-v data:data
xxxx:last

-d是后台运行 -i是提供交互 -t是显示终端运行 -v是带版本运行
–name 是容器名字
-p 左边是主机端口右边是容器端口,主要左边不要和已经有的冲突就好了
-v 是映射卷也是左边主机右边容器,一般是绝对路径,记得看有没有权限
-e 是环境变量
–dns 是设置dns
–net 是网络模式
–restart 是重启策略
最后那个就是镜像的名字

拿autobangumi举例

docker run -d \
  --name=AutoBangumi \
  -v ${HOME}/AutoBangumi/config:/app/config \
  -v ${HOME}/AutoBangumi/data:/app/data \
  -p 7892:7892 \
  -e TZ=Asia/Shanghai \
  -e PUID=$(id -u) \
  -e PGID=$(id -g) \
  -e UMASK=022 \
  --network=bridge \
  --dns=8.8.8.8 \
  --restart unless-stopped \
  ghcr.io/estrellaxd/auto_bangumi:latest

如果是docker-compose

#启动
docker-compose build
docker-compose up -d
#关闭
docker-compose down -v

关于镜像

可能有些拉不到要科学一下

docker search xxx  #搜索镜像
docker pull xxx #拉取镜像
docker build -t xxx .  #部署镜像
docker image ls #列出镜像
docker rmi xxx #删除镜像

xxx是名字
.是表示当前目录的配置

watchover守护进程

关于overlay存储

docker现在使用overlay2存的,这玩意分三块,其中lower目录是最底层的,是镜像文件,可以是多个,只可读;upper目录是只有一个,是容器文件,可读写;merged目录可以看作是前面两个取并集出来的,里面没有文件,只是像图中一样下面的两个映射上去最终给用户看到的目录;还有一个work目录是工作基础目录
1447636-20211031171612934-287286043.png
overlay现在一般都是overlay2,存在/var/lib/docker/overlay2

关于网络模式

docker有四种网络模式

none

容器关闭网络完全隔离

host

容器和宿主机完全公用ip和端口

container

容器和其他容器共享ip和端口

bridge

容器通过一个docker0虚拟网桥,每个容器都被分配一个ip,然后通过这个网桥与主机通信。这里容器的ip一般是172.17.0.0/16,但是容器之间是相互隔离的,然后如果配置了例如-p 80:80,就会让iptable表里面添加规则让主机接收到来自80端口的信息转给容器里的80端口。

关于重启策略

  • unless-stopped:当容器退出或崩溃时,Docker 会自动重新启动该容器。这样可以确保容器在出现故障或宿主机重启后能够自动恢复运行。
  • no:容器不会自动重启,无论什么原因导致容器退出,都需要手动重新启动。
  • on-failure:只有在容器以非零状态退出时才会自动重启。可以通过 –restart on-failure: 指定最大重试次数。
  • always:无论容器以什么状态退出,都会自动重启

容器的操作

列出容器 docker ps

停止容器docker stop xxxx 删除容器docker rm xxxx

命令执行 例如打开命令行:docker exec -it xxx bash

复制文件 docker cp <容器ID或名称>:<容器路径> <主机路径>

查看存储占用docker system df

查看容器状态docker stats xxx

查看容器日志docker logs xxx

复制容器可以在portainer里搞定

dockerfile里的东东

src文件夹是放源代码的

dockerfile文件

FROM php:7.0.9-apache
ENV FLAG=flag{test}
COPY src/ /var/www/html
RUN mv start.sh /start.sh && \
    chmod +x /start.sh && \
    mv phar.ini /usr/local/etc/php/conf.d
CMD ["/start.sh"]
EXPOSE 80

例如这个,FROM后面的语句就是指定这个docker的运行环境,ENV就是设置环境变量,COPY就是把同目录下的src文件夹下的所有文件拷贝到/var/www/html,RUN命令应该自动会在src下执行 就是执行命令的 注意这里命令要连起来 使用&& \不能连续输,CMD就是开局运行的脚本,EXPOSE顾名思义就是暴露端口

docker配置文件deamon.json

因为docker有一个配置文件在/etc/docker/daemon.json(没有的话可以新建),需要什么的话可以自己加,他会自己加载
具体的配置如下:

{
  "authorization-plugins": [],
  "data-root": "", 
  #Docker运行时使用的根路径,根路径下的内容稍后介绍,默认/var/lib/docker
  "dns": [],  
  #设定容器DNS的地址,在容器的 /etc/resolv.conf文件中可查看
  "dns-opts": [],
  #容器 /etc/resolv.conf 文件,其他设置
  "dns-search": [],
  #设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的 主机时,DNS不仅搜索host,还会搜索host.example.com。注意:如果不设置,Docker 会默认用主机上的 /etc/resolv.conf来配置容器。
  "exec-opts": [],
  "exec-root": "",
  "experimental": false,
  "features": {},
  "storage-driver": "",
  "storage-opts": [],
  "labels": [],
  #docker主机的标签,很实用的功能,例如定义:–label nodeName=host-121
  "live-restore": true,
  "log-driver": "",
  "log-opts": {},
  "mtu": 0,
  "pidfile": "",
  #Docker守护进程的PID文件
  "cluster-store": "",
  "cluster-store-opts": {},
  "cluster-advertise": "",
  "max-concurrent-downloads": 3,
  "max-concurrent-uploads": 5,
  "default-shm-size": "64M",
  "shutdown-timeout": 15,
  "debug": true, 
  #启用debug的模式,启用后,可以看到很多的启动信息。默认false
  "hosts": [],
  #设置容器hosts
  "log-level": "",
  "tls": true,  
  #默认 false, 启动TLS认证开关
  "tlscacert": "", 
  #默认 ~/.docker/ca.pem,通过CA认证过的的certificate文件路径
  "tlscert": "", 
  #默认 ~/.docker/cert.pem ,TLS的certificate文件路径
  "tlskey": "",
  #默认~/.docker/key.pem,TLS的key文件路径
  "tlsverify": true,
  #默认false,使用TLS并做后台进程与客户端通讯的验证
  "tls": true,
  "tlsverify": true,
  "tlscacert": "",
  "tlscert": "",
  "tlskey": "",
  "swarm-default-advertise-addr": "",
  "api-cors-header": "",
  "selinux-enabled": false, 
  #默认 false,启用selinux支持
  "userns-remap": "",
  "group": "",
  #Unix套接字的属组,仅指/var/run/docker.sock
  "cgroup-parent": "",
  "default-ulimits": {
    "nofile": {
      "Name": "nofile",
      "Hard": 64000,
      "Soft": 64000
    }
  },
  "init": false,
  "init-path": "/usr/libexec/docker-init",
  "ipv6": false,
  "iptables": false,
  "ip-forward": false,
  #默认true, 启用 net.ipv4.ip_forward ,进入容器后使用sysctl -a|grepnet.ipv4.ip_forward查看
  "ip-masq": false,
  "userland-proxy": false,
  "userland-proxy-path": "/usr/libexec/docker-proxy",
  "ip": "0.0.0.0",
  "bridge": "",
  "bip": "",
  "fixed-cidr": "",
  "fixed-cidr-v6": "",
  "default-gateway": "",
  "default-gateway-v6": "",
  "icc": false,
  "raw-logs": false,
  "allow-nondistributable-artifacts": [],
  "registry-mirrors": [],
  #镜像加速的地址,增加后在 docker info中可查看。
  "seccomp-profile": "",
  "insecure-registries": [],
  #配置docker的私库地址
  "no-new-privileges": false,
  "default-runtime": "runc",
  "oom-score-adjust": -500,
  "node-generic-resources": ["NVIDIA-GPU=UUID1", "NVIDIA-GPU=UUID2"],
  "runtimes": {
    "cc-runtime": {
      "path": "/usr/bin/cc-runtime"
    },
    "custom": {
      "path": "/usr/local/bin/my-runc-replacement",
      "runtimeArgs": [
        "--debug"
      ]
    }
  },
  "default-address-pools":[{"base":"172.80.0.0/16","size":24},
    {"base":"172.90.0.0/16","size":24}]
}

一般就是用data-root去指定docker根路径,默认是/var/lib/docker
或者storage-driver参数指定使用 overlay2 文件驱动,再用storage-opts参数改overlay2的大小,例如

{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.size=20G",
    "overlay2.override_kernel_check=true"
  ]
}

但是扩容overlay还是直接改根目录大小或者迁移overlay更好

使用代理

有下面几种方法

  1. /etc/docker/daemon.json里面配置就好了
{
    "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
  1. 直接进去docker命令行配置,用docker exec -it xxx bash进去,临时的话就export,永久的话就去改.profile,没有vim和nano的话就用cat > .profile或者echo xxx>>.profile
  2. 创建镜像的时候配置,如果用的是host网络模式的话就直接-e http_proxy="127.0.0.1:7890",不是的话就e http_proxy="172.17.0.1:7890",如果是外部的话就改一下
  3. 全局配置代理,去vim ~/.docker/config.json
{
 "proxies":
 {
   "default":
   {
     "httpProxy": "172.17.0.1:7890",
     "httpsProxy": "172.17.0.1:7890",
     "noProxy": "localhost"
   }
 }
}
  1. 但是也有一些不一样的,比如jellyfin的代理,他是不能用上面的方法跑的,而是需要去编辑里面的Systemd环境变量,具体可以参考https://blog.csdn.net/AAMahone/article/details/128966904。或者现在很多docker甚至都有插件或者扩展,去看看有没有相关的加速或者代理。
  2. 还有一个办法就是配置iptables表,把从docker出来的流量全部转发给代理应用

sudo iptables -t nat -A PREROUTING -p tcp -s 172.17.0.0/16 -j DNAT --to-destination 192.168.167.23:7890
然后要取消的话就把-A改成-D,对了要查看状态的话iptables -t nat -L -n -v

为什么docker容器会莫名其妙的跑不起来

因为占用满了

df -h可以看到其实overlay是满了的(其实根目录也满了,这个扩容可以看下面的排错)
image.png
然后这种情况下restart容器会出现Request failed with status code 500错误的,甚至删掉没有用的镜像的时候也会报 write /var/lib/docker/image/overlay2/.tmp-repositories.json2691037075: no space left on device就是说没有空间,所以就需要清理或者扩容一下
最后结果是overlay是在根目录的和根目录占同一个空间,所以其实是根目录满了……按照下面的方法扩容了就完事了

这个还有一个解决办法就是把docker迁移出去,我现在就打算给他放过去sdc1里面,分给他50g
首先先新建一个/tmp/docker文件夹,把sdc1挂载过去mount /dev/sdc1 /tmp/docker
然后复制原来docker里的内容过去,cp -rv /var/lib/docker/* /tmp/docker(v是查看详细信息)
然后解除挂载umount /dev/sdc1,再给他挂载到docker本体文件夹mount /dev/dec1 /var/lib/docker
最后去fstab表里写一下就好了,/dev/sdc1 /var/lib/docker ext4 defaults 0 0

这里的第二步cp文件过去/tmp/docker文件实际上就是写进sdc1里面,然后取消挂载再挂载到docker文件夹,这样docker文件夹里面的东西就是和原来的一样但是它实际上用的是sdc1的空间而不用根目录,可以pull一个镜像验证一下是不是只加了sdc1而没有加/dev/mapper/ubuntu–vg-ubuntu–lv根目录。原来的那些因为挂载被覆盖掉了但是没被删除,取消挂载还能看得到

因为端口没开

有时候虽然他docker ps能看到端口但是在例如portainer.io的工具上就看到没有
image.png
第一有可能是这个端口被占用了netstat看看
第二有可能是网桥的问题,点进去容器在最下面
image.png
这些都是空的,需要重新给一下

因为他一直在重启

之前部署autobangumi的时候就一直访问不了,结果docker exec -it AutoBangumi ls的时候一看好家伙说is restarting, wait until the container is running,一看因为–restart unless-stopped 结果真的一直在重启,改成 –restart no之后果不其然一开就报错,于是就查哪里错了
在portainer里看log如下
image.png
这是配置文件错了导致json解析不出来,根据这个改就好了(看log真的很重要!)

一些有用的功能

crontab

这玩意是定时任务,可以crontab -l列出,crontab -e编辑
里面的格式如下

*  *  *  *  * root command
分  时  日  月  周 用户  命令

比如每小时运行.sh0 * * * * root /root/blog/tongbu.sh
然后这个的形式是可以支持例如1,3,5``1-5``/1(在小时位就是每一个小时)
值得一提的是月份和星期都可以用英文缩写,如果是数字表示的话周日是0而不是7

其他的一些组件

clash

https://github.com/wanhebin/clash-for-linux
用这个就好了,安好首先要把.env里的CLASH_SECRET设置一下,不然随机的后面登录yacd管理界面他可能会识别不到。还要注意订阅地址的加密问题,有一些他是不支持的。对了还需要看看7890到7894端口有没有被占用
记得source /etc/profile.d/clash.sh配置一下环境变量
最后仿照上面的tomcat做一个shell脚本和alias别名连接快速启动就好了

alist

curl -fsSL "https://alist.nn.ci/v3.sh" | bash -s install一键安装,然后跟着配置一下web界面的密码

先cd到alist所在目录:
cd /opt/alist
随机设置新密码:
./alist admin ran 3om
或者手动设置新密码:
./alist admin set NEW_PASSWORD

然后访问5244端口就好了
后面照着alist文档来添加存储啥的就可以了 https://alist.nn.ci/zh/
注意:

  • 对象存储的Endpoint不用复制这么长的,例如阿里云的oss-cn-hangzhou.aliyuncs.com,腾讯云的别把前面的存储桶名字给贴上去……
  • 如果出现Request failed with status code 413e.response is undefined的报错的话,那就是nginx的传输大小限制,去nginx.conf的http块里面加一行client_max_body_size 90000m;即可

vscode

图床

zsh美化

jellyfin

没错我觉得docker里的jellyfin太难用了,然后直接打算本地部署……
主要是参考这个https://post.smzdm.com/p/a908x3l7/
就是安装依赖 下载签名 配置apt库(这里提一嘴这个配置的文件在/etc/apt/sources.list.d/jellyfin.sources,相当于特定使用的source源)然后更新库 安装
因为apt没有签名不能乱安,所以就需要比较麻烦
这玩意还挺大的,我刚扩容的根目录啊……

一些排错

扩展根目录:编辑文件的时候出现E514: write error (file system full?)

这个是表示文件系统已满,无法写入新的数据
df -h一下
image.png
发现根目录都满了……
但是因为我这个是pve虚拟机里的系统,我分了64g给他,为啥只用了15g
fdisk -l看下挂载有没有问题
image.png
可以看到sda3有30g的但是只用了15g,而且pve分的64g也没用完……
先给根目录多分点,用lsblk看下分盘
image.png
确实只给了根目录15g
首先先去把pve给的64g给满

  1. sudo parted /dev/sda扩容系统盘
  2. 然后会出来一个命令界面,叫你输入,依次可以输入printresizepart 3 100%quit(注意resizepart后面的数字是你的分区块号)

image.png

  1. 然后再lsblk就会发现已经改了

image.png
接下来就是直接扩容

  1. 首先vgdisplay一下看下有没有空间,如果看到 Free PE / Size > 0,表示还有

image.png

  1. sudo lvextend -l +100%FREE /dev/mapper/ubuntu--vg-ubuntu--lv,后面那个是写df -h里的那个根目录对应的路径(+100%FREE 表示使用所有可用的空闲空间来扩展逻辑卷)。如果上面那个报错**/etc/lvm/archive: mkdir failed: No space left on device**的话,就用lvresize -A n -L +8G /dev/mapper/ubuntu--vg-ubuntu--lv

image.png

  1. 然后resize2fs -p /dev/mapper/ubuntu--vg-ubuntu--lv

image.png

  1. 接下来就可以看到扩展成功了(如果刚不能写archive,现在还需要扩容的话就可以直接执行上面的lvextend了)

image.png

一些碎碎念

GitHub学生包和Azure学生账户的问题

这俩对我们这都不太好通过,GitHub学生包可以用学信网认证(改英文)加上学生证,然后不要用流量不开科学用校园网申请,实在不行就改到另外一个校区的定位。主要就是要有关键词和ip定位就能让机器认出来。
学生包里有.name``.tech的域名服务,还有termiusJetBrains的产品,以及copilot啥的
然后Azure有时候会出现我们遇到了意外错误,就去支持那里提交邮件,包含登录的邮箱还有错误网页的截图,加上证明的材料,和工程师来往几封邮件就可以了。或者用GitHub学生包认证的账号登录也行。
Azure这个好像是新注册账号有一个月的200刀(用完就没了,过期也没了),然后12个月每个月750小时的免费1核1G,但是要打开即用即付,才能继续12个月免费,然后最后记得取消。学生订阅的话就有一年的100刀额度,可以看着用,用完或者一年之后就要到点才能续期。

常见的命令

vi的用法

vi和vim有些不同,很多功能都没有,比如在insert的时候是不能上下左右的,很难受
这边主要要用好这几个命令,i在光标前插入,a在光标后插入,x删除一个字 同退格,dd删除当前行,dw删除一个单词,G直接到最后,/搜索,当然del键也是可以用的
然后这里是vim的一些常用的操作

首先是正常模式里:
i是进编辑模式 g是进可视模式 :是进命令行模式 .是上一次的操作
u是撤回 CTRL+r是恢复
hjkl是左下上右 o是在下一行新增
gg是第一行 G是最后一行
dd是删除当前行 dw是删除单词 cw是删除完单词之后进编辑模式
yy是复制当前行 p是粘贴
/xxx 是搜索xxx 搜索完后敲n是下一个,N是上一个

压缩和解压缩

  • zip类

压缩:zip -r <zip文件名.zip> <目录1> <目录2> …
解压缩: unzip <zip文件名.zip>

  • rar类

同上,但是改为了rar

  • tar类

压缩: tar -cvf myarchive.tar mydirectory
解压缩: tar -xvf myarchive.tar

  • gzip类

压缩: gzip myfile.txt
解压缩:gunzip myfile.txt.gz

在不同服务器之间复制文件

使用scp命令 scp file_name user_name@remote_ip:file_path
文件夹的话还是加个-r
如果是别名的话就直接xxx:path

硬盘相关

mount命令挂载硬盘和查看挂载(注意挂载给的那个文件的之前的东西会被隐藏不可见,但是没被删掉,取消挂载之后还有)
ls -l /dev/disk/by-id/查看磁盘
fdisk分盘 -l是查看磁盘分盘(这个好用)
lsblk这个是以树状结构查看磁盘 主要用来看挂载
df -h查看硬盘所用空间
du -sh查看所在目录的文件占用大小,加上一个c参数du -csh就是总和,如果要查看当前文件夹下第一级文件夹的每个文件夹的占用情况 就用du -h --max-depth=1
具体可以去看虚拟机安装那个文章的“安装新硬盘遇到的问题”和上面的排错“扩展根目录”

网络服务相关

查看ip ifconfig ip address
改防火墙iptables``ufw``firewall
查看端口netstat``isof
修改lan的ip vi /etc/network/interfaces(这俩可改可不改vi /etc/issue vi /etc/hosts
修改dns vim /etc/resolv.conf(可以修改不能curl域名的问题)

网络连接相关

ping:这个只能对ip地址使用
curl:这是获取网站的内容,还有一些参数,一般-Ls参数代表的就是L是跟所重定向,s是不显示报错

环境变量和别名

设置环境变量export xxx="xxx"取消设置用unset xxx
设置别名用alias xxx=“xxx”取消设置用unalias xxx
要持久化就去.profile或者.bashrc之类的
配置代理的话直接export http_proxy="http://用户名:密码@代理IP:代理端口"就好了,用户名和密码不是必须的

改主机名

/etc/hostname改就好了

查看系统进程

ps命令,一般加-aux参数,配合grep查找,常用的如下:

  • ps: 显示当前终端会话中与当前用户关联的进程。
  • ps -e 或 ps -A: 显示所有正在运行的进程,不仅限于当前用户。
  • ps -f: 显示完整的进程信息,包括进程的父进程 ID(PPID)、CPU 使用情况、内存占用等。
  • ps -l: 以长格式显示进程信息,包括更多的列,如进程状态、进程优先级等。
  • ps -u username: 显示指定用户名(username)关联的进程。
  • ps -p pid: 显示指定进程 ID(pid)的进程信息。
  • ps -aux 或 ps -ef: 显示所有进程的详细信息,包括所有用户的进程,并显示进程的完整命令行。

更新系统缓存

一般用hash命令

  • hash -r:刷新路径缓存,使系统重新查找和记住命令的位置。
  • hash -p filename pathname:将指定的 filename 关联到指定的 pathname,以手动添加命令到路径缓存中。
  • hash -d command:从路径缓存中删除指定的命令。
  • hash -l:列出当前路径缓存中的所有命令及其位置。
  • hash -t command:显示指定命令的路径,但不更新路径缓存。

软件包管理

基于Debian的Ubuntu一般就是用dpkg和apt,后者可以看作前者的升级版
dpkg 命令:

  1. 安装软件包:dpkg -i 或 dpkg –install
  2. 卸载软件包:dpkg -r 或 dpkg –remove
  3. 配置软件包:dpkg –configure
  4. 查询软件包信息:dpkg -l 或 dpkg –list
  5. 查询已安装的软件包:dpkg -l 或 dpkg –list
  6. 查询文件所属的软件包:dpkg -S 或 dpkg –search

apt 命令:

  1. 更新软件包列表:apt update
  2. 安装软件包:apt install
  3. 指定版本安装:apt install =version
  4. 卸载软件包:apt remove
  5. 升级已安装的软件包:apt upgrade
  6. 搜索可用的软件包:apt search
  7. 显示软件包详细信息:apt show

目录创建连接

  • 硬链接命令:ln <source> <destination>
  • 软连接命令:ln -s file.txt link.txt,对于文件夹他是直接覆盖的,例如ln -s /path/to/source /path/to/destination他就会创建一个destination文件夹作为source文件夹

echo命令

  1. 显示变量:echo $a - 这将在终端上显示a变量的值

  2. 显示文本:echo "Hello, World!" - 这将在终端上显示 “Hello, World!”。

  3. 将文本输出到文件:echo "Hello, World!" > 文件路径 - 这将把 “Hello, World!” 写入到指定的文件中。如果文件已经存在,将会覆盖文件内容。

  4. 创建新文件并写入文本:echo "Hello, World!" > 新文件路径 - 这将创建一个新文件,并将 “Hello, World!” 写入其中。如果文件已经存在,将会覆盖文件内容。

  5. 追加文本到文件末尾:echo "Hello, World!" >> 文件路径 - 这将把 “Hello, World!” 追加到指定文件的末尾,而不会覆盖文件内容。需要注意的是,echo 命令会在输出中自动添加换行符。如果你不希望添加换行符,可以使用 -n 选项,例如:echo -n “Hello”。(提一嘴cat > file也可以写文件,而且是在命令窗口写, 按 Ctrl + C结束输入)

  6. 删除文件

  • 递归删除某种类型的文件find ./ -type f -name "*.nfo" -exec rm {} +