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

Gogs 精简备份与恢复方案(仅SQLite数据库和配置)

一、备份方案设计

1. 备份内容

  • SQLite数据库文件/home/git/gogs/data/gogs.db

  • 配置和附件/home/git/gogs/custom 整个目录

2. 备份策略

  • 每周日凌晨2点执行完整备份

  • 保留最近4周的备份文件

  • 备份存储在独立分区 /backup(使用永久化挂载方法挂载到独立分区)

二、备份脚本实现

1. 初始化备份环境

#!/bin/bash
# 初始化备份目录
sudo mkdir -p /backup/gogs
sudo chown -R git:git /backup/gogs
sudo chmod 700 /backup/gogs

2. 主备份脚本 (/usr/local/bin/gogs_backup.sh)

#!/bin/bash
# Gogs周备份脚本
BACKUP_DIR="/backup/gogs"
SOURCE_DATA=("/home/git/gogs/data/gogs.db""/home/git/gogs/custom"
)
DATE=$(date +%Y%m%d)
RETENTION_DAYS=28  # 保留28天备份
LOG_FILE="$BACKUP_DIR/backup.log"# 记录开始时间
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始Gogs备份" >> "$LOG_FILE"# 创建带时间戳的备份文件
BACKUP_FILE="$BACKUP_DIR/gogs_backup_$DATE.tar.gz"# 执行备份
if ! tar -czf "$BACKUP_FILE" "${SOURCE_DATA[@]}" 2>> "$LOG_FILE"; thenecho "[$(date '+%Y-%m-%d %H:%M:%S')] 备份失败" >> "$LOG_FILE"echo "Gogs备份失败" | mail -s "Gogs备份告警" admin@example.comexit 1
fi# 验证备份完整性
if ! tar -tzf "$BACKUP_FILE" >/dev/null 2>&1; thenecho "[$(date '+%Y-%m-%d %H:%M:%S')] 备份验证失败" >> "$LOG_FILE"echo "Gogs备份验证失败" | mail -s "Gogs备份告警" admin@example.comrm -f "$BACKUP_FILE"exit 1
fi# 验证SQLite数据库完整性
TEMP_DIR=$(mktemp -d)
if ! tar -xzf "$BACKUP_FILE" -C "$TEMP_DIR" home/git/gogs/data/gogs.db 2>> "$LOG_FILE"; thenecho "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库提取失败" >> "$LOG_FILE"rm -rf "$TEMP_DIR"exit 1
fiDB_CHECK=$(sqlite3 "$TEMP_DIR/home/git/gogs/data/gogs.db" "PRAGMA integrity_check;" 2>&1)
if ! echo "$DB_CHECK" | grep -q "ok"; thenecho "[$(date '+%Y-%m-%d %H:%M:%S')] 数据库完整性检查失败: $DB_CHECK" >> "$LOG_FILE"echo "Gogs数据库完整性检查失败" | mail -s "Gogs备份告警" admin@example.comrm -rf "$TEMP_DIR"exit 1
firm -rf "$TEMP_DIR"# 清理旧备份
find "$BACKUP_DIR" -name "gogs_backup_*.tar.gz" -mtime +$RETENTION_DAYS -delete >> "$LOG_FILE" 2>&1# 记录成功信息
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 备份成功完成: $BACKUP_FILE ($BACKUP_SIZE)" >> "$LOG_FILE"

3. 设置定时任务

# 编辑git用户的crontab
sudo -u git crontab -e# 添加以下内容
# 每周日凌晨2点执行备份
0 2 * * 0 /usr/local/bin/gogs_backup.sh

三、灾难恢复流程

1. 新系统准备

# 在新服务器上安装基础环境
sudo apt update
sudo apt install -y git sqlite3
sudo adduser --disabled-login --gecos 'Gogs' git

2. 恢复脚本 (/usr/local/bin/gogs_restore.sh)

