建站经历
Halo是一个开源建站项目,文档地址:https://docs.halo.run/
正常购买3个月以上的域名和云服务器备案就可以了,如果嫌备案麻烦就买一个香港的云服务器,减少上线的流程和等待时间,我使用的莱卡云2核2G和阿里云2核2G
购买一个云平台托管的域名,同样也不需要备案,我使用的cloudflare托管免费注册的.dpdns.org域名,也可以在阿里云注册一个域名.xyz
使用docker-compose部署Halo开源项目提供的个人博客建站模板
使用nginx反向代理将域名解析到云服务器ip端口
莱卡云管理平台需要开放端口,Linux服务器上暂时没有防火墙,由于远程连接的端口不是22,这个要在安全组里单独设置ssh端口开放
缺点:
国内只能以IP+端口的方式访问香港服务器IP地址进入个人博客,域名由于托管在cloudflare上,无法从国内直接访问,不备案的话只能将阿里云托管的域名临时解析到香港IP
可扩展性不强,不能自己写代码定制网站展示页面
文件上传有限制,图片音视频等资源有大小限制,基本不好用
暂时没有设置SSL证书,网站显示连接不安全
挂载postgresql的时候没有设置配置文件,数据库不支持远程访问,开放5432端口也没用
使用 Docker Compose 部署
在系统任意位置创建一个文件夹,此文档以 ~/halo
为例。
mkdir ~/halo && cd ~/halo
注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存。
创建 docker-compose.yaml
采用Halo + PostgreSQL方案。
~/halo/docker-compose.yaml
version: "3"
services:
halo:
image: registry.fit2cloud.com/halo/halo:2.21
restart: on-failure:3
depends_on:
halodb:
condition: service_healthy
networks:
halo_network:
volumes:
- ./halo2:/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
environment:
# JVM 参数,默认为 -Xmx256m -Xms256m,可以根据实际情况做调整,置空表示不添加 JVM 参数
- JVM_OPTS=-Xmx256m -Xms256m
command:
- --spring.r2dbc.url=r2dbc:pool:postgresql://halodb/halo
- --spring.r2dbc.username=halo
# PostgreSQL 的密码,请保证与下方 POSTGRES_PASSWORD 的变量值一致。
- --spring.r2dbc.password=openpostgresql
- --spring.sql.init.platform=postgresql
# 外部访问地址,请根据实际需要修改
- --halo.external-url=http://localhost:8090/
halodb:
image: postgres:15.4
restart: on-failure:3
networks:
halo_network:
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: [ "CMD", "pg_isready" ]
interval: 10s
timeout: 5s
retries: 5
environment:
- POSTGRES_PASSWORD=openpostgresql
- POSTGRES_USER=halo
- POSTGRES_DB=halo
- PGUSER=halo
networks:
halo_network:
启动容器:
docker compose up -d
输入docker ps
查看容器。
在云服务器安全组开启8090端口。
初始化后进入后台
备份还原与迁移,本次是迁移操作。
nginx配置域名解析
步骤 1: 拉取Nginx镜像
首先,从Docker官方镜像仓库拉取最新的Nginx镜像:
docker pull nginx
步骤 2: 创建挂载目录
为了方便管理配置文件、日志和网站内容,创建以下目录:
mkdir -p /home/nginx/conf
mkdir -p /home/nginx/logs
mkdir -p /home/nginx/html
设置权限以避免权限问题:
chmod 777 /home/nginx/conf /home/nginx/logs /home/nginx/html
步骤 3: 启动容器并挂载目录
先创建一个容器复制配置文件,这一步避免由于没有挂载文件导致报错。
# 生成容器
docker run --name nginx -p 9001:80 -d nginx
# 将容器nginx.conf文件复制到宿主机
docker cp nginx:/etc/nginx/nginx.conf /home/nginx/conf/nginx.conf
# 将容器conf.d文件夹下内容复制到宿主机
docker cp nginx:/etc/nginx/conf.d /home/nginx/conf/conf.d
# 将容器中的html文件夹复制到宿主机
docker cp nginx:/usr/share/nginx/html /home/nginx/
运行以下命令启动Nginx容器,并将宿主机目录挂载到容器中:
docker run -d \
--name my-nginx \
-p 80:80 \
-v /home/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
-v /home/nginx/logs:/var/log/nginx \
-v /home/nginx/html:/usr/share/nginx/html \
--restart always \
nginx
编辑 /home/nginx/conf/nginx.conf 文件,根据需求调整配置。设置静态文件路径或反向代理。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log notice;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
# 重要安全设置(防止嵌入攻击)
server_tokens off;
add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options SAMEORIGIN;
# 包含其他配置文件
include /etc/nginx/conf.d/*.conf;
# 上游服务器定义
upstream backend_server {
server x.x.x.x:8090; # 替换为实际后端IP和端口
}
# 自定义代理服务器配置
server {
listen 80;
server_name cabbage.dpdns.org ylq0001.xyz; # 域名
# 重要安全设置
client_header_buffer_size 2k;
large_client_header_buffers 4 8k;
client_body_buffer_size 100k;
# 上传限制
client_max_body_size 50m;
# 默认文件索引
index index.php index.asp index.html index.htm;
# 代理配置
location / {
proxy_pass http://backend_server; # 使用上游服务器名称
# 标准代理头设置
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_connect_timeout 60s;
proxy_send_timeout 90s;
proxy_read_timeout 90s;
proxy_buffering off;
proxy_request_buffering off; # 支持大文件上传
}
}
}
修改完成后,重启容器使配置生效:
docker restart my-nginx
检查容器状态和日志:
docker ps
docker logs nginx
日志无报错,访问http://ylq0001.xyz,成功进入博客。
PostgreSQL命令
因为PostgreSQL是以docker容器的方式运行的,所以要进入容器内部修改PostgreSQL远程连接权限。
先运行docker ps
查看正在运行的docker容器。
执行docker exec -it halo-halodb-1 bash
进入容器,看到命令提示发生改变。
[root@iZ2vc6aghw8fcd8mbgu23zZ ~]# docker exec -it halo-halodb-1 bash
root@69b0f2a20cdb:
执行psql
连接数据库,执行\l
显示数据库。用户通过-U 用户名和-d 数据库也可以进入。
psql -U halo -d halo -h 127.0.0.1 -p 5432
执行\c halo
连接数据库。
执行\dt
展示当前数据库的表格。
远程连接PostgreSQL
根据之前挂载的数据库配置位置,进入db目录。
开启云服务器安全组PostgreSQL的端口
要远程连接数据库,还需要修改postgresql.conf添加规则。
listen_addresses = '*'
修改pg_gba.conf,添加规则。
host all all 0.0.0.0/0 md5 # 允许所有IPv4地址用密码连接
本地电脑连接测试。
注意:开放数据库远程连接是高危行为,并且数据库存储的二进制数据并不方便修改,没有本地连接的意义。