网站搭建从0-1
从一台全新的云服务器(阿里云 ECS)开始,从 0 到 1 完整搭建 Halo 个人独立博客的标准全流程如下:
一、 服务器基础环境与前置准备
1. 云厂商安全组放行端口
在阿里云 ECS 控制台的【安全组】入方向规则中,确保放行以下端口:
22:远程 SSH 连接。
80:HTTP Web 服务(Certbot 申请 SSL 证书必须)。
443:HTTPS Web 服务。
8090(可选):Halo 默认端口(若全部走 Nginx/OpenResty 反向代理,可不必对公网开放)。
2. 域名解析
在域名控制台(如阿里云 DNS / Cloudflare)添加解析记录:
记录类型:
A主机记录:
@或www(例如originspace.work)记录值:云服务器的公网 IP
3. 配置虚拟内存(Swap,低配主机必做)
防止 Java 21 与容器服务在内存紧张时触发 OOM 导致 SSH 假死:
Bash
fallocate -l 2G /swapfile || dd if=/dev/zero of=/swapfile bs=1M count=2048
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile
echo '/swapfile none swap sw 0 0' >> /etc/fstab
二、 安装 Docker 与 Docker Compose
以 CentOS / RHEL / Alibaba Cloud Linux 为例:
Bash
# 1. 安装基础依赖与 Docker 官方仓库
yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 2. 安装 Docker Engine 及 Compose 插件
yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 3. 启动 Docker 并设置开机自启
systemctl start docker
systemctl enable docker
三、 部署 Halo 博客(Docker Compose 方式)
1. 创建工作目录与专用桥接网络
Bash
# 创建站点目录及持久化数据目录
mkdir -p /opt/halo/data
cd /opt/halo
# 给持久化工作目录赋予容器运行写入权限
chmod -R 777 /opt/halo/data
# 创建供 Web 反代与应用容器互相通信的桥接网络
docker network create web-net
2. 编写 docker-compose.yml
Bash
nano /opt/halo/docker-compose.yml
写入 Halo 服务的编排文件(默认使用内嵌 H2 模式快速起步):
YAML
services:
halo:
image: ghcr.io/halo-dev/halo:2.24.2
container_name: halo
restart: unless-stopped
ports:
- "8090:8090"
volumes:
- ./data:/root/.halo2
command:
- --halo.external-url=https://originspace.work
networks:
- default
networks:
default:
name: web-net
external: true
3. 启动 Halo 容器
Bash
docker compose up -d
检查启动状态:
Bash
docker logs -f halo
输出 Started HaloApplication in ... seconds 时按 Ctrl + C,说明服务已在本地 8090 端口就绪。
四:使用NPM进行反向代理于ssl配置
1. 寻找部署目录
在服务器上,NPM 通常部署在独立目录中,你可以通过以下命令找到当初放置 docker-compose.yml 的位置:
Bash
docker inspect npm-app-1 --format '{{ index .Config.Labels "com.docker.compose.project.working_dir" }}'
(一般输出会是 /opt/npm、/root/npm 或 /data/npm 等路径)
2. 当时创建的目录与配置文件
当时你进入了该目录,并创建了数据挂载文件夹:
Bash
mkdir -p /opt/npm && cd /opt/npm
mkdir -p data letsencrypt
然后编写了 docker-compose.yml:
YAML
version: '3.8'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # HTTP 访问与证书验证
- '81:81' # NPM 管理后台面板
- '443:443' # HTTPS 加密访问
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
networks:
- default
networks:
default:
name: web-net
external: true
说明:挂载的 data 存放了 NPM 的配置与内置 SQLite 数据库,letsencrypt 存放申请的 SSL 证书。
3. 当时的启动命令
在编写好配置后,直接执行了拉起命令:
Bash
docker compose up -d
Docker 自动将服务命名为了 <项目目录名>-app-1(即 npm-app-1),并自动映射了 80、81、443 端口。
4. 初始登录凭据(默认初始账号)
首次通过 http://<IP>:81 访问时,使用的是 NPM 官方默认账号:
Email:
admin@example.comPassword:
changeme首次登录后系统会强制要求修改邮箱与密码。
五、 反向代理与 SSL 证书配置(Nginx / OpenResty)
为博客绑定域名并启用 HTTPS 加密访问。
1. Nginx 站点配置
在你的 Nginx 或 OpenResty(若使用 1Panel / NPM 则在面板操作)的配置文件中配置反向代理规则:
Nginx
server {
listen 80;
server_name originspace.work;
# 强制跳转 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name originspace.work;
ssl_certificate /etc/nginx/ssl/originspace.work.pem;
ssl_certificate_key /etc/nginx/ssl/originspace.work.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 解除客户端请求体上传大小限制(保证大图片和备份包能正常上传)
client_max_body_size 1024m;
location / {
proxy_pass http://halo:8090; # 若 Nginx 也在容器中并加入同一网络,可直接用容器名
# 若 Nginx 安装在宿主机,可改为: proxy_pass http://127.0.0.1:8090;
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;
# 支持 WebSocket(Halo 控制台通知需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
重新加载 Nginx 配置:
Bash
nginx -t && nginx -s reload
六、 站点初始化与正式使用
打开浏览器访问域名:
[https://originspace.work](https://originspace.work)。页面会自动进入 【系统初始化】 引导向导:
确认外部访问地址为
[https://originspace.work](https://originspace.work)。填写站点标题、管理员用户名、邮箱和管理密码。
点击 【完成初始化】,系统写入初始化设置并跳转至后台登录面板(
/console)。在应用市场中安装并启用喜欢的主题(如 Dream、Joe 等)和插件,即可正式开始发布博客。
评论