Forgejo数据备份及恢复

备份 假设用户为:xxxx Forgejo容器为:forgejo PostgreSQL容器为:forgejo-db 1.创建备份目录 sudo mkdir -p /home/xxxx/backup/forgejo sudo chown xxxx:xxxx /home/xxxx/backup/forgejo 2.创建脚本目录以及脚本文件 mkdir -p /home/xxxx/script mkdir -p /home/xxxx/log vim /home/xxxx/script/forgejo-backup.sh 脚本: #!/bin/bash set -Eeuo pipefail # ===================== # Forgejo Backup Config # ===================== DATE=$(date +%F-%H%M) # 备份用户 BACKUP_USER="xxxx" # 备份目录 BACKUP_DIR="/home/xxxx/backup/forgejo" # 日志目录 LOG_DIR="/home/xxxx/log" LOG_FILE="$LOG_DIR/forgejo-backup.log" # Forgejo 数据目录 FORGEJO_DATA="/opt/docker/forgejo/data" # Docker 容器 FORGEJO_CONTAINER="forgejo" POSTGRES_CONTAINER="forgejo-db" # PostgreSQL DB_USER="forgejo" DB_NAME="forgejo" # 最低剩余空间 GB MIN_FREE_GB=5 # 保留最近备份数量 RETENTION_COUNT=7 # ===================== # Logging # ===================== mkdir -p "$LOG_DIR" touch "$LOG_FILE" chown "$BACKUP_USER:$BACKUP_USER" "$LOG_FILE" exec > >(tee -a "$LOG_FILE") 2>&1 echo echo "================================================" echo "Forgejo backup start: $(date '+%F %T')" echo "================================================" # ===================== # Variables # ===================== DATA_BACKUP="$BACKUP_DIR/forgejo-data-$DATE.tar.gz" DB_BACKUP="$BACKUP_DIR/forgejo-db-$DATE.sql" # ===================== # Check backup directory # ===================== if [[ ! -d "$BACKUP_DIR" ]]; then echo "ERROR: Backup directory not found:" echo "$BACKUP_DIR" exit 1 fi # ===================== # Check disk space # ===================== FREE_KB=$(df -Pk "$BACKUP_DIR" | awk 'NR==2 {print $4}') FREE_GB=$((FREE_KB / 1024 / 1024)) echo "Available disk space: ${FREE_GB}GB" if (( FREE_GB < MIN_FREE_GB )); then echo "ERROR: Need at least ${MIN_FREE_GB}GB free space." exit 1 fi # ===================== # Check containers # ===================== if ! docker ps --format '{{.Names}}' | grep -qx "$FORGEJO_CONTAINER"; then echo "ERROR: Forgejo container is not running." exit 1 fi if ! docker ps --format '{{.Names}}' | grep -qx "$POSTGRES_CONTAINER"; then echo "ERROR: PostgreSQL container is not running." exit 1 fi # ===================== # Stop Forgejo # ===================== echo "[1/6] Stop Forgejo..." docker stop "$FORGEJO_CONTAINER" # 无论成功失败,都启动 Forgejo cleanup() { echo "Restart Forgejo..." docker start "$FORGEJO_CONTAINER" >/dev/null 2>&1 || true } trap cleanup EXIT # ===================== # Backup Forgejo data # ===================== echo "[2/6] Backup Forgejo data..." tar czf \ "$DATA_BACKUP" \ -C "$(dirname "$FORGEJO_DATA")" \ "$(basename "$FORGEJO_DATA")" # ===================== # Backup PostgreSQL # ===================== echo "[3/6] Backup PostgreSQL..." docker exec "$POSTGRES_CONTAINER" \ pg_dump -U "$DB_USER" "$DB_NAME" \ > "$DB_BACKUP" # ===================== # Verify backups # ===================== echo "[4/6] Verify backup files..." if [[ ! -s "$DATA_BACKUP" ]]; then echo "ERROR: Forgejo data backup failed." exit 1 fi if [[ ! -s "$DB_BACKUP" ]]; then echo "ERROR: PostgreSQL backup failed." exit 1 fi echo "Backup verified." # ===================== # Remove old backups # ===================== echo "[5/6] Remove old backups..." echo "Removing old Forgejo data backups..." ls -1t "$BACKUP_DIR"/forgejo-data-*.tar.gz 2>/dev/null \ | tail -n +$((RETENTION_COUNT + 1)) \ | xargs -r rm -f echo "Removing old database backups..." ls -1t "$BACKUP_DIR"/forgejo-db-*.sql 2>/dev/null \ | tail -n +$((RETENTION_COUNT + 1)) \ | xargs -r rm -f # ===================== # Fix ownership # ===================== echo "[6/6] Fix ownership..." chown "$BACKUP_USER:$BACKUP_USER" \ "$DATA_BACKUP" \ "$DB_BACKUP" # ===================== # Summary # ===================== echo echo "Backup files:" ls -lh "$DATA_BACKUP" ls -lh "$DB_BACKUP" echo echo "Current backups:" ls -lh "$BACKUP_DIR" echo echo "================================================" echo "Forgejo backup finished: $(date '+%F %T')" echo "================================================" echo 3.添加执行权限 chmod +x /home/xxxx/script/forgejo-backup.sh 4.测试 sudo /home/xxxx/script/forgejo-backup.sh # 查看备份数据 ls /home/xxxx/backup/forgejo 5.定时执行(每天凌晨) 编辑: ...

