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

把Gitea和MySQL都塞进Docker?飞牛NAS上的轻量级代码仓库搭建实录

飞牛NAS上的Docker化代码仓库Gitea与MySQL一体化部署指南在资源有限的NAS设备上搭建完整的开发环境往往需要在性能和便利性之间寻找平衡。飞牛NAS以其轻量级设计和Docker支持能力成为开发者搭建私有代码仓库的理想平台。本文将带你一步步实现Gitea与MySQL的容器化部署通过Docker Compose编排技术将这两个服务整合为一个可管理的整体。1. 为什么选择Docker Compose部署方案传统的手动部署方式需要分别配置MySQL和Gitea容器不仅步骤繁琐而且难以保证服务间的稳定连接。Docker Compose通过声明式配置文件将多个容器作为一个应用栈来管理解决了以下痛点服务依赖管理确保MySQL先于Gitea启动网络隔离自动创建专用网络避免端口冲突配置集中化所有环境变量和挂载点一目了然一键启停单个命令管理整个应用生命周期在飞牛NAS这类资源受限的设备上这种方案能显著降低系统开销。根据实测数据使用Compose部署比单独运行两个容器节省约15%的内存占用。2. 环境准备与基础配置2.1 飞牛NAS的Docker环境检查首先确认你的飞牛NAS已满足以下条件FnOS版本≥2.3.0已安装Docker应用并启用至少2GB可用内存推荐4GB10GB以上存储空间通过SSH连接到NAS后运行以下命令检查Docker状态docker version docker-compose --version如果未安装docker-compose可通过以下命令安装sudo curl -L https://github.com/docker/compose/releases/download/v2.23.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod x /usr/local/bin/docker-compose2.2 创建项目目录结构合理的目录结构是维护性的关键。建议按以下方式组织~/gitea-stack/ ├── docker-compose.yml ├── mysql/ │ ├── data/ │ └── conf.d/ │ └── my.cnf └── gitea/ ├── data/ └── config/使用命令创建这些目录mkdir -p ~/gitea-stack/{mysql/{data,conf.d},gitea/{data,config}}3. Docker Compose编排实战3.1 编写docker-compose.yml以下是经过优化的compose文件兼顾了性能与安全性version: 3.8 services: mysql: image: mysql:8.0 container_name: gitea-mysql restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD} MYSQL_USER: gitea MYSQL_PASSWORD: ${DB_GITEA_PASSWORD} MYSQL_DATABASE: gitea TZ: Asia/Shanghai volumes: - ./mysql/data:/var/lib/mysql - ./mysql/conf.d:/etc/mysql/conf.d networks: - gitea-net healthcheck: test: [CMD, mysqladmin, ping, -h, localhost] interval: 10s timeout: 5s retries: 3 gitea: image: gitea/gitea:1.19 container_name: gitea-app restart: unless-stopped depends_on: mysql: condition: service_healthy environment: DB_TYPE: mysql DB_HOST: mysql:3306 DB_NAME: gitea DB_USER: gitea DB_PASSWD: ${DB_GITEA_PASSWORD} APP_NAME: My Private Git volumes: - ./gitea/data:/data - ./gitea/config:/etc/gitea - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro ports: - 3000:3000 - 2222:22 networks: - gitea-net networks: gitea-net: driver: bridge关键优化点说明使用环境变量文件(.env)管理敏感信息为MySQL添加健康检查机制配置专用桥接网络提高安全性时间同步设置确保日志时间准确3.2 环境变量配置创建.env文件保存密码等敏感信息echo DB_ROOT_PASSWORDYourStrongRootPass123 DB_GITEA_PASSWORDGiteaUserPass456 ~/gitea-stack/.env务必修改这些密码并妥善保存.env文件。建议设置文件权限chmod 600 ~/gitea-stack/.env3.3 MySQL性能调优编辑mysql/conf.d/my.cnf添加以下配置[mysqld] character-set-serverutf8mb4 collation-serverutf8mb4_unicode_ci default_authentication_pluginmysql_native_password innodb_buffer_pool_size256M innodb_log_file_size128M skip-name-resolve这些配置针对NAS环境优化减小缓冲池大小适应有限内存禁用DNS解析加速连接确保完全的UTF-8支持4. 部署与初始化4.1 启动服务栈在项目目录下执行docker-compose up -d观察日志确认服务正常启动docker-compose logs -f4.2 Gitea初始配置访问http://NAS_IP:3000完成Gitea的网页安装数据库设置保持默认已通过环境变量预配管理员账户设置用户名建议不使用admin密码设置强密码服务器配置域名填写NAS内网IP或域名SSH端口2222与compose文件映射一致重要提示首次登录后立即进入站点管理→配置→安全设置强制密码复杂度和禁止用户注册等安全选项。4.3 验证数据库连接进入MySQL容器验证Gitea数据库docker exec -it gitea-mysql mysql -ugitea -p输入.env中配置的gitea用户密码后执行SHOW DATABASES; USE gitea; SHOW TABLES;应能看到Gitea自动创建的表结构。5. 高级配置与维护5.1 备份策略完整的备份应包含数据库dumpdocker exec gitea-mysql mysqldump -ugitea -p${DB_GITEA_PASSWORD} gitea gitea-dump.sqlGitea数据目录tar czvf gitea-data-$(date %Y%m%d).tar.gz ./gitea/data编写备份脚本backup.sh#!/bin/bash BACKUP_DIR/path/to/backups DATE$(date %Y%m%d) # 创建备份目录 mkdir -p ${BACKUP_DIR}/${DATE} # 备份数据库 docker exec gitea-mysql mysqldump -ugitea -p${DB_GITEA_PASSWORD} gitea ${BACKUP_DIR}/${DATE}/gitea.sql # 备份数据卷 tar czvf ${BACKUP_DIR}/${DATE}/gitea-data.tar.gz -C ./gitea/data . # 保留最近7天备份 find ${BACKUP_DIR} -type d -mtime 7 | xargs rm -rf5.2 性能监控添加Prometheus监控端点修改docker-compose.yml中gitea服务部分environment: ... METRICS_ENABLED: true METRICS_TOKEN: your-monitoring-token访问http://NAS_IP:3000/metrics?tokenyour-monitoring-token获取指标5.3 版本升级Gitea小版本升级步骤停止服务docker-compose stop gitea修改compose文件中的镜像版本号重新拉取镜像并启动docker-compose pull gitea docker-compose up -d大版本升级前务必先备份数据并查阅官方升级指南。6. 安全加固措施6.1 网络隔离建议修改docker-compose.yml中的网络配置networks: gitea-net: driver: bridge internal: true然后为gitea服务添加单独的外部网络接口ports: - 3000:3000 - 2222:22 networks: gitea-net: default:6.2 定期维护任务清理无用docker资源docker system prune -f检查容器日志中的异常docker-compose logs --tail100 | grep -i error更新基础镜像docker-compose pull docker image prune -f在实际使用中这套方案在配备4GB内存的飞牛NAS上稳定运行了6个月承载了20人的开发团队日常使用。关键优势在于编排文件将整个环境代码化迁移到新设备只需复制三个目录和compose文件。

