当前位置: 首页 > news >正文

使用 docker-compose 搭建个人博客 Halo

目录

说明

我这里使用的是 Halo 作为博客的工具,毕竟是开源了,也是使用 Java 写的嘛,另外一点就是使用 docker 来安装(自动挡,不用自己考虑太多的环境因素),这样子搭建起来更快一点,我们这里核心就两步:

  • docker-compose 的安装
  • Halo 的安装

我这边的docker 版本如下:

docker 版本

docker-compose 安装

好了,废话就不多说了,我们现在开始看看怎么去搭建把。下面我也会把我遇到的几个坑给大伙说下,尽量避免我遇到的那些坑,忒别耗时。

安装步骤
这里我们可以看下Github上面官方的版本
官方的版本
正确的安装过程

具体执行的命令如下:

# 下载 docker-compose 文件
curl -L "https://github.com/docker/compose/releases/download/v2.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose# 给他一个执行权限
chmod +x /usr/local/bin/docker-compose# 查看是否安装成功
docker-compose -version

错误的安装过程

上面为什么要使用最新的呢?那是因为我遇到了这个问题,在使用 docker-compose.yaml 创建容器的时候,报错:

ERROR: The Compose file './docker-compose.yml' is invalid because:
services.halo.healthcheck value Additional properties are not allowed ('start_period' was unexpected)
services.halodb.healthcheck value Additional properties are not allowed ('start_period' was unexpected)
services.halo.depends_on contains an invalid type, it should be an array

后面在 docker-compose部署报错 #4110 找到了答案,因为我本地的docker-compose 的版本太低了,之前我安装的是 1.26.2 这个版本,后面干脆一点,升到最新算了。

卸载docker-compose

这里顺便说明下,怎么卸载的,如果是知道的同学,就直接看下面的把,不用在这里浪费时间了。

# 因为我这边是通过 curl 下载的,所以可以直接 rm 就好
rm /usr/local/bin/docker-compose

另外我也发现,可以使用上面安装的方式,直接再次 curl -L 下载对应的版本就好了,会直接覆盖安装。

Halo 搭建

好了,这里我们搭建 Halo 就很方便了,直接按照官方的文档来吧,很快就搞定了

第一步: 在系统任意位置创建一个文件夹,此文档以 ~/halo 为例。

mkdir ~/halo && cd ~/halo

注意:后续操作中,Halo 产生的所有数据都会保存在这个目录,请妥善保存。

第二步: 创建 docker-compose.yaml,这里我没有修改下面的配置,直接搭建的

需要注意的是,此文档为了更加方便的管理配置,所有与 Halo 相关的配置都使用 Docker 容器启动参数代替,所以无需创建 application.yaml 文件。

创建 Halo + PostgreSQL 的实例: *~/halo/docker-compose.yaml**

version: "3"services:halo:image: halohub/halo:2.15restart: on-failure:3depends_on:halodb:condition: service_healthynetworks:halo_network:volumes:- ./halo2:/root/.halo2ports:- "8090:8090"healthcheck:test: ["CMD", "curl", "-f", "http://localhost:8090/actuator/health/readiness"]interval: 30stimeout: 5sretries: 5start_period: 30s          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.4restart: on-failure:3networks:halo_network:volumes:- ./db:/var/lib/postgresql/datahealthcheck:test: [ "CMD", "pg_isready" ]interval: 10stimeout: 5sretries: 5environment:- POSTGRES_PASSWORD=openpostgresql- POSTGRES_USER=halo- POSTGRES_DB=halo- PGUSER=halonetworks:halo_network:

此示例的 PostgreSQL 数据库容器默认没有设置端口映射,如果需要在容器外部访问数据库,可以自行在 halodb 服务中添加端口映射,PostgreSQL 的端口为 5432

docker-compose.yaml

第四步: 启动 Halo 服务

docker-compose up -d

docker-compose up
其实到此我们就完成了,后面我就看下 log 以及 容器就好了

查看 log

docker-compose logs -f

查看日志

查看容器
我们可以看到容器的情况,最开始需要一点时间 starting ,启动完了之后,就是 healthy
容器

效果

好了好了,我们最后来看下效果把,最开始需要我们初始化,这个界面我就跳过去了,就是填写下用户名和密码,邮箱,博客名称。

前端界面
前端界面
后端管理界面
后台管理界面

OK,到此就搞定了。如果是 docker-compose 没有出bug,我感觉可以在几分钟之类搞完这个,就看下 docker 获取镜像的时间,搞完了之后,直接启动就好了。

相关文章:

使用 docker-compose 搭建个人博客 Halo

说明 我这里使用的是 Halo 作为博客的工具,毕竟是开源了,也是使用 Java 写的嘛,另外一点就是使用 docker 来安装(自动挡,不用自己考虑太多的环境因素),这样子搭建起来更快一点,我们…...

《这就是ChatGPT》读书笔记

书名:这就是ChatGPT 作者:[美] 斯蒂芬沃尔弗拉姆(Stephen Wolfram) ChatGPT在做什么? ChatGPT可以生成类似于人类书写的文本,它基本任务是弄清楚如何针对它得到的任何文本产生“合理的延续”。当ChatGPT写…...

更专业的汽车软件研发工具链,怿星重磅发布新产品

怿星科技在2024北京国际车展同期举办主题为“创新引领未来——聚焦智能汽车软件新基建”的新产品发布会,重磅推出1款绝对优势产品和4套场景解决方案。同时举行了4场热点技术研讨:国产工具链的机遇与挑战、新架构下的的车载DDS应用探索及测试方案介绍、软…...

Stable Diffusion:AI绘画的新纪元

