我换新服务器了,不打算用hexo这种静态博客了,一直听说wordpress很不错,就整了一个,配上Fuuker主题效果很好。下面是我的部署流程,中间还顺手修了个小bug。废话不多说,开搞!
一、ed25519密钥添加
服务器毕竟在公网上,建议以后用密钥登录,关闭密码登录,保证安全。
1.在Windows上生成SSH密钥对
打开 PowerShell 或 命令提示符(CMD)
ssh-keygen -t ed25519 -C "你的邮箱@example.com"会提示你:
- 保存位置: 直接回车(默认保存在
C:\Users\你的用户名\.ssh\id_ed25519) - 设置密码: 可以设置一个密码(passphrase)保护私钥,也可以直接回车留空
💡 建议设置密码,这样即使私钥被盗也需要密码才能使用
生成完成后会有两个文件:
id_ed25519- 私钥(千万不要泄露!)id_ed25519.pub- 公钥(这个要传到服务器)
2.将公钥上传到服务器
先去C:\Users\你的用户名\.ssh\id_ed25519.pub查看你的公钥内容(中文用户的路径是C:\用户\你的用户名\.ssh\id_ed25519.pub)
复制显示的内容(以 ssh-ed25519 开头的一长串),大概长这样:
ssh-ed25519 ABCDEF468631WEFANESJKOSDCPWNNFXCOJWF/7WFDS56WF6SDF6DF 你的邮箱💡 注意整个都要复制过来!
登陆服务器,在服务器执行:
# 创建 .ssh 目录(如果不存在)
mkdir -p ~/.ssh
# 设置正确的权限
chmod 700 ~/.ssh
# 将公钥添加到授权文件
echo "你复制的公钥内容" >> ~/.ssh/authorized_keys
# 设置授权文件权限
chmod 600 ~/.ssh/authorized_keys然后修改ssh配置:
sudo nano /etc/ssh/sshd_config找到并修以下行:
PubkeyAuthentication yesctrl+o,回车,之后ctrl+x退出编辑(如果没有nano请自行使用vim编辑)
检查配置语法:
sudo sshd -t如果没有错误提示,说明配置文件语法正确(只要没有错误提示就就行,默认应该是什么都不输出,下同)。
3.测试密钥登陆
将密钥添加到你的远程连接软件,(我用的termius),然后测试登陆。
4.禁用密码登陆(可选,更安全)
编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config找到并修改下面这行:
PasswordAuthentication no检查配置语法:
sudo sshd -t如果没有错误提示,说明配置文件语法正确。
重启ssh服务:
sudo systemctl restart sshd或者使用这个重启ssh服务:
sudo service ssh restart二、新建普通用户(推荐)
不管是生产环境还是个人使用,一般不建议天天拿着root账户跑命令,更推荐创建一个普通用户。
1.创建普通用户
# 创建用户(你可以改成你喜欢的用户名,比如 admin、yourname 等)
sudo adduser myblog
# 给sudo权限
sudo usermod -aG sudo myblog2.给新用户配置密钥
# 切换到新创建的用户
sudo su - myblog
# 创建.ssh目录
mkdir ~/.ssh
chmod 700 ~/.ssh
# 复制你的公钥
echo "你的公钥内容" > ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
# 退出
exit3.修改ssh配置
sudo nano /etc/ssh/sshd_config改这两行:
PermitRootLogin no
PasswordAuthentication noPermitRootLogin no禁止root用户登陆,PasswordAuthentication no 禁止使用密码登陆(只能用密钥)
检查配置语法:
sudo sshd -t如果没有错误提示,说明配置文件语法正确。
重启:
sudo systemctl restart sshd三、安装docker
1.安装必要工具
我们更新一下包列表,并安装一些 apt 添加 HTTPS 仓库时需要用到的工具,以及你稍后会用到的文本编辑器 nano
# 更新 apt 包列表
sudo apt-get update
# 安装 curl (用于下载) 和 nano (用于编辑文件)
sudo apt-get install ca-certificates curl nano运行apt-get update超时的请自行配置镜像加速,我这里使用的中科大的镜像源(一般服务商会直接给配好,我这个是直接预配置的中科大的)
2.为docker配置国内镜像源
我的服务器无法直接连上docker官方仓库,故需要添加镜像
1.下载密钥
在服务器端创建 GPG 密钥目录
sudo install -m 0755 -d /etc/apt/keyrings打开powershell,在自己的电脑上从docker官方下载GPG 密钥的文本源文件,
# 示例:从 Docker 官方下载
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o docker-key.asc注意,如果报错Invoke-WebRequest : 找不到与参数名称“fsSL”匹配的参数。是因为调用的不是真实的curl程序,请使用这个指令:
curl.exe -fsSL https://download.docker.com/linux/ubuntu/gpg -o docker-key.asc2.上传密钥
将docker-key.asc传到服务器,放到你能找到的路径,这里以放到/home/naseele/为例
3.转换并安装密钥
这是最重要的一步。我们使用 gpg 命令将文本密钥(.asc)转换为 apt 需要的二进制密钥(.gpg),并存放到指定位置。
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg /home/naseele/docker-key.asc
sudo chmod a+r /etc/apt/keyrings/docker.gpg注:--dearmor 意思是“解密/转换” ,-o ... 指定输出到目标文件
4.配置 Docker 仓库源
创建 docker.list 仓库文件:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null5.刷新列表
sudo apt-get update6.安装docker
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin7.【重要】配置 Docker 免 sudo 权限
安装完成后,默认情况下,每次运行 docker 命令都需要加 sudo,这很麻烦。我们可以把我们的用户(naseele)添加到 docker 用户组来解决这个问题。
sudo usermod -aG docker $USER注意这里的$USER不需要我们手动改成我们自己的用户名!!!
这个权限更改不会立即生效。我们需要:
- 完全退出 SSH 会话。
- 重新登录服务器。
强烈建议这一步做完之后断开当前ssh再重新连接,否则你后续执行
docker compose up -d --build的时候会遇到报错:
unable to get image 'blog-hexo': permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.51/images/blog-hexo/json": dial unix /var/run/docker.sock: connect: permission denied8.验证安装
- 检查 Docker 版本
docker --version应当看到类似:Docker version 28.5.2, build 4261b1a
- 检查 Docker Compose 版本 (注意:新版命令是
docker compose,中间没有连字符)
docker compose version应看到类似:Docker Compose version v2.40.3
- 运行 "Hello World"(可选) 这是测试 Docker 是否能正常拉取和运行容器的最佳方式。
docker run hello-world如果能看到 "Hello from Docker!" 的消息,那就说明服务器环境已经完美就绪了。
四、安装fish(可选)
注意:我们用的cl更推荐用bash运行,可以在包那里用bash install.sh
1.安装
- 添加 PPA (Personal Package Archive) 源: 这个命令会将
fish-shell/release-4这个PPA添加到你系统的软件源列表中。sudo add-apt-repository ppa:fish-shell/release-4 - 更新软件包列表: 添加新源之后,你需要运行这个命令来刷新本地的软件包列表,这样系统才能“看到”新PPA中的软件包。sudo apt update
- 安装 Fish Shell: 这才是关键的安装步骤。更新完成后,你就可以使用
apt来安装fish软件包了。sudo apt install fish
2.配置
将fish设置为默认shell(登录shell)后,每次打开新的终端窗口或SSH登录时,系统都会自动启动fish,而不是默认的bash。
1. 查找fish的安装路径
我们需要告诉系统fish可执行文件到底安装在哪里了。
which fish这个命令通常会返回一个路径,比如 /usr/bin/fish 或 /usr/local/bin/fish。
2. 更改默认Shell
注意!强烈建议在修改这个之前另开一个ssh连接备用,等更改默认shell生效,而且再新开ssh连接不会出现连接失败,再关掉那个多余的ssh连接
使用 chsh (change shell) 命令来更改当前用户的默认shell。我们需要将上一步中获取到的路径填入命令中。
假设上一步返回的路径是 /usr/bin/fish:
chsh -s /usr/bin/fish- 系统会提示我们输入你当前用户的登录密码(sudo密码)来进行身份验证。
chsh是专门用来修改/etc/passwd文件中记录的、关于我们用户默认shell的工具。
3. 生效
这个更改不会立即应用到我们当前打开的终端窗口。我们需要新开一个ssh连接来看,
(在某些桌面环境上,可能只需要关闭所有终端窗口再重新打开即可,但最保险的方法是完全注销并重新登录。)
重新登录后,打开终端,我们应该会看到fish的欢迎界面。
如果以后想改回bash,操作也是类似的,bash的默认路径通常是 /bin/bash:
chsh -s /bin/bash五、安装WordPress
1.创建项目结构
wordpress-project/
├── docker-compose.yml
├── Caddyfile
├── mysql/ # MySQL 数据持久化
├── wordpress/ # WordPress 文件持久化
├── caddy_data/ # Caddy 数据(证书等)
├── wp-config/ # 存放uploads.ini
├── caddy_data/
└── caddy_config/除非教程要求创建,否则wordpress-project下的文件夹都不需要我们手动创建,他们会随着程序的运行自动创建,这里仅做展示用。
2.创建 docker-compose.yml
services:
# MySQL 数据库
db:
image: mysql:8.0
container_name: wordpress_db
restart: always
# 预留最多30s时间供它关闭(如果嫌长可以适当调整)
stop_grace_period: 30s
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: your_wordpress_password
volumes:
- ./mysql:/var/lib/mysql
networks:
- wordpress_internal
# WordPress
wordpress:
image: wordpress:latest
container_name: wordpress
restart: always
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: your_wordpress_password
WORDPRESS_DB_NAME: wordpress
sysctls:
- net.ipv6.conf.all.disable_ipv6=1
- net.ipv6.conf.default.disable_ipv6=1
dns:
- 223.5.5.5
- 114.114.114.114
volumes:
- ./wordpress:/var/www/html
- ./wp-config/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- wordpress_internal
- caddy_net
# Caddy 反向代理
caddy:
image: caddy:latest
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3 支持
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config
networks:
- caddy_net
networks:
wordpress_internal:
driver: bridge
# 关键修改:设置 MTU 为 1280以适配邮件服务 (默认是1500)
driver_opts:
com.docker.network.driver.mtu: 1280
caddy_net:
external: true
volumes:
mysql:
wordpress:
caddy_data:
caddy_config:请将MYSQL_ROOT_PASSWORD、MYSQL_PASSWORD改成自己的密码,并将wordpress的environment里面的WORDPRESS_DB_PASSWORD内容改成与MYSQL_PASSWORD一样的内容。
请不要修改wordpress的environment里其他内容,否则可能出现数据库连接错误,db的environment同理。
自己临时测试的时候可以把此文件中caddy的ports改成- "8080:8080" ,等域名备案完成请按照本教程第十步进行
如果你想锁死版本号,比如6.8.3,请将wordpress的image: wordpress:latest改成image: wordpress:6.8.3.
3.创建Caddyfile
对就叫Caddyfile,不要带任何后缀,文件内容如下:
# 替换为你的域名
your-domain.com {
encode gzip
# 反向代理到 WordPress
reverse_proxy wordpress:80
# 日志
log {
output file /data/access.log
}
}自己临时测试时可以把Caddyfile文件的your-domain.com改成:8080,等域名备案完成请按照本教程第十步进行
然后访问并进入配置页
注:
注意,此时配置完成会将你的ip:端口的访问方式记入数据库,后面备案完成后需要修改,修改步骤如下:
docker exec -it wordpress_db mysql -u wordpress -p之后盲输密码,回车登录数据库,你会看到这样的输出:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 28
Server version: 8.0.44 MySQL Community Server - GPL
Copyright (c) 2000, 2025, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>查看数据库中存的主页链接:
SELECT option_name, option_value FROM wp_options WHERE option_name IN ('siteurl', 'home');应该是这样:
+-------------+---------------------+
| option_name | option_value |
+-------------+---------------------+
| home | http://你的IP:23231 |
| siteurl | http://你的IP:23231 |
+-------------+---------------------+
2 rows in set (0.01 sec)我这里是23231是因为我当时测试的时候,直接在docker-compose.yml给wordpress配了个ports,端口是23231。
执行命令,修改端口:
UPDATE wp_options SET option_value='http://你的域名' WHERE option_name='siteurl';
UPDATE wp_options SET option_value='http://你的域名' WHERE option_name='home';退出数据库:
exit;4.PHP 配置优化:
此优化可以增加上传文件大小限制
sudo touch wp-config/uploads.ini 在文件内写入
file_uploads = On
memory_limit = 512M
upload_max_filesize = 100M
post_max_size = 100M
max_execution_time = 600
max_input_time = 600注意这个文件夹不要删不要动,如果想挪,请同步修改docker-compose.yml里面的volumes部分的挂载./wp-config/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
5.开始部署
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f6.安装 WordPress
访问 http://your-domain.com 或 http://localhost,按照提示完成 WordPress 安装:
- 选择语言
- 填写站点标题、管理员账号等信息
- 完成安装
注:
如果在setting-general中找不到语言选项,请自行下载(参考{1})简体中文语言包进行安装,步骤如下:
- 完成安装配置后,查看自己的wordpress版本号。
- 去官网下载简体中文包,找自己的对应版本下载。
- 把下载的包解压,把其中的languages文件夹(在
wordpress/wp-content/languages)上传到服务器,并放到/你的博客路径/wordpress/wp-content/下 - 修改新上传的文件夹的归属权sudo chown -R www-data:www-data /你的博客路径/wordpress/wp-content部分参数解释:-R 递归修改文件夹内所有文件www-data:www-data 用户组www-data内的名为www-data的用户注意,请确保你的wordpress文件夹里面每个文件属于www-data用户,这个文件夹的所有默认是属于这个用户的,但是如果你新上传文件或者覆盖文件,可能会导致归属权变更,建议每次操作后更改一次被操作文件的所有者:sudo chown www-data:www-data 文件名
- 修改网站语言设置
进入你的网址/wp-admin(这是你的网站的后台管理地址)(如果是临时测试,网址是你的ip:端口号,如果已经绑定域名,网址就是你的域名),点击左侧的settings-general
六、安装Fuukei主题
1.下载主题
访问仓库,下载主题,也可以直接去前往 Github Release 或 Gitee 镜像 下载,没错那个Source code(zip)就是我们要下载的东西。
2.上传并启用主题
将下载的压缩包上传到服务器,解压:
# 如果下载的是tar.gz格式,请使用:
tar -zxvf Sakurairo-3.0.4.tar.gz
# 如果下载的是zip格式,请使用:
unzip Sakurairo-3.0.4.zip将文件夹移动到/你的博客路径/wordpress/wp-content/themes/:
sudo mv /到文件夹的路径/文件夹 /你的博客路径/wordpress/wp-content/themes/重命名文件夹:
sudo mv Sakurairo-3.0.4 Sakurairo更改文件夹所有者:
sudo chown -R www-data:www-data Sakurairo浏览器进入你的博客后台(地址为你的网址/wp-admin),点击外观-主题,找到我们
七、数据库密码修改
WordPress 官方 Docker 镜像使用 getenv_docker() 从环境变量读取配置,所以密码不会硬编码在文件中。
所以我们不需要修改 wp-config.php,只需要改两个地方:
1. 先修改 MySQL 数据库中的密码
# 进入 MySQL 容器
docker exec -it wordpress_db mysql -u root -p
# 输入数据库 root 密码:执行 SQL:
-- 修改 wordpress 用户密码
ALTER USER 'wordpress'@'%' IDENTIFIED BY '你的新wordpress密码';
-- 如果要改 root 密码
ALTER USER 'root'@'localhost' IDENTIFIED BY '你的新root密码';
ALTER USER 'root'@'%' IDENTIFIED BY '你的新root密码';
-- 刷新权限
FLUSH PRIVILEGES;
-- 验证
SELECT user, host FROM mysql.user WHERE user IN ('wordpress', 'root');
exit;2. 修改 docker-compose.yml 的环境变量
nano docker-compose.yml只需修改 environment 部分:
services:
db:
image: mysql:8.0
container_name: wordpress_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: 你的新root密码 # 改这里
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: 你的新wordpress密码 # 改这里
volumes:
- ./mysql:/var/lib/mysql
networks:
- wordpress_internal
wordpress:
image: wordpress:latest
container_name: wordpress
restart: always
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: 你的新wordpress密码 # 改这里
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wordpress:/var/www/html
- ./php-config/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini:ro
networks:
- wordpress_internal
- caddy_netcaddy部分没有要修改的,我就省略了
3. 重启容器
# 停止并删除容器(数据不会丢失,因为有volume)
docker compose down
# 重新创建并启动
docker compose up -d4. 验证
# 测试网站是否正常
curl -I http://localhost:8080
# 测试新密码是否生效
docker exec -it wordpress_db mysql -u wordpress -p
# 输入新密码
# 查看 WordPress 读取的环境变量
docker exec wordpress env | grep WORDPRESS_DB八、主题配置
sakurairo有自己的主题设置页,自己看着配就好,这里只说一些雷区
1.字体设置
我们可能会发现访问后台的时候非常缓慢,看控制台还能看见一个加载失败,是因为字体调用的google的字体仓库,而我们服务器大概率是不能直连的(国外服务器请无视本条),需要配置镜像:
iro主题设置-全局设置-字体设置:Google字体API地址,设为:
fonts.font.im字体自己去谷歌字体搜。
另外主页正中间那个签名的字体默认是不能单独设置的,我们要去博客后台-外观-自定义-额外CSS
添加这部分:
@import url('https://fonts.font.im/css2?family=Ma+Shan+Zheng');
.header-info .element {
font-family: 'Ma Shan Zheng';
font-size: 30px;
}我选的名为Ma Shan Zheng的字体,如果你有其他喜欢的字体,请自行替换这段代码的两个位置
2.封面配置
iro主题设置-主页设置-封面设置 调整样式
之后把图片传到/home/naseele/blog/WP/wordpress/wp-content/uploads/iro_gallery/img/,不是wp的媒体库!!!!!!这个图库和wp媒体库是独立的!!!
之后我们可以在 iro主题设置-主页设置-封面设置调整 封面随机图片选项 为内建api,然后点击将图片优化为webp,之后点击初始化/重建索引,点击保存,完成后就可以看到封面已经出来了,
九、备案后的一些配置
如果你之前就是按照域名配置的,可以跳过本节。如果你之前用的ip,现在备案下来了,请跟着我做:
1.修改数据库中的链接
# 进入 MySQL 容器(进不去的先看看你的容器是不是在运行,名字对不对)
docker exec -it wordpress_db mysql -u root -p
# 输入数据库 root 密码,登录
# 修改数据库中你的站点url和主页url
UPDATE wp_options SET option_value='https://你的域名' WHERE option_name='siteurl';
UPDATE wp_options SET option_value='https://你的域名' WHERE option_name='home';
# 退出数据库登录
exit;2.修改docker-compose.yml
先关闭容器:
cd /放你的docker-compose.yml的路径
docker compose down然后修改docker-compose.yml:
services:
# MySQL 数据库
db:
image: mysql:8.0
container_name: wordpress_db
restart: always
environment:
MYSQL_ROOT_PASSWORD: your_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: your_wordpress_password
volumes:
- ./mysql:/var/lib/mysql
networks:
- wordpress_internal
# WordPress
wordpress:
image: wordpress:latest
container_name: wordpress
restart: always
depends_on:
- db
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: your_wordpress_password
WORDPRESS_DB_NAME: wordpress
volumes:
- ./wordpress:/var/www/html
- ./wp-config/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini
networks:
- wordpress_internal
- caddy_net
# Caddy 反向代理
caddy:
image: caddy:latest
container_name: caddy
restart: always
ports:
- "80:80"
- "443:443"
- "443:443/udp" # HTTP/3 支持
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./caddy_data:/data
- ./caddy_config:/config
- ./caddy_certs:/etc/caddy/certs
networks:
- caddy_net
networks:
wordpress_internal:
driver: bridge
# 【手术1】关键修改:设置 MTU 为 1400 (默认是1500)
driver_opts:
com.docker.network.driver.mtu: 1280
caddy_net:
external: true
volumes:
mysql:
wordpress:
caddy_data:
caddy_config:其实就改了caddy里面的ports部分和volumes部分,将docker-compose.yml同级的caddy_data、caddy_config、caddy_certs文件夹分别挂载到容器的/data、/config、/etc/caddy/certs来进行持久化处理,这个可以自由修改,记得同步改Caddyfile即可。
3.修改Caddyfile
# 将your-domain.com替换为你的域名
your-domain.com {
encode gzip
reverse_proxy wordpress:80
# === 修改这里:指向本地证书文件 ===
# 注意路径必须是容器内的路径 /etc/caddy/certs/...
tls /etc/caddy/certs/naseele.pem /etc/caddy/certs/naseele.key
log {
output file /data/access.log
}
}
naseele-vollerei.cn {
redir https://www.naseele-vollerei.cn{uri} permanent
}前面docker-compose.yml中我们设置了挂载(- ./caddy_certs:/etc/caddy/certs),所以这里的 /etc/caddy/certs 就相当于我们docker-compose.yml文件同级目录的caddy_certs文件夹,容器内访问 /etc/caddy/certs 就相当于在访问容器外的caddy_certs。
十、开启ssl和强制跳转https
1.自行申请证书并放入caddy_certs
其实更推荐使用lets Encrypt,但是我的服务器连不上,zeroSSL也连不上,无奈之下直接手动在阿里申请免费的证书了。至于如何在阿里申请免费的SSL证书,请参阅我的另一篇文章。
自己申请并下载证书,下载nginx支持的格式即可( pem 和 key 文件)
修改docker-compose.yml(参考第九章的相关部分),在caddy:的volumes部分加入这一行
- ./caddy_certs:/etc/caddy/certs注意-符号后面要有一个空格
然后修改Caddyfile,加入这行(修改方式参考第九章相关部分):
tls /etc/caddy/certs/naseele.pem /etc/caddy/certs/naseele.key挂载相关说明参考第九章末尾,不再赘述
pem和key文件的名字可以自由定,把Caddyfile里面的naseele.pem和naseele.key同步修改即可。
2.强制博客组件走https
修改/你的博客路径/wordpress/wp-config.php,加入下面的代码:
$_SERVER['HTTPS'] = 'on';
define('FORCE_SSL_ADMIN', true);
define('FORCE_SSL_LOGIN', true);
// 下面这两行可以在这里写,也可以直接改数据库,或者是修改管理页面的两个访问url
define('WP_HOME', 'https://blog.gomkiri.top/');
define('WP_SITEURL', 'https://blog.gomkiri.top/');如果是想直接改数据库,那就是将 wp_options 表中的 option_name 为 home 和 siteurl 的两行的 option_value 列改为https访问地址,步骤如下:
# 进入 MySQL 容器
docker exec -it wordpress_db mysql -u root -p# 输入数据库 root 密码,登录
# 修改数据库中你的站点url和主页url
UPDATE wp_options SET option_value='https://你的域名' WHERE option_name='siteurl';
UPDATE wp_options SET option_value='https://你的域名' WHERE option_name='home';
# 退出数据库登录
exit;然后在/你的博客路径/wordpress/wp-includes/fuctions.php,找到require ABSPATH . WPINC . '/option.php'; (这个应该就在文件开头几行)后在它的下方加入:
add_filter('script_loader_src', 'agnostic_script_loader_src', 20,2); function agnostic_script_loader_src($src, $handle) { return preg_replace('/^(http|https):/', '', $src); }
add_filter('style_loader_src', 'agnostic_style_loader_src', 20,2); function agnostic_style_loader_src($src, $handle) { return preg_replace('/^(http|https):/', '', $src); }完成之后重启WordPress:
cd 你的docker-compose.yml所在路径
docker compose restart wordpress十一、添加友链
1.首先新建友链界面

