搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档
搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档
本项目采用以下架构:
- NFS服务器: 负责存储文档资料。
- Web服务器: 负责提供文档访问和编辑功能。
- SELinux: 负责权限控制,确保文档安全。
- Git服务器: 负责存储文档版本历史,并提供版本控制功能
- Shell脚本: 负责自动化运维,例如定期备份、日志清理等
步骤一:搭建NFS服务器
1.安装NFS软件包
[root@server data]# yum install -y nfs-utils rpcbind
2.配置NFS共享目录
我们需要创建一个共享目录,例如 /var/nfs/share
,并配置其访问权限。这里我们允许所有来自 192.168.137.128
网段的客户端以读写方式访问共享目录。
[root@server data]# mkdir -p /var/nfs/share[root@server data]# cat /etc/exports /data 192.168.137.128(rw)
3.启动NFS服务
需要启动NFS服务,并启用开机自启动,确保服务器一直提供NFS服务
[root@server data]# chmod o+w /data/
[root@server data]# systemctl disable firewalld --now //记得关防火墙
[root@server data]# getenforce
Enforcing
[root@server data]# setenforce 0
[root@server data]# systemctl restart nfs-server//之后可以查看一下
步骤二:搭建Web服务器
1.安装Web服务器软件:
[root@localhost ~]# dnf install nginx -y
2.配置Web服务器:
需要在Nginx配置文件中定义一个服务器块,指定监听的端口、域名和网站根目录。我们还需要配置HTTPS,使用自签名证书或CA签发的证书进行加密传输,提高安全性。
[root@localhost ~]# vim /etc/nginx/conf.d/document_management.confserver {listen 80;server_name document_management.example.com;location / {root /var/nfs/share;autoindex on;auth_basic "Document Management";auth_basic_user_file /etc/nginx/conf.d/htpasswd;}}
3.配置HTTPS:
配置HTTPS需要生成私钥和证书,并将其添加到Nginx配置文件中
[root@localhost ~]# openssl req -x509 -newkey rsa:4096 -sha256 -days 365 -nodes -out /etc/nginx/conf.d/document_management.crt -keyout /etc/nginx/conf.d/document_management.key
一次性生成证书:
- Country Name (2 letter code): 国家代码,例如
CN
表示中国。 - State or Province Name (full name): 州或省的名称,例如Sichuan。
- Locality Name (eg, city): 城市名称,例如
Chengdu
。 - Organization Name (eg, company): 如果不需要填写,直接按回车键。
- Organizational Unit Name (eg, section): 如果不需要填写,直接按回车键。
- Common Name (e.g. server FQDN or YOUR name): 通用名称,如果没有FQDN,可以输入localhost或你的IP地址。
- Email Address: 电子邮件地址,如果不需要填写,直接按回车键
4.修改Nginx配置:
[root@localhost ~]# vim /etc/nginx/conf.d/document_management.confserver {listen 443 ssl;server_name document_management.example.com;ssl_certificate /etc/nginx/conf.d/document_management.crt;ssl_certificate_key /etc/nginx/conf.d/document_management.key;location / {root /var/nfs/share;autoindex on;auth_basic "Document Management";auth_basic_user_file /etc/nginx/conf.d/htpasswd;}}
5.重启Web服务器:
[root@localhost ~]# systemctl restart nginx
步骤三:创建本地用户和组
1.创建用户:
[root@localhost ~]# useradd user1
[root@localhost ~]# useradd user2
2.创建组:
[root@localhost ~]# groupadd group1
[root@localhost ~]# groupadd group2
3.将用户添加到组:
[root@localhost ~]# usermod -a -G group1 user1
[root@localhost ~]# usermod -a -G group2 user2
步骤四:配置SELinux
1.创建文件类型:
用于添加文件上下文
[root@localhost ~]# semanage fcontext -a -t httpd_sys_content_t "/var/nfs/share(/.*)?"
2.设置文件安全上下文
我们需要将共享目录的安全上下文设置为 httpd_sys_content_t
,以便Web服务器能够访问该目录下的文件。
[root@localhost ~]# chcon -R -t httpd_sys_content_t /var/nfs/share
3.允许Nginx访问共享目录
需要允许Nginx访问共享目录,以便Web服务器能够访问该目录下的文件。
[root@localhost ~]# semanage port -a -t http_port_t -p tcp 80[root@localhost ~]# semanage port -a -t http_port_t -p tcp 443
步骤五:配置Git服务器
1.Git服务
- Git是一个分布式版本控制系统,每个开发者的工作目录都是一个完整的代码库副本,包含所有历史记录。
- 这种分布式架构使得开发者可以在本地进行大部分操作,如提交、分支、合并等,而无需依赖网络连接
- Git通过快照的方式存储数据,每次提交都会保存当前项目的状态(即文件的快照)。这种方式使得回滚到之前的版本非常高效,但也会占用较多的存储空间。
- Git支持轻量级的分支(是指向特定提交的指针,可以快速创建和删除)和合并操作,使得并行开发和功能集成变得简单
2.安装Git软件包
[root@localhost ~]# yum install -y git
3.创建Git仓库
用于存储文档版本历史
[root@localhost ~]# sudo git init --shared /var/nfs/share/git_repository
4.配置Git用户名和邮箱
以便Git能够记录文档的提交历史
[root@localhost ~]# git config --global user.name "Your Name"[root@localhost ~]# git config --global user.email "your.email@example.com"
步骤六:配置自动化运维
1.创建shell脚本:
编写一个shell脚本(/path/to/backup.sh),定期备份共享目录,并将备份文件移动到其他存储位置。
同时,要确保 /path/to/backup.sh
脚本有可执行权限
chmod +x /path/to/backup.sh
#!/bin/bash cd /var/nfs/share //当前工作目录切换到 /var/nfs/sharetar -zcvf backup.tar.gz . //使用 tar 工具创建一个名为 backup.tar.gz 的压缩归档文件mv backup.tar.gz /backup/ //将刚刚创建的 backup.tar.gz 文件移动到 /backup/ 目录中
2.设置定时任务:
使用 crontab
命令设置定时任务,让备份脚本在指定的时间自动运行(每天午夜 00:00 执行)。
[root@localhost ~]# crontab -e0 0 * * * /path/to/backup.sh
步骤七:配置Web服务器用户认证
1.修改Web服务器配置
[root@localhost ~]# vim /etc/nginx/conf.d/document_management.confserver {listen 80;server_name document_management.example.com;location / {root /var/nfs/share;autoindex on;auth_basic "Document Management";auth_basic_user_file /etc/nginx/conf.d/htpasswd;access_control_list_file /etc/nginx/conf.d/access_list}}
2.创建访问控制列表文件
[root@localhost ~]# touch /etc/nginx/conf.d/access_list
3.配置访问控制列表:
[root@localhost ~]# echo "user1 group1" >> /etc/nginx/conf.d/access_list[root@localhost ~]# echo "user2 group2" >> /etc/nginx/conf.d/access_list
最后测试一下
或者需要重启一下nginx服务再测试
[root@localhost ~]# systemctl restart nginx
相关文章:
搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档
搭建一个基于Web的文档管理系统,用于存储、共享和协作编辑文档 本项目采用以下架构: NFS服务器: 负责存储文档资料。Web服务器: 负责提供文档访问和编辑功能。SELinux: 负责权限控制,确保文档安全。Git服务器: 负责存储文档版本历史&#x…...
【QT】控件8
1.QDial 通过调节旋钮位置来控制窗口的不透明度: void Widget::on_dial_valueChanged(int value) {qDebug()<<value;this->setWindowOpacity((double)value/100); }效果演示: 2.Date/Time Edit 计算两个日期的差值 ui界面设计 计算按钮按下…...
asyncio.to_thread 详解及示例代码
asyncio.to_thread 详解及示例代码 1. asyncio.to_thread() 简介函数签名返回值 2. 示例代码示例 1: 执行阻塞的 I/O 操作示例 2: 执行阻塞的 CPU 密集型操作 3. 注意事项4. 总结 在异步编程中,asyncio 是 Python 中用于编写异步代码的标准库。然而,有时…...
MYSQL字段变更
修改字段长度 ALTER TABLE tqt_sp_prod.t_receipt_order_head MODIFY COLUMN CUS_CONTRACT_CD VARCHAR(50) COMMENT 客户合同编号;添加varchar类型字段 AFTER 此处指在loc_cd字段后面 ALTER TABLE m_product ADD COLUMN FIXED_ASSET_NUM VARCHAR(100) DEFAULT NULL COMME…...
【通俗理解】步长和学习率在神经网络中是一回事吗?
【通俗理解】步长和学习率在神经网络中是一回事吗? 【核心结论】 步长(Step Size)和学习率(Learning Rate, LR)在神经网络中并不是同一个概念,但它们都关乎模型训练过程中的参数更新。 【通俗解释&#x…...
力扣-位运算-8【算法学习day.48】
前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…...
C++ 字符串中数字识别
【问题描述】 输入一个字符串,含有数字和非数字字符,如“sumabc234;while(abc700)tab{ass346;bssabc267;}”,将其中连续的数字作为一个整数,依次存放到一个数组nums中。例如,234放在nums[0],700放在nums[1…...
计算机毕业设计Python+卷积神经网络股票预测系统 股票推荐系统 股票可视化 股票数据分析 量化交易系统 股票爬虫 股票K线图 大数据毕业设计 AI
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
jvm-49-linux 服务器 cpu 使用率升高应该如何排查分析?
拓展阅读 JVM FULL GC 生产问题 I-多线程通用实现 JVM FULL GC 生产问题 II-如何定位内存泄露? 线程通用实现 JVM FULL GC 生产问题 III-多线程执行队列的封装实现,进一步抽象 jvisualvm java 性能分析工具 jvm-44-jvm 内存性能分析工具 Eclipse Me…...
FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现
FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现 原因ADS111x连续采样实现连续采样功能说明iic读取adc的数据速率 VS adc连续采样的速率adc连续采样的速率iic读取adc的数据速率结论分析 FPGA读取adc数据问题一:读取adc数…...
Web开发基础学习——HTML, CSS, JavaScript 的区别和联系
Web开发基础学习系列文章目录 第一章 基础知识学习之HTML, CSS, JavaScript 的区别和联系 文章目录 Web开发基础学习系列文章目录前言一、定义说白了,就是HTML负责网页的内容,CSS负责网页的格式,JS负责网页的交互。 二、 功能三、联系四、示…...
通义灵码走进北京大学创新课堂丨阿里云云原生 10 月产品月报
云原生月度动态 云原生是企业数字创新的最短路径。 《阿里云云原生每月动态》,从趋势热点、产品新功能、服务客户、开源与开发者动态等方面,为企业提供数字化的路径与指南。 趋势热点 🥇 通义灵码走进北京大学创新课堂,与 400…...
Facebook Messenger背后的技术架构:即时通讯的实现之道
Facebook Messenger,作为全球最受欢迎的即时通讯应用之一,每天承载着数十亿的消息交换。其背后支撑这一流畅通讯体验的技术架构,融合了大量先进的技术和创新的解决方案。本文将从技术角度,深入探讨Facebook Messenger如何实现即时…...
前端css实例
前端css实例 一、带条纹的表格 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>条纹样式的表格<…...
电阻改善信号完整性
1.为什么电路端接电阻能改善信号完整性 由于电信号在PCB上传输,因此在PCB设计中可以把PCB走线认为是信号的通道,当该通道的 物理结构(线宽,线到参考面的距离等)发生变化,特别是有一些突变时,都会…...
如何选择合适的主键id?
目录标题 MySQL主键一定是自增的吗?自增id、uuid、雪花算法 谁更合适?详细聊聊 UUID详细聊聊 雪花算法 在数据库设计中,选择合适的主键对于数据表的性能和数据完整性都非常重要。接下来,让我们探讨一下自增id、uuid和雪花算法&…...
OpenMP出现Stack Overflow及其疑问
今天对着《OpenMP核心技术指南》练习OpenMP,其中一个案例: #include <stdio.h> #include <math.h> #include <omp.h>#define ITER 100000000void main() {int i;double A[ITER];for (i 0; i < ITER; i)A[i] 2.0 * i;#pragma omp parallel{/…...
vscode查找函数调用
在 VS Code 中,要查找 C 语言函数的调用列表,有以下几种方法可以使用,具体取决于项目的规模和你的需求: 方法 1: 使用全局查找功能 步骤: 打开全局查找: 按 CtrlShiftF (Windows/Linux) 或 CmdShiftF (Ma…...
网络安全-网络安全审计
网络安全审计是为了确保网络系统的安全性和完整性,防范潜在的网络攻击和数据泄露风险。 审计步骤: 1.确定审计目标:明确审计的目的和范围,例如审计网络设备、服务器、应用程序或数据库等。 2.收集信息:收集审计范围…...
刷LeetCode hot100--1.哈希表
哈希表--查找一个元素在不在数组/map/set中 目前用到的数据结构: std::unordered_set哈希表无序否否O(1)O(1) std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1) 1. 两数之和 - 力扣(LeetCode) 30min 几个问题 1.原来想…...
鸿蒙生态崛起的机遇有什么
鸿蒙生态系统的崛起为各个领域带来了多个机遇,主要体现在以下几个方面: 智能设备的互联互通:鸿蒙系统旨在实现不同设备之间的无缝连接,为物联网(IoT)设备的发展提供了良好的基础。这将推动智能家居、智慧城…...
写入json和读取json文件
/// <summary> ///写入文件 /// </summary> /// <param name"Stns"></param> /// <returns></returns> public ActionResult WriteJsonFile(string Stns) { strin…...
【Java基础入门篇】前言
Java基础入门篇 本系列内容主要针对Java基础知识,总共包含四大部分内容: 变量、数据类型和运算符控制语句和递归算法面向对象和JVM底层分析数组和排序 学习需要具备: IDEA编译器 JDK1.8版本 写在前面 在Java入门的最开始,我们需…...
LangChain——管道提示词 缓存
管道提示词 管道提示词可以将多个提示组合在一起。当我们想要使用部分提示时,这会很有用。这里可以通过PipelinePrompt来完成。 PipelinePrompt由两部分组成: 最终提示:返回的最终提示;管道提示:元组列表,…...
LangGPT社区创始人云中江树:用热爱与坚持点燃实战营课堂
书生大模型实战营第 4 期正在火热进行中,在这里,我们见证了众多同学的成长与进步。今天,让我们一起走进第 4 期导师、结构化提示词 LangGPT 社区创始人云中江树的故事。他的故事不仅是对知识改变命运的生动诠释,更是一段关于热爱与…...
Admin.NET框架使用宝塔面板部署步骤
文章目录 Admin.NET框架使用宝塔面板部署步骤🎁框架介绍部署步骤1.Centos7 部署宝塔面板2.部署Admin.NET后端3.部署前端Web4.访问前端页面 Admin.NET框架使用宝塔面板部署步骤 🎁框架介绍 Admin.NET 是基于 .NET6 (Furion/SqlSugar) 实现的通用权限开发…...
18:(标准库)DMA二:DMA+串口收发数据
DMA串口收发数据 1、DMA串口发送数据2、DMA中断串口接收定长数据包3、串口空闲中断DMA接收不定长数据包4、串口空闲中断DMA接收不定长数据包DMA发送数据包 1、DMA串口发送数据 当串口的波特率大于115200时,可以通过DMA1进行数据搬运,以防止数据的丢失。如…...
Unity 导出 xcode 工程 并给 Info.plist 文件添加字段
Unity 导出 xcode 工程 并给 Info.plist 文件添加字段 在 Editor 文件夹下新建 xxx.cs 脚本 实现静态方法 [PostProcessBuild]public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject){// Unity 导出 Xcode 工程自动调用这个方法 }例子 一 us…...
打造高质量技术文档的关键要素(结合MATLAB)
在技术的浩瀚海洋中,一份优秀的技术文档宛如精准的航海图。它不仅是知识传承的载体,也是团队协作的桥梁,更是产品成功的幕后英雄。打造出色的技术文档并非易事,以下将从多个方向探讨如何做到这一点。 文章目录 方向一:…...
C语言-数组
数组的创建 数组结构式 数组类型 数组名称 数组大小 内容 列如 char Arr[3]{1,2,3} int Arr[3]{1,2,3} 注意:在C99之前,【】中需要一个常量才可以 数组的初始化 初始化就是给它赋值,初始化分为完全初始化和非完全初始化 完全初始化…...
hhdb数据库介绍(10-19)
监控 智能物理拓扑 物理拓扑图主要以服务器为视角展示集群组件与服务器的所属关系,同时可查看服务器资源的使用情况以及各集群组件服务运行状态。使用前需保证为集群服务器配置了可用的SSH连接信息,否则只能查看当前服务器与集群组件的所属关系&#x…...
AI开发:生成式对抗网络入门 模型训练和图像生成 -Python 机器学习
阶段1:GAN是个啥? 生成式对抗网络(Generative Adversarial Networks, GAN),名字听着就有点“对抗”的意思,没错!它其实是两个神经网络互相斗智斗勇的游戏: 生成器(Gene…...
68 mysql 的 临键锁
前言 我们这里来说的就是 我们在 mysql 这边常见的 一种锁, 行临键锁 虽然 在平时我们用到的不是很多, 我们这里 主要是 讲一下 它的主要的触发的场景 行临键锁 等价于 行锁 间隙锁, 行间隙锁是一个 左开右开的区间, 行临键锁 是一个左开右闭的区间 但是 它 和 行锁的差异…...
(十一)Python3 接口自动化测试,Pytest-Allure报告的使用
(十一)Python3 接口自动化测试,Pytest-Allure报告的使用 1、安装和使用 1、安装pytest和allure-pytest插件: pip install pytest allure-pytest 2、在你的pytest测试用例中使用allure装饰器或者上下文管理器来生成报告。 例如,你可以使用@allure.feature装饰器来标记特性…...
【Rust 学习笔记】Rust 基础数据类型介绍(一)
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 博客内容主要围绕: 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 Rust 基础数据类型介绍(一)一、固定宽…...
深入理解Oracle DB的锁和闩
1. 引言 本文深入介绍Oracle DB的锁和闩。 2. Oracle DB 锁的基本概念 2.1 定义与作用 锁是 Oracle 数据库用于控制并发访问的一种机制。它用于防止多个事务同时对同一数据进行不一致的操作,确保数据的完整性和一致性。例如,当一个事务正在更新一行数…...
mcu上一种利用伪随机数防止mac地址冲突的方法
一 前言 前段时间开发的一个带tcp功能的项目,出现了mac地址冲突的问题,领导让随机生成一个mac地址,因此研究了下随机数。 二 预研 1.硬随机数 硬随机数又叫真随机数,英文名称”true random number generator“,即通过硬件随机数…...
C# 索引器(Indexer)
文章目录 前言一、索引器的语法规则二、索引器的用途及与属性的对比三、索引器的重载 前言 在 C# 编程中,索引器(Indexer)是一项极具特色且实用的语言特性,它赋予了对象一种独特的访问方式,使得对象能够如同数组一般&a…...
【大数据学习 | Spark-SQL】定义UDF和DUAF,UDTF函数
1. UDF函数(用户自定义函数) 一般指的是用户自己定义的单行函数。一进一出,函数接受的是一行中的一个或者多个字段值,返回一个值。比如MySQL中的,日期相关的dateDiff函数,字符串相关的substring函数。 先…...
Springboot集成通义大模型
1.先到阿里云平台开头阿里云白炼账号,创建apiKey 2. 引入maven依赖 <dependency><groupId>com.alibaba</groupId><artifactId>dashscope-sdk-java</artifactId><version>2.8.3</version></dependency><!-- htt…...
Xilinx PCIe高速接口入门实战(一)
引言:本文对Xilinx 7 Series Intergrated Block for PCI Express PCIe硬核IP进行简要介绍,主要包括7系列FPGA PCIe硬核资源支持、三IP硬核差异、PCIe硬核资源利用等相关内容。 1. 概述 1.1 7系列FPGA PCIe硬件资源支持 7系列FPGA对PCIe接口最大支持如…...
区块链游戏的新观察:自治世界能否成为未来链游的突破口?
区块链游戏(链游)作为加密领域的创新方向,一直被寄予厚望。然而,尽管各类链游层出不穷,大多只是靠代币激励一时爆火,缺乏持久吸引力。这种现象让人对链游未来的发展充满疑虑:是否有一种全新的设…...
Linq中的投影运算 (C#):Select、SelectMany、Zip
投影是指将对象转换为一种新形式的操作,该形式通常只包含那些将随后使用的属性。 通过使用投影,您可以构造从每个对象生成的新类型。 可以投影属性,并对该属性执行数学函数。 还可以在不更改原始对象的情况下投影该对象。 1、Select 下面的…...
GPU 服务器厂家:怎样铸就卓越 AI 算力?
文章来源于百家号:GPU服务器厂家 今天咱来聊聊 GPU 服务器厂家那些事儿,而这其中衡量 AI 算力的因素可是关键所在哦。 先讲讲计算速度这一块。咱都知道 AI 那复杂的活儿,像训练超厉害的图像识别模型,得处理海量图像数据&#x…...
数据结构与算法——N叉树(自学笔记)
本文参考 N 叉树 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 遍历 前序遍历:A->B->C->E->F->D->G后序遍历:B->E->F->C->G->D->A层序遍历:A->B->C->D->…...
浏览器的数据六种存储方法比较 :LocalStorage vs. IndexedDB vs. Cookies vs. OPFS vs. WASM-SQLite
在构建该 Web 应用程序,并且希望将数据存储在用户浏览器中。也许您只需要存储一些小标志,或者甚至需要一个成熟的数据库。 我们构建的 Web 应用程序类型发生了显着变化。在网络发展的早期,我们提供静态 html 文件。然后我们提供动态渲染的 h…...
Rust个人认为将抢占C和C++市场,逐渐成为主流的开发语言
本人使用C开发8年、C#开发15年、中间使用JAVA开发过项目、后期在学习过程中发现了Rust语言说它是最安全的语言,能够解决C、C的痛点、于是抽出一部分时间网上买书,看网上资料进行学习,这一学习起来发现和其它语言比较起来,在编码的…...
electron-updater软件自动检测更新 +无服务器本地测试
大家好,我是小黄。 今天分享一下如何0基础实现electron自动检测更新功能。 一. 安装 electron-updater 实现自动更新 安装依赖 electron-updater npm install electron-updater 二. 修改package.josn "publish": {"provider": "generi…...
Flink在Linux系统上的安装与入门
一、Flink的引入 这几年大数据的飞速发展,出现了很多热门的开源社区,其中著名的有Hadoop、Storm,以及后来的Spark,他们都有着各自专注的应用场景。Spark 掀开了内存计算的先河,也以内存为赌注,赢得了内存计…...
鸿蒙面试---都用过哪些装饰器
必答的 State装饰器:组件内状态 State装饰的变量,或称为状态变量,一旦变量拥有了状态属性,就可以触发其直接绑定UI组件的刷新。当状态改变时,UI会发生对应的渲染改变。Prop装饰器:父子单向同步Prop装饰的变…...