写在前面

在当今数字化时代,个人博客和网站已经成为分享知识、展示作品和交流思想的重要平台。Typecho 作为一款轻量级的开源博客系统,以其简洁高效的设计和灵活的扩展性,受到了广大用户的喜爱。本教程将引导您如何在 Ubuntu 服务器上使用 Docker Compose 快速部署 Typecho 博客平台,并使用宿主机的 Nginx 进行反向代理,使您的 Typecho 站点可以通过域名正常访问。本教程将会提供 PostgreSQL 和 MariaDB 两种数据库的配置方案,你可以根据自己的需求选择使用。

准备工作

在开始之前,请确保你的 Ubuntu 系统已经安装了以下软件:

  • Docker: 用于容器化运行 Typecho 和数据库。

  • Docker Compose: 用于编排和管理多容器 Docker 应用。

  • Nginx: 用作反向代理服务器。

安装 Docker 和 Docker Compose:

# 更新系统包
sudo apt update

# 安装 Docker
sudo apt install apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 备选源(如果官方源无法连接)
curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker

# 验证安装
docker-compose --version

安装 Nginx:

sudo apt install nginx
sudo systemctl start nginx
sudo systemctl enable nginx

步骤 1: 创建目录结构

首先,在你的用户目录下创建一个用于存放 Typecho Docker Compose 配置文件的目录,例如 ~/typecho

mkdir ~/typecho
cd ~/typecho

在这个目录下,我们将创建 docker-compose.yml 文件。

步骤 2: 创建 Docker Compose 配置文件 (docker-compose.yml)

本文提供两个版本的 docker-compose.yml 文件,分别对应 PostgreSQL 和 MariaDB 数据库。

版本一:PostgreSQL 数据库

typecho 目录下,创建名为 docker-compose-pgsql.yml 的文件,并将以下内容粘贴进去:

version: '3.7'

services:
  typecho:
    image: joyqi/typecho:nightly-php7.4-apache
    container_name: typecho-server
    restart: always
    ports:
      - "8080:80" # 容器80端口映射到宿主机8080端口,供Nginx反向代理
    volumes:
      - ./typecho-data:/app/usr  # 将宿主机 ./typecho-data 目录挂载到容器 /app/usr 用于持久化数据
    environment:
      - TYPECHO_SITE_URL=http://localhost  # 站点 URL,这里使用 localhost,Nginx 反向代理后会通过域名访问
      - TYPECHO_DB_ADAPTER=Pdo_Pgsql
      - TYPECHO_DB_HOST=pgsql
      - TYPECHO_DB_PORT=5432
      - TYPECHO_DB_USER=typecho_user
      - TYPECHO_DB_PASSWORD=typecho_password
      - TYPECHO_DB_DATABASE=typecho_db

  pgsql:
    image: postgres:15.4
    container_name: typecho-db-pgsql
    restart: always
    environment:
      - POSTGRES_USER=typecho_user
      - POSTGRES_PASSWORD=typecho_password
      - POSTGRES_DB=typecho_db
    volumes:
      - ./pgsql-data:/var/lib/postgresql/data # 将宿主机 ./pgsql-data 目录挂载到容器数据目录用于持久化
    ports:
      - "5432:5432" # 可选,如果需要从宿主机直接连接数据库可以映射端口,生产环境通常不需要

volumes:
  typecho-data:
  pgsql-data:

版本二:MariaDB 数据库

typecho 目录下,创建名为 docker-compose-mariadb.yml 的文件,并将以下内容粘贴进去:

version: '3.7'

services:
  typecho:
    image: joyqi/typecho:nightly-php7.4-apache
    container_name: typecho-server
    restart: always
    ports:
      - "8080:80" # 容器80端口映射到宿主机8080端口,供Nginx反向代理
    volumes:
      - ./typecho-data:/app/usr  # 将宿主机 ./typecho-data 目录挂载到容器 /app/usr 用于持久化数据
    environment:
      - TYPECHO_SITE_URL=http://localhost  # 站点 URL,这里使用 localhost,Nginx 反向代理后会通过域名访问
      - TYPECHO_DB_ADAPTER=Pdo_Mysql
      - TYPECHO_DB_HOST=mariadb
      - TYPECHO_DB_PORT=3306
      - TYPECHO_DB_USER=typecho_user
      - TYPECHO_DB_PASSWORD=typecho_password
      - TYPECHO_DB_DATABASE=typecho_db

  mariadb:
    image: mariadb:10.6-focal
    container_name: typecho-db-mariadb
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root_password # 设置 MariaDB root 用户密码,根据需要更改
      - MYSQL_USER=typecho_user
      - MYSQL_PASSWORD=typecho_password
      - MYSQL_DATABASE=typecho_db
    volumes:
      - ./mariadb-data:/var/lib/mysql # 将宿主机 ./mariadb-data 目录挂载到容器数据目录用于持久化
    ports:
      - "3306:3306" # 可选,如果需要从宿主机直接连接数据库可以映射端口,生产环境通常不需要