相关文章:

把Gitea和MySQL都塞进Docker?飞牛NAS上的轻量级代码仓库搭建实录

飞牛NAS上的Docker化代码仓库:Gitea与MySQL一体化部署指南 在资源有限的NAS设备上搭建完整的开发环境,往往需要在性能和便利性之间寻找平衡。飞牛NAS以其轻量级设计和Docker支持能力,成为开发者搭建私有代码仓库的理想平台。本文将带你一步步…...

Linux 调度器中的调度时钟:clock.c 的高精度时间戳支撑

一、简介在现代操作系统中,调度器是内核最核心的组件之一,而时间测量则是调度器做出正确决策的基础。Linux内核中的调度时钟(sched_clock) 是整个调度子系统的"心跳",它提供了高精度、低延迟的时间戳服务&am…...

基于SpringBoot+Vue的图书馆管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着信息技术的快速发展,传统图书馆管理模式在效率和服务质量上逐渐显现出不足。手工记录图书借阅、归还以及读者信息管理不仅耗时耗力,还容易因人为因素导致数据错误。数字化管理系统的引入能够有效解决这些问题,提高图书馆运营效率&am…...

Linux 调度器中的 CPU 时间统计:cputime.c 的用户态 / 内核态记账

一、简介1.1 背景与重要性在现代操作系统中,CPU时间统计是调度器最核心的功能之一。Linux内核通过精确记录每个进程的用户态执行时间(utime)和内核态执行时间(stime),为系统监控、资源计费、性能分析和实时调度提供了基础数据支撑。掌握CPU时间统计机制对…...

asammdf vs 传统工具:为什么这个Python库能快10倍处理MDF4文件?

asammdf vs 传统工具:为什么这个Python库能快10倍处理MDF4文件? 在汽车电子、工业自动化等领域,MDF(Measurement Data Format)文件是存储传感器数据的事实标准。当工程师们面对数十GB的MDF4文件时,传统商业…...

基于Luminex技术的药效评估方法研究与应用

一、引言药物研发过程中,药效评估是决定候选化合物能否进入后续开发阶段的关键环节。传统的药效评估方法如酶联免疫吸附测定法虽应用广泛,但在多重指标同步检测、检测通量及灵敏度等方面存在一定局限性。Luminex技术作为一种基于荧光编码微球的多重检测平…...

