总得有个记录的地方吧,搭建博客服务

总得有个记录的地方吧,搭建博客服务

现在的博客搭建方式有很多,本文使用的是 halo,它安装起来比较方便快捷,界面也非常清晰简洁。

  • 安装方法使用的是 podman
  • 代理服务使用的是 nginx
  • 数据库使用的是 mysql

安装 podman

podman 是一个容器管理工具,可以很方便的管理容器。它与 docker 相比,更轻量级一些。比如,docker 需要 root权限,而 podman 不需要。

  • podman 安装配置

    # 安装依赖
    sudo apt-get install podman
    
    # 启动服务
    sudo systemctl start podman.socket
    sudo systemctl enable podman.socket
    
    # 编辑配置文件
    sudo vim /etc/containers/registries.conf
    
    # 添加以下内容
    unqualified-search-registries = ["docker.io"]
    
  • podman 基本命令

    # 搜索镜像
    podman search <image_name>
    
    # 拉取镜像
    podman pull <image_name>
    
    # 列出所有镜像
    podman images
    
    # 删除镜像
    podman rmi <image_id>
    
    # 列出所有容器
    podman ps -a
    
    # 启动容器
    podman start <container_id>
    
    # 停止容器
    podman stop <container_id>
    
    # 删除容器
    podman rm <container_id>
    
    # 查看容器日志
    podman logs <container_id>
    
    # 进入容器
    podman exec -it <container_id> bash
    
    # 运行容器
    podman run -itd --name <container_name> -p <host_port>:<container_port> -v <host_path>:<container_path> <image_name>
    # -i 表示交互模式
    # -t 表示分配一个伪终端
    # -d 表示后台运行
    # --name <container_name> 表示给容器起一个名字
    # -p <host_port>:<container_port> 表示将容器的 <container_port> 端口映射到宿主机的 <host_port> 端口
    # -v <host_path>:<container_path> 表示将宿主机的 <host_path> 路径映射到容器的 <container_path> 路径
    
    # 示例
    podman run -d --name mysql -p 3306:3306 -v /home/<user>/mysql:/var/lib/mysql mysql:8.0.32
    
  • podman 扩展知识

    • 配置文件路径
      1. root 用户的路径是 /etc/containers/containers.conf
      2. 普通 用户的路径是 ~/.config/containers/containers.conf
    • 容器配置文件保存
      1. root 用户的路径是 /var/lib/containers/storage/overlay
      2. 普通用户的路径是 ~/.local/share/containers/storage/overlay
    • 因为 podman 是无根的,所以用户退出后,启动的容器会自动停止。可以使用 sudo loginctl enable-linger 启用linger模式,使得在系统关闭时,当前用户的服务能够继续运行
    • 容器内需要访问宿主机时,可以使用 host.containers.internal 替代宿主机 ip

安装 mysql

  • mysql 安装配置

    # 拉取镜像
    podman pull mysql:8.0.32
    
    # 创建数据目录,日志目录
    mkdir -p /home/<user>/mysql/data -p /home/<user>/mysql/logs
    
    # 创建配置文件
    vim /home/<user>/mysql/my.cnf
    
    # 写入配置信息
    [mysqld]
    port = 3306
    datadir=/var/lib/mysql
    log-error=/var/log/mysqld.log
    pid-file=/var/run/mysqld/mysqld.pid
    
    # 保存退出
    :wq
    
  • 运行 mysql 容器

    podman run -itd \
    --name mysql \
    -p 3306:3306 \
    -e MYSQL_ROOT_PASSWORD=<password> \
    -v /home/<user>/mysql/data:/var/lib/mysql \
    -v /home/<user>/mysql/logs:/var/log/mysql \
    -v /home/<user>/mysql/my.cnf:/etc/mysql/my.cnf \
    -v /etc/localtime:/etc/localtime \
    mysql:8.0.32
    
    # 说明
    # -e MYSQL_ROOT_PASSWORD=<password> 设置数据库root用户的密码,需替换
    # -v /home/<user>/mysql/data:/var/lib/mysql 对应容器的数据存储路径
    # -v /home/<user>/mysql/logs:/var/log/mysql 对应容器的日志存储路径
    # -v /home/<user>/mysql/my.cnf:/etc/mysql/my.cnf 对应容器的配置文件
    # -v /etc/localtime:/etc/localtime 是为了保证容器内和宿主机的时间同步
    
  • 创建 halo 数据库和用户

    # 进入容器
    podman exec -it mysql bash
    
    # 登录数据库
    mysql -u root -p
    
    # 创建用户
    create user 'halo'@'%' identified by 'halopwd';
    # 创建了一个用户名为halo,密码为halopwd的用户
    # % 表示允许从任意主机访问
    
    # 创建数据库
    create database halo_db charset utf8mb4 collate utf8mb4_bin;
    # 创建了一个名为halo_db的数据库,字符集为utf8mb4,排序规则为utf8mb4_bin
    
    # 授权
    grant all privileges on halo_db.* to 'halo'@'%';
    # 授权halo用户对halo_db数据库的所有权限
    
    # 刷新权限
    flush privileges;
    
    # 退出数据库
    exit
    
    # 退出容器
    exit
    

