从零部署halo博客


从零部署halo博客

此教程是使用宝塔+docker+mysql搭建个人博客,使用H2可上halo官网教程查阅

准备工作

  • 一台云服务器
  • 一个域名(国内服务器需要备案,备案要很久,最好提前)
  • 域名实名,申请SSL证书
  • 域名解析

安装宝塔面板

安装前注意系统必须为没装过其它环境如Apache/Nginx/php/MySQL的新系统,以下使用centos系统安装宝塔面板

  • 执行安装命令
    yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

    安装成功后会给你面板地址和管理员账号和密码,注意要在服务器后台安全组或是防火墙中打开8888端口

面板登录进去后会让你一键部署环境(LNMP或LAMP,推荐LNMP)
安装方式编译安装比极速安装更加稳定,但安装时间需要1到2小时,极速安装10多分钟,时间充裕推荐编译安装

  • halo官方要求mysql数据库需要5.7+,8.0需要6RAM以上,推荐就5.7。php和phpmyadmin选最新,其他随意

这里我进行编译安装时面板卡死了一次,任务列表是空的,服务器满载,cpu使用率低,重登也是特别卡和慢,这时候就别等了,这里我重启服务器后,问题解决,编译安装正常继续运行

安装Docker管理器

  • 在宝塔面板的软件商店中直接安装即可

下载并修改halo配置文件

  • 创建并进入工作目录
    mkdir ~/.halo || cd ~/.halo
  • 下载示例配置文件到工作目录
    wget https://dl.halo.run/config/application-template.yaml -O ./application.yaml
  • 根据需要编辑配置文件,配置数据库或者端口等
    vim application.yaml
    使用mysql本地数据库的配置图
    application.yaml配置图
    • 默认是使用的H2数据库
    • 使用mysql数据库则将H2配置打上注释,将mysql配置注释放开
    • 修改username和password为mysql的账号和密码,密码在宝塔数据库界面可查看
    • 若在容器中使用数据库,则需要将127.0.0.1换成数据库的容器名,端口为容器内部端口 例:将127.0.0.1:3306换成blog_mysql:3306
    • 以下根据个人需求配置:
      port为halo博客运行的端口
      admin-path为后台管理的根路径
      cache是设置缓存数据的保存方式
      compression设置是否开启压缩,用Nginx等反向代理服务器时通常会默认开启

下面根据个人 选择一种进行配置

①直接使用本地数据库

  • 进入msyql

    mysql -u root -p
  • 创建halodb数据库

    create database halodb character set utf8mb4 collate utf8mb4_bin;

    注意这里官方要求字符集为utf8mb4,排序规则为utf8mb4_bin

  • 拉取最新的 Halo 镜像

    docker pull halohub/halo

    从 1.4.3 开始,Docker 镜像已经转移到 halohub 组织,不再是 ruibaby/halo

  • 创建halo容器并使用本地数据库

    docker run -itd --net host --name halo -p 8090:8090 -v ~/.halo:/root/.halo --restart=always halohub/halo

    参数说明:

    • -i, 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用
    • -t, 分配一个伪tty,一般与 -i 连用
    • -d,在后台运行容器,并且打印容器id
    • - -name,容器名
    • - -net,指定容器的网络配置

      - -net=bridge 这个是默认值,连接到默认的网桥。
      - -net=host 容器使用本地主机的网络,它拥有完全的本地主机接口访问权限
      - -net=container:NAME_or_ID 让Docker使用其他容器的网路,共享IP和PORT等网络资源,两者进程可以直接通过 lo 环回接口通信
      - -net=none 容器使用自己的网络,但是不进行网络配置,之后用户可以自行配置

    • -p, 容器内部端口绑定到指定的主机端口,主机端口:容器端口
    • -v, 挂载目录,这里是将主机的目录~/.halo挂载到容器的目录/root/.halo上
    • - -restart=always,当docker重启时,容器自动启动

docker默认的网络模式是bridge,因此默认容器内无法访问本地127.0.0.1