摘要: Stable Diffusion(SD)作为AI绘画领域的新星,以其开源免费、强大的生成能力和高度的自定义性,正在引领一场艺术与技术的革命。本文旨在为读者提供Stable Diffusion的全面介绍,包括其原理、核心组件、安…...

有5个excel表,每个表有6列。用python把这5个表合成1个表。

要将五个Excel表格合并成一个表格,我们可以使用pandas库,它提供了一个简单且强大的方式来处理和分析数据。下面是一个步骤说明和示例代码: 步骤: 安装pandas和openpyxl(如果你还没有安装的话)&#xff1a…...

【回溯算法】【Python实现】最大团问题

文章目录 [toc]问题描述回溯算法Python实现时间复杂性 问题描述 给定无向图 G ( V , E ) G (V , E) G(V,E),如果 U ⊆ V U \subseteq V U⊆V,且对任意 u u u, v ∈ U v \in U v∈U有 ( u , v ) ∈ E (u , v) \in E (u,v)∈E,则称…...

CMakeLists.txt语法规则:foreach 循环基本用法

一. 简介 cmake 中除了 if 条件判断之外,还支持循环语句,包括 foreach()循环、while()循环。 本文学习 CMakeLists.txt语法中的循环语句。 CMakeLists.txt语法中 有两种 循环实现方式:foreach循环与 while循环。 二. CMakeLists.txt语法规则…...

redis集群-主从机连接过程

首先从机需要发送自身携带的replid和offset向主机请求连接 replid:replid是所有主机在启动时会生成的一个固定标识,它表示当前复制流的id,当从机第一次请求连接时,主机会将自己的replid发送给从机,从机在接下来的请求…...

去哪里找高清视频素材?推荐几个短视频素材免费网站

在数字时代,视频内容的质量直接影响观众的吸引力和留存率。尤其是高清、4K视频素材和可商用素材,它们在提升视觉质量和叙事深度方面起到了至关重要的作用。以下是一些国内外的顶级视频素材网站,它们提供的资源将为您的创作提供极大的支持和灵…...

从互联网医院源码到搭建:开发视频问诊小程序的技术解析

如今,视频问诊小程序作为医疗服务的一种新形式,正逐渐受到人们的关注和青睐。今天,小编将为您详解视频问诊小程序的开发流程。 一、背景介绍 互联网医院源码是视频问诊小程序开发的基础,它提供了一套完整的医疗服务系统框架&…...

【Linux】常见指令(二)

mv指令 mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files) 是Linux系统下常用的命令,经常用来备份文件或者目录 功能: 1.剪切文件或者目录 2.对文件或者目录进行重命名 常用选项: -f &#xf…...

python元类与C#、Java中的反射

Python的元类和C#中的反射 在概念上有一定的相似性,但它们的目的和使用方式有所不同。 Python的元类: 元类(Metaclass)是控制类创建的类。它们定义了类的创建过程,可以修改类的行为。元类通过定制类的创建过程&…...

Echart.js绘制时间线并绑定事件

<template><div id"app"><!-- 定义一个具有指定宽高的容器&#xff0c;用于渲染图表 --><div ref"timeline" style"width: 800px; height: 600px;"></div></div> </template><script> import *…...

Flutter弹窗链-顺序弹出对话框

效果 前言 弹窗的顺序执行在App中是一个比较常见的应用场景。比如进入App首页&#xff0c;一系列的弹窗就会弹出。如果不做处理就会导致弹窗堆积的全部弹出&#xff0c;严重影响用户体验。 如果多个弹窗中又有判断逻辑&#xff0c;根据点击后需要弹出另一个弹窗&#xff0c;这…...

1290.二进制链表转整数

给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。 请你返回该链表所表示数字的 十进制值 。 示例 1&#xff1a; 输入&#xff1a;head [1,0,1] 输出&#xff1a;5 解释&#xff1a;二进制数 (101) 转化为十进制…...

P8803 [蓝桥杯 2022 国 B] 费用报销

P8803 [蓝桥杯 2022 国 B] 费用报销 分析 最值问题——DP 题意分析&#xff1a;从N张票据中选&#xff0c;且总价值不超过M的票据的最大价值&#xff08;背包问题&#xff09; K天限制 一、处理K天限制&#xff1a; 1.对于输入的是月 日的格式&#xff0c;很常用的方式是…...

【Android】Kotlin学习之Lambda表达式

java和kotlin对比 Lambda语法 Lambda隐形参数 it 也可以不使用指定的名称it, 可以 自定义 Lambda 使用下划线...

YOLOv5-7.0改进(四)添加EMA注意力机制

前言 关于网络中注意力机制的改进有很多种&#xff0c;本篇内容从EMA注意力机制开始&#xff01; 往期回顾 YOLOv5-7.0改进&#xff08;一&#xff09;MobileNetv3替换主干网络 YOLOv5-7.0改进&#xff08;二&#xff09;BiFPN替换Neck网络 YOLOv5-7.0改进&#xff08;三&…...

TCP协议的确认应答机制

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的、基于字节流的传输层协议&#xff0c;它在网络通信中扮演着至关重要的角色。其中&#xff0c;确认应答机制是TCP协议中的一个核心概念&#xff0c;它确保了数据的可靠传输。本文将详细介绍J…...

【论文阅读笔记】MAS-SAM: Segment Any Marine Animal with Aggregated Features

1.论文介绍 MAS-SAM: Segment Any Marine Animal with Aggregated Features MAS-SAM&#xff1a;利用聚合特征分割任何海洋动物 Paper Code(空的) 2.摘要 最近&#xff0c;分割任何模型&#xff08;SAM&#xff09;在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...