Ubuntu利用docker compose搭建Typecho博客
登录Ubuntu
- 使用SSH工具登录Ubuntu的root用户
sudo -i创建文件夹
- 创建相关文件夹并赋予777权限
mkdir -m 777 -p typecho/nginx/conf.d
mkdir -m 777 -p typecho/nginx/certs
mkdir -m 777 -p typecho/nginx/app
mkdir -m 777 -p typecho/mariadb
mkdir -m 777 -p typecho/usr
mkdir -m 777 -p typecho/uploads配置ddns-go
- 建立相关文件夹
# 先确保目录存在(如果已存在可跳过)
mkdir -p ~/ddns-go
# 然后赋予权限(不需要sudo)
chmod 777 ~/ddns-go
或者直接使用绝对路径:
chmod 777 /home/zhang-u/ddns-go- 拉取并运行ddns-go
sudo docker run -d --name ddns-go --restart=always -p 9876:9876 --net=host -v ~/ddns-go:/root jeessy/ddns-go- 登录并配置ddns-go
登录地址:http://你Ubuntu的IP地址:9876,例如http://192.168.200.25:9876
登录后先配置用户名和密码
配置域名和解析方式,我的域名是blog.lelez.site上传证书文件
先上传证书到ubutu的一个文件夹,然后拷贝证书文件到建立的文件夹typecho/nginx/certs内
例如先用SSH工具上传到/home/zhang-u/下载,然后执行拷贝
> cp /home/zhang-u/下载/_.lelez.site.key ~/typecho/nginx/certs
> cp /home/zhang-u/下载/_.lelez.site.crt ~/typecho/nginx/certs配置typecho.conf
# HTTPS 配置
server {
listen 443 ssl http2;
server_name blog.lelez.site;
# SSL 证书 (放到 /home/zhang-u/typecho/nginx/certs/)
ssl_certificate /etc/nginx/certs/_.lelez.site.crt;
ssl_certificate_key /etc/nginx/certs/_.lelez.site.key;
# TLS 推荐配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256';
ssl_prefer_server_ciphers on;
# 日志(可选)
access_log /var/log/nginx/typecho_access.log;
error_log /var/log/nginx/typecho_error.log;
# 反向代理到 typecho 容器 (走 mynet 网络)
location / {
proxy_pass http://typecho:80; # 注意:这里用的是 docker 服务名 typecho
proxy_http_version 1.1;
proxy_set_header Host $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;
}
# 静态文件缓存(可选优化)
location ~* \.(jpg|jpeg|gif|png|webp|ico|css|js|woff|woff2|ttf|svg|eot|mp4|avi|mov)$ {
expires 30d;
access_log off;
proxy_pass http://typecho:80;
}
}
- 上传
typecho.conf到~/typecho/nginx/conf.d内
先上传typecho.conf到Ubuntu的/home/zhang-u/下载文件夹,并拷贝这个文件到typecho/nginx/conf.d内
cp /home/zhang-u/下载/typecho.conf ~/typecho/nginx/conf.d上传后假如需要修改,用下边的命令
nano ~/typecho/nginx/conf.d/typecho.conf在里边修改后按ctrl+x,然后回车,然后yes保存退出
或者ctrl+o后回车,然后yes保存退出
配置docker-compose.yml
# version: '3.8'
services:
mariadb:
image: linuxserver/mariadb
container_name: mariadb
environment:
- PUID=1000
- PGID=1001
- MYSQL_ROOT_PASSWORD=110119asdF!
- MYSQL_DATABASE=typecho
- MYSQL_USER=typecho
- MYSQL_PASSWORD=TypechoPass123!
- TZ=Asia/Shanghai
volumes:
- /home/zhang-u/typecho/mariadb/config:/config
ports:
- 43306:3306
networks:
- mynet
restart: unless-stopped
adminer:
image: adminer:latest
container_name: adminer
environment:
- ADMINER_DEFAULT_SERVER=mariadb
ports:
- 48079:8080
networks:
- mynet
depends_on:
- mariadb
restart: unless-stopped
typecho:
image: joyqi/typecho:nightly-php8.2-apache
container_name: typecho-server
restart: unless-stopped
environment:
- TYPECHO_SITE_URL=https://blog.lelez.site/
- TYPECHO_DB_ADAPTER=Pdo_Mysql
- TYPECHO_DB_HOST=mariadb
- TYPECHO_DB_PORT=3306
- TYPECHO_DB_NAME=typecho
- TYPECHO_DB_USER=typecho
- TYPECHO_DB_PASSWORD=TypechoPass123!
- TYPECHO_REWRITE=1
ports:
- 48080:80
networks:
- mynet
depends_on:
- mariadb
volumes:
- /home/zhang-u/typecho/usr:/app/usr
- /home/zhang-u/typecho/uploads:/app/usr/uploads
nginx:
image: nginx:latest
container_name: nginx
ports:
- 80:80
- 443:443
volumes:
- /home/zhang-u/typecho/nginx/conf.d:/etc/nginx/conf.d
- /home/zhang-u/typecho/nginx/certs:/etc/nginx/certs
networks:
- mynet
depends_on:
- typecho
restart: unless-stopped
networks:
mynet:
name: mynet
注意我docker compose里的配置全部写成了绝对路径/home/zhang-u/typecho/,而不是短路径~/typecho/
先上传docker-compose.yml到Ubuntu的/home/zhang-u/下载文件夹,并拷贝这个文件到typecho/内
cp /home/zhang-u/下载/docker-compose.yml ~/typecho上传后假如需要修改,用下边的命令
nano ~/typecho/docker-compose.yml在里边修改后按ctrl+x,然后回车,然后yes保存退出
或者ctrl+o后回车,然后yes保存退出
运行
docker compose up -d假如报错说权限问题,请执行以下命令
sudo chown -R www-data:www-data /home/zhang-u/typecho/uploads sudo chown -R www-data:www-data /home/zhang-u/typecho/usr
权限通常是因为Typecho 容器里的 Apache/PHP 是以www-data用户运行,所以宿主机挂载的目录必须属于www-data才能写
其他
任何修改要使其生效,修改后去执行下边命令
docker compose down
docker compose up -d以上命令需在docker-compose.yml文件所在目录执行才能生效
- 题外话 - 关于复制粘贴
在 Linux 中,cp 命令默认只能复制文件,不能复制目录。如果你要复制一个目录及其内容,必须加上 -r 参数。
例如:
cp /source/dir /destination/这个命令会报错,因为 /source/dir 是一个目录,而你没加 -r。
正确的写法是:
cp -r /source/dir /destination/你想把 /home/zhang-u/typecho/usr/uploads/2025/09/* 这些子文件夹(比如 04、05、07、08)拷贝到 /home/zhang-u/typecho/uploads/2025/,你应该这样写:
cp -r /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/⚠️ 注意:
- 使用
*表示匹配所有子文件夹和文件。- 如果目标路径
/home/zhang-u/typecho/uploads/2025/不存在,需要先创建它。- 如果你只想复制某个特定文件夹,比如
04,就写成:cp -r /home/zhang-u/typecho/usr/uploads/2025/09/04 /home/zhang-u/typecho/uploads/2025/
📌 小贴士
确保目标目录存在:
mkdir -p /home/zhang-u/typecho/uploads/2025检查权限: 确保你有读取源目录和写入目标目录的权限。如果提示权限不足,可以使用
sudo:sudo cp -r /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/避免覆盖已有文件? 如果不想覆盖,可以用
-n参数:cp -rn /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/
✅ 总结
你的错误是因为 复制目录时缺少 -r 参数。
👉 解决方法:加上 -r 即可!
cp -r /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/试试看吧!✅
假如拷贝不成功,请使用绝对路径,例如拷贝sidebar.php到/home/zhang-u/typecho/usr/themes/default/文件夹内
cp /home/zhang-u/下载/sidebar.php /home/zhang-u/typecho/usr/themes/default/