2026年7月15日 · 3 分钟 · KHai

配置 DOCKER-USER链

1.查看现有规则 DOCKER-USER 链的规则是否生效与 链的优先级 和 规则顺序相关 sudo iptables -L DOCKER-USER --line-numbers 2.添加规则 允许已建立的连接(必须放在最前面) sudo iptables -I DOCKER-USER -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT 允许 192.168.1.100 访问所有 Docker 容器: sudo iptables -I DOCKER-USER -s 192.168.1.100 -j ACCEPT 允许 192.168.1.100 访问 Docker 容器时,仅允许访问 TCP 80 端口 sudo iptables -I DOCKER-USER -p tcp --dport 80 -s 192.168.1.100 -j ACCEPT 添加规则到指定位置 sudo iptables -I DOCKER-USER 3 -p tcp --dport 80 -s 192.168.1.101 -j ACCEPT 参数说明: -I在最前面插入 3.禁止其他所有 IP 的访问 注意iptables规则是从上往下执行的所以这条命令要放在最下面 ...

2025年2月19日 · 1 分钟 · KHai

搭建FRP内网穿透

frp 主要由两个组件组成:服务端(frps) 和 客户端(frpc)。通常情况下,服务端部署在具有公网 IP 地址的机器上,而客户端部署在需要穿透的内网服务所在的机器上。 服务端 Linux 方式一 1.下载 frp 版本根据自己情况选择,然后通过FTP上传到服务器 或者也可以使用wget下载 wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.55.1_linux_amd64.tar.gz 2.解压 tar -zxvf frp_0.55.1_linux_amd64.tar.gz 3.重命名并进入该目录 mv frp_0.55.1_linux_amd64 frp cd frp ls 有以下文件 LICENSE frpc frpc.toml frps frps.toml 4.编辑 frps.toml bindPort = 7000 # frp服务器用于接收客户端连接的端口 auth.method = "token" auth.token = "xxxxxxx" # 身份认证 更多配置示例请参考官方文档 5.运行 ./frps -c ./frps.toml 如果需要在后台长期运行,建议结合其他工具,如 systemd 创建 frps.service 文件 sudo vim /etc/systemd/system/frps.service 添加以下内容 # 服务名称,可自定义 Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple # 启动frps的命令,需修改为您的frps的安装路径 ExecStart = /path/to/frps -c /path/to/frps.toml [Install] WantedBy = multi-user.target 使用 systemd 命令管理 frps 服务 ...

2024年3月27日 · 2 分钟 · KHai