登录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.confUbuntu/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.ymlUbuntu/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/

📌 小贴士

  1. 确保目标目录存在

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

    sudo cp -r /home/zhang-u/typecho/usr/uploads/2025/09/* /home/zhang-u/typecho/uploads/2025/
  3. 避免覆盖已有文件? 如果不想覆盖,可以用 -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/

标签: Typecho, Ubuntu, docker compose

添加新评论

🔝