#!/bin/bash
# Gogs数据恢复脚本
BACKUP_DIR="/backup/gogs"
RESTORE_DIR="/home/git"
GOGS_VERSION="0.13.2"  # 根据实际情况调整
LOG_FILE="/tmp/gogs_restore.log"# 清空旧日志
> "$LOG_FILE"# 检查备份目录
if [ ! -d "$BACKUP_DIR" ]; thenecho "错误: 备份目录 $BACKUP_DIR 不存在" | tee -a "$LOG_FILE"exit 1
fi# 获取最新备份文件
LATEST_BACKUP=$(ls -t "$BACKUP_DIR/gogs_backup_"*.tar.gz 2>/dev/null | head -n 1)if [ -z "$LATEST_BACKUP" ]; thenecho "错误: 未找到备份文件" | tee -a "$LOG_FILE"exit 1
fiecho "准备从备份恢复: $LATEST_BACKUP" | tee -a "$LOG_FILE"
echo "恢复日志保存在: $LOG_FILE"# 1. 创建恢复目录结构
mkdir -p "$RESTORE_DIR/gogs/data" "$RESTORE_DIR/gogs/custom" >> "$LOG_FILE" 2>&1# 2. 恢复Gogs数据文件
echo "解压备份文件中..." | tee -a "$LOG_FILE"
if ! tar -xzf "$LATEST_BACKUP" -C / >> "$LOG_FILE" 2>&1; thenecho "错误: 解压备份文件失败" | tee -a "$LOG_FILE"exit 1
fi# 3. 安装Gogs二进制文件
echo "安装Gogs二进制文件..." | tee -a "$LOG_FILE"
if ! wget -q "https://dl.gogs.io/$GOGS_VERSION/gogs_${GOGS_VERSION}_linux_amd64.tar.gz" -P /tmp; thenecho "错误: 下载Gogs失败" | tee -a "$LOG_FILE"exit 1
fiif ! tar -xzf "/tmp/gogs_${GOGS_VERSION}_linux_amd64.tar.gz" -C "$RESTORE_DIR" >> "$LOG_FILE" 2>&1; thenecho "错误: 解压Gogs二进制文件失败" | tee -a "$LOG_FILE"exit 1
fi# 4. 设置权限
chown -R git:git "$RESTORE_DIR" >> "$LOG_FILE" 2>&1# 5. 验证数据库完整性
echo "验证数据库完整性..." | tee -a "$LOG_FILE"
DB_CHECK=$(sudo -u git sqlite3 "$RESTORE_DIR/gogs/data/gogs.db" "PRAGMA integrity_check;" 2>&1)
if ! echo "$DB_CHECK" | grep -q "ok"; thenecho "警告: 数据库完整性检查未通过: $DB_CHECK" | tee -a "$LOG_FILE"
elseecho "数据库完整性验证通过" | tee -a "$LOG_FILE"
fi# 6. 完成提示
echo "" | tee -a "$LOG_FILE"
echo "恢复完成!" | tee -a "$LOG_FILE"
echo "请执行以下命令启动Gogs:" | tee -a "$LOG_FILE"
echo "sudo -u git /home/git/gogs/gogs web" | tee -a "$LOG_FILE"
echo "或配置为系统服务后启动:" | tee -a "$LOG_FILE"
echo "sudo systemctl start gogs" | tee -a "$LOG_FILE"

3. 恢复操作步骤

  1. 挂载备份存储:

sudo mkdir -p /backup
sudo mount /dev/sdb1 /backup  # 假设备份在/dev/sdb1分区
  1. 执行恢复:

sudo bash /usr/local/bin/gogs_restore.sh
  1. 启动服务:

sudo -u git /home/git/gogs/gogs web
# 或者配置为系统服务后启动
sudo systemctl start gogs

四、备份验证与维护

1. 手动验证备份

