记录一下搭建halo开源博客的步骤,或许以后还能用得上。
一、安装docker环境
具体怎么购买云服务器之类的就不说了,建议使用轻量级应用服务器。因为轻量级应用服务器价格更便宜,带宽反而更高,比云服务器更适合搭建web应用。缺点是轻量级应用服务器不支持集群,个人项目想必也用不到这东西。这里我建议直接选用带docker环境的系统,方便省事。
二、安装数据库
我打算安装一个MySQL数据库,该数据库不仅仅是用来部署本博客网站,同时还可以给其他应用使用,避免每个web应用都部署一个数据库容器,节约服务器资源。
首先创建一个名为mysql的目录,并且在该目录中创建一个名为docker-compose.yml的文件,文件的内容如下:
version: "3" services: db: image: mysql:latest container_name: mysql restart: always command: [ '--lower_case_table_names=1', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_unicode_ci' ] environment: MYSQL_ROOT_PASSWORD: 123456 ports: - "3306:3306" volumes: - ./db_data:/var/lib/mysql networks: - db_network networks: db_network:
注意: 强烈建议对没一个应用创建一个独立的目录,并且保证一个目录中只存在一个docker-compose.yml文件,方便管理。简单解释一下上面yaml文件的作用,创建了一个MySQL容器,并且该容器忽略大小写,这一点对我来说尤其重要,比如当你从某个数据库导出数据并导入到该数据库时,有可能出现因为导入后的表名是大写而导致各种表不存在之类的错误。其中
MYSQL_ROOT_PASSWORD: 123456
作用是指定数据库的root用户的密码,这里建议更改为较安全的密码。我就不创建普通数据库用户了,没必要,直接使用root用户即可。该配置中将容器中的关键数据挂载到宿主机,避免更新数据库版本导致数据丢失。使用
docker-compose up -d
命令运行容器,注意应该是在mysql目录下运行该命令。该命令会后台运行并创建一个MySQL容器,如果该容器已经创建,则再次使用该命令不会再创建容器。这里简单补充一下docker-compose相关知识:命令
作用
docker-compose up
使用当前目录下的docker-compose.yml文件创建(如果已经创建,则不会再额外创建)并启动容器,-d参数表示后台运行该命令
docker-compose down
卸载当前目录下docker-compose.yml文件创建的容器,如果挂载了volumes,并不会删除volumes。想要一并删除volumes可以在后面加参数--volume
docker-compose stop
停止当前目录下docker-compose.yml文件创建的容器
docker-compose start
启动当前目录下docker-compose.yml文件创建的容器
如果启动没有报错就算是安装成功了,但是有可能因为防火墙之类的原因无法远程访问,而我需要一个可以远程访问的数据库用来平时使用。
在腾讯云/阿里云的管理后台配置防火墙,允许3306端口号的访问,然后使用Navicat之类的工具连接MySQL数据库,如果能远程连接上,那肯定环境正常了,这里我们需要创建一个名为halo的数据库。
三、安装Halo博客
同样的是在当前用户的home目录下创建一个名为halo的文件夹,在该文件夹中创建一个名为docker-compose.yml的文件,文件的内容如下:
version: "3" services: halo: image: halohub/halo:2.6 container_name: halo restart: on-failure:3 network_mode: "host" privileged: true volumes: - ./data:/root/.halo2 command: # 修改为自己已有的 MySQL 配置 - --spring.r2dbc.url=r2dbc:pool:mysql://localhost:3306/halo - --spring.r2dbc.username=root - --spring.r2dbc.password=123456 - --spring.sql.init.platform=mysql # 外部访问地址,请根据实际需要修改 - --halo.external-url=https://www.jiangqiang.top/ # 初始化的超级管理员用户名 - --halo.security.initializer.superadminusername=admin # 初始化的超级管理员密码 - --halo.security.initializer.superadminpassword=admin123 # 端口号 默认8090 - --server.port=8090
这里直接使用外部数据库的连接方式,而不是通过docker的容器之间的通信方式来进行连接。注意
privileged: true
这行参数必不可少,如果是直接通过docker创建halo容器的话,也需要加--privileged
参数,因为很多云服务器自带的docker容器貌似跟halo之间有兼容性的问题,启动可能出错,会出现系统资源不足,无法创建线程之类的错误。亲测,使用腾讯云轻量级应用服务器的带docker环境的系统通过1panel面板安装halo博客也会有此错误。在halo目录下执行
docker-compose up -d
,不出意外的话博客就安装好了。在腾讯云/阿里云的管理后台配置防火墙,允许8090端口号的访问,此时我们可以通过浏览器输入以下地址访问:http://{云服务器ip}:8090
四、安装nginx配置域名证书
同样是创建一个名为nginx的目录,然后创建一个名为docker-compose.yml的文件,文件的内容如下
version: '3' services: nginx: image: nginx:latest restart: always ports: - "80:80" - "443:443" volumes: - ./conf.d/:/etc/nginx/conf.d/ - ./logs/:/var/log/nginx/ - ./html/:/usr/share/nginx/html/ - ./certs/:/etc/nginx/certs/
在nginx目录下执行
docker-compose up -d
,此时有可能会报错,因为我们并没有创建相关的配置文件,所以不用管。去腾讯云/阿里云申请免费的单域名证书,域名在哪儿买的去哪儿申请。别告诉我用acme.sh或者certbot之类的申请。这些东西申请的域名就三个月,如果你不能保证自动续期脚本正常生效,还不如去云服务商申请免费的一年的证书。将证书下载并上传到nginx/certs/目录下。
在nginx目录下创建conf.d文件夹,并进入该文件夹中创建一个名为halo.conf的文件,这里的文件名可以任意,但是必须以.conf结尾。文件的内容 如下:
upstream halo { #云服务器的内网ip,这里不能使用localhost或127.0.0.1 server 10.0.4.15:8090; } server { listen 80; listen [::]:80; server_name www.jiangqiang.top jiangqiang.top; return 301 https://www.jiangqiang.top$request_uri; } server { #SSL 默认访问端口号为 443 listen 443 ssl; listen [::]:443 ssl; #请填写绑定证书的域名 server_name www.jiangqiang.top; #请填写证书文件的相对路径或绝对路径 ssl_certificate /etc/nginx/certs/jiangqiang.top_nginx/jiangqiang.top_bundle.crt; #请填写私钥文件的相对路径或绝对路径 ssl_certificate_key /etc/nginx/certs/jiangqiang.top_nginx/jiangqiang.top.key; ssl_session_timeout 5m; #请按照以下协议配置 ssl_protocols TLSv1.2 TLSv1.3; #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; location / { #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。 #例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。 #root html; #index index.html index.htm; proxy_pass http://halo; 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; } } server { #SSL 默认访问端口号为 443 listen 443 ssl; listen [::]:443 ssl; #请填写绑定证书的域名 server_name jiangqiang.top; #请填写证书文件的相对路径或绝对路径 ssl_certificate /etc/nginx/certs/jiangqiang.top_nginx/jiangqiang.top_bundle.crt; #请填写私钥文件的相对路径或绝对路径 ssl_certificate_key /etc/nginx/certs/jiangqiang.top_nginx/jiangqiang.top.key; ssl_session_timeout 5m; #请按照以下协议配置 ssl_protocols TLSv1.2 TLSv1.3; #请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; ssl_prefer_server_ciphers on; return 301 https://www.jiangqiang.top$request_uri; }
这里有几个需要注意的地方:
server 10.0.4.15:8090;
这里的ip绝对不能写127.0.0.1或者localhost,因为nginx和halo是部署在两个独立的容器中,而这里的localhost是指nginx容器的localhost,并非是指宿主机的localhost,所以这里应该要写宿主机的内网地址,也可以写宿主机的外网地址。注意证书的路径,宿主机的nginx/certs/目录就相当于配置中的/etc/nginx/certs/目录,因为我已经把nginx内部的路径挂载到了宿主机上。简单解释下其中几个配置:第一个server部分的作用是将通过http://www.jiangqiang.top和http://jiangqiang.top进来的请求都强制重定向到https://www.jiangqiang.top上,也就是强制使用https。而第三个server则是将https://jiangqiang.top也重定向到https://www.jiangqiang.top。此时运行
docker-compose up -d
命令,如果前面运行过该命令,可以先运行docker-compose down
,再运行docker-compose up -d
即可。
评论区