②利用容器间的关联使用容器中的数据库

  • 拉取mysql5.7镜像

    docker pull mysql:5.7
  • 创建并启动mysql容器

    docker run --name blog_mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=****** -d mysql:5.7
    • - -name,容器名
    • -e 设置环境变量,MYSQL_ROOT_PASSWORD为数据库密码,自行修改,用户名默认root
    • 这里因为我主机已有mysql,所以映射端口到3307,这个自行决定
  • 进入容器

    docker exec -it blog_mysql /bin/bash
  • 进入mysql并创建halo必要数据库halodb,注意字符集和排序规则

    mysql -u root -p
    create database halodb character set utf8mb4 collate utf8mb4_bin;
  • 拉取最新的 Halo 镜像

    docker pull halohub/halo
  • 创建halo容器并使其关联数据库容器

    docker run -itd --name halo --link blog_mysql -p 8090:8090 -v ~/.halo:/root/.halo --restart=always halohub/halo

    参数说明:

    • -i, 即使没有连接,也要保持标准输入保持打开状态,一般与 -t 连用
    • -t, 分配一个伪tty,一般与 -i 连用
    • -d,在后台运行容器,并且打印容器id
    • - -name,容器名
    • - -link,指定容器间的关联
    • -p, 容器内部端口绑定到指定的主机端口,主机端口:容器端口
    • -v, 挂载目录,这里是将主机的目录~/.halo挂载到容器的目录/root/.halo上
    • - -restart=always,当docker重启时,容器自动启动

PS:如果要使用外部数据库管理工具远程管理mysql,则需要用户开启远程登录功能

Grant all privileges on *.* to 'root'@'%' identified by ‘password’with grant option;
flush privileges;      刷新权限

*. * 为 数据库.表 ,root为用户,%代表所有主机 ,password处填写用户密码

以下为注意事项!!!

创建并启动halo容器后,会有20s左右的初始化建表时间,初始化后在数据库halodb当中能看见自动创建的表,若没有表,请检查问题
Halo工作目录的绝对路径为 ~/.halo,这个工作目录是固定的,Halo容器运行后里面通常包含下列目录或文件:
db:存放 H2 Database 的物理文件,如果您使用 MySQL 数据库,那么不会存在这个目录
templates/themes:里面包含用户所下载的主题
static:相当于网站的根目录
logs:运行日志目录
application.yaml:配置文件

放行端口80 443 8090!!!
云服务器防火墙和宝塔的防火墙两边都要放行!!!

到这里我们就可以以http://ip:8090的方式访问halo安装程序了
可以先配置好域名访问和SSL再进行安装

配置域名访问、SSL,使用 Nginx 进行反向代理

  • 安装 Nginx
    之前安装LNMP时已安装
  • 编辑配置文件

    官方是下载模板再进行配置,这里使用全局

    vim /www/server/nginx/conf/nginx.conf
    在http的括号内加入以下代码:
    server {
        listen 80;
        server_name baidu.com www.baidu.com; #域名
        rewrite ^(.*)$ https://$host$1 permanent;
     
        client_max_body_size 1024m;
    }
    server {
        listen 443 ssl;
     
        server_name baidu.com www.baidu.com; #域名
     
        ssl_certificate /usr/local/xxxxxx.pem; #证书地址
        ssl_certificate_key /usr/local/xxxxxxx.key; #证书地址
        ssl_session_timeout 5m;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_prefer_server_ciphers on;
     
        location / {
            proxy_set_header HOST $host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     
            proxy_pass http://127.0.0.1:8090/; #halo进入端口
        }
    }
    • 修改域名
    • 用ftp将证书文件放到云服务器中,配置好证书地址,第一个证书后缀不一定是pem
    • rewrite ^(.*)$ https://$host$1 permanent;是强制跳转http到https
  • 修改后需要重载Nginx
    在宝塔中重启Nginx    或    nginx -s reload    

到这里,就可以使用域名访问网站了!!!


文章作者: BananaYH
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 BananaYH !
评论
  目录