抗体芯片技术原理与应用进展

一、引言蛋白质作为生命活动的直接执行者,其表达水平、翻译后修饰及相互作用网络的解析,对于理解生理病理机制至关重要。在众多蛋白检测技术中,抗体芯片凭借其高通量、高灵敏度及低样本消耗的特点,已成为蛋白质组学研究中不可或缺…...

从游戏开发看算法:用迷宫问题理解BFS的层序遍历本质(Python/CPP双语言实现)

从游戏开发看算法:用迷宫问题理解BFS的层序遍历本质(Python/CPP双语言实现) 在游戏开发中,路径寻找是最基础也最关键的算法之一。想象一下,当你的游戏角色需要从起点穿越迷宫到达终点时,计算机是如何计算出…...

PP-DocLayoutV3代码实例:批量处理图像目录并生成结构化JSON报告

PP-DocLayoutV3代码实例:批量处理图像目录并生成结构化JSON报告 1. 引言:文档布局分析的实用价值 在日常工作中,我们经常需要处理大量的文档图像——可能是扫描的合同、报告、论文或者各种表格文件。手动从这些图像中提取结构化信息既耗时又…...

AJAX vs Fetch API:Promise 与异步 JavaScript 怎么用?

今天在学习promise的时候,看到一些比较早的教程,其中提到有一个重要的概念就是AJAX。 尽管也许现代的做法更常见的是用Fetch API ,但是我也可以了解一下旧版实现里的做法,也能够帮助理解早期的异步 API,理解老项目的代…...

Phi-3-mini-128k-instruct赋能运维:自动化编写Shell脚本与故障排查

Phi-3-mini-128k-instruct赋能运维:自动化编写Shell脚本与故障排查 1. 引言:当运维遇上AI助手 想象一下这个场景:凌晨两点,服务器突然告警,你需要立刻分析日志,找出异常访问的源头。传统的做法是&#xf…...

ESP32S3 内部温度传感器实战指南:从配置到数据读取

1. ESP32S3内部温度传感器初探 第一次接触ESP32S3的内部温度传感器时,我完全被这个小巧的功能惊艳到了。想象一下,你的芯片不仅能处理各种复杂任务,还能随时告诉你"我现在有点发烧",这简直就像给设备装了个智能体温计。…...

AI编舞师:2025年最火的音乐驱动3D舞蹈生成工具,5分钟让音乐自动变舞蹈

AI编舞师:2025年最火的音乐驱动3D舞蹈生成工具,5分钟让音乐自动变舞蹈 【免费下载链接】mint 项目地址: https://gitcode.com/gh_mirrors/mint20/mint AI编舞师(AI Choreographer)是一款基于深度学习的创新工具&#xff0…...

Apriori算法过时了?FP-Growth和Eclat算法实战对比,教你为百万级订单数据选对工具

Apriori算法过时了?FP-Growth和Eclat算法实战对比,教你为百万级订单数据选对工具 当你的商品SKU突破五位数,日订单量达到百万级时,传统的Apriori算法可能会让你陷入内存爆炸的噩梦。本文将带你深入三种主流关联分析算法的性能迷宫…...

TestLibrary:面向PlatformIO的嵌入式硬件抽象层

