{"id":22902398,"url":"https://github.com/1113464192/freeopsserver","last_synced_at":"2025-05-08T05:43:36.033Z","repository":{"id":267893327,"uuid":"843355876","full_name":"1113464192/FreeOpsServer","owner":"1113464192","description":"运维后台 | 运维自动化后台 | 游戏运维后台 基于golang的Gin与Vue3编写的一个可以即用的运维自动化后台","archived":false,"fork":false,"pushed_at":"2024-12-23T08:35:50.000Z","size":310,"stargazers_count":4,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-31T17:14:00.796Z","etag":null,"topics":["crud","devops","gin","go","golang","gorm","goroutine","jwt","jwt-token","mariadb","mysql","ops","ops-admin","ssh","websocket","webssh"],"latest_commit_sha":null,"homepage":"http://106.52.66.254:81/home","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/1113464192.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-08-16T10:35:30.000Z","updated_at":"2025-03-25T09:52:41.000Z","dependencies_parsed_at":"2024-12-13T04:37:42.979Z","dependency_job_id":null,"html_url":"https://github.com/1113464192/FreeOpsServer","commit_stats":null,"previous_names":["1113464192/freeopsserver"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1113464192%2FFreeOpsServer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1113464192%2FFreeOpsServer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1113464192%2FFreeOpsServer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/1113464192%2FFreeOpsServer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/1113464192","download_url":"https://codeload.github.com/1113464192/FreeOpsServer/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253009534,"owners_count":21839712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["crud","devops","gin","go","golang","gorm","goroutine","jwt","jwt-token","mariadb","mysql","ops","ops-admin","ssh","websocket","webssh"],"created_at":"2024-12-14T02:14:56.569Z","updated_at":"2025-05-08T05:43:36.025Z","avatar_url":"https://github.com/1113464192.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 欢迎来到FreeOps!\n\u003e 这里是后端代码\n\n[前端代码入口](https://github.com/1113464192/FreeOpsClient)\n\nFreeOps是一个功能齐全的运维自动化平台，只需要接入运维入口脚本即可使用，涵盖有基本的RBAC、每个用户的操作记录、项目管理、服务器管理、云平台同步操作、工单审批、游戏服管理、操作模板管理、模板参数管理、任务管理、任务日志等\n基本上一个公司所需要的运维自动化业务，这里都能涵盖~\n\u003e精力有限，如果后续有人关注到，再补CI等功能\n\n## 功能特性\n\u003e 普通用户(只有get权限且无法查看操作记录)\n\u003e \n\u003e 账密\n\u003e \n\u003e normal1\n\u003e \n\u003e normal1_123456\n\n[项目展示](http://106.52.66.254:81/)\n\n[后端接口展示(swagger websocket在此以get假显示)](http://106.52.66.254:9080/swagger/index.html#/)\n\n\u003e RBAC等常见功能就忽略了，只介绍运维功能\n### 用户操作记录\n\u003e 系统管理-\u003e用户操作记录\n\u003e \n\u003e 为了安全起见，没有给普通用户API权限，但是给了菜单权限以让普通用户看到\n\n包含所有请求与返回，防止单表过大做了水平分表处理。\n### 项目管理\n\u003e 资产管理-\u003e项目管理\n\n有字段限制每个服务器限制部署的 服数/Mem，接入运维脚本后，可以在该页面直接 创建云项目 以及 同步云平台 的项目信息\n单项目单平台也可以多项目单平台\n\u003e 如果单项目单平台，可以将对应服务器的运维管理机设置为127.0.0.1\n### 服务器管理\n\u003e 资产管理-\u003e服务器管理\n\n接入运维脚本后，可以在该页面选择服务器数量进行购买\n### WebSSH\n\u003e 资产管理-\u003e服务器管理\n\u003e\n\u003e 这里key与passphrase示范的是通过配置文件读取使用，为了安全起见demo代码注释了写的功能\n\n可以在网页实现与服务器的终端连接交互，这里的按钮权限(无则不可见按钮)理论上只给运维(便于运维有快捷操作的时候迅速登录服务器进行操作，免得进入xshell等应用)\n\n这里的key与passphrase通过读配置文件(有jumpserver的情况下一般这样子做)，也可以直接每个用户录入密钥与passphrase字段(后端有AESCBC加密与解密的函数，即拿即用，加个字段和接口调用就好了)\n### 游戏服管理\n\u003e 运维管理-\u003e游戏服管理\n\u003e \n\u003e 可改为对应公司业务，这里以作者所在行业举例\n\n包含游服ID、对应的公共服等ID，以及LB、单服最大占用资源等信息可视化展示，以便运维装服脚本获取数据，运维脚本装服成功后携带信息请求接口即可。\n### 模板管理\n\u003e 运维管理-\u003e模板管理\n\n编写模板如：\n\npython3 /data/script/ops_manage.py -a update -r ${server_id}\n\npython3 /data/script/ops_manage.py -a clean -r ${server_id}\n### 模板参数管理\n\u003e 运维管理-\u003e参数模板管理\n\n提前编辑好如：所有服 = serverId\n\n在下面任务管理中提交任务的时候，根据运营从PHP处生成的执行内容，取出关键字(所有服)对应的内容，映射到关联模板命令的变量，避免了人工修改变量出错风险\n### 任务管理\n\u003e 运维管理-\u003e任务管理\n\u003e \n1. 可以关联模板顺序，选择主机(可选择内网执行or外网IP执行)，可选择按顺序执行or多模板同时执行\n2. 在执行前(提交任务工单)还可以选择增删用审批人与命令，可以实时查看增删而致新生成的命令，如果不设置审批人与预设时间，则直接执行。\n3. 在执行前(提交任务工单)可以预设执行时间，以凌晨12.举例：只要审批人(无审批人则到点自动执行)在12.前审批，则会等到12.自动执行。超过12.审批，则不予执行。\n4. 有任务执行时可以点开modal查看任务实时进度。\n### 审批任务\n\u003e 运维管理-\u003e审批任务\n\u003e \n\u003e 有待审批任务会定时间隔弹出message\n\n包含提交人、运营从PHP处生成的执行内容、检查脚本返回的检查内容、待执行的命令、执行的管理机IP、预设执行时间(如有设置) 等关键信息\n### 任务日志\n\u003e 运维管理-\u003e任务日志\n\n任务日志除了基本的每个命令的返回内容与SSH返回码，还包含提交人、运营从PHP处生成的执行内容、运维检查脚本返回的检查内容、审批人等关键信息\n## 部署方式\n### 环境依赖\n#### 前端\n\n - node-v18.20.3\n\n#### 后端\n\n - mysql8.0+/mariadb:11.2\n - go-1.21.7\n\n\u003e P.S：go用1.19试过也可以，没有特殊库绝大多数版本应该通用，Mysql也没有使用特殊字段类型\n\n\n\u003e 部署上述所需环境，然后假设git clone到/data目录下\n### 后端\n#### 数据库\n\u003e 此处以mariadb举例，使用docker便于示例\n\u003e \n\u003e 可以将mariadb换成mysql\n##### vim /data/mariadb-docker.yaml \n\n    version: '3'\n    services:\n      db:\n        image: \"mariadb:11.2\"\n        ports:\n          - \"3306:3306\"\n        volumes:\n          - /data/mariadb-11.2/data:/var/lib/mysql\n        environment:\n          TIME_ZONE: Asia/Shanghai\n          MYSQL_ROOT_PASSWORD: \"yourPassword\"\n##### 启动数据库\n    docker-compose -f mariadb-docker.yaml up -d\n##### 健康检查\n    docker ps\n##### 创建数据库\n    docker exec -it yourDockerContainerID mariadb -uyourUser -p'yourPassword' -e \"CREATE DATABASE yourDatabaseName CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\"\n#### 启动后端服务\n\u003e 配置好configs/config.yaml，尤其是mysql/mariadb路径\n\n    cd /data/FreeOpsServer/ \u0026\u0026 go run main.go\n    // 如果能启动，则Crtrl+C关闭，然后执行编译\n    go build -o FreeOpsServer main.go\n    后台启动(二选一)：nohup ./FreeOpsServer \u003e /dev/null 2\u003e\u00261 \u0026\n    前台启动(二选一)：./FreeOpsServer\n    docker cp /data/FreeOpsServer/init.sql yourDockerContainerID:/tmp/init.sql\n    docker exec -it yourDockerContainerID bash\n    mariadb -uroot -p'yourDBPassword' yourDatabaseName \u003c /tmp/init.sql\n\n### 前端\n\u003e 配置好.env*的对应后端url\n\n    cd /data/FreeOpsClient \u0026\u0026 npm install -g pnpm\n    pnpm i\n    pnpm run build\n### Nginx\n#### 部署\n    apt install nginx\n#### vim /etc/nginx/conf.d/freeOps.conf \n\n    server { \n            listen 80;\n            server_name yourAdmin;\n            proxy_buffer_size 64k;\n            proxy_buffers   32 32k;\n            proxy_busy_buffers_size 128k;\n            access_log /var/log/nginx/freeops.log;\n            error_log /var/log/nginx/freeops_error.log;            \n            location / { \n                root /data/FreeOpsClient/dist;\n                index  index.html index.htm;\n                try_files $uri $uri/ /index.html;\n            } \n    \tlocation /api/ {\n                proxy_pass http://127.0.0.1:9080;\n                proxy_http_version 1.1;\n                proxy_set_header Upgrade $http_upgrade;    # WebSocket 协议升级\n                proxy_set_header Connection \"Upgrade\";\n                proxy_set_header Host $host;\n                proxy_set_header X-Real-IP $remote_addr;\n                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            \n                # CORS 支持\n                add_header 'Access-Control-Allow-Origin' $http_origin;\n                add_header 'Access-Control-Allow-Credentials' 'true';\n                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';\n                add_header 'Access-Control-Allow-Headers' 'DNT,web-token,app-token,Authorization,Accept,Origin,Keep-Alive,User-Agent,X-Mx-ReqToken,X-Data-Type,X-Auth-Token,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,x-request-id';\n                add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';\n            }\n    }\n#### 刷新\n    nginx -t \u0026\u0026 nginx -s reload\n\n## P.S\n1. 可以定时任务检查后台输出是否有日志写入失败,定时任务检查日志十分钟内是否有ERROR\n2. 数据库如果量级不大且对性能要求不高可以改为使用主外键关联，可以省去做约束的时间\n3. 如果新增/删除Model，记得从consts和model的init中更改常量/变量\n\n    \n    \n\n\n\n \n\n## 联系我\n 如果在二开/学习过程中有疑问，可以联系邮箱：fqh1113464192@gmail.com\n 因为这也是我初次从0手搓运维平台，如果有意见或者批评也可以联系我，看到就会回。\n 辛苦看到这里！！再次感谢！\n \n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1113464192%2Ffreeopsserver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F1113464192%2Ffreeopsserver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F1113464192%2Ffreeopsserver/lists"}