volumes:
  typecho-data:
  mariadb-data:

配置文件说明:

  • version: '3.7': 指定 Docker Compose 文件版本。

  • services: 定义需要运行的服务,这里包含 typecho 和数据库 (pgsqlmariadb) 服务。

  • typecho 服务:

    • image: joyqi/typecho:nightly-php7.4-apache: 使用 joyqi/typecho 官方镜像, nightly-php7.4-apache 标签表示使用 nightly 版本,基于 PHP 7.4 和 Apache。你可以根据需要选择其他标签,例如 latest-php8.1-apache

    • container_name: typecho-server: 容器名称。

    • restart: always: 容器总是重启。

    • ports: - "8080:80": 将容器的 80 端口映射到宿主机的 8080 端口。注意,这里我们没有将容器的 80 端口直接映射到宿主机的 80 端口,因为宿主机的 80 端口将会被 Nginx 使用。

    • volumes: - ./typecho-data:/app/usr: 将当前目录下的 typecho-data 目录挂载到容器的 /app/usr 目录。Typecho 的数据(主题、插件、上传文件等)将会保存在宿主机的 typecho-data 目录中,实现数据持久化。

    • environment: 设置 Typecho 运行所需的环境变量:

      • TYPECHO_SITE_URL=http://localhost: Typecho 站点 URL,这里暂时设置为 http://localhost,因为最终会通过 Nginx 反向代理使用域名访问。

      • TYPECHO_DB_ADAPTER, TYPECHO_DB_HOST, TYPECHO_DB_PORT, TYPECHO_DB_USER, TYPECHO_DB_PASSWORD, TYPECHO_DB_DATABASE: 数据库连接信息,根据选择的数据库类型 (PostgreSQL 或 MariaDB) 进行配置。TYPECHO_DB_HOST 设置为数据库服务的 service name,Docker Compose 会自动解析。

  • pgsql 服务 (PostgreSQL 版本) / mariadb 服务 (MariaDB 版本):

    • image: postgres:15.4 / image: mariadb:10.6-focal: 使用官方 PostgreSQL 或 MariaDB 镜像。

    • container_name: typecho-db-pgsql / container_name: typecho-db-mariadb: 数据库容器名称。

    • restart: always: 容器总是重启。

    • environment: 设置数据库服务的环境变量,例如用户名、密码、数据库名 (PostgreSQL) 或 root 密码、用户名、密码、数据库名 (MariaDB)。

    • volumes: - ./pgsql-data:/var/lib/postgresql/data / volumes: - ./mariadb-data:/var/lib/mysql: 将宿主机目录挂载到容器的数据目录,实现数据库数据持久化。

    • ports: - "5432:5432" / ports: - "3306:3306": 可选的端口映射,仅在需要从宿主机直接连接数据库时使用。

  • volumes 根节点:

    • 定义了 Docker Compose 管理的卷,用于持久化数据。

选择数据库版本:

请根据你的需求选择使用 docker-compose-pgsql.yml (PostgreSQL 版本) 或 docker-compose-mariadb.yml (MariaDB 版本)。

步骤 3: 创建 Nginx 配置文件

在宿主机的 Nginx 配置目录下(通常是 /etc/nginx/sites-available/),创建一个新的配置文件,例如 typecho

sudo nano /etc/nginx/sites-available/typecho

将以下内容粘贴到 typecho 文件中,并根据你的实际域名进行修改:

HTTP 配置 (如果你还没有 HTTPS 证书)

server {
    listen 80;
    server_name yourdomain.com; # 将 yourdomain.com 替换为你的域名

    location / {
        proxy_pass http://localhost:8080; # 反向代理到 Docker Compose 运行的 Typecho 容器的 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;
    }
}

HTTPS 配置 (推荐,如果你有 SSL 证书)