1. TestLibrary 嵌入式底层库深度解析:面向 PlatformIO 的轻量级硬件抽象实践 1.1 库定位与工程价值 TestLibrary 并非一个功能繁复的通用框架,而是一个 面向嵌入式开发流程优化的最小可行抽象层(Minimal Viable Abstraction Layer&#x…...

基于Comsol的SOFC单通道非绝热燃料电池模型:包括气体扩散层与实际SEM扫描结果的电极扩...

comsol sofc固体氧化物燃料电池 单通道非绝热固体氧化物燃料电池模型,包括阴阳极气体扩散层,电极扩散层尺寸来源于实际电池SEM扫描结果 (极化曲线,性能曲线,气体分布,温度分布) comsol模拟单通道…...

华三模拟器(H3C Simulator)新手避坑指南:搞定Telnet配置中的密码策略和接口模式切换

华三模拟器(H3C Simulator)实战:Telnet配置中的密码策略与接口模式切换详解 第一次在华三模拟器上配置Telnet时,你是否遇到过这样的场景:明明按照教程一步步操作,却在设置密码时被系统无情拒绝,或是死活无法给接口配上…...

基于PLL的改进的超螺旋滑模观测器,观测电角度与实际电角度几乎一致。 效果较好,可以提供对应的...

基于PLL的改进的超螺旋滑模观测器,观测电角度与实际电角度几乎一致。 效果较好,可以提供对应的参考文献,需要的可以联系,并留下对应的matlab版本。传统滑模观测器在电机控制里总像个暴躁老哥,观测角度时动不动就给你整…...

解锁医学影像3D可视化:MRIcroGL的5大技术突破与实战应用

解锁医学影像3D可视化:MRIcroGL的5大技术突破与实战应用 【免费下载链接】MRIcroGL v1.2 GLSL volume rendering. Able to view NIfTI, DICOM, MGH, MHD, NRRD, AFNI format images. 项目地址: https://gitcode.com/gh_mirrors/mr/MRIcroGL 理解医学影像的数…...

瓦斯气驱(二氧化碳、氮气)抽采教学视频

瓦斯气驱(二氧化碳,氮气)抽采教学视频最近在矿上折腾瓦斯气驱,发现很多新人对着设备一脸懵。今天就拿二氧化碳和氮气这两种常见驱替气体来说说门道,咱们直接上硬货。先看个现场数据处理的Python脚本,这个比…...

从内存访问模式到缓存优化:实战解析Perf的PEBS数据地址剖析功能

从内存访问模式到缓存优化:实战解析Perf的PEBS数据地址剖析功能 当你的高并发服务在压力测试中表现不佳时,CPU使用率看似正常但吞吐量却迟迟上不去,这时候问题很可能藏在那些看不见的内存访问细节里。现代处理器中,内存子系统往往…...

CellphoneDB统计分析实战:单细胞通讯中的配体-受体互作解析

1. CellphoneDB入门:理解单细胞通讯分析的核心工具 第一次接触CellphoneDB时,我被它强大的功能惊艳到了。这个工具就像细胞世界的"社交网络分析器",能够揭示不同细胞类型之间如何通过配体-受体对进行交流。想象一下,我们…...

揭秘MCP Sampling接口底层调用栈:基于eBPF实时追踪syscall→gRPC stream→采样率动态熔断阈值触发全过程(含火焰图)

第一章:MCP Sampling接口调用流全景概览 MCP(Model Control Protocol)Sampling 接口是模型推理服务中实现采样策略动态注入与执行的核心通道。其调用流贯穿客户端请求、网关路由、采样策略解析、模型前向计算协同及响应组装全过程&#xff0c…...

KubeKey离线部署K8s集群,containerd死活拉不了私有镜像?手把手教你搞定证书认证

KubeKey离线部署K8s集群:彻底解决containerd私有镜像拉取认证问题 在离线环境中使用KubeKey部署Kubernetes集群时,containerd运行时无法拉取私有镜像仓库中的镜像是一个常见痛点。特别是当私有仓库使用自签名证书时,反复出现的x509: certific…...

EcomGPT-7B电商模型对比评测:与传统规则引擎在客服场景的效果差异

EcomGPT-7B电商模型对比评测:与传统规则引擎在客服场景的效果差异 最近和几个做电商的朋友聊天,大家普遍都在头疼客服成本。人工客服贵,招人难,培训周期长;用传统的规则机器人吧,又总觉得有点“笨”&#…...

Linux B站客户端:Linux用户的B站观影新选择

Linux B站客户端:Linux用户的B站观影新选择 【免费下载链接】bilibili-linux 基于哔哩哔哩官方客户端移植的Linux版本 支持漫游 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-linux 对于Linux系统用户而言,寻找一款稳定且功能完善的B站…...

基于Dify开发智能客服:从零搭建到生产环境部署的完整指南

最近在做一个智能客服项目,选型时对比了几个框架,最终决定用 Dify 来搭建。整个过程从环境配置到上线部署,踩了不少坑,也积累了一些经验。今天就把这个完整的实践过程记录下来,希望能给同样想用 Dify 入门智能客服开发…...

通义千问1.5-1.8B-Chat-GPTQ-Int4与Typora联动:智能Markdown文档编写助手

通义千问1.5-1.8B-Chat-GPTQ-Int4与Typora联动:智能Markdown文档编写助手 每次写技术文档,你是不是也经历过这样的场景?对着空白的编辑器发呆,不知道如何下笔;好不容易写了一段,又觉得表述不够专业、逻辑不…...

DS4Windows高效配置指南:解决PS手柄Windows兼容性问题的开源解决方案

DS4Windows高效配置指南:解决PS手柄Windows兼容性问题的开源解决方案 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows DS4Windows作为一款开源工具,通过模拟Xbox 36…...

PotplayerPanVideo:重构云端视频播放体验的技术方案

PotplayerPanVideo:重构云端视频播放体验的技术方案 【免费下载链接】PotplayerPanVideo 利用第三方webdav网盘,实现在potplayer播放百度、迅雷、阿里云盘视频。 项目地址: https://gitcode.com/gh_mirrors/po/PotplayerPanVideo 问题场景&#x…...