使用自带的友链模板

其他什么都不用写,直接保存退出即可
之后去后台的链接-新建链接即可。
如果想像我的这样,给友链做分类,需要在后台-链接分类里面添加分类,注意要改每个分类的优先级,随便什么正整数都行,不要都设成0,否则会出现分类失效的情况

十二、添加分类页面
来到博客后台,点击页面-添加页面

标题部分自己随便写,然后在正文第一个区块放入分类列表,需要点那个黑色的加号然后自己搜索“分类”

分类列表是自动渲染,不需要我们写任何东西,之后直接保存退出即可。
至于分类的创建,我们可以在博客后台的文章-分类目录创建;也可以在写文章的时候,在文章信息部分添加分类。
如果你发现你新增了分类,但是分类界面并没有显示,那大概率是因为你的这个分类下还没有文章。
十三、首页顶部菜单栏配置
我们来到后台-外观-菜单
如果你现在没有菜单,先创建一个新菜单,名字随便写,反正一般情况下菜单名称是不显示的。
然后我们就可以自由地修改了,我们现在改的部分对应博客主页的这个部分

这里给一个简单的参考模板

十四、修复一个小bug
偶发性bug,在保存文章的时候报错:返回的json无效
且查看docker容器日志发现报错:
wordpress | [Sun Nov 23 13:02:57.060699 2025] [php:error] [pid 39:tid 39] [client 39.144.26.21:0] PHP Fatal error: Uncaught TypeError: number_format(): Argument #1 ($num) must be of type int|float, string given in /var/www/html/wp-content/themes/Sakurairo/functions.php:766\nStack trace:\n#0 /var/www/html/wp-content/themes/Sakurairo/functions.php(766): number_format('', 0, '.', ' ')\n#1 /var/www/html/wp-content/themes/Sakurairo/functions.php(809): restyle_text('')\n#2 /var/www/html/wp-content/themes/Sakurairo/functions.php(3102): get_post_views(141)\n#3 /var/www/html/wp-content/themes/Sakurairo/functions.php(3157): get_archive_info()\n#4 /var/www/html/wp-includes/class-wp-hook.php(326): {closure}(137)\n#5 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters(21, Array)\n#6 /var/www/html/wp-includes/plugin.php(517): WP_Hook->do_action(Array)\n#7 /var/www/html/wp-includes/post.php(5110): do_action('save_post', 137, Object(WP_Post), true)\n#8 /var/www/html/wp-includes/post.php(5212): wp_insert_post(Array, true, false)\n#9 /var/www/html/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php(972): wp_update_post(Array, true, false)\n#10 /var/www/html/wp-includes/rest-api/class-wp-rest-server.php(1292): WP_REST_Posts_Controller->update_item(Object(WP_REST_Request))\n#11 /var/www/html/wp-includes/rest-api/class-wp-rest-server.php(1125): WP_REST_Server->respond_to_request(Object(WP_REST_Request), '/wp/v2/posts/(?...', Array, NULL)\n#12 /var/www/html/wp-includes/rest-api/class-wp-rest-server.php(439): WP_REST_Server->dispatch(Object(WP_REST_Request))\n#13 /var/www/html/wp-includes/rest-api.php(459): WP_REST_Server->serve_request('/wp/v2/posts/13...')\n#14 /var/www/html/wp-includes/class-wp-hook.php(324): rest_api_loaded(Object(WP))\n#15 /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook->apply_filters('', Array)\n#16 /var/www/html/wp-includes/plugin.php(565): WP_Hook->do_action(Array)\n#17 /var/www/html/wp-includes/class-wp.php(418): do_action_ref_array('parse_request', Array)\n#18 /var/www/html/wp-includes/class-wp.php(818): WP->parse_request('')\n#19 /var/www/html/wp-includes/functions.php(1344): WP->main('')\n#20 /var/www/html/wp-blog-header.php(16): wp()\n#21 /var/www/html/index.php(17): require('/var/www/html/w...')\n#22 {main}\n thrown in /var/www/html/wp-content/themes/Sakurairo/functions.php on line 766, referer: https://www.naseele-vollerei.cn/wp-admin/post.php?post=137&action=edit这个是因为get_post_meta($post_id, 'views', true) 在没有该 meta 或值为空时返回空字符串,随后 restyle_text() 直接把这个值传给 number_format()。number_format() 收到空字符串(''),在 PHP 8+ 会抛出 TypeError(需要 int|float)。
我们只需要修改wordpress/wp-content/themes/Sakurairo/下的functions.php,找到function restyle_text($number)(大概在760行左右),在这个函数的最开头加入:
// Normalize input: ensure we have a numeric value to avoid TypeError in number_format
if ($number === '' || $number === null) {
$number = 0;
}
// If not numeric, try to extract digits, otherwise fallback to 0
if (!is_numeric($number)) {
$filtered = preg_replace('/[^0-9.\-]/', '', (string) $number);
$number = $filtered === '' ? 0 : $filtered;
}
// Cast to float for comparisons and formatting
$number = (float) $number;
该方法完整内容如下:
function restyle_text($number)
{
// Normalize input: ensure we have a numeric value to avoid TypeError in number_format
if ($number === '' || $number === null) {
$number = 0;
}
// If not numeric, try to extract digits, otherwise fallback to 0
if (!is_numeric($number)) {
$filtered = preg_replace('/[^0-9.\-]/', '', (string) $number);
$number = $filtered === '' ? 0 : $filtered;
}
// Cast to float for comparisons and formatting
$number = (float) $number;
switch (iro_opt('statistics_format')) {
case "type_2": //23,333 次访问
return number_format($number);
case "type_3": //23 333 次访问
return number_format($number, 0, '.', ' ');
case "type_4": //23k 次访问
if ($number >= 1000) {
return round($number / 1000, 2) . 'k';
}
return $number;
default:
return $number;
}
}
十五、SMTP服务配置
1.安装Wordpress邮件SMTP插件,
打开WordPress网站的后台 —插件 —搜索“WP Mail SMTP” —安装并激活
如果服务器连不上,可以手动下载压缩包,上传到wordpress/wp-content/plugins/

