2023.10.27日搭建
halo快速部署个人博客 技术方案 docker+docker-compose+nginx+mysql
halo简介 Halo是一款现代化的开源博客/CMS系统,所有代码开源在GitHub上且处于积极维护状态。它是基于 Java Spring Boot 构建的,易于部署,支持REST API、模板系统、附件系统和评论系统等功能。
Halo 作为一款好用又强大的开源建站工具,配合上不同的模板与插件,可以很好地帮助你构建你心中的理想站点。它可以是你公司的官方网站,可以是你的个人博客,也可以是团队共享的知识库,甚至可以是一个论坛、一个商城。
相关地址 开源仓库 halo-dev/halo: 强大易用的开源建站工具。 (github.com)
halo: 强大易用的开源建站工具。 (gitee.com)
中文文档 Halo 文档
社区 Halo 社区
官网 Halo 建站 - 强大易用的开源建站工具
主题仓库 应用市场 - Halo 建站 - 强大易用的开源建站工具
基础设置 关闭防火墙(docker启动之前关闭)
1 2 systemctl status firewalld systemctl stop firewalld
docker 安装 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 1.卸载旧的版本 $sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine 2.需要的安装包 $sudo yum install -y yum-utils 3.设置镜像的仓库(官方) $sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo (官网速度慢) $sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo(推荐使用,阿里云速度快) 4.更新yum软件包索引 $sudo yum makecache fast 5.安装docker docker-ce 社区版 docker-ee 企业版 $sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin 6.启动docker $sudo systemctl start docker 7.查看docker是否安装成功 $sudo docker version
卸载 1 2 3 4 5 1.卸载依赖 $sudo yum remove docker-ce docker-ce-cli containerd.io 2.删除资源 $sudo rm -rf /var/lib/docker # /var/lib/docker docker的默认工作路径
阿里云镜像加速 1 2 3 4 5 6 7 8 9 10 配置镜像加速器 通过shell脚本追加文本内容 $sudo mkdir -p /etc/docker $sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://f2k3b83v.mirror.aliyuncs.com"] } EOF $sudo systemctl daemon-reload $sudo systemctl restart docker
设置开机自动启动 1 # systemctl enable docker
查看docker服务状态 1 # systemctl status docker
查看docker具体信息 docker-compose 这里采用离线安装,在线安装或多或少有各种问题
所有版本预览Releases · docker/compose (github.com)
1 2 3 4 5 6 7 8 9 10 #最好是进入到/usr/local/bin/目录下安装,我第一次在根目录下安装,报错docker-compose: command not found,第二次在上述目录下安装可以成功 #将文件上传到linux后,重命名 mv docker-compose-linux-x86_64.docker-compose-linux-x86_64 docker-compose #添加可执行权限 chmod +x /usr/local/bin/docker-compose #测试 docker-compose version
nginx反向代理配置 在系统任意位置创建一个 halo 文件夹,并创建多级目录
1 mkdir -p /halo/nginx/conf/
编写Nginx配置文件
1 2 3 4 vim /halo/nginx/conf/nginx.conf vim: command not found yum install vim -y
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 #user root; error_log /var/log/nginx/error.log notice; worker_processes 1; pid /var/run/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; # 设置上传文件的最大值 client_max_body_size 256m; upstream blog { # 使用容器服务名 server halo:8090; } server { listen 80; # 可进行域名绑定 server_name nwth.xyz; location / { # 设置反向代理的地址(实际是请求转发) proxy_pass http://blog; # 设置HTTP请求头 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; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
Docker-compose部署halo,mysql,nginx 修改的自定义配置,找到下面的参数所在位置修改:
服务器或虚拟机ip:halo.external-url 中的 ip 设置,修改为自己的服务器ip地址。
超级管理员账号密码 账号 halo.security.initializer.superadminusername,我写的配置中是 admin 密码 halo.security.initializer.superadminpassword ,我写的配置中是 123456 mysql的root用户密码,以下两个参数的值都需要修改且必须保持一致 spring.r2dbc.password,我写的配置中是 123456 MYSQL_ROOT_PASSWORD,我写的配置中是 123456
==建议本地编辑再上传==
记得用notepad++打开编辑完成后,格式修改为UTF-8无BOM编码格式
要不然报错
parsing /root/halo/compose.yaml: yaml: invalid leading UTF-8 octet
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 services: halo: image: halohub/halo:2.10 container_name: halo restart: on-failure:3 depends_on: halodb: condition: service_healthy networks: halo_network: volumes: - ./halo:/root/.halo2 ports: - "8090:8090" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"] interval: 30s timeout: 5s retries: 5 start_period: 30s command: - --spring.r2dbc.url=r2dbc:pool:mysql://halodb:3306/halo - --spring.r2dbc.username=root # MySQL 的密码,请保证与下方 MYSQL_ROOT_PASSWORD 的变量值一致。 - --spring.r2dbc.password=123456 - --spring.sql.init.platform=mysql # 外部访问地址,我的服务器 ip 为8.130.97.145,此处需要修改为你自己的服务器或虚拟机 ip - --halo.external-url=http://192.168.101.128:80/ # 初始化的超级管理员用户名 - --halo.security.initializer.superadminusername=admin # 初始化的超级管理员密码 - --halo.security.initializer.superadminpassword=123456 halodb: image: mysql:8.1.0 container_name: halodb restart: on-failure:3 networks: halo_network: command: - --default-authentication-plugin=mysql_native_password - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - --explicit_defaults_for_timestamp=true volumes: - ./mysql:/var/lib/mysql - ./mysqlBackup:/data/mysqlBackup ports: - "3306:3306" healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "127.0.0.1", "--silent"] interval: 3s retries: 5 start_period: 30s environment: # 请修改此密码,并对应修改上方 Halo 服务的 SPRING_R2DBC_PASSWORD 变量值 - MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=halo halonginx: # 服务名称,用户自定义 image: nginx:1.24.0 # 镜像版本 container_name: halonginx # 链接到其它容器,能在 nginx.conf 反向代理配置时使用 links: - halo networks: halo_network: ports: - 80:80 # 暴露端口 volumes: # 挂载 - /halo/nginx/conf/nginx.conf:/etc/nginx/nginx.conf privileged: true # 这个必须要,解决nginx的文件调用的权限问题 networks: halo_network:
容器编排 1 2 3 4 5 6 7 8 # 1.进入 halo 目录 cd /halo # 2.容器编排 启动并访问服务 docker-compose up -d 关停服务 docker-compose down
访问测试 http://【服务器或虚拟机ip】
初次访问有点慢
账号密码为compose.yml中填写的超级管理员的账号密码
admin/123456
基础操作 参考用户指南 | Halo 文档
主题 2.10版本加入了应用市场,可在其中下载安装喜欢的主题
Sakura
番外:有界面的反向代理神器 Nginx Proxy Manager 创建一个docker-compose.yml 文件 1 2 3 4 5 6 7 8 9 10 11 12 version: '3.8' services: app: image: 'jc21/nginx-proxy-manager:latest' restart: unless-stopped ports: - '8080:80' - '81:81' - '443:443' volumes: - ./data:/data - ./letsencrypt:/etc/letsencrypt
一键启动 登录到管理界面 当docker容器跑起来后, 连接到81端口即可访问管理界面。有时候需要稍等一会儿。
访问:http://你的服务器IP:80
第一次登录的默认管理员账户:
1 2 Email: admin@example.com Password: changeme
第一次登陆后,你会立刻被要求修改登录密码和一些重要信息。
番外:twikoo部署 云函数部署 | Twikoo 文档
Halo Twikoo 插件以及 ssl 部署 | L’s Blog (liuocean.com)
ssl证书 cer和key
https://freessl.cn/
ACME v2证书自动化快速入门 (freessl.cn)
参考文章
Let’s Encrypt泛域名证书生成 acme.sh免费申请使用_letsencrypt泛域名-CSDN博客
https://guozh.net/acme-sh-gen-lets-encrypt-domain-ssl-tutorial/
番外:错误集锦 下面两处错误主要是nginx和nginx proxy端口冲突
Error response from daemon: driver failed programming external connectivity on endpo int nginx-proxy-manager-app-1 (b39ad26f01f7599bcee2fc11c042ea357c4b33369ccdd9effcdb7 97a92ce94e4): Bind for 0.0.0.0:80 failed: port is already allocated
1 2 3 4 5 6 7 8 9 10 查看docker 代理占用的端口 ps -aux | grep -v grep | grep docker-proxy 关闭docker 服务 sudo service docker stop ### 重启docker服务 sudo service docker start 还不行的话就 docker rm $(docker ps -aq) sudo rm /var/lib/docker/network/files/local-kv.db
Error response from daemon: failed to update store for object type *libnetwork.endpointCnt: Key not found in store
1 2 3 4 5 # pkill docker # iptables -t nat -F # ifconfig docker0 down # brctl delbr docker0 # service docker restart