# 检查最新备份文件
ls -lt /backup/gogs/gogs_backup_*.tar.gz# 验证备份内容
tar -tzf /backup/gogs/gogs_backup_最新日期.tar.gz# 验证数据库完整性
TEMP_DIR=$(mktemp -d)
tar -xzf /backup/gogs/gogs_backup_最新日期.tar.gz -C "$TEMP_DIR" home/git/gogs/data/gogs.db
sqlite3 "$TEMP_DIR/home/git/gogs/data/gogs.db" "PRAGMA integrity_check;"
rm -rf "$TEMP_DIR"

2. 日志检查

# 查看备份日志
tail -n 20 /backup/gogs/backup.log# 查看恢复日志(如果有)
cat /tmp/gogs_restore.log

3. 定期维护

# 检查备份文件占用空间
du -sh /backup/gogs# 检查备份文件数量
ls /backup/gogs/gogs_backup_*.tar.gz | wc -l

五、方案特点

  1. 极简设计:仅备份核心数据文件和配置

  2. 完整验证:自动验证备份完整性和数据库一致性

  3. 独立存储:备份存储在非系统分区,避免系统盘故障影响

  4. 详细日志:所有操作均有详细日志记录

  5. 一键恢复:恢复脚本自动处理所有步骤

六、注意事项

  1. 确保 /backup 分区有足够空间(建议至少是Gogs数据大小的2-3倍)

  2. 定期检查备份日志 (/backup/gogs/backup.log)

  3. 重要更新前建议手动执行额外备份

  4. 建议每季度进行一次恢复演练

此方案提供了最简单直接的Gogs核心数据保护方法,特别适合不需要频繁备份的中小型Gogs实例。

相关文章:

Gogs 精简备份与恢复方案(仅SQLite数据库和配置)