然后解压:
# tar.gz格式使用
tar -zxvf 文件名
# zip格式使用
unzip 文件名之后删掉多余的压缩包,
去博客后台-插件管理,启用插件,安装步骤跟着走。
之后我们来到配置界面


我使用的是QQ的服务,跟着QQ官方的smtp配置文档走就行,使用163或者其他邮箱的请自行搜索你的邮箱的smtp配置方案。SMTP username是你的邮箱,SMTP password是授权码,要去自己邮箱申请,QQ的申请是在这里:
新版QQ邮箱在首页右上角设置-账号与安全-安全设置这里:

旧版QQ邮箱在首页左上方 设置-账号-POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务,点击管理服务,跳转到新页面,点击安全设置,同样是这个地方

注意:修改QQ密码后授权码会自动删除,需要重新创建!!!
十六、一些其他优化建议(可选)
1.媒体库文件夹插件
媒体库塞太多文章配图很杂乱?推荐一个插件,让你可以在媒体库建文件夹,免费版就能直接无限建文件夹,收费版可以建文件夹嵌套文件夹(其实免费版就够用)
我们打开WP的应用商店,搜索Real Media Library,下载安装即可。
安装很简单,也没什么配置项这里不再赘述,只强调一点,如果你是手动安装的(直接下载然后传到服务器的wordpress/wp-content/plugins/,解压,删除压缩包),那你使用的时候可能会看到警告:

