ubuntu安装配置typecho
第一步:准备系统环境
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装必要工具
sudo apt install -y curl wget unzip git第二步:下载 Typecho 源码
# 创建项目目录
mkdir -p /var/www/html
cd /var/www/html
# 备份(可选)
mv typecho typecho.bak
# 下载最新版 Typecho(v1.2+)
wget https://github.com/camel52zhang/Typecho-lelez/releases/download/v1.0.1-beta.1/typecho.zip
# 解压
unzip typecho.zip
# 启动 PHP 内置服务器,监听 29080(其它任何端口都可以)
# 1. 确保宿主机防火墙允许 29080 端口
sudo ufw allow 29080/tcp # 如果你启用了 ufw
或者临时关闭防火墙测试:
sudo ufw disable
测试完再开启:
sudo ufw enable
# 2. 杀掉可能存在的旧 PHP 进程
pkill -f "php -S.*29080"
# 3. 进入 typecho 目录启动 PHP 服务(后台运行)
cd /var/www/html/typecho
nohup php -S 0.0.0.0:29080 > /var/log/typecho.log 2>&1 &
# 4. 验证
ss -tuln | grep 29080 # 应看到 LISTEN
curl -I http://localhost:29080/install.php # 应返回 200
...
# 清理压缩包
rm typecho.zip
# 授权(确保 PHP 能写入 usr/ 和 var/)
chmod -R 777 /var/www/html/typecho/usr /var/www/html/typecho/var
# 或更安全:
chown -R www-data:www-data /var/www/html/typecho # 如果用 Web 用户
# 浏览器测试
http://localhost:29080/install.php #打开出现安装界面即正常
# 🔍 获取宿主机对容器可见的 IP(容器访问宿主机用),下边配置default.conf要用:
ip route show default | awk '{print $3}' # 通常是 172.17.0.1
第三步:安装 MariaDB(简单、兼容、省资源)
安装 MariaDB 服务 + 客户端
# Ubuntu/Debian sudo apt update sudo apt install -y mariadb-server mariadb-client启动并启用服务
sudo systemctl start mariadb sudo systemctl enable mariadb运行安全初始化(设置 root 密码、删匿名用户等)
sudo mysql_secure_installation按提示操作,建议:
设置 root 密码(记下来!)110119asd 删除匿名用户(Y) 禁止 root 远程登录(Y) 删除 test 数据库(Y) 重载权限表(Y)登录 MariaDB
sudo mysql -u root -p输入你设置的 root 密码,进入 MariaDB 命令行(提示符变成 MariaDB [(none)]>)。
执行以下 SQL 命令
💡 复制粘贴以下整块内容到 MariaDB 中(一行一行也可以):
-- 创建数据库(使用 utf8mb4 支持 emoji 和完整 Unicode)
CREATE DATABASE typecho_blog CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建专用用户(替换 your_strong_password 为你的强密码!)
CREATE USER 'typecho_user'@'localhost' IDENTIFIED BY 'your_strong_password';
-- 授权该用户操作这个数据库
GRANT ALL PRIVILEGES ON typecho_blog.* TO 'typecho_user'@'localhost';
-- 刷新权限使生效
FLUSH PRIVILEGES;
-- 退出
EXIT;🔐 密码建议:
长度 ≥ 12 位
包含大小写字母、数字、符号(如 T3chBl0g!2026#)
不要和系统密码相同
验证是否成功(可选)
重新登录测试新用户:
mysql -u typecho_user -p -D typecho_blog输入你设置的密码,如果能进入,说明 OK!
然后退出:EXIT;- 回到浏览器安装 Typecho(可以其他配置完后操作)
在 “初始化配置” 页面填写:
字段 值
数据库适配器 Mysql
数据库地址 localhost
端口 3306(可留空)
用户名 typecho_user
密码 your_strong_password(你刚设的)
数据库名 typecho_blog
表前缀 typecho_(默认)
然后填写站点信息(用户名、密码、邮箱),点击 “开始安装”。
第四步:配置 Nginx(Docker 容器)
编辑 default.conf(位置在/home/zhang-fn/camelznav-project/nginx/conf.d/文件夹内):
nano /home/zhang-fn/camelznav-project/nginx/conf.d/default.confNginx当前在运行状态,监控端口是80/443,用于域名nav.camelz.dpdns.org导航站,现只需假如typecho的域名blog.camelz.dpdns.org和端口29080进来即可,修改后如下:
# =============== nav.camelz.dpdns.org ===============
server {
listen 80;
server_name nav.camelz.dpdns.org;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name nav.camelz.dpdns.org;
ssl_certificate /etc/letsencrypt/live/nav.camelz.dpdns.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nav.camelz.dpdns.org/privkey.pem;
location /api/ {
rewrite ^/api/(.*) /$1 break;
proxy_pass http://camelznav-backend:8080;
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 / {
proxy_pass http://camelznav-frontend:3000;
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;
}
}
# =============== blog.camelz.dpdns.org新增 ===============
server {
listen 80;
server_name blog.camelz.dpdns.org;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name blog.camelz.dpdns.org;
ssl_certificate /etc/letsencrypt/live/nav.camelz.dpdns.org/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/nav.camelz.dpdns.org/privkey.pem;
location / {
proxy_pass http://172.17.0.1:29080;
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;
proxy_http_version 1.1;
}
# 可选:允许上传大文件(Typecho 默认限制较小)
client_max_body_size 64M;
}172.17.0.1:Linux 上 Docker 默认网桥 docker0 的 IP,容器访问宿主机的标准方式。也可改为host.docker.internal,它是Docker Desktop(Mac/Windows)专用,在 Linux 原生 Docker 默认不支持,假如改后报错不能连接,就用172.17.0.1。
两个域名nav.camelz.dpdns.org和blog.camelz.dpdns.org是一个运营商,都托管在cloudflare,它们的证书目录设为一样的
第四步:配置 docker-compose.yml(含证书新加域名blog.camelz.dpdns.org)
修改
nano /home/zhang-fn/camelznav-project/docker-compose.yml添加域名
-d blog.camelz.dpdns.org
--expand🔁 注意:必须加上 --expand,否则 Certbot 不会自动覆盖/扩展现有证书。
完整版
# version: '3.8'
services:
# Certbot for SSL certificates
certbot:
image: certbot/dns-cloudflare
container_name: camelznav-certbot
volumes:
- ./certbot/letsencrypt:/etc/letsencrypt
- ./certbot/credentials.ini:/credentials.ini
command: certonly --dns-cloudflare --dns-cloudflare-credentials /credentials.ini -d nav.camelz.dpdns.org -d blog.camelz.dpdns.org --expand --agree-tos --email eric.zhng@gmail.com --non-interactive
# Nginx 反向代理
nginx:
image: nginx:alpine
container_name: camelznav-nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./certbot/letsencrypt:/etc/letsencrypt
depends_on:
- camelznav-backend
- camelznav-frontend
# 后端服务
camelznav-backend:
build: ./camelznav-backend
container_name: camelznav-backend
restart: always
environment:
- PORT=8080
- GIN_MODE=release
volumes:
# 挂载宿主机 ./data 文件夹到容器内的 /app 目录
- ./data/nav.db:/app/nav.db
- ./data/uploads:/app/uploads
- /etc/localtime:/etc/localtime:ro
ports:
# 🚀 左边是外面访问的端口,可随意修改,右边容器内端口8080不能修改
- "18081:8080"
# 前端服务
camelznav-frontend:
build:
context: ./camelznav-frontend
args:
# 🚀 根据实际情况修改IP地址,必须与后端左侧的宿主机端口一致
- NEXT_PUBLIC_API_URL=http://camelznav-backend:18081
container_name: camelznav-frontend
restart: always
environment:
# 🚀 根据实际情况修改IP地址,必须与后端左侧的宿主机端口一致
- NEXT_PUBLIC_API_URL=http://camelznav-backend:18081
ports:
# 🚀 左边是外面访问的端口,可随意修改,右边容器内端口3000不能修改
- "30001:3000"
depends_on:
- camelznav-backend
第五步:申请证书
停止当前项目
docker compose down申请证书
docker compose run --rm certbot输出Successfully received certificate表示成功了
Container camelznav-project-certbot-run-da8d151e1ae7 Creating
Container camelznav-project-certbot-run-da8d151e1ae7 Created
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Renewing an existing certificate for nav.camelz.dpdns.org and blog.camelz.dpdns.org
Unsafe permissions on credentials configuration file: /credentials.ini
Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='api.cloudflare.com', port=443): Read timed out. (read timeout=5)")': /client/v4/zones?name=blog.camelz.dpdns.org&per_page=1
Waiting 10 seconds for DNS changes to propagate
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/nav.camelz.dpdns.org/fullchain.pem
Key is saved at: /etc/letsencrypt/live/nav.camelz.dpdns.org/privkey.pem
This certificate expires on 2026-04-04.
These files will be updated when the certificate renews.重新启用项目
docker compose up -d
# 或
docker compose up --build -d第六步:重载 Nginx,测试连接
# 测试配置
nginx -t
# 重载
nginx -s reload
# 重启 Nginx 容器
docker restart camelznav-nginx测试连接
docker exec -it camelznav-nginx curl -I https://blog.camelz.dpdns.org/install.php查看日志
# 查看日志确认启动成功
docker logs camelznav-nginx
# Nginx 启动日志(最近10行)
docker logs --tail 10 camelznav-nginx✅ 安装完成后记得
删除 install.php(重要!)
~~~
rm /var/www/html/typecho/install.php
~~~
限制 config.inc.php 权限
~~~
chmod 600 /var/www/html/typecho/config.inc.php
~~~
确保 usr/ 目录可写(用于上传、缓存)
~~~
chmod -R 777 /var/www/html/typecho/usr
~~~
🎉 恭喜!
你现在有了:
一个安全的 MariaDB 数据库
一个专用数据库用户
即将上线的 Typecho 博客!去完成安装吧!完成后访问:
前台:https://blog.camelz.dpdns.org
后台:https://blog.camelz.dpdns.org/admin/