{"id":13525937,"url":"https://github.com/axetroy/wsm","last_synced_at":"2025-03-16T13:31:38.733Z","repository":{"id":42935566,"uuid":"222220466","full_name":"axetroy/wsm","owner":"axetroy","description":"🔳Manage you team's server via browser 通过浏览器管理服务器。堡垒机","archived":false,"fork":false,"pushed_at":"2023-07-24T12:45:31.000Z","size":25937,"stargazers_count":76,"open_issues_count":18,"forks_count":15,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-27T09:49:38.780Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/axetroy.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2019-11-17T08:47:13.000Z","updated_at":"2024-05-23T17:33:54.000Z","dependencies_parsed_at":"2024-05-28T07:37:44.539Z","dependency_job_id":null,"html_url":"https://github.com/axetroy/wsm","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fwsm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fwsm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fwsm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/axetroy%2Fwsm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/axetroy","download_url":"https://codeload.github.com/axetroy/wsm/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243817276,"owners_count":20352530,"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":[],"created_at":"2024-08-01T06:01:23.662Z","updated_at":"2025-03-16T13:31:35.670Z","avatar_url":"https://github.com/axetroy.png","language":"Go","funding_links":[],"categories":["Go","堡垒机"],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n## Web Server Manager\n\n![License](https://img.shields.io/github/license/axetroy/wsm.svg)\n![Repo Size](https://img.shields.io/github/repo-size/axetroy/wsm.svg)\n\n[![Build Status](https://github.com/axetroy/wsm/workflows/backend/badge.svg)](https://github.com/axetroy/wsm/actions)\n[![Docker Build Status](https://img.shields.io/docker/cloud/build/axetroy/wsm-backend)](https://hub.docker.com/r/axetroy/wsm-backend/builds)\n[![Docker Pulls](https://img.shields.io/docker/pulls/axetroy/wsm-backend)](https://hub.docker.com/r/axetroy/wsm-backend/builds)\n[![Coverage Status](https://coveralls.io/repos/github/axetroy/wsm/badge.svg?branch=master)](https://coveralls.io/github/axetroy/wsm?branch=master)\n[![Go Report Card](https://goreportcard.com/badge/github.com/axetroy/wsm)](https://goreportcard.com/report/github.com/axetroy/wsm)\n![GitHub go.mod Go version](https://img.shields.io/github/go-mod/go-version/axetroy/wsm)\n\n[![Build Status](https://github.com/axetroy/wsm/workflows/frontend/badge.svg)](https://github.com/axetroy/wsm/actions)\n[![Docker Build Status](https://img.shields.io/docker/cloud/build/axetroy/wsm-frontend)](https://hub.docker.com/r/axetroy/wsm-frontend/builds)\n[![Docker Pulls](https://img.shields.io/docker/pulls/axetroy/wsm-frontend)](https://hub.docker.com/r/axetroy/wsm-frontend/builds)\n[![DeepScan grade](https://deepscan.io/api/teams/6484/projects/8581/branches/105883/badge/grade.svg)](https://deepscan.io/dashboard#view=project\u0026tid=6484\u0026pid=8581\u0026bid=105883)\n\n\u003c/div\u003e\n\n\u003cdiv align=\"center\"\u003e\n通过 Web 来管理远端服务器\n\n创建团队，邀请你的小伙伴加入，管理你的服务器\n\n成员无需关心服务器的地址/帐号/密码/密钥等敏感信息，即可连接服务器进行操作\n\n你在终端的每一步操作，都会被完整地记录下来，并且支持回放功能。**有内鬼，终止交易**\n\n\u003c/div\u003e\n\n\u003cimg src=\"screenshot/1.gif\" width=\"100%\" alt=\"\"/\u003e\n\n\u003ch3 align=\"center\"\u003e特性\u003c/h3\u003e\n\n- [x] 用户无需 密码/私钥 即可连接服务器\n- [x] Web 登录终端\n- [x] 支持打开多个终端\n- [x] 支持团队管理终端，可分配不同的角色到不同的团队\n- [x] 操作记录回放，每一次连接终端，都会记录完整的操作，支持回放\n- [ ] TODO: 镜像终端。用户连接终端后，管理员可镜像终端，实时查看\n- [ ] TODO: 分享一次性终端，可以匿名连接，终端断开不能在链接\n- [x] 支持 Docker 一键部署\n\n使用技术 Golang + Node.js + Nuxt.js 构建，前后端分离\n\n\u003ch2 align=\"center\"\u003e如何本地开发\u003c/h3\u003e\n\n首先确保你已安装\n\n- Golang v1.13.x\n- Node.js v12.x.x\n- Docker\n- Docker Compose\n\n1. 克隆项目\n\n```shell\n$ git clone https://github.com/axetroy/wsm.git $GOPATH/src/github.com/axetroy/wsm\n$ cd $GOPATH/src/github.com/axetroy/wsm\n```\n\n2. 启动数据库依赖(Postgres/Redis)\n\n```shell\n$ cd ./docker\n$ docker-compose up\n```\n\n3. 启动后端 API\n\n```shell\n$ go run cmd/user/main.go start\n```\n\n4. 启动前端页面\n\n```shell\n$ cd ./frontend\n$ yarn\n$ npm run dev\n```\n\n到这里就已经启动完毕，打开浏览器 `http://localhosst:3000`\n\n\u003ch2 align=\"center\"\u003e如何部署\u003c/h2\u003e\n\n部署分为两部分\n\n- 数据库\n- 前端 + 后端\n\n### 数据库\n\n使用 docker-compose 部署数据库\n\n```yaml\nversion: \"3\"\nservices:\n  # 数据库\n  pg:\n    image: postgres:9.6.16-alpine\n    restart: always\n    volumes:\n      - \"./volumes/pg:/var/lib/postgresql/data\"\n    ports:\n      - 54321:5432 # 本机端口:容器端口\n    environment:\n      - POSTGRES_USER=terminal # 用户名\n      - POSTGRES_PASSWORD=terminal # 数据库密码\n      - POSTGRES_DB=terminal # 数据库名\n\n  # 缓存\n  redis:\n    image: redis:5.0.7-alpine\n    restart: always\n    ports:\n      - 6379:6379\n    volumes:\n      - \"./volumes/redis:/data\"\n    environment:\n      - REDIS_PASSWORD=password\n    command: [\"redis-server\", \"--requirepass\", \"password\"]\n```\n\n### 前端 + 后端\n\n部署应用程序，使用 `Nginx` + `前端镜像` + `后端镜像` 进行部署\n\n需要使用 [nginx.conf](nginx.conf) 文件和 [docker-compose.yml](docker-compose.yml) 文件\n\n```yaml\nversion: \"3\"\nservices:\n  # 网关\n  nginx:\n    image: nginx:1.17.7-alpine\n    restart: always\n    volumes:\n      - ./nginx.conf:/etc/nginx/nginx.conf\n      - ./logs/nginx:/var/log/nginx\n    ports:\n      - 8000:80 # 宿主端口:容器端口\n    links:\n      - frontend\n      - backend\n\n  # 前端\n  frontend:\n    image: axetroy/wsm-frontend:latest\n    restart: always\n    links:\n      - backend\n    environment:\n      - API_HOST=http://192.168.1.29:9000 # 请求接口的域名, 请自行更改\n\n  # 后端接口\n  backend:\n    image: axetroy/wsm-backend:latest\n    restart: always\n    ports:\n      - 9000:80\n    environment:\n      # 更多环境变量配置请查看 .env 文件\n      - DB_HOST=192.168.1.29 # 要连接的数据库 IP，请自行更改\n      - DB_PORT=54321 # 要连接的数据库端口\n```\n\n后端接口部分全部由环境变量进行配置，可用的配置选项参考 [.env](.env)\n\n\u003ch2 align=\"center\"\u003e许可协议\u003c/h2\u003e\n\n[Apache License 2.0](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxetroy%2Fwsm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faxetroy%2Fwsm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faxetroy%2Fwsm/lists"}