图片看不清的可以直接看文字:
Some language packs could not be downloaded for the textdomain real-media-library (Error: cURL error 28: Connection timed out after 10002 milliseconds, Endpoint: https://ps.w.org/real-media-library-lite/language-packs/zh_CN-d83cef51b989d949150534d45811cbaf.zip). • Retry
大意是这个插件需要下语言包,但是你的服务器连不上那个网站。我们可以直接访问那个网站(https://ps.w.org/real-media-library-lite/language-packs/zh_CN-d83cef51b989d949150534d45811cbaf.zip)来手动下载,下载完成解压得到四个文件,我们只要mo和po结尾的那两个:

把它上传到我们的wordpress/wp-content/languages/plugins文件夹下,记得修改权限:
sudo chown -R www-data:www-data real-media-library-zh_CN.mo
sudo chown -R www-data:www-data real-media-library-zh_CN.po2.后台常驻窗口管理器
这里推荐byobu,安装请自行参考官网
不需要的时候直接
# 查看所有运行中的后台视窗
byobu ls
# 或者
byobu list-session
# 你会看到类似这样的,一行是一个视窗
1: 1 windows (created Wed Nov 19 09:47:15 2025) (group 1)
# 关闭编号为1的视窗
byobu kill-session -t 12.文本编辑器
vim用腻了?可以试试nano
3.好用的shell
推荐fish shell,官网的安装教程很全面,这里不再赘述,只强调一点,在安装好之后,修改默认shell配置之前,建议先开一个连接放一边,修改用户的默认shell配置之后,先尝试一下ssh连接,如果没问题,再关掉之前开的那个连接,如果有问题(一般是连不上),还可以通过那个连接来远程操作。
如果你没开备用连接而且已经连不上了,去服务器提供商那边通过他们的面板登入服务器修改吧(:з」∠)_
4.镜像加速(ubuntu)(可选)
这个不是docker加速,如果需要配置docker加速请自己用浏览器搜搜。
sudo sed -i 's|http://security.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list
sudo sed -i 's|http://archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list十七、尾声
到这里配置基本上就完成了,后面就交给大家自己探索了,不过大家自己捣鼓的时候记得把上传的文件修改一下文件所有者,我们默认上传的文件的所有者是其他用户或者root,记得把文件所有者改成www-data:
sudo chown -R www-data:www-data 文件名(或者文件夹名)十八、一些写作小技巧
1.同区块换行
使用shift+enter
常用 Docker 命令参考
# 启动服务
docker compose up -d
# 停止服务
docker compose down
# 重启服务
docker compose restart
# 查看日志
docker compose logs -f wordpress
docker compose logs -f caddy
# 进入容器
docker exec -it wordpress bash
# 备份数据库
docker exec wordpress_db mysqldump -u wordpress -p wordpress > backup.sql
# 更新服务
docker compose pull
docker compose up -d
# 如果你使用的旧版本,请将docker compose替换为docker-compose

Comments NOTHING