一、备份方案设计 1. 备份内容 SQLite数据库文件:/home/git/gogs/data/gogs.db 配置和附件:/home/git/gogs/custom 整个目录 2. 备份策略 每周日凌晨2点执行完整备份 保留最近4周的备份文件 备份存储在独立分区 /backup(使用永久化挂载…...

FPGA实现数码管显示分秒时间

目录 一. verilog实现 二. 烧录验证 三. 结果验证 使用开发板:DE2-115开发板 一. verilog实现 要实现分和秒,需要知道定时器的频率,通过查手册可知,我使用的开发板时钟为50hz,也就是时钟一个周期是2微秒。 5000000…...

读书记录九之《在峡江的转弯处-陈行甲人生笔记》

距离上本读完的书,写读后感有很长一段时间了,中间读了几本书,但都没写点文字,没错,是懒病又犯了。陈行甲这本书,一开始从网络上推荐看到,看之前介绍是一本人物自传的回忆录。我个人对这类贴近的…...

可视化开发:用Qt实现Excel级动态柱状图

Qt柱状图 QtChart 首先我们介绍一下 图表建立的基础:Qt Charts QtChart 是Qt框架的一个模块,专注与提供交互式数据可视化功能 俗话就是 用于用户轻松创建各种类型的图表和图形界面 它包含的图表类型有很多:折线图,饼图&#x…...

从零实现Json-Rpc框架】- 项目实现 - 基于Dispatcher模块的RPC框架

📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...

kubekey -实现懒人一键部署K8S集群

kubekey -实现懒人一键部署K8S集群 操作步骤 官网: https://kubesphere.io/zh/ 一、执行以下命令快速创建一个 Kubernetes 集群。 Master节点 如果您访问 GitHub/Googleapis 受限,请登录 Linux 主机,执行以下命令设置下载区域。 [roottest ~]…...

Android设计模式之模板方法模式

一、定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 二、结构: AbstractClass抽象类:定义算法的骨架,包含模板方法和若干…...

李宏毅机器学习笔记(1)—机器学习基本概念+深度学习基本概念

机器学习基本概念 1、获取模型 步骤 1.1、假定未知函数 带未知参数的函数 1.2、定义损失函数 真实值:label MAE MSE 几率分布,cross-entropy? 1.3、优化 单独考虑一个参数 让损失函数最小,找导数为零的点 单独考虑w,w…...

数字IC后端项目常见问题之streamOut layermap和innovus drc violation

Q1:我需要将Innovus设计GDS导出到Virtuoso,但发现写出GDS的过程会报如下所示的警告。这里写出GDS使用的是Virtuoso (DFII) streamOut mapping文件! Clock Gen模块Routing DRC,Timing分析及解决 streamOut tease.gds2 -mapFile cd…...

短剧系统开发动漫短剧系统源码开发上线小程序app教程

一、市场规模与用户增长:突破677亿,Z世代成主力 整体扩张 2025年短剧市场预计同比增长15%,规模达677.9亿元,用户规模6.62亿(占网民59.7%)。动漫短剧作为细分领域,增速显著受益于二次元文化渗透&…...

太阳能高杆路灯:照亮未来的新光

在全球能源转型进程加速以及可持续发展理念日益深入人心的背景下,太阳能高杆路灯作为融合新能源技术、智能控制技术与多功能集成特性的创新产品,正逐步革新传统路灯的格局。其不仅有效解决了传统路灯对电网供电的依赖问题,更为城市及乡村的照…...

《C++Linux编程进阶:从0实现muduo 》-第8讲.C++面试如何高效获取线程ID

章节重点 在C面试时,经常被问到如果高效获取线程ID,但不少同学都不知道如何回答。 重点是通过__thread关键字。 重点内容 视频讲解:《CLinux编程进阶:从0实现muduo C网络框架系列》-第8讲. C面试如何高效获取线程ID 测试获取线…...

【Tauri2】011——菜单menu(2)

前言 前面简单地创建了菜单,接下来就来试试菜单中的action Rust中菜单项注册action AppHandle in tauri - Rusthttps://docs.rs/tauri/2.4.0/tauri/struct.AppHandle.html#method.on_menu_event这就需要用到App或者AppHandle中的方法on_menu_event #[must_use] …...

架构设计基础系列:面向对象设计的原则

引言 面向对象设计(Object-Oriented Design,OOD)是软件开发中的重要概念,其核心在于通过对象、类、继承、封装和多态等机制,实现对现实世界问题的抽象和建模。OOD不仅有助于提高代码的可重用性、可维护性和可扩展性&a…...

UE5学习笔记 FPS游戏制作35 使用.csv配置文件

文章目录 导入.csv要求首先创建一个结构体导入配置文件读取配置 导入 .csv要求 第一行必须包含标题 第一列的内容必须不能重复,因为第一列会被当成行的名字,在数据处理中发挥类似于字典的key的作用 当前的配置文件内容如下 首先创建一个结构体 结构…...

嵌入式单片机ADC数模转换的基本方法

第一:模数转换的概述 1:模数转换的概念 一般在电路中,信号分为两种,一种是模拟信号,一种是数字信号,绝大多数传感器采集的都是模拟信号,如温度、湿度、烟雾浓度、亮度.......,但是对于计算机需要处理的数字信号,那就需要利用电路把模拟信号转换为数字信号,这个转换的…...

Web数据挖掘及其在电子商务中的研究与应用

标题:Web数据挖掘及其在电子商务中的研究与应用 内容:1.摘要 随着互联网的飞速发展,Web数据呈现出爆炸式增长,电子商务领域更是积累了海量数据。在此背景下,对Web数据进行有效挖掘并应用于电子商务具有重要意义。本研究旨在探索Web数据挖掘技…...

01-Docker 安装

1、安装环境介绍 安装环境:Linux CentOS 7 本安装教程参考Docker官方文档,地址如下:https://docs.docker.com/engine/install/centos/ 2、卸载旧版docker 首先如果系统中已经存在旧的Docker,则先卸载: yum remove do…...

Redis 的缓存雪崩、击穿、穿透及其解决办法

文章目录 Redis 的缓存雪崩、击穿、穿透及其解决办法缓存雪崩解决办法 缓存击穿解决方案 缓存穿透解决方案 Redis 的缓存雪崩、击穿、穿透及其解决办法 本篇文章回顾 Redis 当中缓存崩溃、击穿、穿透现象以及相应的解决办法,主要的参考资料是:https://w…...

使用 Selenium 构建简单高效的网页爬虫

在当今数据驱动的世界中,网络爬虫已成为获取网络信息的重要工具。本文将介绍如何使用 Python 和 Selenium 构建一个简单而高效的网页爬虫,该爬虫能够处理现代网站的动态内容,支持代理设置和用户配置文件。 为什么选择 Selenium? …...

性能比拼: Pingora vs Nginx (My NEW Favorite Proxy)

本内容是对知名性能评测博主 Anton Putra Pingora vs Nginx Performance Benchmark: My NEW Favorite Proxy! 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 介绍 在本视频中,我们将对比 Nginx 和 Pingora(一个用于构建网络服务的 Rust 框架…...

Ranger一分钟

简介 Ranger Admin:Web UIPolicy Admin Tool:定义和管理策略的模块Ranger Plugins:HDFS、Hive、HBase、Kafka、Storm、YARNRanger UserSync: LDAP、Active DirectoryRanger KMS:管理和保护数据加密的密钥 加密密钥管理…...

STM32单片机入门学习——第5节: [3-1]GPIO输出

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难,但我还是想去做! 本文写于:2025.04.01 STM32开发板学习——第5节: [3-1]GPIO输出 前言开发板说明引用解答和…...

Open GL ES ->模型矩阵、视图矩阵、投影矩阵等变换矩阵数学推导以及方法接口说明

Open GL ES 变换矩阵详解 一、坐标空间变换流程 局部空间 ->Model Matrix(模型矩阵)-> 世界空间 世界空间->View Matrix(视图矩阵)->观察空间 观察空间 ->Projection Matrix(投影矩阵)->裁剪空间 裁剪空间 ->ViewPort Transform(视口变换)>屏幕空间 …...

AI提示词:自然景区智能客服

提示描述 专为自然景区游客设计的智能客服系统,旨在通过人工智能技术提供实时、准确的景区信息、游览建议、安全提示和服务支持,提升游客的体验质量和满意度。 提示词 # Role: 自然景区智能客服## Profile: - Author: xxx - Version: 1.0 - Language: …...

c#的反射和特性

在 C# 中,反射(Reflection)和特性(Attributes)是两个强大的功能,它们在运行时提供元编程能力,广泛用于框架开发、对象映射和动态行为扩展。以下是对它们的详细介绍,包括定义、用法、…...

智能体项目实现AI对话流式返回效果

1、智能体项目里与AI大模型对话的时候,需要从后端的流式接口里取数据并实现打字机渲染效果。这里涉及到 Markdown 格式的渲染,所以需要配合 marked.js 实现,安装 marked.js : npm install marked 引用: import { ma…...

定时任务(python)

介绍 🧩 什么是“定时任务”? 定时任务,就是按照设定的时间间隔或时间点自动执行某些操作。比如: • 每天早上8点发通知 • 每隔10秒采集一次数据 • 每小时清理一次缓存相关使用 ✅ 最简单的方式:while True tim…...

Python学习第二十七天

yield关键字 yield关键字扮演着核心角色,主要用于处理异步数据流和请求调度。 主要作用 生成器函数:将方法转换为生成器,可以逐步产生结果而不需要一次性返回所有数据 异步处理:支持Scrapy的异步架构,提高爬取效率 …...

Docker Compose 启动jar包项目

参考文章安装Docker和Docker Compose 点击跳转 配置 创建一个文件夹存放项目例如mydata mkdir /mydata上传jar包 假设我的jar包名称为goudan.jar 编写dockerfile文件 vim app-dockerfile按键盘上的i进行编辑 # 使用jdk8 FROM openjdk:8-jre# 设置时区 上海 ENV TZAsia/Sh…...