写在前面

在当今数字化时代,个人博客和网站已经成为分享知识、展示作品和交流思想的重要平台。Typecho 作为一款轻量级的开源博客系统,以其简洁高效的设计和灵活的扩展性,受到了广大用户的喜爱。然而,如何在服务器上高效地部署和管理 Typecho,尤其是在保证安全性和性能的前提下,仍然是许多用户面临的挑战。

本教程旨在帮助读者在 Ubuntu 系统上使用 Docker Compose 部署 Typecho,并通过 Nginx 进行反向代理。通过详细的步骤讲解和配置示例,读者可以轻松地搭建一个稳定、高效的 Typecho 博客平台。无论你是刚接触 Docker 的新手,还是有一定经验的开发者,本教程都将为你提供有价值的参考和指导。希望通过本教程,你能顺利完成 Typecho 的部署,并享受博客创作的乐趣。

1. 安装 Docker 和 Docker Compose

确保你已经安装了 Docker 和 Docker Compose。如果没有安装,可以使用以下命令进行安装:

# 1. 更新系统包
   sudo apt update
# 2. 安装 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 docker-buildx-plugin docker-compose docker-compose-plugin
   sudo systemctl start docker
   sudo systemctl enable docker
# 3. 验证安装
   docker-compose --version

2. 创建 Docker Compose 文件

新建项目目录,本文以 ~/typecho 为例

mkdir ~/typecho
cd ~/typecho

本文提供两种场景的 Docker Compose 配置文件,请根据你的需要选择一种。

在你的项目目录中创建一个docker-compose.yaml文件,并添加以下内容:

Typecho + Postgres

version: '3.7'
services:
  postgres:
    image: postgres:15.4
    environment:
      POSTGRES_DB: typecho
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    restart: unless-stopped
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 10s
      timeout: 5s
      retries: 5
    volumes:
      - ./postgres_data:/var/lib/postgresql/data
    networks:
      - typecho_network

  typecho:
    image: joyqi/typecho:nightly-php7.4-apache
    restart: unless-stopped
    environment:
      - TYPECHO_SITE_URL=${TYPECHO_SITE_URL}
      - MAX_POST_BODY=1024M
      - TYPECHO_INSTALL=1
      - TYPECHO_DB_ADAPTER=Pdo_Pgsql
      - TYPECHO_DB_HOST=postgres
      - TYPECHO_DB_USER=${POSTGRES_USER}
      - TYPECHO_DB_PASSWORD=${POSTGRES_PASSWORD}
      - TYPECHO_DB_DATABASE=typecho
      - TYPECHO_USER_NAME=${TYPECHO_USER_NAME}
      - TYPECHO_USER_PASSWORD=${TYPECHO_USER_PASSWORD}
      - TYPECHO_USER_MAIL=${TYPECHO_USER_MAIL}
    ports:
      - "${TYPECHO_PORT}:80"
    volumes:
      - ./typecho_data:/app/usr
    networks:
      - typecho_network
    depends_on:
      postgres:
        condition: service_healthy

networks:
  typecho_network:

Typecho + MySQL

version: '3.7'

services:
  mysql:
    image: mysql:8.2.0
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
      MYSQL_DATABASE: typecho
      MYSQL_USER: ${MYSQL_USER}
      MYSQL_PASSWORD: ${MYSQL_PASSWORD}
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
      timeout: 20s
      retries: 10
    volumes:
      - ./mysql_data:/var/lib/mysql
    networks:
      - typecho_network

  typecho:
    image: joyqi/typecho:nightly-php7.4-apache
    restart: unless-stopped
    environment:
      - TYPECHO_SITE_URL=${TYPECHO_SITE_URL}
      - MAX_POST_BODY=1024M
      - TYPECHO_INSTALL=1
      - TYPECHO_DB_HOST=mysql
      - TYPECHO_DB_USER=${MYSQL_USER}
      - TYPECHO_DB_PASSWORD=${MYSQL_PASSWORD}
      - TYPECHO_DB_DATABASE=typecho
      - TYPECHO_USER_NAME=${TYPECHO_USER_NAME}
      - TYPECHO_USER_PASSWORD=${TYPECHO_USER_PASSWORD}
      - TYPECHO_USER_MAIL=${TYPECHO_USER_MAIL}
    ports:
      - "${TYPECHO_PORT}:80"
    volumes:
      - ./typecho_data:/app/usr
    networks:
      - typecho_network
    depends_on:
      mysql:
        condition: service_healthy

networks:
  typecho_network:

创建.env文件并添加以下内容:

# PostgreSQL 配置
POSTGRES_USER=typecho
POSTGRES_PASSWORD=yourpassword

# Typecho 配置
TYPECHO_SITE_URL=https://yourdomain.com
TYPECHO_PORT=9000
TYPECHO_USER_NAME=typecho_user   # Typecho用户名
TYPECHO_USER_PASSWORD=yourpassword
TYPECHO_USER_MAIL=example@example.com

# MySQL 配置
MYSQL_USER=typecho
MYSQL_ROOT_PASSWORD=yourpassword   # 数据库root用户密码
MYSQL_PASSWORD=yourpassword

# Typecho 配置
TYPECHO_SITE_URL=https://yourdomain.com
TYPECHO_PORT=9000
TYPECHO_USER_NAME=typecho_user   # Typecho用户名
TYPECHO_USER_PASSWORD=yourpassword
TYPECHO_USER_MAIL=example@example.com

3. 配置 Nginx

输入sudo nano /etc/nginx/sites-available/typecho在你的 Nginx 配置目录中创建一个新的配置文件,并添加以下内容:

server {
    listen 80;

    server_name yourdomain.com;

    location / {
        proxy_pass http://localhost:9000;
        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;
    }
}

请将yourdomain.com替换为你的实际域名。

4. 启动 Docker Compose

在项目目录中运行以下命令以启动 Typecho 服务:

sudo docker-compose up -d

5. 启用 Nginx 配置

创建一个符号链接到/etc/nginx/sites-enabled/目录:

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

然后重新加载 Nginx 配置:

sudo systemctl reload nginx

6. 访问 Typecho

打开浏览器,访问你的域名(例如http://yourdomain.com),因为本文选择了快速安装的方式,已经配置好了数据库和用户,你应该能够直接看到 Typecho 的主页界面。