你需要提前获取 SSL 证书,并将证书文件 (例如 yourdomain.com.crtyourdomain.com.key) 放置在合适的目录,例如 /etc/nginx/ssl/

server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$server_name$request_uri; # 将 HTTP 请求重定向到 HTTPS
}

server {
    listen 443 ssl;
    server_name yourdomain.com; # 将 yourdomain.com 替换为你的域名

    ssl_certificate /etc/nginx/ssl/yourdomain.com.crt; # 替换为你的证书路径
    ssl_certificate_key /etc/nginx/ssl/yourdomain.com.key; # 替换为你的私钥路径

    location / {
        proxy_pass http://localhost:8080; # 反向代理到 Docker Compose 运行的 Typecho 容器的 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;
    }
}

配置文件说明:

  • server { listen ...; server_name ...; }: 定义一个 Nginx 服务器块,监听指定的端口和域名。

  • listen 80; / listen 443 ssl;: 监听 HTTP (80 端口) 或 HTTPS (443 端口)。

  • server_name yourdomain.com;: 将 yourdomain.com 替换为你的实际域名。

  • return 301 https://$server_name$request_uri; (HTTPS 配置的 HTTP 服务器块): 将所有 HTTP 请求 301 重定向到 HTTPS。

  • ssl_certificate ...; ssl_certificate_key ...; (HTTPS 配置): 指定 SSL 证书和私钥的路径。

  • location / { ... }: 定义根路径 / 的配置。

  • proxy_pass http://localhost:8080;: 将请求反向代理到 http://localhost:8080,即 Docker Compose 运行的 Typecho 容器的 8080 端口。

  • proxy_set_header ...;: 设置一些必要的请求头,以便 Typecho 正确获取客户端 IP 和协议等信息。

步骤 4: 启用 Nginx 站点并测试配置

创建 Nginx 站点的符号链接,启用站点:

sudo ln -s /etc/nginx/sites-available/typecho /etc/nginx/sites-enabled/

测试 Nginx 配置文件是否正确:

sudo nginx -t

如果测试输出 syntax is oktest is successful,则配置文件正确。

重启 Nginx 服务以应用配置:

sudo systemctl restart nginx

步骤 5: 启动 Docker Compose

根据你选择的数据库版本,使用相应的 Docker Compose 配置文件启动 Typecho 和数据库容器。

PostgreSQL 版本:

docker-compose -f docker-compose-pgsql.yml up -d

MariaDB 版本:

docker-compose -f docker-compose-mariadb.yml up -d

-d 参数表示在后台运行。

步骤 6: 访问 Typecho 安装向导

稍等片刻,待 Docker 容器启动完成后,在浏览器中访问你的域名 yourdomain.com (或者你在 Nginx 配置文件中设置的 server_name)。你将会看到 Typecho 的安装向导页面。

按照安装向导的提示,填写站点信息、管理员账号等,并完成 Typecho 的安装。

注意事项:

  • 域名解析: 请确保你的域名 yourdomain.com 已经正确解析到你的 Ubuntu 服务器的公网 IP 地址。

  • 防火墙: 如果你的服务器启用了防火墙 (例如 UFW),请确保开放了 80 端口和 443 端口 (HTTPS)。

  • 数据持久化: Typecho 数据和数据库数据都通过 Volume 挂载到宿主机目录,实现了数据持久化。即使容器被删除,数据也不会丢失。

  • 容器端口: Docker Compose 配置文件中,Typecho 容器的 80 端口被映射到了宿主机的 8080 端口,并通过 Nginx 反向代理到 80 或 443 端口。你可以根据需要修改宿主机映射端口,但需要同时修改 Nginx 配置文件中的 proxy_pass 指向。

  • 环境变量: 你可以在 docker-compose.yml 文件中通过 environment 节点设置更多的 Typecho 环境变量,例如 TIMEZONE (时区), MEMORY_LIMIT (PHP 内存限制) 等,详细环境变量列表请参考https://github.com/typecho/Dockerfile的 "Environment Variables" 部分。

  • 安全性: 本教程提供的是基本部署方案,生产环境请务必加强安全性配置,例如配置 HTTPS, MariaDB root 用户设置强密码, 定期备份数据等。

总结

恭喜你!你已经成功使用 Docker Compose 部署了 Typecho 博客系统,并使用了宿主机的 Nginx 进行了反向代理。现在你可以通过你的域名访问 Typecho 站点,开始你的博客之旅了。 希望这个教程对你有所帮助!