安装 halo

  • halo 安装配置

    # 拉取镜像
    podman pull halo:2.13
    
    # 创建本地映射目录
    mkdir -p /home/<user>/halo
    
  • 启动 halo 容器

    podman run -itd \
    --name halo \
    -p 8090:8090 \
    -v /home/<user>/halo:/root/.halo2 \
    halo:2.13
    --spring.r2dbc.url=r2dbc:pool:mysql://host.containers.internal:3306/halo_db \
    --spring.r2dbc.username=halo \
    --spring.r2dbc.password=halopwd \
    --spring.sql.init.platform=mysql
    
    # 说明
    # --spring.r2dbc.url 指定使用的数据库连接地址
    # host.containers.internal 是一个特殊的域名,表示是宿主机,相当于127.0.0.1
    # --spring.r2dbc.username 指定数据库用户名
    # --spring.r2dbc.password 指定数据库密码
    # --spring.sql.init.platform 指定数据库类型
    
  • 访问 halo

    1. 访问 http://localhost:8090 按照提示填写注册信息
    2. 登录刚才注册的用户,完成初始化 halo
    3. 访问 http://localhost:8090/console 进入后台管理界面
    4. 访问 http://localhost:8090 进入主站

安装 nginx

  • 准备 nginx 环境

    # 拉取镜像
    podman pull nginx:1.23.3
    
    # 创建本地映射目录
    mkdir -p /home/<user>/nginx/conf.d /home/<user>/nginx/logs /home/<user>/nginx/data/html
    
    # 生成缺省配置文件容器
    podman run -itd --name nginxdef nginx:1.23.3
    
    # 拷贝配置文件到本地映射路径
    podman cp nginx:/etc/nginx/nginx.conf /home/<user>/nginx/nginx.conf
    podman cp nginx:/etc/nginx/conf.d/default.conf /home/<user>/nginx/conf.d/default.conf
    podman cp nginx:/usr/share/nginx/html/index.html /home/<user>/nginx/data/html/index.html
    
    # 删除容器
    podman rm nginxdef
    
  • 启动 nginx 容器

    podman run -itd \
    --name nginx \
    -p 80:80 \
    -p 443:443 \
    -v /home/<user>/nginx/nginx.conf:/etc/nginx/nginx.conf \
    -v /home/<user>/nginx/conf.d:/etc/nginx/conf.d \
    -v /home/<user>/nginx/logs:/var/log/nginx \
    -v /home/<user>/nginx/data:/usr/share/nginx \
    nginx:1.23.3
    
    # 说明
    # 普通用户不能使用1024以下端口,需要使用root用户启动容器,或者使用 sysctl 命令修改端口范围
    # 注意,该操作有泄露端口的风险,请谨慎使用。
    sudo sysctl net.ipv4.ip_unprivileged_port_start=80
    # 1024为默认值,修改为80,这时再重新启动容器即可
    
    # 启动容器后,及时恢复默认值
    sudo sysctl net.ipv4.ip_unprivileged_port_start=1024
    
  • 配置 nginx 解析

    # 添加 halo 配置
    vim /home/<user>/nginx/conf.d/halosite.conf
    
    # 写入配置信息
    upstream halo2 {
        server  host.containers.internal:8090;
    }
    
    server {
        listen 80;
        server_name halosite.com;
    
        location / {
            proxy_pass http://halo2;
            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_set_header X-Forwarded-Host $host;
            proxy_set_header X-Forwarded-Port $server_port;
            proxy_set_header X-Forwarded-Server $host;
            proxy_set_header X-Forwarded-Path $request_uri;
        }
    }
    
    # 保存退出
    :wq
    
    # 重载nginx配置
    podman exec -it nginx nginx -s reload
    
  • 验证 nginx 解析

    使用 http://halosite.com 访问 halosite,验证配置是否生效