登录Ubuntu

  • 使用SSH工具登录Ubuntu的root用户
1
sudo -i

创建文件夹

  • 创建相关文件夹并赋予777权限
1
2
3
4
5
6
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

  • 建立相关文件夹
1
2
3
4
5
6
7
# 先确保目录存在(如果已存在可跳过)
mkdir -p ~/ddns-go

# 然后赋予权限(不需要sudo)
chmod 777 ~/ddns-go
或者直接使用绝对路径:
chmod 777 /home/zhang-u/ddns-go
  • 拉取并运行ddns-go
1
sudo docker run -d --name ddns-go --restart=always -p 9876:9876 --net=host -v ~/ddns-go:/root jeessy/ddns-go
  • 登录并配置ddns-go
1
2
3
登录地址:http://你Ubuntu的IP地址:9876,例如http://192.168.200.25:9876
登录后先配置用户名和密码
配置域名和解析方式,我的域名是blog.lelez.site

上传证书文件

先上传证书到ubutu的一个文件夹,然后拷贝证书文件到建立的文件夹typecho/nginx/certs

例如先用SSH工具上传到/home/zhang-u/下载,然后执行拷贝

1
2
> cp /home/zhang-u/下载/_.lelez.site.key ~/typecho/nginx/certs
> cp /home/zhang-u/下载/_.lelez.site.crt ~/typecho/nginx/certs

配置typecho.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 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.confUbuntu/home/zhang-u/下载文件夹,并拷贝这个文件到typecho/nginx/conf.d

1
cp /home/zhang-u/下载/typecho.conf ~/typecho/nginx/conf.d

上传后假如需要修改,用下边的命令

1
nano ~/typecho/nginx/conf.d/typecho.conf

在里边修改后按ctrl+x,然后回车,然后yes保存退出

或者ctrl+o后回车,然后yes保存退出

配置docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 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.ymlUbuntu/home/zhang-u/下载文件夹,并拷贝这个文件到typecho/

1
cp /home/zhang-u/下载/docker-compose.yml ~/typecho

上传后假如需要修改,用下边的命令

1
nano ~/typecho/docker-compose.yml

在里边修改后按ctrl+x,然后回车,然后yes保存退出

或者ctrl+o后回车,然后yes保存退出

运行

1
docker compose up -d
  • 假如报错说权限问题,请执行以下命令

    1
    2
    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 才能写

其他

任何修改要使其生效,修改后去执行下边命令

1
2
docker compose down
docker compose up -d

以上命令需在docker-compose.yml文件所在目录执行才能生效

  • 题外话 - 关于复制粘贴

在 Linux 中,cp 命令默认只能复制文件,不能复制目录。如果你要复制一个目录及其内容,必须加上 -r 参数。

例如:

1
cp /source/dir /destination/

这个命令会报错,因为 /source/dir 是一个目录,而你没加 -r

正确的写法是:

1
cp -r /source/dir /destination/

你想把 /home/zhang-u/typecho/usr/uploads/2025/09/* 这些子文件夹(比如 04、05、07、08)拷贝到 /home/zhang-u/typecho/uploads/2025/,你应该这样写:

1
cp -r /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/

⚠️ 注意:

  • 使用 * 表示匹配所有子文件夹和文件。
  • 如果目标路径 /home/zhang-u/typecho/uploads/2025/ 不存在,需要先创建它。
  • 如果你只想复制某个特定文件夹,比如 04,就写成:
1
cp -r /home/zhang-u/typecho/usr/uploads/2025/09/04 /home/zhang-u/typecho/uploads/2025/

📌 小贴士

  1. 确保目标目录存在

    1
    mkdir -p /home/zhang-u/typecho/uploads/2025
  2. 检查权限: 确保你有读取源目录和写入目标目录的权限。如果提示权限不足,可以使用 sudo

    1
    sudo cp -r /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/
  3. 避免覆盖已有文件? 如果不想覆盖,可以用 -n 参数:

    1
    cp -rn /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/

✅ 总结

你的错误是因为 复制目录时缺少 -r 参数

👉 解决方法:加上 -r 即可!

1
cp -r /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/

试试看吧!✅