{"id":17027084,"url":"https://github.com/oldwinter/metacloud","last_synced_at":"2026-05-04T15:33:12.539Z","repository":{"id":108598634,"uuid":"457510312","full_name":"oldwinter/metacloud","owner":"oldwinter","description":"VSCode + Docker doing everything","archived":false,"fork":false,"pushed_at":"2025-08-07T14:57:36.000Z","size":10907,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-13T05:47:00.720Z","etag":null,"topics":["docker","kubernetes","vscode"],"latest_commit_sha":null,"homepage":"","language":"Vue","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/oldwinter.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":"2022-02-09T20:02:34.000Z","updated_at":"2025-08-24T09:11:06.000Z","dependencies_parsed_at":null,"dependency_job_id":"2d5602a5-f766-4282-b1f2-faefb03fa514","html_url":"https://github.com/oldwinter/metacloud","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/oldwinter/metacloud","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldwinter%2Fmetacloud","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldwinter%2Fmetacloud/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldwinter%2Fmetacloud/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldwinter%2Fmetacloud/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oldwinter","download_url":"https://codeload.github.com/oldwinter/metacloud/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oldwinter%2Fmetacloud/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32613360,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-04T10:08:07.713Z","status":"ssl_error","status_checked_at":"2026-05-04T10:08:02.005Z","response_time":58,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["docker","kubernetes","vscode"],"created_at":"2024-10-14T07:46:00.832Z","updated_at":"2026-05-04T15:33:12.497Z","avatar_url":"https://github.com/oldwinter.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://ant.design\"\u003e\n    \u003cimg width=\"200\" src=\"https://github.com/oldwinter/my-pics/blob/master/1024x1024.png\"\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003ch1 align=\"center\"\u003emetacloud\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"https://img.shields.io/badge/golang-1.16-blue\"/\u003e\n\u003c/div\u003e\n\n\u003c!-- TODO: --\u003e\n\n---\n\n\u003c!-- [English](./README-en.md) | 简体中文 --\u003e\n\n# 1. 基本介绍\n\n## 1.1 项目介绍\n\n\u003e metacloud，是工具，也是方法论：\n\u003e 作为工具，它只通过 VSCode + docker，将一台计算机，衍生出无数的独立开发环境。\n\u003e 作为方法论，它将开源社区「最新的思想」和「最热的项目」，融合到工具中，且所见即所得。\n\n## 1.2 项目文档\n\n\u003c!-- [在线文档](https://doc.oldwinter.com) : \u003chttps://doc.oldwinter.com\u003e --\u003e\n\n[[uni-tools/README]]\n\n# haha #牛批\n\n## 1.3 项目预览\n\n[在线预览](https://demo.oldwinter.com): \u003chttps://demo.oldwinter.com\u003e\n\n\u003c!-- ![系统架构图](http://.png) --\u003e\n\n## 1.4 项目特点\n\n- 面向开源社区开发：不造轮子，全部基于开源项目缝合，且只选最新、最酷、最热门的项目\n- 面向云原生开发：要实现 cloud native，先实现 contaier native，顺便完成 service mesh 和 devops\n- 背对云平台开发：使用云却不被任何云绑定，万花丛中过，片叶不沾身\n\n---\n\n# 2. 快速开始\n\n## 2.1 软件安装\n\n注：\n//TODO 超速体验，vscode也用web版本，耗时约1分钟🚀🚀🚀 \u003chttps://github.dev/oldwinter/MetaCloud\u003e\n若要快速体验，请选择本机开发+前端开发模式，耗时约5分钟🚀\n若要完整使用，请选择远程开发+运维开发模式，耗时约1天内🐶\n\n### 2.1.1 本机开发\n\n```text\n本机：安装 [VSCode](https://code.visualstudio.com/download)（Remote-Containers 插件） + [Docker](https://www.docker.com/get-started) + [Nodejs](https://nodejs.org/)\n```\n\n### 2.1.2 远程开发\n\n```text\n本机：安装 VSCode（Remote-SSH 和 Remote-Containers 插件）\n服务器：安装 Docker + [Nodejs](https://nodejs.org/)\n\n注1：若你的服务器在公司的内网而无法 ssh 登陆。可以用开源的内网穿透工具：[frp](https://github.com/fatedier/frp)\n注2：或者去各大公有云，已知aws和gcs目前可白嫖2-12个月。推荐选大陆以外的服务器，天然连通google，机器内存\u003e8GB。\n\n```\n\n## 2.2 环境构建\n\n后文为了统一表述，这里请注意：\n\n若你选择**本机开发**，那后文的**服务器**就是你个人使用的计算机，{server_ip} 就是 localhost；\n若你选择**远程开发**，那后文的**服务器**就是你能 ssh 登陆的那台远程 server, {server_ip}就是其地址。\n\n注1：目前还未适配低权限，请全部使用root权限操作，除非有特别说明。\n\n打开**服务器**的 terminal，\n\n\u003c!-- 📢若你等不及 pull 镜像，且本机已经有 npm，可以先跳过前 2 步，直接本机执行 npm init metacloud 操作\n\n# pull 打包了各种好用工具的「瑞士军刀」镜像\ndocker pull oldwinter/uni-tools:latest\n\n# 启动并进入 uni-tools 容器\ndocker run -it -v /home:/home -v /var/run/docker.sock:/var/run/docker.sock oldwinter/uni-tools zsh --\u003e\n\n```bash\n# 请先确保你的服务器已经安装完成docker，docker-compose，以及npm\ndocker version\ndocker-compose version\nnpm version\n\n# 根据提示，初始化项目，主要执行 git clone， docker build， docker-compose up 等操作\nnpm init metacloud\n```\n\n完成后，根据 terminal 中的打印信息，获得{port}。打开**本机**的浏览器，查看前端界面：\u003chttp://{server_ip}:{port}\u003e ，如果是本机开发，这个地址一般是\u003chttp://localhost:8000\u003e。\n\n## 2.3 启动开发\n\n至此，基本的dev容器已经构建完成并运行，接下来我们探索细节。\n\n\u003c!-- 1. 通用工具型容器 uni-tools。推荐个人使用。里面有各种必备，高效，好玩的命令行工具，你可以考虑带着它去任意机器上玩耍，或者定制一个专属自己的工具型容器，其 dockerfile 位于 `uni-tools/.devcontainer/`。 --\u003e\n\n\u003c!-- 2. 专属工程 devops 容器。推荐团队使用。里面封装好团队共同的开发工具和规范。并有一个小型的 docker in docker 以及 minikube（或者是docker from docker，并复用本机上的minikube）。在这一个容器里，就完全实现了开发改 1 行代码 ==\u003e 10 秒上生产环境的全过程。其 dockerfile 位于 `.devcontainer/` --\u003e\n\n打开**服务器**terminal，\n\n```bash\n# 查看服务器已经构建且运行的 devcontainer\ndocker ps | grep meta\n\nCONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                    NAMES\n0ea65c34050c   mysql:8.0               \"docker-entrypoint.s…\"   7 minutes ago   Up 7 minutes   0.0.0.0:3306-\u003e3306/tcp   meta-dev-mysql\nce9e4d919166   devops_dev-server-toy   \"/bin/sh -c 'pip3 in…\"   7 minutes ago   Up 7 minutes   0.0.0.0:8002-\u003e8002/tcp   meta-dev-server-toy\n6d34662783eb   redis:7.0-rc-bullseye   \"docker-entrypoint.s…\"   7 minutes ago   Up 7 minutes   0.0.0.0:6379-\u003e6379/tcp   meta-dev-redis\n33e1ed2b4489   devops_dev-server-gin   \"/bin/sh -c 'go buil…\"   7 minutes ago   Up 7 minutes   0.0.0.0:8001-\u003e8001/tcp   meta-dev-server-gin\n546983007ace   devops_dev-portal       \"docker-entrypoint.s…\"   7 minutes ago   Up 7 minutes   0.0.0.0:8000-\u003e8000/tcp   meta-dev-portal\n\n# 若选择了 devops 模式体验全工程，还会有一个尚未运行的镜像\ndocker images | grep vsc\n\nREPOSITORY                                                TAG               IMAGE ID       CREATED             SIZE\nvsc-metacloud-612dd3fcdc19c84c66941286bd4a8e42-features   latest            14ab39946ea3   18 hours ago        919MB\n\n```\n\n接着，若选择了**远程开发**，这里需要注意多做一步操作：\n**本机**新打开一个 VSCode 窗口，\n`shift+cmd+p` 打开 VSCode 命令控制台，输入`ssh :connect to host`，根据提示，完成连接操作即可。请自行搞定ssh连接免密码的问题。\n\n后文为了统一表述，这里请注意：\n若你选择了**本机开发**，后文的**服务器VSCode窗口**，就是你本机新开的一个VSCode窗口，\n若你选择了**远程开发**，后文的**服务器VSCode窗口**，就是你通过上一步，已经SSH连接至服务器的窗口。\n\n接着，分为 3 类，根据在上一节做的选择，按需选择 1 种继续操作。或者最好都玩一遍 😄。\n\n### 2.3.1 纯前端开发\n\n**本机**新打开一个**服务器VSCode窗口**，此处设其名为 A，\n\n**ctrl+`** 打开 VSCode 内置 Terminal，\n\n```bash\n\n# 进入前端代码目录\ncd metacloud/portal\n\n# pnpm 的node_modules目录结构整洁，冲这点用它了。\nnpm install -g pnpm\n# 安装依赖\npnpm install\n\n# 启动 portal 开发\npnpm dev\n\n# ! 目前前端工程由于node_modules的存在，挂卷至容器，会造成较大性能问题，此处前端直接在server本地启动\n```\n\n完成后，根据提示，记端口为{port}。打开**本机**的浏览器，查看前端界面：\u003chttp://{server_ip}:{port}\u003e 。改动一行代码感受一下浏览器刷新出新的界面的速度吧。\n\n### 2.3.2 全栈开发\n\n**本机**新打开一个**服务器VSCode窗口**，此处设其名为 B，\n\n这时有2个选择，均可以：\n\n1. `shift+cmd+p` 打开 VSCode 命令控制台，输入 `open folder in container`，选择metacloud工程根目录下的 `server/gin` 目录。此后，此时 VSCode 会默认销毁窗口 B，新建一个 C 窗口，此后这个 C 窗口，就是一个完全独立的微服务开发环境。\n\n2. `shift+cmd+p` 打开 VSCode 命令控制台，输入 `attach to running container`，选择`/meta_server-gin`。此时 VSCode 会默认销毁窗口 B，新建一个窗口 D。此后这个 D 窗口，就是一个完全独立的微服务开发环境。\n\n如要同时调测多个微服务，则再开多个**服务器VSCode窗口**，分别 attach 或 open in container，生出窗口 E,F ...。\n做过后端开发的同学肯定熟悉 attach 这个词语，以前 debug 都是 attach 一个进程，现在对象换成了容器。\n如果你以往深受改1行代码，弄到目标环境上调试却要花10分钟的痛苦折磨。你一定能体会到用这个方法后带来的极致 debug 体验🔥🚀。\n\n接下来我们继续探索细节，简要分析 open in 和 attach 两种方式的特点和适用情况。\n\n找到窗口B， **ctrl+`** 打开 VSCode 内置 Terminal，\n\n```bash\n# 通过 open in 方式打开的开发环境，会默认启动一个vsc前缀的容器，并且VSCode会自动做文件夹目录.devcontaienr所配置的挂卷安装相关的操作。一般用于持续开发。\ndocker ps |grep vsc\n\nCONTAINER ID   IMAGE                                                  COMMAND                  CREATED          STATUS\n89cb454e895b   vsc-toy-08c6c6f809ce645b4ed2263a97524866               \"/bin/sh -c 'echo Co…\"   4 minutes ago    Up 3 minutes\n8ce86db96f85   vsc-gin-78042bf5c69786c6e44bcf9fa3f417a6               \"/bin/sh -c 'echo Co…\"   5 minutes ago    Up 5 minutes\nc05efb0498b4   vsc-portal-b285246c94dcc7d9bbd2b7f34f836be7-features   \"/bin/sh -c 'echo Co…\"   15 minutes ago   Up 7 minutes\n\n# 通过 attach 方式进入到的开发环境，要初始化VSCode 相关配置，耗时较长，而且后续还需要自行做挂在volume等操作。一般用于临时debug。\ndocker ps | grep meta\n\nCONTAINER ID   IMAGE                   COMMAND                  CREATED         STATUS         PORTS                    NAMES\nce9e4d919166   devops_dev-server-toy   \"/bin/sh -c 'pip3 in…\"   7 minutes ago   Up 7 minutes   0.0.0.0:8002-\u003e8002/tcp   meta-dev-server-toy\n33e1ed2b4489   devops_dev-server-gin   \"/bin/sh -c 'go buil…\"   7 minutes ago   Up 7 minutes   0.0.0.0:8001-\u003e8001/tcp   meta-dev-server-gin\n546983007ace   devops_dev-portal       \"docker-entrypoint.s…\"   7 minutes ago   Up 7 minutes   0.0.0.0:8000-\u003e8000/tcp   meta-dev-portal\n\n```\n\n这时候你应该已经能明显体会到：\n\n\u003e **一个窗口 ＝ 一个环境 ＝ 一个服务**\n\n### 2.3.3 运维开发\n\n\u003e 这里目前需要科学上网，要访问谷歌（gcr）和微软（mcr.microsoft.com）自家的被墙的容器镜像仓库。\n\n**本机**新打开一个**服务器VSCode窗口**，此处设其名为 Z，\n\n**ctrl+`** 打开 VSCode 内置 Terminal，\n\n```bash\n# 前文执行环境均为root用户，由于minikube 不支持root用户启动，此处容器内改用vscode用户启动\n# 将工程所属从root修改，以便启动的容器能有修改文件的权限。\n# 请确保{user} {group}的uid和gid均为1000， {workspace}是你的工程根目录\nchown -R {user}:{group} {workspace}\n```\n\n`shift+cmd+p` 打开 VSCode 命令控制台，输入 `open folder in container`，选择metacloud工程根目录。\n\n\u003e 注：此时你处于一个devcontainer中，这个容器默认采用docker in docker 方案，也就是在容器里面，再安装一套docker，并安装minikube，istio\n\n**ctrl+`** 打开 VSCode 内置 Terminal，\n\n```bash\n\n# 初始化安装运维开发环境 docker, minikube 和 istio\nzx devops/scripts/install.mjs\n\n# 构建全部微服务于「生产环境」使用的镜像\nzx devops/scripts/build.mjs\n\n# 发布构建产物：镜像，npm，brew 包等等\nzx devops/scripts/publish.mjs\n\n# 为 k8s 集群创建各类资源，部署微服务\nzx devops/scripts/deploy.mjs\n\n# 确保全部 pod 均正常 running 状态\nkubectl get pod --all-namespaces -w\n\n```\n\n---\n\n# 3. 整体架构\n\n## 3.1 vscode + devcontainer 架构图\n\n![开发流程图]()\n\n## 3.2 微服务系统架构图\n\n![系统架构图]()\n\n## 3.3 目录结构\n\n```bash\n\ntree -a -d  -L 3 --dirsfirst --gitignore\n\n    ├── devops\n    │   ├── helm\n    │   ├── portal\n    │   ├── scripts\n    │   ├── server\n    │   ├── docker-compose.singledev.yaml\n    │   ├── docker-compose.wholedev.yaml\n    │   └── docker-compose.yaml\n    ├── portal\n    │   ├── public\n    │   ├── src\n    │   ├── Dockerfile\n    │   ├── auto-imports.d.ts\n    │   ├── components.d.ts\n    │   ├── env.d.ts\n    │   ├── index.html\n    │   ├── package.json\n    │   ├── pnpm-lock.yaml\n    │   ├── tsconfig.json\n    │   ├── tsconfig.vite-config.json\n    │   └── vite.config.ts\n    ├── server\n    │   ├── gin\n    │   └── toy\n    ├── uni-tools\n    │   ├── metacloud\n    │   ├── scripts\n    │   ├── README.md\n    │   ├── index.js\n    │   ├── package.json\n    │   └── pnpm-lock.yaml\n    ├── LICENSE\n    └── README.md\n\n```\n\n---\n\n# 4. 进阶玩法\n\n- 修改。devcontainer 文件夹，定制团队一致的开发环境\n- 在本机，用 iTerm2，批量连接所有开发环境\n- 在线打开 github 直接开始开发\n- 直接连接至生产环境的 k8s 中的 pod 进行 debug\n- 在已有集群中，快速创建一个新的微服务\n- 将现有业务，快速适配融合至本项目\n\n---\n\n# 5. 技术选择\n\n## 5.1 为什么只用 VSCode + Docker\n\n### 5.1.1 为什么是 VSCode\n\n- 原生支持 devops in container，力度极大\n- 开源、免费、轻量、好用。用户量第一，版本周更\n- 插件机制，满足你的一切幻想，开发者的第二个操作系统\n\n### 5.1.2 为什么是 Docker\n\n- 基础架构即代码，和环境问题说 byebye\n- 秒级启动，极致轻量。我个人 4U8G 的笔记本，可以运行一套 k8s，共 50+个容器\n- 微服务化，devops，cloud native，有 docker 才有这一切\n\n### 有什么劣势？\n\n- 没有劣势，这就是未来 🐯\n\n## 5.2 具体开源技术选型\n\n- 前端：\n  1. 基于 [Vue](https://vuejs.org)\n  2. 使用组件库 [Element Plus](https://github.com/element-plus/element-plus) 构建基础页面\n- 后端：拆分若干个微服务：\n  1. 用 [traefik](https://github.com/traefik/traefik) 作为微服务网关\n  2. 用 [Gin](https://gin-gonic.com/) 快速搭建基础 restful 风格 API，它是一个 [Go](https://go.dev) 语言编写的 Web 框架\n  3. 用 [Python](https://www.python.org) 玩各种新技术的 demo\n  4. 用 [Mysql](https://www.mysql.com/) 和 [Redis](https://redis.io/) 作为数据库中间件\n- 运维\u0026云原生：\n  1. 用 [docker](https:www.docker.com) 进行微服务容器化封装\n  2. 用 [kubernetes](https://kubernetes.io/) 进行容器集群化部署\n  3. 用 [istio](https://istio.io) 进行集群服务网格化治理\n  4. 用 [helm](https://helm.sh/) 进行 k8s 资源的包管理和部署，[docker-compose](https://docs.docker.com/compose/) 仅在开发阶段使用\n- 构建脚本：\n  1. 尝试不用 bash，改用现在很火的 [zx](https://github.com/google/zx) ，进行脚本编写。\n\n---\n\n# 6. 将来也许\n\n- [x] 完成最小可行性版本，串通全流程\n- [ ] 编写详细文档，阐述设计理念\n- [ ] 尝试用 knative 实现 serverless\n- [ ] 体验 openyurt 的边缘治理能力\n- [ ] 完全上云版本，支持生产可用\n- [ ] 践行云原生的工具栈和技术栈的融合思考\n\n# 各大公有云简单对比\n\n| 服务商  | ECS白嫖  | 是否需要外币卡 | 是否已用|\n|---|---|---|---|\n|阿里云| 1年2U2G1M 39元  | ||\n|华为云|1年1U2G1M 39元||已经用了首年优惠|\n|腾讯云|个人2个月免费| |已经用了免费体验2个月|\n|AWS|企业用户12个月免费| 需要master或visa卡\n|Azure|12个月免费|需要master或visa卡\n|GCS||\n\n[[uni-tools/README]]\n[[/elasticsearch/examples/config/values.yaml]]\n[[yaml/README]]\n\n# haha/aa\n\n[[uni-tools/README]]\n[[metacloud-workflow/README]]\n\n[[uni-tools/pnpm-lock.yaml]]\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foldwinter%2Fmetacloud","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foldwinter%2Fmetacloud","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foldwinter%2Fmetacloud/lists"}