├── data ├── docker │ ├── env │ │ ├── minerva-agent.env │ │ ├── etcd.env │ │ └── mysql.env │ ├── standalone_base.yaml │ └── standalone_monitor.yaml └── mockdata │ ├── appnode2.json │ ├── appnode1.json │ └── app.json ├── tests ├── e2e │ ├── e2e.go │ ├── suite_juno_test.go │ └── e2e_test.go └── data │ └── broker │ └── conf │ └── broker.conf ├── .codecov.yml ├── assets ├── public │ ├── CNAME │ ├── home.png │ ├── favicon.png │ ├── home_bg.png │ └── js │ │ ├── prettier │ │ └── v2.0.5 │ │ │ └── package.json │ │ └── jquery │ │ └── v3.4.1 │ │ └── .eslintrc.json ├── src │ ├── pages │ │ ├── demo │ │ │ ├── EnvZoneCascader.tsx │ │ │ ├── AppCreate │ │ │ │ └── index.less │ │ │ ├── NodeCreate │ │ │ │ └── index.less │ │ │ ├── AppNodeCreate │ │ │ │ └── index.less │ │ │ ├── search │ │ │ │ └── service.js │ │ │ ├── demoFn │ │ │ │ ├── index.tsx │ │ │ │ ├── service.js │ │ │ │ └── view.tsx │ │ │ └── demoClass │ │ │ │ ├── index.tsx │ │ │ │ ├── service.js │ │ │ │ └── view.tsx │ │ ├── app │ │ │ ├── components │ │ │ │ ├── Config │ │ │ │ │ ├── components │ │ │ │ │ │ ├── ModalCreate │ │ │ │ │ │ │ └── index.less │ │ │ │ │ │ ├── Editor │ │ │ │ │ │ │ ├── languages │ │ │ │ │ │ │ │ ├── index.ts │ │ │ │ │ │ │ │ └── language.ts │ │ │ │ │ │ │ ├── parsers │ │ │ │ │ │ │ │ ├── parser-ini │ │ │ │ │ │ │ │ │ ├── loc.js │ │ │ │ │ │ │ │ │ ├── api.js │ │ │ │ │ │ │ │ │ └── lexer │ │ │ │ │ │ │ │ │ │ └── api.js │ │ │ │ │ │ │ │ └── parser-toml │ │ │ │ │ │ │ │ │ ├── loc.js │ │ │ │ │ │ │ │ │ └── lexer │ │ │ │ │ │ │ │ │ └── api.js │ │ │ │ │ │ │ └── language.ts │ │ │ │ │ │ ├── EditorMaskLayer │ │ │ │ │ │ │ ├── index.less │ │ │ │ │ │ │ └── index.jsx │ │ │ │ │ │ ├── LeftSide │ │ │ │ │ │ │ ├── components │ │ │ │ │ │ │ │ ├── Publish │ │ │ │ │ │ │ │ │ └── ModalPublish.less │ │ │ │ │ │ │ │ ├── RightMenu │ │ │ │ │ │ │ │ │ └── index.less │ │ │ │ │ │ │ │ └── Menu │ │ │ │ │ │ │ │ │ └── index.less │ │ │ │ │ │ │ └── index.less │ │ │ │ │ │ └── OptionButton │ │ │ │ │ │ │ └── index.less │ │ │ │ │ ├── var.less │ │ │ │ │ └── index.less │ │ │ │ ├── Detail │ │ │ │ │ ├── style.less │ │ │ │ │ ├── service.js │ │ │ │ │ └── view.tsx │ │ │ │ ├── AppHeader │ │ │ │ │ ├── style.less │ │ │ │ │ └── service.js │ │ │ │ └── Test │ │ │ │ │ ├── TaskItem.less │ │ │ │ │ └── StepLogs.less │ │ │ ├── service.js │ │ │ └── view.tsx │ │ ├── DashboardAnalysis │ │ │ ├── components │ │ │ │ ├── Charts │ │ │ │ │ ├── bizcharts.d.ts │ │ │ │ │ ├── bizcharts.tsx │ │ │ │ │ ├── TagCloud │ │ │ │ │ │ └── index.less │ │ │ │ │ ├── TimelineChart │ │ │ │ │ │ └── index.less │ │ │ │ │ ├── Field │ │ │ │ │ │ ├── index.less │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.less │ │ │ │ │ ├── WaterWave │ │ │ │ │ │ └── index.less │ │ │ │ │ └── MiniProgress │ │ │ │ │ │ └── index.less │ │ │ │ ├── PageLoading │ │ │ │ │ └── index.tsx │ │ │ │ └── Trend │ │ │ │ │ └── index.less │ │ │ ├── service.tsx │ │ │ └── utils │ │ │ │ └── Yuan.tsx │ │ ├── proxy │ │ │ ├── Welcome │ │ │ │ ├── welcome_bg1.png │ │ │ │ ├── welcome_bg2.png │ │ │ │ ├── index.less │ │ │ │ └── index.jsx │ │ │ ├── index.less │ │ │ ├── services │ │ │ │ └── proxyintegrat.ts │ │ │ └── models │ │ │ │ └── proxyintegrat.js │ │ ├── test │ │ │ ├── http │ │ │ │ ├── components │ │ │ │ │ ├── BodyTabPane │ │ │ │ │ │ └── index.less │ │ │ │ │ ├── LeftSider │ │ │ │ │ │ ├── CollectionsTab.less │ │ │ │ │ │ ├── index.less │ │ │ │ │ │ ├── RequestItem.less │ │ │ │ │ │ └── RightMenu.less │ │ │ │ │ ├── TestLog │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── ResponseHeaders │ │ │ │ │ │ └── index.tsx │ │ │ │ └── var.less │ │ │ └── grpc │ │ │ │ ├── components │ │ │ │ ├── index.jsx │ │ │ │ ├── public.jsx │ │ │ │ ├── UseCaseMenu.less │ │ │ │ └── SettinngDialog.jsx │ │ │ │ └── var.less │ │ ├── grpcadmin │ │ │ └── components │ │ │ │ ├── Help │ │ │ │ ├── index.less │ │ │ │ └── index.jsx │ │ │ │ └── Header │ │ │ │ └── service.js │ │ ├── confgo │ │ │ ├── config │ │ │ │ ├── view.tsx │ │ │ │ ├── style │ │ │ │ │ └── code.less │ │ │ │ ├── style.less │ │ │ │ └── common.tsx │ │ │ └── tpl │ │ │ │ ├── create.tsx │ │ │ │ ├── view.tsx │ │ │ │ └── service.js │ │ ├── workspace │ │ │ ├── components │ │ │ │ ├── EventList │ │ │ │ │ └── index.less │ │ │ │ ├── Panel │ │ │ │ │ └── index.less │ │ │ │ └── ViewHistory │ │ │ │ │ └── index.less │ │ │ ├── index.less │ │ │ ├── service.js │ │ │ └── view.tsx │ │ ├── Welcome.less │ │ ├── etcd │ │ │ └── services.js │ │ ├── applog │ │ │ ├── services.js │ │ │ └── index.less │ │ ├── manage │ │ │ ├── SettingBlock.less │ │ │ └── services.js │ │ ├── monitor │ │ │ └── services.js │ │ ├── resource │ │ │ ├── appnode │ │ │ │ ├── service.js │ │ │ │ └── view.tsx │ │ │ ├── node │ │ │ │ ├── create.tsx │ │ │ │ ├── view.tsx │ │ │ │ └── service.js │ │ │ ├── zone │ │ │ │ ├── create.tsx │ │ │ │ ├── view.tsx │ │ │ │ └── service.js │ │ │ └── app │ │ │ │ ├── create.tsx │ │ │ │ ├── view.tsx │ │ │ │ └── service.js │ │ ├── analysis │ │ │ ├── deppkg │ │ │ │ └── service.js │ │ │ ├── topology │ │ │ │ └── service.js │ │ │ ├── proxy │ │ │ │ ├── index.less │ │ │ │ └── services │ │ │ │ │ ├── proxymenu.ts │ │ │ │ │ └── proxymanage.ts │ │ │ └── grafana │ │ │ │ └── index.tsx │ │ ├── user │ │ │ ├── login │ │ │ │ └── components │ │ │ │ │ └── Login │ │ │ │ │ ├── LoginContext.tsx │ │ │ │ │ ├── LoginSubmit.tsx │ │ │ │ │ └── index.less │ │ │ └── manage │ │ │ │ └── data.d.ts │ │ ├── permission │ │ │ └── components │ │ │ │ └── menu_tree.less │ │ ├── 404.tsx │ │ ├── Welcome.tsx │ │ ├── cronjob │ │ │ └── types.ts │ │ ├── pprof │ │ │ ├── components │ │ │ │ └── PprofIframe.js │ │ │ └── services.js │ │ └── global │ │ │ └── service.js │ ├── utils │ │ ├── prettier.ts │ │ ├── form.js │ │ ├── utils.less │ │ ├── Authorized.ts │ │ ├── strings.js │ │ ├── searchapppath.js │ │ ├── config.ts │ │ └── permission.ts │ ├── models │ │ ├── cronjob │ │ │ ├── effects.ts │ │ │ └── reducers.ts │ │ ├── types.ts │ │ ├── cronjob.ts │ │ ├── testplatform.ts │ │ ├── config │ │ │ └── reducers.js │ │ └── testplatform │ │ │ └── reducers.ts │ ├── components │ │ ├── PageList │ │ │ └── search.less │ │ ├── EventView │ │ │ ├── tiano.jsx │ │ │ ├── register.jsx │ │ │ ├── style.css │ │ │ ├── userinfo.jsx │ │ │ └── config.jsx │ │ ├── PageLoading │ │ │ └── index.tsx │ │ ├── Table │ │ │ └── index.less │ │ ├── Authorized │ │ │ └── index.tsx │ │ ├── VersionSelect │ │ │ ├── style.less │ │ │ └── index.tsx │ │ ├── HeaderDropdown │ │ │ ├── index.less │ │ │ └── index.tsx │ │ ├── SelectLang │ │ │ └── index.less │ │ ├── NoticeIcon │ │ │ └── index.less │ │ ├── Footer │ │ │ └── index.tsx │ │ ├── HeaderSearch │ │ │ └── index.less │ │ └── ZoneSelect │ │ │ ├── style.less │ │ │ └── index.tsx │ ├── layouts │ │ └── BlankLayout.tsx │ ├── services │ │ ├── menu.ts │ │ ├── idc.ts │ │ ├── zone.ts │ │ ├── system.ts │ │ ├── provider.jsx │ │ ├── analysis.ts │ │ ├── event.ts │ │ ├── node.ts │ │ ├── confgo.ts │ │ ├── access_token.ts │ │ └── grpcadmin.js │ ├── locales │ │ ├── zh-CN │ │ │ ├── component.ts │ │ │ ├── pwa.ts │ │ │ └── globalHeader.ts │ │ ├── zh-TW │ │ │ ├── component.ts │ │ │ ├── pwa.ts │ │ │ └── globalHeader.ts │ │ ├── en-US │ │ │ ├── component.ts │ │ │ ├── pwa.ts │ │ │ └── globalHeader.ts │ │ ├── pt-BR │ │ │ ├── component.ts │ │ │ └── pwa.ts │ │ ├── zh-TW.ts │ │ ├── pt-BR.ts │ │ ├── zh-CN.ts │ │ └── en-US.ts │ ├── manifest.json │ └── access.ts ├── .eslintignore ├── favicon.png ├── .prettierrc.js ├── .stylelintrc.js ├── mock │ └── route.ts ├── jsconfig.json ├── .eslintrc.js ├── config │ └── styles.ts ├── jest.config.js ├── .editorconfig ├── assets.go ├── .prettierignore ├── assets_embeded.go ├── .gitignore └── tsconfig.json ├── pkg ├── notice │ ├── README.md │ └── interface.go ├── model │ ├── view │ │ ├── respGovern │ │ │ ├── errStats.go │ │ │ ├── appEnv.go │ │ │ ├── health.go │ │ │ ├── serverStats.go │ │ │ ├── gormStats.go │ │ │ ├── bigmapStats.go │ │ │ ├── restyStats.go │ │ │ ├── stats.go │ │ │ ├── dyrpcStats.go │ │ │ ├── mongoStats.go │ │ │ ├── redixStats.go │ │ │ ├── leveldbStats.go │ │ │ ├── gustyStats.go │ │ │ └── appInfo.go │ │ ├── reqRegister.go │ │ ├── event.go │ │ ├── k8s.go │ │ ├── junoworker.go │ │ ├── pagination.go │ │ ├── respConfig.go │ │ ├── zone.go │ │ ├── loggerplatform.go │ │ ├── accesstoken.go │ │ ├── respIDC.go │ │ ├── resource.go │ │ ├── tool.go │ │ └── relation.go │ ├── db │ │ ├── model.go │ │ ├── app_view_history.go │ │ ├── user_visited_app.go │ │ ├── cmdb_sync_log.go │ │ ├── config_tpl.go │ │ ├── ops_supervisor_config.go │ │ ├── tool.go │ │ ├── options.go │ │ ├── access_token.go │ │ ├── app_container.go │ │ ├── worker_node.go │ │ ├── user_relation.go │ │ ├── gitlab_event.go │ │ ├── app_package.go │ │ ├── casbin_policy_group.go │ │ ├── system_config.go │ │ ├── user_config.go │ │ ├── zone.go │ │ └── user_visit.go │ ├── go_dep.go │ ├── init.go │ └── regv2_aggregation.go ├── auth │ ├── social │ │ └── models.go │ └── authconfig │ │ └── config_oauth.go ├── util │ ├── file.go │ ├── string.go │ ├── encrypt_test.go │ ├── string_test.go │ ├── file_test.go │ └── queue │ │ └── mutex.go ├── constx │ └── constx.go └── pb │ └── notify.proto ├── internal ├── pkg │ ├── service │ │ ├── applog │ │ │ ├── aliyun.go │ │ │ ├── interface.go │ │ │ └── init.go │ │ ├── k8s │ │ │ ├── cluster_test.go │ │ │ ├── pod_test.go │ │ │ └── common.go │ │ ├── parse │ │ │ ├── README.md │ │ │ ├── manage.go │ │ │ ├── init.go │ │ │ └── parse.go │ │ ├── loggerplatform │ │ │ └── interface.go │ │ ├── appevent │ │ │ └── view.go │ │ ├── confgo │ │ │ ├── config.go │ │ │ └── init.go │ │ ├── casbin │ │ │ ├── const.go │ │ │ ├── constx.go │ │ │ └── model.conf │ │ ├── aliyunlog │ │ │ └── type.go │ │ ├── huaweilog │ │ │ └── type.go │ │ ├── confgov2 │ │ │ ├── init.go │ │ │ └── commit.go │ │ ├── agent │ │ │ └── decrypt.go │ │ ├── user │ │ │ └── init.go │ │ ├── resource │ │ │ └── init.go │ │ ├── appDep │ │ │ ├── app_dep_test.go │ │ │ └── init.go │ │ ├── httptest │ │ │ └── init.go │ │ ├── testplatform │ │ │ └── pipeline │ │ │ │ └── pipeline_test.go │ │ ├── permission │ │ │ └── init.go │ │ ├── clientproxy │ │ │ └── init.go │ │ ├── openauth │ │ │ └── init.go │ │ ├── taskplatform │ │ │ └── init.go │ │ ├── proxy │ │ │ ├── buffer_pool.go │ │ │ └── store.go │ │ ├── proxyintegrat │ │ │ ├── init.go │ │ │ └── proxy_cron.go │ │ ├── sentinel │ │ │ └── init.go │ │ └── grpctest │ │ │ └── init.go │ ├── packages │ │ ├── contrib │ │ │ └── output │ │ │ │ └── msg.go │ │ └── xtest │ │ │ ├── globalstore.go │ │ │ └── interpreter.go │ └── datasource │ │ └── datasource.go └── app │ └── middleware │ ├── gateway.go │ └── proxyauth.go ├── docs ├── logo.png ├── wiki-cn │ └── quickstart.md ├── img │ ├── jaeger.png │ ├── monitorapi.png │ ├── pyroscope.png │ ├── monitorinstance.png │ ├── monitoroverview.png │ └── monitorpyroscope.png └── LICENSEHEADER.txt ├── deployment ├── dockerfiles │ └── mysql │ │ └── Dockerfile ├── overlays │ ├── release │ │ └── kustomization.yaml │ └── dev │ │ ├── juno-agent.yaml │ │ └── kustomization.yaml └── juno │ ├── data │ └── config │ │ ├── juno │ │ ├── entry.sh │ │ ├── casbin_test │ │ │ ├── model.conf │ │ │ └── policy.csv │ │ ├── install.toml │ │ └── juno-prometheus.yml │ │ ├── broker │ │ └── broker.conf │ │ └── pyroscope │ │ └── server.yml │ └── kustomization.yaml ├── .grenrc.yml ├── script └── build │ ├── folder.sh │ └── build_data.sh ├── api └── apiv1 │ ├── permission │ ├── api.go │ ├── permission.go │ ├── menu.go │ └── user.go │ ├── confgov2 │ ├── configstatistics │ │ └── view.go │ └── batch_cluster_publish_config_info.go │ ├── confgo │ └── view.go │ ├── user │ └── view.go │ ├── grafana │ └── grafana.go │ ├── test │ └── platform │ │ └── worker.go │ ├── system │ ├── menu.go │ └── config.go │ ├── analysis │ └── view.go │ ├── proxyintegrat │ ├── group.go │ ├── proxy_ui.go │ └── trace_url.go │ ├── worker │ └── worker.go │ └── event │ └── event.go ├── .github ├── .semantic.yml ├── dependabot.yml └── workflows │ ├── pr.yml │ └── front.yml ├── config ├── casbin_test │ ├── model.conf │ └── policy.csv └── juno-prometheus.yml ├── app ├── adminengine │ └── form_validator.go └── proxyengine │ └── form_validator.go ├── .travis.yml └── cmd ├── juno-admin └── main.go └── juno-proxy └── main.go /data/docker/env/minerva-agent.env: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/e2e/e2e.go: -------------------------------------------------------------------------------- 1 | package e2e 2 | -------------------------------------------------------------------------------- /.codecov.yml: -------------------------------------------------------------------------------- 1 | ignore: 2 | - "example/.*" -------------------------------------------------------------------------------- /assets/public/CNAME: -------------------------------------------------------------------------------- 1 | preview.pro.ant.design -------------------------------------------------------------------------------- /assets/src/pages/demo/EnvZoneCascader.tsx: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pkg/notice/README.md: -------------------------------------------------------------------------------- 1 | # 通知中心 2 | 用于平台产生的各种告警推送。 -------------------------------------------------------------------------------- /internal/pkg/service/applog/aliyun.go: -------------------------------------------------------------------------------- 1 | package applog 2 | -------------------------------------------------------------------------------- /internal/pkg/service/k8s/cluster_test.go: -------------------------------------------------------------------------------- 1 | package k8s 2 | -------------------------------------------------------------------------------- /assets/.eslintignore: -------------------------------------------------------------------------------- 1 | /lambda/ 2 | /scripts 3 | /config 4 | .history -------------------------------------------------------------------------------- /assets/src/pages/demo/AppCreate/index.less: -------------------------------------------------------------------------------- 1 | .CreateModal { 2 | } 3 | -------------------------------------------------------------------------------- /assets/src/pages/demo/NodeCreate/index.less: -------------------------------------------------------------------------------- 1 | .CreateModal { 2 | } 3 | -------------------------------------------------------------------------------- /internal/pkg/service/parse/README.md: -------------------------------------------------------------------------------- 1 | # PARSE 2 | 3 | 配置文件多格式解析功能代码块。 -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/ModalCreate/index.less: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /assets/src/pages/demo/AppNodeCreate/index.less: -------------------------------------------------------------------------------- 1 | .CreateModal { 2 | } 3 | -------------------------------------------------------------------------------- /docs/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/docs/logo.png -------------------------------------------------------------------------------- /docs/wiki-cn/quickstart.md: -------------------------------------------------------------------------------- 1 | [参考文档](http://jupiter.douyu.com/juno/) 2 | -------------------------------------------------------------------------------- /assets/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/assets/favicon.png -------------------------------------------------------------------------------- /data/mockdata/appnode2.json: -------------------------------------------------------------------------------- 1 | { 2 | "app_name":"juno-admin", 3 | "list":[] 4 | } 5 | -------------------------------------------------------------------------------- /docs/img/jaeger.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/docs/img/jaeger.png -------------------------------------------------------------------------------- /assets/public/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/assets/public/home.png -------------------------------------------------------------------------------- /docs/img/monitorapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/docs/img/monitorapi.png -------------------------------------------------------------------------------- /docs/img/pyroscope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/docs/img/pyroscope.png -------------------------------------------------------------------------------- /assets/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/assets/public/favicon.png -------------------------------------------------------------------------------- /assets/public/home_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/assets/public/home_bg.png -------------------------------------------------------------------------------- /docs/img/monitorinstance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/docs/img/monitorinstance.png -------------------------------------------------------------------------------- /docs/img/monitoroverview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/docs/img/monitoroverview.png -------------------------------------------------------------------------------- /pkg/notice/interface.go: -------------------------------------------------------------------------------- 1 | package notice 2 | 3 | type notice interface { 4 | Send(*Message) 5 | } 6 | -------------------------------------------------------------------------------- /data/docker/env/etcd.env: -------------------------------------------------------------------------------- 1 | ALLOW_NONE_AUTHENTICATION=yes 2 | ETCD_ADVERTISE_CLIENT_URLS=http://etcd-server:2379 -------------------------------------------------------------------------------- /deployment/dockerfiles/mysql/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mysql:5.7 2 | 3 | COPY *.sql /docker-entrypoint-initdb.d/ 4 | -------------------------------------------------------------------------------- /docs/img/monitorpyroscope.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/docs/img/monitorpyroscope.png -------------------------------------------------------------------------------- /data/docker/env/mysql.env: -------------------------------------------------------------------------------- 1 | MYSQL_ROOT_PASSWORD=root 2 | MYSQL_DATABASE=juno 3 | MYSQL_USER=root 4 | MYSQL_PASSWORD=root -------------------------------------------------------------------------------- /pkg/model/view/respGovern/errStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | type ErrStats struct { 4 | Err string 5 | } 6 | -------------------------------------------------------------------------------- /assets/.prettierrc.js: -------------------------------------------------------------------------------- 1 | const fabric = require('@umijs/fabric'); 2 | 3 | module.exports = { 4 | ...fabric.prettier, 5 | }; 6 | -------------------------------------------------------------------------------- /assets/.stylelintrc.js: -------------------------------------------------------------------------------- 1 | const fabric = require('@umijs/fabric'); 2 | 3 | module.exports = { 4 | ...fabric.stylelint, 5 | }; 6 | -------------------------------------------------------------------------------- /.grenrc.yml: -------------------------------------------------------------------------------- 1 | --- 2 | dataSource: "commits" 3 | prefix: "" 4 | includeMessages: "commits" 5 | changelogFilename: "CHANGELOG.md" 6 | -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/components/Charts/bizcharts.d.ts: -------------------------------------------------------------------------------- 1 | import * as BizChart from 'bizcharts'; 2 | 3 | export = BizChart; 4 | -------------------------------------------------------------------------------- /assets/src/pages/proxy/Welcome/welcome_bg1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/assets/src/pages/proxy/Welcome/welcome_bg1.png -------------------------------------------------------------------------------- /assets/src/pages/proxy/Welcome/welcome_bg2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/douyu/juno/HEAD/assets/src/pages/proxy/Welcome/welcome_bg2.png -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/components/Charts/bizcharts.tsx: -------------------------------------------------------------------------------- 1 | import * as BizChart from 'bizcharts'; 2 | 3 | export default BizChart; 4 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/var.less: -------------------------------------------------------------------------------- 1 | @editorH: 800px; 2 | @editorBG: #1e1e1e; 3 | @primaryColor: #fff; 4 | @secondColor: #ccc; 5 | -------------------------------------------------------------------------------- /assets/src/pages/test/http/components/BodyTabPane/index.less: -------------------------------------------------------------------------------- 1 | :global { 2 | .bodyEditor .CodeMirror { 3 | height: auto; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/utils/prettier.ts: -------------------------------------------------------------------------------- 1 | import WorkerApi from '@/utils/WorkerApi'; 2 | 3 | export const worker = new WorkerApi('/ant/worker.js'); 4 | -------------------------------------------------------------------------------- /assets/src/models/cronjob/effects.ts: -------------------------------------------------------------------------------- 1 | import { Effects } from './types'; 2 | 3 | const effects: Effects = {}; 4 | 5 | export default effects; 6 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/appEnv.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | type AppEnv struct { 4 | RuntimeStats 5 | Data []string `json:"data"` 6 | } 7 | -------------------------------------------------------------------------------- /assets/mock/route.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | '/api/auth_routes': { 3 | '/form/advanced-form': { authority: ['admin', 'user'] }, 4 | }, 5 | }; 6 | -------------------------------------------------------------------------------- /assets/src/models/cronjob/reducers.ts: -------------------------------------------------------------------------------- 1 | import { Reducers } from './types'; 2 | 3 | const reducers: Reducers = {}; 4 | 5 | export default reducers; 6 | -------------------------------------------------------------------------------- /assets/src/pages/test/http/components/LeftSider/CollectionsTab.less: -------------------------------------------------------------------------------- 1 | .CollectionsTab { 2 | .optionBar { 3 | text-align: right; 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/pages/grpcadmin/components/Help/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/lib/style/themes/default.less'; 2 | 3 | .help { 4 | margin-bottom: 10px; 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/pages/test/grpc/components/index.jsx: -------------------------------------------------------------------------------- 1 | import History from './history'; 2 | import Public from './public'; 3 | 4 | export { History, Public }; 5 | -------------------------------------------------------------------------------- /assets/src/components/PageList/search.less: -------------------------------------------------------------------------------- 1 | .customAdvancedSearch { 2 | :global { 3 | .ant-row { 4 | margin-bottom: 10px; 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/pages/test/grpc/components/public.jsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default function Public(props) { 4 | return <>Public; 5 | } 6 | -------------------------------------------------------------------------------- /deployment/overlays/release/kustomization.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kustomize.config.k8s.io/v1beta1 2 | kind: Kustomization 3 | 4 | resources: 5 | - "../../juno" 6 | -------------------------------------------------------------------------------- /assets/src/layouts/BlankLayout.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Layout: React.FC = ({ children }) => <>{children}; 4 | 5 | export default Layout; 6 | -------------------------------------------------------------------------------- /assets/src/pages/confgo/config/view.tsx: -------------------------------------------------------------------------------- 1 | export interface ConfgoBase { 2 | appName: string; 3 | env: string; 4 | zone_code: string; 5 | appList: any; 6 | } 7 | -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/components/Charts/TagCloud/index.less: -------------------------------------------------------------------------------- 1 | .tagCloud { 2 | overflow: hidden; 3 | canvas { 4 | transform-origin: 0 0; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Detail/style.less: -------------------------------------------------------------------------------- 1 | .lay { 2 | margin: 0px 0 0 5px; 3 | } 4 | 5 | .lay_width_full { 6 | width: 100%; 7 | margin: 5px 5px 5px 5px; 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/pages/workspace/components/EventList/index.less: -------------------------------------------------------------------------------- 1 | .listItem { 2 | .date { 3 | font-size: 14px; 4 | color: #ccc; 5 | padding: 8px 0 8px 0; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/services/menu.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | export async function loadMenu() { 4 | return request(`/api/admin/permission/menu/list`); 5 | } 6 | -------------------------------------------------------------------------------- /internal/pkg/service/loggerplatform/interface.go: -------------------------------------------------------------------------------- 1 | package loggerplatform 2 | 3 | type loggerP interface { 4 | LogStore(env, query, typ, appName string) (string, error) 5 | } 6 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/health.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | // 应用存活信息 4 | type HealthStats struct { 5 | RuntimeStats 6 | Status string `json:"status" label:"状态"` 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/services/idc.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | export async function ServiceGetIdcList() { 4 | return request('/api/admin/resource/zone/list'); 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/services/zone.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | export async function zoneEnvTree() { 4 | return request(`/api/admin/resource/zone/zone_env`); 5 | } 6 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/serverStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | // 应用服务状态信息 4 | type ServerStats struct { 5 | RuntimeStats 6 | Servers interface{} `json:"servers"` 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/service.tsx: -------------------------------------------------------------------------------- 1 | import request from 'umi-request'; 2 | 3 | export async function fakeChartData() { 4 | return request('/api/fake_chart_data'); 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/services/system.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | 3 | export async function loadSystemConfig() { 4 | return request('/api/admin/public/system/config'); 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/locales/zh-CN/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': '展开', 3 | 'component.tagSelect.collapse': '收起', 4 | 'component.tagSelect.all': '全部', 5 | }; 6 | -------------------------------------------------------------------------------- /assets/src/locales/zh-TW/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': '展開', 3 | 'component.tagSelect.collapse': '收起', 4 | 'component.tagSelect.all': '全部', 5 | }; 6 | -------------------------------------------------------------------------------- /script/build/folder.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | RELEASE_PATH=${1:?"release path"} 4 | for dir in $(ls ${RELEASE_PATH}) 5 | do 6 | echo $dir 7 | # [ -d $dir ] && echo $dir 8 | done 9 | -------------------------------------------------------------------------------- /api/apiv1/permission/api.go: -------------------------------------------------------------------------------- 1 | package permission 2 | 3 | // 4 | //func ListAPI(c echo.Context) error { 5 | // 6 | // return output.JSON(c, output.MsgOk, "", casbin.Casbin.Resource.API) 7 | //} 8 | -------------------------------------------------------------------------------- /assets/src/components/EventView/tiano.jsx: -------------------------------------------------------------------------------- 1 | import { Component } from 'react'; 2 | 3 | export default class TianoEventView extends Component { 4 | render() { 5 | return ''; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /pkg/auth/social/models.go: -------------------------------------------------------------------------------- 1 | package social 2 | 3 | type OAuthType int 4 | 5 | const ( 6 | GITHUB OAuthType = iota + 1 7 | GOOGLE 8 | GENERIC 9 | GRAFANA_COM 10 | GITLAB 11 | ) 12 | -------------------------------------------------------------------------------- /assets/src/components/EventView/register.jsx: -------------------------------------------------------------------------------- 1 | import { Component } from 'react'; 2 | 3 | export default class TianoEventView extends Component { 4 | render() { 5 | return '---'; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/locales/en-US/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'Expand', 3 | 'component.tagSelect.collapse': 'Collapse', 4 | 'component.tagSelect.all': 'All', 5 | }; 6 | -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/components/Charts/TimelineChart/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .timelineChart { 4 | background: @component-background; 5 | } 6 | -------------------------------------------------------------------------------- /assets/src/locales/pt-BR/component.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'component.tagSelect.expand': 'Expandir', 3 | 'component.tagSelect.collapse': 'Diminuir', 4 | 'component.tagSelect.all': 'Todas', 5 | }; 6 | -------------------------------------------------------------------------------- /assets/src/pages/Welcome.less: -------------------------------------------------------------------------------- 1 | @import '~antd/lib/style/themes/default.less'; 2 | 3 | .pre { 4 | margin: 12px 0; 5 | padding: 12px 20px; 6 | background: @input-bg; 7 | box-shadow: @card-shadow; 8 | } 9 | -------------------------------------------------------------------------------- /internal/pkg/service/appevent/view.go: -------------------------------------------------------------------------------- 1 | package appevent 2 | 3 | import "github.com/douyu/juno/pkg/model/db" 4 | 5 | type eventMessage struct { 6 | db.AppEvent 7 | HostName []string `json:"host_name"` 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/Editor/languages/index.ts: -------------------------------------------------------------------------------- 1 | import { INI } from './ini'; 2 | import { Toml } from './toml'; 3 | import { Yaml } from './yaml'; 4 | 5 | export { INI, Toml, Yaml }; 6 | -------------------------------------------------------------------------------- /internal/pkg/service/confgo/config.go: -------------------------------------------------------------------------------- 1 | package confgo 2 | 3 | import ( 4 | "github.com/douyu/jupiter/pkg/store/gorm" 5 | ) 6 | 7 | type cmc struct{} 8 | 9 | type confu struct { 10 | DB *gorm.DB 11 | } 12 | -------------------------------------------------------------------------------- /assets/src/models/types.ts: -------------------------------------------------------------------------------- 1 | export interface ResponseData { 2 | code: ResponseCode; 3 | msg: string; 4 | data: T; 5 | } 6 | 7 | export enum ResponseCode { 8 | OK = 0, 9 | InternalError = 1, 10 | } 11 | -------------------------------------------------------------------------------- /internal/pkg/service/applog/interface.go: -------------------------------------------------------------------------------- 1 | package applog 2 | 3 | type applog interface { 4 | DashboardUrl(project, dashboard string) (string, error) 5 | LogStoreUrl(project, store, query string) (string, error) 6 | } 7 | -------------------------------------------------------------------------------- /internal/pkg/service/k8s/pod_test.go: -------------------------------------------------------------------------------- 1 | package k8s 2 | 3 | import ( 4 | "testing" 5 | ) 6 | 7 | func TestKeyLock(t *testing.T) { 8 | k := &keyLock{} 9 | k.Lock("1", "11") 10 | k.UnLock("1", "11") 11 | 12 | } 13 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/gormStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | import "database/sql" 4 | 5 | // gorm状态信息 6 | type GormStats struct { 7 | RuntimeStats 8 | Gorms map[string]sql.DBStats `json:"gustys"` 9 | } 10 | -------------------------------------------------------------------------------- /internal/pkg/service/casbin/const.go: -------------------------------------------------------------------------------- 1 | package casbin 2 | 3 | import ( 4 | _ "embed" 5 | ) 6 | 7 | //go:embed resource.yaml 8 | var resourceContent string 9 | 10 | //go:embed model.conf 11 | var modelContent string 12 | -------------------------------------------------------------------------------- /assets/src/pages/etcd/services.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | export async function etcdList(params) { 5 | return request(`/api/admin/etcd/list?${stringify(params)}`); 6 | } 7 | -------------------------------------------------------------------------------- /assets/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "emitDecoratorMetadata": true, 4 | "experimentalDecorators": true, 5 | "baseUrl": ".", 6 | "paths": { 7 | "@/*": ["./src/*"] 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/AppHeader/style.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .cube { 4 | margin-left: 0px; 5 | margin-top: 20px; 6 | float: left; 7 | width: 100px; 8 | height: 30px; 9 | } 10 | -------------------------------------------------------------------------------- /internal/pkg/service/aliyunlog/type.go: -------------------------------------------------------------------------------- 1 | package aliyunlog 2 | 3 | //LogNode 日志菜单 4 | type LogNode struct { 5 | Value string `json:"value"` 6 | Label string `json:"label"` 7 | Children []*LogNode `json:"children"` 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/components/PageLoading/index.tsx: -------------------------------------------------------------------------------- 1 | import { PageLoading } from '@ant-design/pro-layout'; 2 | 3 | // loading components from code split 4 | // https://umijs.org/plugin/umi-plugin-react.html#dynamicimport 5 | export default PageLoading; 6 | -------------------------------------------------------------------------------- /assets/src/pages/applog/services.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | export async function getLogUrl(params) { 5 | return request(`/api/admin/logger/logstore?${stringify(params)}`); 6 | } 7 | -------------------------------------------------------------------------------- /assets/src/utils/form.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 为了方便过滤空值的情况,如果不这么写依然会传字段,导致form getFieldDecorator 不能设置为空 3 | * @param field 4 | * @returns {*} 5 | */ 6 | export const initialValue = (field) => { 7 | return field ? { initialValue: field } : {}; 8 | }; 9 | -------------------------------------------------------------------------------- /assets/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [require.resolve('@umijs/fabric/dist/eslint')], 3 | globals: { 4 | ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: true, 5 | page: true, 6 | REACT_APP_ENV: true, 7 | }, 8 | }; 9 | -------------------------------------------------------------------------------- /assets/src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Ant Design Pro", 3 | "short_name": "Ant Design Pro", 4 | "display": "standalone", 5 | "start_url": "./?utm_source=homescreen", 6 | "theme_color": "#002140", 7 | "background_color": "#001529" 8 | } 9 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/Editor/parsers/parser-ini/loc.js: -------------------------------------------------------------------------------- 1 | function locStart(cstNode) { 2 | // TODO: TBD 3 | } 4 | 5 | function locEnd(cstNode) { 6 | // TODO: TBD 7 | } 8 | 9 | export { locStart, locEnd }; 10 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/Editor/parsers/parser-toml/loc.js: -------------------------------------------------------------------------------- 1 | function locStart(cstNode) { 2 | // TODO: TBD 3 | } 4 | 5 | function locEnd(cstNode) { 6 | // TODO: TBD 7 | } 8 | 9 | export { locStart, locEnd }; 10 | -------------------------------------------------------------------------------- /assets/src/locales/zh-CN/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': '当前处于离线状态', 3 | 'app.pwa.serviceworker.updated': '有新内容', 4 | 'app.pwa.serviceworker.updated.hint': '请点击“刷新”按钮或者手动刷新页面', 5 | 'app.pwa.serviceworker.updated.ok': '刷新', 6 | }; 7 | -------------------------------------------------------------------------------- /assets/src/locales/zh-TW/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': '當前處於離線狀態', 3 | 'app.pwa.serviceworker.updated': '有新內容', 4 | 'app.pwa.serviceworker.updated.hint': '請點擊“刷新”按鈕或者手動刷新頁面', 5 | 'app.pwa.serviceworker.updated.ok': '刷新', 6 | }; 7 | -------------------------------------------------------------------------------- /assets/src/pages/manage/SettingBlock.less: -------------------------------------------------------------------------------- 1 | .settingBlock { 2 | &:nth-child(n + 2) { 3 | margin-top: 10px; 4 | } 5 | 6 | .header { 7 | margin-bottom: 10px; 8 | .title { 9 | font-weight: bold; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /assets/src/pages/test/grpc/var.less: -------------------------------------------------------------------------------- 1 | @secondaryBGColor: rgb(250, 250, 250); 2 | @primaryBorderStyle: 1px solid #eaeaea; 3 | @secondaryBorderStyle: 0.5px solid #efefef; 4 | @secondaryColor: #999; 5 | @primaryBGColor: #1890ff; 6 | @primaryColor: #505050; 7 | -------------------------------------------------------------------------------- /assets/src/services/provider.jsx: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | export async function fetchAggregationList(params) { 5 | return request(`/api/admin/grpc/aggregation/list?${stringify(params)}`); 6 | } 7 | -------------------------------------------------------------------------------- /internal/pkg/service/parse/manage.go: -------------------------------------------------------------------------------- 1 | package parse 2 | 3 | // GetParseManage .. 4 | func GetParseManage(typ string) Parse { 5 | switch typ { 6 | case TypToml: 7 | return tp 8 | case TypYaml: 9 | return tpy 10 | } 11 | return tp 12 | } 13 | -------------------------------------------------------------------------------- /assets/src/pages/monitor/services.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | export async function getFrameVersion(params) { 5 | return request(`/api/admin/resource/app/frameVersion?${stringify(params)}`); 6 | } 7 | -------------------------------------------------------------------------------- /internal/pkg/service/huaweilog/type.go: -------------------------------------------------------------------------------- 1 | package huaweilog 2 | 3 | type LogNodeMap struct { 4 | Value string `json:"value"` 5 | Label string `json:"label"` 6 | Children map[string]*LogNodeMap `json:"children"` 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/pages/test/http/components/LeftSider/index.less: -------------------------------------------------------------------------------- 1 | @import '../../var'; 2 | 3 | .historyItem { 4 | cursor: pointer; 5 | margin-bottom: 5px; 6 | padding: 5px; 7 | 8 | &:hover { 9 | background-color: @activeBGColor; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /.github/.semantic.yml: -------------------------------------------------------------------------------- 1 | titleOnly: true 2 | allowRevertCommits: true 3 | types: 4 | - feat 5 | - fix 6 | - docs 7 | - style 8 | - refactor 9 | - perf 10 | - test 11 | - build 12 | - ci 13 | - chore 14 | - revert 15 | - change -------------------------------------------------------------------------------- /assets/src/pages/demo/search/service.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | // 获取应用列表 5 | export async function reqSelect(param) { 6 | return request(`/api/admin/analysis/topology/select?${stringify(param)}`); 7 | } 8 | -------------------------------------------------------------------------------- /assets/src/pages/resource/appnode/service.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | // 获取应用列表 5 | export async function getAppList(param) { 6 | return request(`/api/admin/resource/app_node/list?${stringify(param)}`); 7 | } 8 | -------------------------------------------------------------------------------- /assets/config/styles.ts: -------------------------------------------------------------------------------- 1 | const env = process.env.NODE_ENV; 2 | const staticPrefix = env === 'development' ? '' : '/ant'; 3 | 4 | export default [ 5 | staticPrefix + '/js/codemirror/v5.62.3/lib/codemirror.css', 6 | // staticPrefix + '/js/antd/v4.3.4/antd.css' 7 | ]; 8 | -------------------------------------------------------------------------------- /assets/src/access.ts: -------------------------------------------------------------------------------- 1 | // src/access.ts 2 | export default function (initialState: { currentUser?: API.CurrentUser | undefined }) { 3 | const { currentUser } = initialState || {}; 4 | return { 5 | canAdmin: currentUser && currentUser.access === 'admin', 6 | }; 7 | } 8 | -------------------------------------------------------------------------------- /internal/pkg/service/confgov2/init.go: -------------------------------------------------------------------------------- 1 | package confgov2 2 | 3 | import "github.com/douyu/jupiter/pkg/store/gorm" 4 | 5 | var ( 6 | mysql *gorm.DB 7 | ) 8 | 9 | // Init .. 10 | func Init(d *gorm.DB) { 11 | mysql = d 12 | 13 | go clearLockPeriodically() 14 | } 15 | -------------------------------------------------------------------------------- /assets/src/pages/test/http/var.less: -------------------------------------------------------------------------------- 1 | @secondaryBGColor: rgb(250, 250, 250); 2 | @activeBGColor: #eeeeee; 3 | @primaryBorderStyle: 1px solid #eaeaea; 4 | @secondaryBorderStyle: 0.5px solid #efefef; 5 | @secondaryColor: #999; 6 | @successColor: #1890ff; 7 | @primaryColor: #505050; 8 | -------------------------------------------------------------------------------- /assets/src/services/analysis.ts: -------------------------------------------------------------------------------- 1 | import { stringify } from 'qs'; 2 | import request from '@/utils/request'; 3 | 4 | export async function ServiceAnalysisTopologyRelationship(param: any) { 5 | return request(`/api/admin/analysis/topology/relationship?${stringify(param)}`); 6 | } 7 | -------------------------------------------------------------------------------- /pkg/model/view/reqRegister.go: -------------------------------------------------------------------------------- 1 | package view 2 | 3 | type ReqRegistryQuery struct { 4 | AppName string `json:"appName"` 5 | IDCCode string `json:"zone_code"` 6 | IP string `json:"ip"` 7 | HostName string `json:"hostname"` 8 | Env string `json:"env"` 9 | } 10 | -------------------------------------------------------------------------------- /assets/src/components/Table/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .standardTable { 4 | :global { 5 | .ant-table-pagination { 6 | margin-top: 24px; 7 | } 8 | } 9 | 10 | .tableAlert { 11 | margin-bottom: 16px; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /assets/jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | testURL: 'http://localhost:8000', 3 | testEnvironment: './tests/PuppeteerEnvironment', 4 | verbose: false, 5 | globals: { 6 | ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION: false, 7 | localStorage: null, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /pkg/model/db/model.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | type Model struct { 4 | Id int `gorm:"not null;"json:"id"` 5 | CreateTime int64 `gorm:"not null;"json:"create_time"` 6 | UpdateTime int64 `gorm:"not null;"json:"update_time"` 7 | DeleteTime int64 `gorm:"not null;"json:"delete_time"` 8 | } 9 | -------------------------------------------------------------------------------- /pkg/model/view/event.go: -------------------------------------------------------------------------------- 1 | package view 2 | 3 | type ( 4 | ReqEventList struct { 5 | AppName string `query:"app_name"` 6 | Env string `query:"env"` 7 | Zone string `query:"zone"` 8 | 9 | Page int `query:"page"` 10 | PageSize int `query:"page_size"` 11 | } 12 | ) 13 | -------------------------------------------------------------------------------- /internal/pkg/packages/contrib/output/msg.go: -------------------------------------------------------------------------------- 1 | package output 2 | 3 | const ( 4 | MsgOk = 0 5 | MsgRedirect = 302 6 | MsgErr = 1 7 | MsgNoAuth = 14000 8 | MsgOpenAuthFailed = 14001 9 | MsgNeedLogin = 10000 10 | MsgTaskQueueEmpty = 20001 11 | ) 12 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/bigmapStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | // bigmap 状态信息 4 | type BigmapStats struct { 5 | RuntimeStats 6 | Bigmaps map[string]OneBigmap `json:"bigmaps"` 7 | } 8 | 9 | type OneBigmap struct { 10 | // Status string 11 | Config interface{} `json:"config"` 12 | } 13 | -------------------------------------------------------------------------------- /assets/src/pages/demo/demoFn/index.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | /** 3 | * 此方法会跳转到 redirect 参数所在的位置 4 | */ 5 | const Login: React.FC<{}> = () => { 6 | const [submitting, setSubmitting] = useState(false); 7 | return
Hello
; 8 | }; 9 | 10 | export default Login; 11 | -------------------------------------------------------------------------------- /internal/pkg/service/agent/decrypt.go: -------------------------------------------------------------------------------- 1 | package agent 2 | 3 | import ( 4 | "github.com/douyu/juno/pkg/cfg" 5 | "github.com/douyu/juno/pkg/util" 6 | ) 7 | 8 | func Decrypt(cipherText string) (plainText string, err error) { 9 | return util.AESCBCDecrypt(cipherText, cfg.Cfg.Agent.Secret) 10 | } 11 | -------------------------------------------------------------------------------- /internal/pkg/service/user/init.go: -------------------------------------------------------------------------------- 1 | package user 2 | 3 | import "github.com/douyu/jupiter/pkg/store/gorm" 4 | 5 | var ( 6 | User *user 7 | Session *userSession 8 | ) 9 | 10 | func Init(db *gorm.DB) { 11 | initGob() 12 | User = InitUser(db) 13 | Session = InitUserSession() 14 | return 15 | } 16 | -------------------------------------------------------------------------------- /pkg/model/view/k8s.go: -------------------------------------------------------------------------------- 1 | package view 2 | 3 | import v1 "k8s.io/api/core/v1" 4 | 5 | // K8sConfig k8s config 6 | type K8sConfig struct { 7 | ZoneCode string 8 | Domain string 9 | Token string 10 | } 11 | 12 | // PodList .. 13 | type PodList struct { 14 | Items []*v1.Pod `json:"items"` 15 | } 16 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/restyStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | // resty 状态信息 4 | type RestyStats struct { 5 | RuntimeStats 6 | Redixs map[string]OneResty `json:"restys"` 7 | } 8 | 9 | type OneResty struct { 10 | Target string `json:"target"` 11 | Config interface{} `json:"config"` 12 | } 13 | -------------------------------------------------------------------------------- /tests/e2e/suite_juno_test.go: -------------------------------------------------------------------------------- 1 | package e2e 2 | 3 | import ( 4 | . "github.com/onsi/ginkgo/v2" 5 | . "github.com/onsi/gomega" 6 | ) 7 | 8 | var _ = Describe("juno-admin", func() { 9 | Context("SayHello", func() { 10 | It("normal", func() { 11 | Expect(1).To(Equal(1)) 12 | }) 13 | }) 14 | }) 15 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/EditorMaskLayer/index.less: -------------------------------------------------------------------------------- 1 | @import '../../var'; 2 | 3 | .editorMaskLayer { 4 | position: absolute; 5 | height: 100vh; 6 | width: 100%; 7 | background-color: @editorBG; 8 | z-index: 1; 9 | left: 0; 10 | top: 0; 11 | color: @secondColor; 12 | } 13 | -------------------------------------------------------------------------------- /pkg/util/file.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | import "os" 4 | 5 | // IsFileExists ... 6 | func IsFileExists(path string) (bool, error) { 7 | _, err := os.Stat(path) 8 | if err == nil { 9 | return true, nil 10 | } 11 | if os.IsNotExist(err) { 12 | return false, nil 13 | } 14 | return false, err 15 | } 16 | -------------------------------------------------------------------------------- /internal/pkg/service/parse/init.go: -------------------------------------------------------------------------------- 1 | package parse 2 | 3 | const ( 4 | // TypToml .. 5 | TypToml = "toml" 6 | // TypYaml .. 7 | TypYaml = "yaml" 8 | ) 9 | 10 | var ( 11 | tp Parse 12 | tpy Parse 13 | ) 14 | 15 | // Init .. 16 | func Init() { 17 | tp = NewTomlParse() 18 | tpy = NewYanmlParse() 19 | } 20 | -------------------------------------------------------------------------------- /assets/src/locales/en-US/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'You are offline now', 3 | 'app.pwa.serviceworker.updated': 'New content is available', 4 | 'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page', 5 | 'app.pwa.serviceworker.updated.ok': 'Refresh', 6 | }; 7 | -------------------------------------------------------------------------------- /pkg/constx/constx.go: -------------------------------------------------------------------------------- 1 | package constx 2 | 3 | // msgid 4 | const ( 5 | MsgConnectReq = 101 6 | MsgNodeHeartBeatResp = 1001 7 | MsgTestStepUpdateResp = 1002 8 | MsgWorkerHeartBeatResp = 1003 9 | ) 10 | 11 | // mode 12 | 13 | const ( 14 | ModeSingle = "single" 15 | ModeMultiple = "multiple" 16 | ) 17 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/stats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | // 通用状态信息 4 | type RuntimeStats struct { 5 | IP string `json:"ip" label:"IP"` 6 | Hostname string `json:"hostname" label:"Hostname"` 7 | Time string `json:"time" label:"时间"` // 每次展示数据的时间 8 | Err string `json:"err" label:"错误信息"` 9 | } 10 | -------------------------------------------------------------------------------- /internal/pkg/service/resource/init.go: -------------------------------------------------------------------------------- 1 | package resource 2 | 3 | import "github.com/douyu/jupiter/pkg/store/gorm" 4 | 5 | var ( 6 | Resource *resource 7 | ) 8 | 9 | type resource struct { 10 | *gorm.DB 11 | } 12 | 13 | func InitResource(db *gorm.DB) { 14 | Resource = &resource{ 15 | db, 16 | } 17 | return 18 | } 19 | -------------------------------------------------------------------------------- /assets/.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | end_of_line = lf 8 | charset = utf-8 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | 12 | [*.md] 13 | trim_trailing_whitespace = false 14 | 15 | [Makefile] 16 | indent_style = tab 17 | -------------------------------------------------------------------------------- /assets/src/utils/utils.less: -------------------------------------------------------------------------------- 1 | // mixins for clearfix 2 | // ------------------------ 3 | .clearfix() { 4 | zoom: 1; 5 | &::before, 6 | &::after { 7 | display: table; 8 | content: ' '; 9 | } 10 | &::after { 11 | clear: both; 12 | height: 0; 13 | font-size: 0; 14 | visibility: hidden; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /assets/assets.go: -------------------------------------------------------------------------------- 1 | //go:build !embedassets 2 | // +build !embedassets 3 | 4 | package assets 5 | 6 | import ( 7 | "net/http" 8 | "path/filepath" 9 | ) 10 | 11 | var AssetsEmbedded = false 12 | 13 | func Assets() (http.FileSystem, error) { 14 | pathDir := filepath.Join(".", "assets", "dist") 15 | return http.Dir(pathDir), nil 16 | } 17 | -------------------------------------------------------------------------------- /assets/src/pages/test/http/components/LeftSider/RequestItem.less: -------------------------------------------------------------------------------- 1 | @import '../../var'; 2 | 3 | .RequestItem { 4 | font-size: 12px; 5 | padding: 2px 10px; 6 | 7 | .method { 8 | display: inline-block; 9 | width: 40px; 10 | } 11 | .title { 12 | word-wrap: break-word; 13 | word-break: break-all; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /internal/pkg/service/confgo/init.go: -------------------------------------------------------------------------------- 1 | package confgo 2 | 3 | import "github.com/douyu/juno/internal/pkg/invoker" 4 | 5 | var ( 6 | // Cmc ... 7 | Cmc *cmc 8 | // ConfuSrv ... 9 | ConfuSrv *confu 10 | ) 11 | 12 | // Init ... 13 | func Init() { 14 | Cmc = &cmc{} 15 | ConfuSrv = &confu{ 16 | DB: invoker.JunoMysql, 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /assets/.prettierignore: -------------------------------------------------------------------------------- 1 | **/*.svg 2 | package.json 3 | .umi 4 | .umi-production 5 | /dist 6 | .dockerignore 7 | .DS_Store 8 | .eslintignore 9 | *.png 10 | *.toml 11 | docker 12 | .editorconfig 13 | Dockerfile* 14 | .gitignore 15 | .prettierignore 16 | LICENSE 17 | .eslintcache 18 | *.lock 19 | yarn-error.log 20 | .history 21 | CNAME 22 | /build 23 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/LeftSide/components/Publish/ModalPublish.less: -------------------------------------------------------------------------------- 1 | .versionSelectItem { 2 | display: grid; 3 | grid-template-columns: 70px auto 130px; 4 | 5 | .changeLog { 6 | overflow: hidden; 7 | text-overflow: ellipsis; 8 | white-space: nowrap; 9 | padding-right: 10px; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /config/casbin_test/model.conf: -------------------------------------------------------------------------------- 1 | [request_definition] 2 | r = sub, obj, act 3 | 4 | [policy_definition] 5 | p = sub, obj, act 6 | 7 | [role_definition] 8 | g = _, _ 9 | g2 = _, _ 10 | g3 = _,_ 11 | 12 | [policy_effect] 13 | e = some(where (p.eft == allow)) 14 | 15 | [matchers] 16 | m = g(r.sub, p.sub) && g2(r.obj, p.obj) && g3(r.act , p.act) 17 | -------------------------------------------------------------------------------- /deployment/overlays/dev/juno-agent.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: apps/v1 2 | kind: Deployment 3 | metadata: 4 | name: juno-agent 5 | spec: 6 | selector: 7 | matchLabels: 8 | io.kompose.service: juno-agent 9 | template: 10 | metadata: 11 | labels: 12 | name: juno-agent 13 | appName: juno-agent 14 | runEnv: dev -------------------------------------------------------------------------------- /tests/data/broker/conf/broker.conf: -------------------------------------------------------------------------------- 1 | brokerClusterName = DefaultCluster 2 | brokerName = broker-a 3 | brokerId = 0 4 | deleteWhen = 04 5 | autoCreateTopicEnable = true 6 | fileReservedTime = 48 7 | brokerRole = ASYNC_MASTER 8 | flushDiskType = ASYNC_FLUSH 9 | #set `brokerIP1` if you want to set physical IP as broker IP. 10 | brokerIP1=127.0.0.1 11 | -------------------------------------------------------------------------------- /assets/src/pages/proxy/index.less: -------------------------------------------------------------------------------- 1 | .cardContainer { 2 | display: flex; 3 | flex: 1; 4 | flex-direction: column; 5 | :global { 6 | .ant-tabs, 7 | .ant-tabs-content-holder, 8 | .ant-tabs-content, 9 | .ant-tabs-tabpane { 10 | display: flex; 11 | flex: 1; 12 | flex-direction: column; 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /pkg/model/db/app_view_history.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | // AppViewHistory 应用浏览历史记录 4 | type AppViewHistory struct { 5 | ModelT 6 | UID uint `json:"uid"` 7 | Aid uint `json:"aid"` 8 | AppName string `json:"appName"` 9 | } 10 | 11 | // TableName .. 12 | func (AppViewHistory) TableName() string { 13 | return "app_view_history" 14 | } 15 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/dyrpcStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | // redix 状态信息 4 | type DyrpcStats struct { 5 | RuntimeStats 6 | Dyrpcs map[string]OneDyrpc `json:"dyrpcs"` 7 | } 8 | 9 | type OneDyrpc struct { 10 | Mode int `json:"mode"` 11 | GroupID int `json:"groupID"` 12 | Config interface{} `json:"config"` 13 | } 14 | -------------------------------------------------------------------------------- /api/apiv1/confgov2/configstatistics/view.go: -------------------------------------------------------------------------------- 1 | package configstatics 2 | 3 | // Info .. 4 | type Info struct { 5 | Value int `json:"value"` 6 | Name string `json:"name"` 7 | } 8 | 9 | // RespStatics .. 10 | type RespStatics struct { 11 | EnvCnt []Info `json:"env_cnt"` 12 | CmcCnt []Info `json:"cmc_cnt"` 13 | Total int64 `json:"total"` 14 | } 15 | -------------------------------------------------------------------------------- /assets/src/locales/pt-BR/pwa.ts: -------------------------------------------------------------------------------- 1 | export default { 2 | 'app.pwa.offline': 'Você está offline agora', 3 | 'app.pwa.serviceworker.updated': 'Novo conteúdo está disponível', 4 | 'app.pwa.serviceworker.updated.hint': 5 | 'Por favor, pressione o botão "Atualizar" para recarregar a página atual', 6 | 'app.pwa.serviceworker.updated.ok': 'Atualizar', 7 | }; 8 | -------------------------------------------------------------------------------- /deployment/juno/data/config/juno/entry.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | echo "init juno-admin..." 4 | # /usr/local/bin/juno-admin --config=/root/juno/config/install.toml --install=true 5 | # /usr/local/bin/juno-admin --config=/root/juno/config/install.toml --mock=true 6 | /usr/local/bin/juno-admin --config=/root/juno/config/single-region-admin.toml --host=0.0.0.0 7 | 8 | 9 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/mongoStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | import mgo "gopkg.in/mgo.v2" 4 | 5 | // mongo 状态信息 6 | type MongoStats struct { 7 | RuntimeStats 8 | Mongos map[string]OneMongo `json:"mongos"` 9 | } 10 | 11 | type OneMongo struct { 12 | LiveServers []string `json:"liveServers"` 13 | Mode mgo.Mode `json:"mode"` 14 | } 15 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | 3 | updates: 4 | - package-ecosystem: gomod 5 | directory: / 6 | labels: 7 | - dependencies 8 | schedule: 9 | interval: daily 10 | 11 | - package-ecosystem: "github-actions" 12 | directory: "/" 13 | labels: 14 | - dependencies 15 | schedule: 16 | interval: "daily" 17 | -------------------------------------------------------------------------------- /api/apiv1/confgo/view.go: -------------------------------------------------------------------------------- 1 | package confgo 2 | 3 | import "github.com/douyu/juno/pkg/model/db" 4 | 5 | // ReqTplList .. 6 | type ReqTplList struct { 7 | db.CmcTpl 8 | KeywordsType string `query:"keywords_type"` 9 | Keywords string `query:"keywords"` 10 | CurrentPage int `query:"currentPage"` 11 | PageSize int `query:"pageSize"` 12 | } 13 | -------------------------------------------------------------------------------- /deployment/juno/data/config/broker/broker.conf: -------------------------------------------------------------------------------- 1 | brokerClusterName = DefaultCluster 2 | brokerName = broker-a 3 | brokerId = 0 4 | deleteWhen = 04 5 | autoCreateTopicEnable = true 6 | fileReservedTime = 48 7 | brokerRole = ASYNC_MASTER 8 | flushDiskType = ASYNC_FLUSH 9 | #set `brokerIP1` if you want to set physical IP as broker IP. 10 | # brokerIP1=127.0.0.1 11 | -------------------------------------------------------------------------------- /internal/pkg/service/appDep/app_dep_test.go: -------------------------------------------------------------------------------- 1 | package appDep 2 | 3 | import ( 4 | "github.com/douyu/juno/internal/pkg/invoker" 5 | sresource "github.com/douyu/juno/internal/pkg/service/resource" 6 | "github.com/douyu/juno/pkg/cfg" 7 | ) 8 | 9 | func init() { 10 | cfg.InitCfg() 11 | invoker.Init() 12 | sresource.InitResource(invoker.JunoMysql) 13 | } 14 | -------------------------------------------------------------------------------- /assets/src/pages/confgo/config/style/code.less: -------------------------------------------------------------------------------- 1 | :global { 2 | .CodeMirror { 3 | border: 1px solid #eee !important; 4 | height: auto !important; 5 | } 6 | 7 | .configEditor .CodeMirror-scroll { 8 | overflow-y: hidden !important; 9 | overflow-x: auto !important; 10 | } 11 | 12 | td > pre { 13 | word-break: break-word; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /assets/src/pages/grpcadmin/components/Header/service.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | // 获取应用过滤信息 5 | export async function getAppListSrv() { 6 | return request(`/api/app/filter/list?langs=Go`); 7 | } 8 | 9 | // 获取环境和机房数据 10 | export async function getEnv() { 11 | return request(`/api/app/env`); 12 | } 13 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/redixStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | import ( 4 | "github.com/gomodule/redigo/redis" 5 | ) 6 | 7 | // redix 状态信息 8 | type RedixStats struct { 9 | RuntimeStats 10 | Redixs map[string]OneRedix `json:"redixs"` 11 | } 12 | 13 | type OneRedix struct { 14 | Status redis.PoolStats 15 | Target string 16 | Config interface{} 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/pages/proxy/services/proxyintegrat.ts: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | export async function uilist() { 5 | return request('/api/admin/proxyintegrat/uilist'); 6 | } 7 | 8 | export async function traceURL(params) { 9 | return request(`/api/admin/proxyintegrat/traceURL?${stringify(params)}`); 10 | } 11 | -------------------------------------------------------------------------------- /assets/src/pages/workspace/index.less: -------------------------------------------------------------------------------- 1 | .summaryBar { 2 | display: grid; 3 | width: 100%; 4 | grid-template-columns: auto auto; 5 | grid-column-gap: 40px; 6 | padding: 20px 0 20px 0; 7 | } 8 | 9 | .contentBox { 10 | margin-top: 10px; 11 | display: grid; 12 | grid-template-columns: 450px auto; 13 | column-gap: 30px; 14 | min-height: 250px; 15 | } 16 | -------------------------------------------------------------------------------- /deployment/juno/data/config/juno/casbin_test/model.conf: -------------------------------------------------------------------------------- 1 | [request_definition] 2 | r = sub, obj, act 3 | 4 | [policy_definition] 5 | p = sub, obj, act 6 | 7 | [role_definition] 8 | g = _, _ 9 | g2 = _, _ 10 | g3 = _,_ 11 | 12 | [policy_effect] 13 | e = some(where (p.eft == allow)) 14 | 15 | [matchers] 16 | m = g(r.sub, p.sub) && g2(r.obj, p.obj) && g3(r.act , p.act) 17 | -------------------------------------------------------------------------------- /data/mockdata/appnode1.json: -------------------------------------------------------------------------------- 1 | { 2 | "app_name":"douyu-demo", 3 | "list":[ 4 | { 5 | "host_name":"wuhan-host-1-1", 6 | "ip":"192.168.1.1", 7 | "env":"dev", 8 | "region_code":"cn-wuhan", 9 | "region_name":"武汉", 10 | "zone_code":"cn-wuhan-guanggu-f1", 11 | "zone_name":"武汉光谷F1区" 12 | } 13 | ] 14 | } 15 | -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/components/PageLoading/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Spin } from 'antd'; 3 | 4 | // loading components from code split 5 | // https://umijs.org/plugin/umi-plugin-react.html#dynamicimport 6 | export default () => ( 7 |
8 | 9 |
10 | ); 11 | -------------------------------------------------------------------------------- /api/apiv1/permission/permission.go: -------------------------------------------------------------------------------- 1 | package permission 2 | 3 | import ( 4 | "github.com/douyu/juno/internal/pkg/packages/contrib/output" 5 | "github.com/douyu/juno/internal/pkg/service/casbin" 6 | "github.com/labstack/echo/v4" 7 | ) 8 | 9 | func MenuAPITree(c echo.Context) (err error) { 10 | return output.JSON(c, output.MsgOk, "success", casbin.Casbin.Resource.Permission) 11 | } 12 | -------------------------------------------------------------------------------- /assets/src/components/Authorized/index.tsx: -------------------------------------------------------------------------------- 1 | import Authorized from './Authorized'; 2 | import Secured from './Secured'; 3 | import check from './CheckPermissions'; 4 | import renderAuthorize from './renderAuthorize'; 5 | 6 | Authorized.Secured = Secured; 7 | Authorized.check = check; 8 | 9 | const RenderAuthorize = renderAuthorize(Authorized); 10 | 11 | export default RenderAuthorize; 12 | -------------------------------------------------------------------------------- /assets/src/models/cronjob.ts: -------------------------------------------------------------------------------- 1 | import { DefaultState, Type } from '@/models/cronjob/types'; 2 | import effects from '@/models/cronjob/effects'; 3 | import reducers from '@/models/cronjob/reducers'; 4 | 5 | const CronJobModel: Type = { 6 | namespace: 'cronjob', 7 | effects: effects, 8 | reducers: reducers, 9 | state: DefaultState, 10 | }; 11 | 12 | export default CronJobModel; 13 | -------------------------------------------------------------------------------- /pkg/pb/notify.proto: -------------------------------------------------------------------------------- 1 | syntax = "proto3"; 2 | 3 | package pb; 4 | 5 | service Proxy { 6 | rpc Notify (stream NotifyReq) returns (stream NotifyResp); 7 | } 8 | 9 | //新增连接信息通知 10 | message NotifyReq 11 | { 12 | uint32 msgId = 1; 13 | bytes msg = 2 ; 14 | } 15 | 16 | message NotifyResp 17 | { 18 | uint32 code = 1; 19 | uint32 msgId = 2; 20 | bytes msg = 3; 21 | } 22 | -------------------------------------------------------------------------------- /.github/workflows/pr.yml: -------------------------------------------------------------------------------- 1 | name: "Lint PR" 2 | 3 | on: 4 | pull_request: 5 | types: 6 | - opened 7 | - edited 8 | - synchronize 9 | 10 | jobs: 11 | main: 12 | name: Validate PR title 13 | runs-on: ubuntu-latest 14 | steps: 15 | - uses: amannn/action-semantic-pull-request@v5 16 | env: 17 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 18 | -------------------------------------------------------------------------------- /api/apiv1/user/view.go: -------------------------------------------------------------------------------- 1 | package user 2 | 3 | import "github.com/douyu/juno/pkg/model/db" 4 | 5 | type ReqUserList struct { 6 | CurrentPage int `query:"currentPage"` 7 | PageSize int `query:"pageSize"` 8 | } 9 | 10 | type ReqUserCreate struct { 11 | db.User 12 | } 13 | 14 | type ReqUserUpdate struct { 15 | db.User 16 | } 17 | 18 | type ReqUserDelete struct { 19 | db.User 20 | } 21 | -------------------------------------------------------------------------------- /assets/src/pages/proxy/Welcome/index.less: -------------------------------------------------------------------------------- 1 | .welcome_wrap { 2 | font-size: 24px; 3 | text-align: center; 4 | padding-top: 50px; 5 | color: #5f4700; 6 | font-weight: 200; 7 | height: 100%; 8 | background-color: #fff; 9 | min-width: 600px; 10 | .title { 11 | font-size: 100px; 12 | } 13 | .subtitle { 14 | font-size: 30px; 15 | margin-bottom: 40px; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/leveldbStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | import "github.com/syndtr/goleveldb/leveldb" 4 | 5 | // levelDB 状态信息 6 | type LeveldbStats struct { 7 | RuntimeStats 8 | Leveldbs map[string]OneLeveldb `json:"leveldbs"` 9 | } 10 | 11 | type OneLeveldb struct { 12 | // Status string 13 | Err string `json:"err"` 14 | Stats leveldb.DBStats `json:"stats"` 15 | } 16 | -------------------------------------------------------------------------------- /api/apiv1/grafana/grafana.go: -------------------------------------------------------------------------------- 1 | package grafana 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/douyu/juno/internal/pkg/service/grafana" 7 | "github.com/labstack/echo/v4" 8 | ) 9 | 10 | func Proxy(c echo.Context) (err error) { 11 | err = grafana.Proxy(c) 12 | if err != nil { 13 | return c.String(http.StatusInternalServerError, "Grafana访问失败:"+err.Error()) 14 | } 15 | 16 | return 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/pages/analysis/deppkg/service.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | // 获取应用列表 5 | export async function reqSelect(param) { 6 | return request(`/api/admin/analysis/topology/select?${stringify(param)}`); 7 | } 8 | 9 | export async function reqList(param) { 10 | return request(`/api/admin/analysis/deppkg/list?${stringify(param)}`); 11 | } 12 | -------------------------------------------------------------------------------- /internal/pkg/service/httptest/init.go: -------------------------------------------------------------------------------- 1 | package httptest 2 | 3 | import ( 4 | "github.com/douyu/jupiter/pkg/store/gorm" 5 | "github.com/go-resty/resty/v2" 6 | ) 7 | 8 | var ( 9 | option Option 10 | ) 11 | 12 | type ( 13 | Option struct { 14 | DB *gorm.DB 15 | Client *resty.Client 16 | } 17 | ) 18 | 19 | func Init(opt Option) { 20 | option = opt 21 | option.Client = resty.New() 22 | } 23 | -------------------------------------------------------------------------------- /internal/pkg/service/testplatform/pipeline/pipeline_test.go: -------------------------------------------------------------------------------- 1 | package pipeline 2 | 3 | import ( 4 | "encoding/json" 5 | "testing" 6 | ) 7 | 8 | func TestJobGitPull(t *testing.T) { 9 | payload := JobGitPull( 10 | "https://github.com/linux/linux", 11 | "master", 12 | "token", 13 | ) 14 | 15 | payloadBytes, _ := json.Marshal(payload) 16 | t.Logf("payload = %s", string(payloadBytes)) 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/pages/analysis/topology/service.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | // 获取应用列表 5 | export async function reqSelect(param) { 6 | return request(`/api/admin/analysis/topology/select?${stringify(param)}`); 7 | } 8 | 9 | export async function reqList(param) { 10 | return request(`/api/admin/analysis/topology/list?${stringify(param)}`); 11 | } 12 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/LeftSide/index.less: -------------------------------------------------------------------------------- 1 | .leftSide { 2 | color: #fff; 3 | background-color: #252526; 4 | // flex: 0 0 300px; 5 | position: absolute; 6 | top: 0; 7 | bottom: 0; 8 | width: 300px; 9 | display: flex; 10 | 11 | // grid-template-columns: 60px auto; 12 | } 13 | 14 | .main { 15 | flex: 1; 16 | display: flex; 17 | flex-direction: column; 18 | } 19 | -------------------------------------------------------------------------------- /assets/src/components/VersionSelect/style.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .container > * { 4 | background-color: @popover-bg; 5 | border-radius: 4px; 6 | box-shadow: @shadow-1-down; 7 | } 8 | 9 | @media screen and (max-width: @screen-xs) { 10 | .container { 11 | width: 100% !important; 12 | } 13 | .container > * { 14 | border-radius: 0 !important; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /assets/src/pages/confgo/config/style.less: -------------------------------------------------------------------------------- 1 | .site-collapse-custom-collapse .site-collapse-custom-panel { 2 | background: #fff; 3 | border-radius: 2px; 4 | margin-bottom: 24px; 5 | border: 0px; 6 | overflow: hidden; 7 | } 8 | 9 | .cube { 10 | width: 50px; 11 | float: left; 12 | display: block; 13 | } 14 | 15 | .cube-title { 16 | width: 300px; 17 | float: left; 18 | display: block; 19 | } 20 | -------------------------------------------------------------------------------- /config/casbin_test/policy.csv: -------------------------------------------------------------------------------- 1 | p, peng, default, setting/update 2 | p, duminxiang, roombase , monitor 3 | p, liuteng, data_important, monitor 4 | p, liuteng, data_important, method_common_write 5 | 6 | g, alice, data_group_admin 7 | g2, roomcate, data_important 8 | g2, roomattach, data_important 9 | g3, config_read, method_common_read 10 | g3, config_write, method_common_write 11 | g3, pprof, method_common_read 12 | -------------------------------------------------------------------------------- /pkg/model/db/user_visited_app.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | type UserVisitedApp struct { 4 | ID int 5 | AppName string `json:"app_name" gorm:"app_name"` 6 | UserName string `json:"user_name" gorm:"user_name"` 7 | VisitedTime int64 `json:"visited_time" gorm:"column:visited_time"` 8 | } 9 | 10 | // TableName ... 11 | func (UserVisitedApp) TableName() string { 12 | return "user_visited_app" 13 | } 14 | -------------------------------------------------------------------------------- /assets/src/components/HeaderDropdown/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .container > * { 4 | background-color: @popover-bg; 5 | border-radius: 4px; 6 | box-shadow: @shadow-1-down; 7 | } 8 | 9 | @media screen and (max-width: @screen-xs) { 10 | .container { 11 | width: 100% !important; 12 | } 13 | .container > * { 14 | border-radius: 0 !important; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /internal/pkg/service/k8s/common.go: -------------------------------------------------------------------------------- 1 | package k8s 2 | 3 | import "time" 4 | 5 | // dataRetentionTime .. 6 | const dataRetentionTime = time.Hour * 24 * 3 7 | 8 | // cleanInterval .. 9 | const cleanInterval = time.Minute * 30 10 | 11 | const ( 12 | podListAllNamespaces = "/api/v1/pods" 13 | podItem = "/api/v1/namespaces/%s/pods/%s" 14 | podLog = "/api/v1/namespaces/%s/pods/%s/log" 15 | ) 16 | -------------------------------------------------------------------------------- /internal/pkg/service/permission/init.go: -------------------------------------------------------------------------------- 1 | package permission 2 | 3 | import "github.com/douyu/jupiter/pkg/store/gorm" 4 | 5 | type Option struct { 6 | DB *gorm.DB 7 | GitlabOAuthApiUrl string 8 | GitlabOAuthEnabled bool 9 | ProductionEnvs []string 10 | } 11 | 12 | func Init(o Option) { 13 | initUserGroup(o.DB) 14 | initAppGroup(o.DB) 15 | initUser(o.DB) 16 | initPermission(o) 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/pages/confgo/config/common.tsx: -------------------------------------------------------------------------------- 1 | import { FormComponentProps } from 'antd/lib/form'; 2 | 3 | export interface CommonProps { 4 | name: string; 5 | appName: string; 6 | zone_code: string; 7 | namespace: string; 8 | instanceList: []; 9 | token: { 10 | token: string; 11 | expire: string; 12 | }; 13 | } 14 | 15 | export interface CommonPropsWithForm extends CommonProps, FormComponentProps {} 16 | -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/components/Charts/Field/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .field { 4 | margin: 0; 5 | overflow: hidden; 6 | white-space: nowrap; 7 | text-overflow: ellipsis; 8 | .label, 9 | .number { 10 | font-size: @font-size-base; 11 | line-height: 22px; 12 | } 13 | .number { 14 | margin-left: 8px; 15 | color: @heading-color; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /internal/pkg/service/clientproxy/init.go: -------------------------------------------------------------------------------- 1 | package clientproxy 2 | 3 | import ( 4 | "github.com/douyu/juno/pkg/cfg" 5 | "github.com/douyu/juno/pkg/constx" 6 | ) 7 | 8 | // ClientProxy .. 9 | var ClientProxy clientProxy 10 | 11 | // Init ... 12 | func Init() { 13 | if cfg.Cfg.App.Mode == constx.ModeMultiple { 14 | ClientProxy = initMultiProxy() 15 | } else { 16 | ClientProxy = initSingleProxy() 17 | } 18 | return 19 | } 20 | -------------------------------------------------------------------------------- /pkg/model/view/respGovern/gustyStats.go: -------------------------------------------------------------------------------- 1 | package respGovern 2 | 3 | import ( 4 | "google.golang.org/grpc/connectivity" 5 | ) 6 | 7 | // gusty状态信息 8 | type GustyStats struct { 9 | RuntimeStats 10 | Gustys map[string]OneGusty `json:"gustys"` 11 | } 12 | 13 | type OneGusty struct { 14 | State connectivity.State `json:"state"` 15 | Target string `json:"target"` 16 | Config interface{} `json:"config"` 17 | } 18 | -------------------------------------------------------------------------------- /app/adminengine/form_validator.go: -------------------------------------------------------------------------------- 1 | package adminengine 2 | 3 | import "github.com/go-playground/validator/v10" 4 | 5 | type ( 6 | FormValidator struct { 7 | validator *validator.Validate 8 | } 9 | ) 10 | 11 | func NewValidator() *FormValidator { 12 | return &FormValidator{ 13 | validator: validator.New(), 14 | } 15 | } 16 | 17 | func (f *FormValidator) Validate(i interface{}) error { 18 | return f.validator.Struct(i) 19 | } 20 | -------------------------------------------------------------------------------- /app/proxyengine/form_validator.go: -------------------------------------------------------------------------------- 1 | package proxyengine 2 | 3 | import "github.com/go-playground/validator/v10" 4 | 5 | type ( 6 | FormValidator struct { 7 | validator *validator.Validate 8 | } 9 | ) 10 | 11 | func NewValidator() *FormValidator { 12 | return &FormValidator{ 13 | validator: validator.New(), 14 | } 15 | } 16 | 17 | func (f *FormValidator) Validate(i interface{}) error { 18 | return f.validator.Struct(i) 19 | } 20 | -------------------------------------------------------------------------------- /pkg/model/db/cmdb_sync_log.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | // 发布环境 4 | type CmdbSyncLog struct { 5 | ID int `gorm:"primary_key" json:"id"` 6 | Aid int `json:"aid"` // 项目id 7 | Uid int `json:"uid"` // juno用户id 8 | Log string `json:"log"` // 日志明细 9 | CreateTime int64 `json:"create_time"` 10 | } 11 | 12 | // TableName 表名 13 | func (CmdbSyncLog) TableName() string { 14 | return "cmdb_sync_log" 15 | } 16 | -------------------------------------------------------------------------------- /pkg/model/view/junoworker.go: -------------------------------------------------------------------------------- 1 | package view 2 | 3 | type ( 4 | WorkerHeartbeat struct { 5 | IP string `json:"ip"` 6 | Port int `json:"port"` 7 | HostName string `json:"host_name"` 8 | RegionCode string `json:"region_code"` 9 | RegionName string `json:"region_name"` 10 | ZoneCode string `json:"zone_code"` 11 | ZoneName string `json:"zone_name"` 12 | Env string `json:"env"` 13 | } 14 | ) 15 | -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/components/Charts/index.less: -------------------------------------------------------------------------------- 1 | .miniChart { 2 | position: relative; 3 | width: 100%; 4 | .chartContent { 5 | position: absolute; 6 | bottom: -28px; 7 | width: 100%; 8 | > div { 9 | margin: 0 -5px; 10 | overflow: hidden; 11 | } 12 | } 13 | .chartLoading { 14 | position: absolute; 15 | top: 16px; 16 | left: 50%; 17 | margin-left: -7px; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /deployment/juno/data/config/juno/casbin_test/policy.csv: -------------------------------------------------------------------------------- 1 | p, peng, default, setting/update 2 | p, duminxiang, roombase , monitor 3 | p, liuteng, data_important, monitor 4 | p, liuteng, data_important, method_common_write 5 | 6 | g, alice, data_group_admin 7 | g2, roomcate, data_important 8 | g2, roomattach, data_important 9 | g3, config_read, method_common_read 10 | g3, config_write, method_common_write 11 | g3, pprof, method_common_read 12 | -------------------------------------------------------------------------------- /internal/pkg/service/openauth/init.go: -------------------------------------------------------------------------------- 1 | package openauth 2 | 3 | import ( 4 | "github.com/douyu/juno/pkg/model/db" 5 | "github.com/douyu/jupiter/pkg/store/gorm" 6 | ) 7 | 8 | var ( 9 | OpenAuthService *openAuthService 10 | ) 11 | 12 | func Init(dbConn *gorm.DB) { 13 | OpenAuthService = &openAuthService{ 14 | db: dbConn, 15 | accessTokens: make(map[string]db.AccessToken), 16 | } 17 | 18 | OpenAuthService.init() 19 | } 20 | -------------------------------------------------------------------------------- /assets/src/models/testplatform.ts: -------------------------------------------------------------------------------- 1 | import { DefaultState, TestPlatformType } from '@/models/testplatform/types'; 2 | import reducers from '@/models/testplatform/reducers'; 3 | import effects from '@/models/testplatform/effects'; 4 | 5 | const TestPlatformModel: TestPlatformType = { 6 | namespace: 'testPlatform', 7 | state: DefaultState, 8 | effects: effects, 9 | reducers: reducers, 10 | }; 11 | 12 | export default TestPlatformModel; 13 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/Editor/languages/language.ts: -------------------------------------------------------------------------------- 1 | import { languages, Thenable } from 'monaco-editor'; 2 | import LanguageConfiguration = languages.LanguageConfiguration; 3 | import IMonarchLanguage = languages.IMonarchLanguage; 4 | 5 | export interface Language { 6 | id: () => string; 7 | configuration: () => LanguageConfiguration; 8 | tokensProvider: () => IMonarchLanguage | Thenable; 9 | } 10 | -------------------------------------------------------------------------------- /internal/app/middleware/gateway.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "github.com/douyu/juno/internal/pkg/service/gateway" 5 | "github.com/labstack/echo/v4" 6 | ) 7 | 8 | func ProxyGatewayMW(next echo.HandlerFunc) echo.HandlerFunc { 9 | return func(c echo.Context) error { 10 | // 检查是否在网关代理的列表里面 11 | if gateway.IsDomainToProxy(c.Request().Host) { 12 | return gateway.Proxy(c) 13 | } 14 | 15 | return next(c) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /internal/pkg/service/casbin/constx.go: -------------------------------------------------------------------------------- 1 | package casbin 2 | 3 | import ( 4 | "fmt" 5 | ) 6 | 7 | const ( 8 | GroupTypeUser = "user" 9 | GroupTypeApp = "app" 10 | GroupTypeURL = "url" 11 | ) 12 | 13 | func CasbinGroupKey(gType string, name string) (key string) { 14 | return fmt.Sprintf("group_%s:%s", gType, name) 15 | } 16 | 17 | func CasbinAppObjKey(appName, appEnv string) string { 18 | return fmt.Sprintf("%s:%s", appName, appEnv) 19 | } 20 | -------------------------------------------------------------------------------- /assets/assets_embeded.go: -------------------------------------------------------------------------------- 1 | //go:build embedassets 2 | // +build embedassets 3 | 4 | package assets 5 | 6 | import ( 7 | "embed" 8 | "io/fs" 9 | "net/http" 10 | ) 11 | 12 | var AssetsEmbedded = true 13 | 14 | //go:embed dist 15 | var assets embed.FS 16 | 17 | func Assets() (http.FileSystem, error) { 18 | fsys, err := fs.Sub(assets, "dist") 19 | if err != nil { 20 | 21 | return nil, err 22 | } 23 | t := http.FS(fsys) 24 | return t, nil 25 | } 26 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/LeftSide/components/RightMenu/index.less: -------------------------------------------------------------------------------- 1 | .rightMenu { 2 | position: absolute; 3 | width: 200px; 4 | height: 200px; 5 | background-color: #252526; 6 | box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.5); 7 | color: #cccccc; 8 | 9 | .menuList { 10 | padding: 0; 11 | margin: 0; 12 | list-style: none; 13 | 14 | li { 15 | height: 32px; 16 | display: block; 17 | } 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /assets/src/pages/user/login/components/Login/LoginContext.tsx: -------------------------------------------------------------------------------- 1 | import { createContext } from 'react'; 2 | 3 | export interface LoginContextProps { 4 | tabUtil?: { 5 | addTab: (id: string) => void; 6 | removeTab: (id: string) => void; 7 | }; 8 | updateActive?: (activeItem: { [key: string]: string } | string) => void; 9 | } 10 | 11 | const LoginContext: React.Context = createContext({}); 12 | 13 | export default LoginContext; 14 | -------------------------------------------------------------------------------- /assets/src/components/EventView/style.css: -------------------------------------------------------------------------------- 1 | .listItem { 2 | width: 100%; 3 | } 4 | 5 | .envInfo { 6 | margin-left: 10px; 7 | } 8 | 9 | .username { 10 | margin: 0 6px 0 6px; 11 | font-weight: bolder; 12 | } 13 | 14 | .createTime { 15 | font-size: 12px; 16 | } 17 | 18 | .absoluteTime { 19 | float: right; 20 | } 21 | 22 | .eventInfo { 23 | padding-left: 10px; 24 | } 25 | 26 | .cmLine { 27 | margin-top: 10px; 28 | } 29 | 30 | .infoLine { 31 | } 32 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/AppHeader/service.js: -------------------------------------------------------------------------------- 1 | import request from '@/utils/request'; 2 | import { stringify } from 'qs'; 3 | 4 | // 获取应用过滤信息 5 | export async function getAppListSrv() { 6 | return request(`/api/app/filter/list?langs=Go`); 7 | } 8 | 9 | // 获取环境和机房数据 10 | export async function getEnv() { 11 | return request(`/api/app/env`); 12 | } 13 | 14 | export async function ServiceAppList() { 15 | return request(`/api/admin/resource/app/list`); 16 | } 17 | -------------------------------------------------------------------------------- /assets/src/pages/permission/components/menu_tree.less: -------------------------------------------------------------------------------- 1 | .menuTree { 2 | width: 100%; 3 | 4 | .menuItem { 5 | //padding-left: 20px; 6 | width: 100%; 7 | 8 | .menuItemContainer { 9 | padding: 5px 5px; 10 | border-radius: 5px; 11 | display: grid; 12 | background-color: #eeeeee00; 13 | transition: background-color 0.3s; 14 | 15 | &:hover { 16 | background-color: #eeeeeeff; 17 | } 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /pkg/model/db/config_tpl.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | type CmcTpl struct { 4 | Id int `gorm:"not null;primary_key;AUTO_INCREMENT"json:"id"` 5 | TplType string `gorm:"not null;"json:"tpl_type";query:"tpl_type"` 6 | Content string `gorm:"not null;type:longtext"json:"content"` 7 | CreateTime int64 `gorm:"not null;"json:"create_time"` 8 | UpdateTime int64 `gorm:"not null;"json:"update_time"` 9 | } 10 | 11 | func (CmcTpl) TableName() string { 12 | return "cmc_tpl" 13 | } 14 | -------------------------------------------------------------------------------- /pkg/model/view/pagination.go: -------------------------------------------------------------------------------- 1 | package view 2 | 3 | // 响应 4 | type Pagination struct { 5 | Current int `json:"current"` 6 | Total int64 `json:"total"` 7 | PageSize int `json:"pageSize"` 8 | } 9 | 10 | func NewPagination(current int, pageSize int) *Pagination { 11 | p := &Pagination{} 12 | p.Current = current 13 | p.PageSize = pageSize 14 | if p.Current == 0 { 15 | p.Current = 1 16 | } 17 | if p.PageSize == 0 { 18 | p.PageSize = 20 19 | } 20 | return p 21 | } 22 | -------------------------------------------------------------------------------- /assets/src/pages/404.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Result } from 'antd'; 2 | import React from 'react'; 3 | import { history } from 'umi'; 4 | 5 | const NoFoundPage: React.FC<{}> = () => ( 6 | history.push('/')}> 12 | Back Home 13 | 14 | } 15 | /> 16 | ); 17 | 18 | export default NoFoundPage; 19 | -------------------------------------------------------------------------------- /data/docker/standalone_base.yaml: -------------------------------------------------------------------------------- 1 | version: "2" 2 | services: 3 | etcd: 4 | container_name: etcd 5 | image: bitnami/etcd:latest 6 | env_file: 7 | - ./env/etcd.env 8 | ports: 9 | - "2379:2379" 10 | - "2380:2380" 11 | restart: on-failure 12 | mysql: 13 | container_name: mysql 14 | image: mysql:latest 15 | env_file: 16 | - ./env/mysql.env 17 | depends_on: 18 | - etcd 19 | ports: 20 | - "3306:3306" 21 | restart: on-failure -------------------------------------------------------------------------------- /assets/src/pages/demo/demoClass/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | export interface HomeProps {} 3 | 4 | export default class Base extends React.Component { 5 | constructor(props: HomeProps) { 6 | super(props); 7 | this.state = {}; 8 | } 9 | 10 | componentWillMount() {} 11 | 12 | componentDidMount(): void {} 13 | 14 | componentWillReceiveProps(nextProps: any, nextContext: any) {} 15 | 16 | render() { 17 | return
Hello
; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /config/juno-prometheus.yml: -------------------------------------------------------------------------------- 1 | scrape_configs: 2 | # The job name is added as a label `job=` to any timeseries scraped from this config. 3 | - job_name: "prometheus" 4 | 5 | # metrics_path defaults to '/metrics' 6 | # scheme defaults to 'http'. 7 | 8 | static_configs: 9 | - targets: ["localhost:9090"] 10 | 11 | - job_name: "node" 12 | file_sd_configs: 13 | - refresh_interval: 1m 14 | files: 15 | - "/home/www/system/prometheus/conf/*.yml" 16 | -------------------------------------------------------------------------------- /internal/app/middleware/proxyauth.go: -------------------------------------------------------------------------------- 1 | package middleware 2 | 3 | import ( 4 | "github.com/douyu/juno/internal/pkg/packages/contrib/output" 5 | "github.com/douyu/juno/pkg/cfg" 6 | "github.com/labstack/echo/v4" 7 | ) 8 | 9 | func ProxyAuth(next echo.HandlerFunc) echo.HandlerFunc { 10 | return func(c echo.Context) error { 11 | if c.Request().Header.Get("Token") == cfg.Cfg.ProxyAuth.Token { 12 | return next(c) 13 | } 14 | 15 | return output.JSON(c, output.MsgNoAuth, "forbidden") 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/components/EventView/userinfo.jsx: -------------------------------------------------------------------------------- 1 | import { Component } from 'react'; 2 | import { Avatar } from 'antd'; 3 | import styles from './style.css'; 4 | 5 | export default class UserInfo extends Component { 6 | render() { 7 | const { name, avatar } = this.props; 8 | 9 | return ( 10 | 11 | 12 | {name} 13 | 14 | {name} 15 | 16 | ); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /api/apiv1/test/platform/worker.go: -------------------------------------------------------------------------------- 1 | package platform 2 | 3 | import ( 4 | "github.com/douyu/juno/internal/app/core" 5 | "github.com/douyu/juno/internal/pkg/packages/contrib/output" 6 | "github.com/douyu/juno/internal/pkg/service/testplatform" 7 | ) 8 | 9 | func WorkerZones(c *core.Context) (err error) { 10 | zones, err := testplatform.WorkerZones() 11 | if err != nil { 12 | return c.OutputJSON(output.MsgErr, err.Error()) 13 | } 14 | 15 | return c.OutputJSON(output.MsgOk, "", c.WithData(zones)) 16 | } 17 | -------------------------------------------------------------------------------- /internal/pkg/service/taskplatform/init.go: -------------------------------------------------------------------------------- 1 | package taskplatform 2 | 3 | import ( 4 | "github.com/douyu/juno/internal/pkg/service/taskplatform/cronjob" 5 | "github.com/douyu/juno/pkg/cfg" 6 | "github.com/douyu/jupiter/pkg/store/gorm" 7 | ) 8 | 9 | var ( 10 | Job *cronjob.CronJob 11 | ) 12 | 13 | type ( 14 | Option struct { 15 | DB *gorm.DB 16 | } 17 | ) 18 | 19 | func Init(o Option) { 20 | if cfg.Cfg.App.Mode == "local" { 21 | return 22 | } 23 | Job = cronjob.New(o.DB) 24 | Job.StartWatch() 25 | } 26 | -------------------------------------------------------------------------------- /assets/src/pages/analysis/proxy/index.less: -------------------------------------------------------------------------------- 1 | .proxyAdmin { 2 | position: absolute; 3 | top: 0; 4 | right: 0; 5 | bottom: 0; 6 | left: 0; 7 | display: flex; 8 | flex-direction: column; 9 | padding-top: 12px; 10 | padding-left: 12px; 11 | background: #fff; 12 | :global { 13 | .ant-tabs, 14 | .ant-tabs-content-holder, 15 | .ant-tabs-content, 16 | .ant-tabs-tabpane { 17 | flex: 1; 18 | } 19 | .ant-tabs-content-holder { 20 | overflow-y: auto; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /pkg/model/db/ops_supervisor_config.go: -------------------------------------------------------------------------------- 1 | package db 2 | 3 | type OpsSupervisorConfig struct { 4 | ID int `gorm:"primary_key" json:"id"` 5 | Aid int // 项目ID 6 | AppName string // 项目名称 7 | OpsAppName string // 项目发布名称 8 | ZoneCode string 9 | AccessKey string // 接口公钥 10 | AccessSecret string // 接口私钥 11 | CreateTime int64 12 | UpdateTime int64 13 | } 14 | 15 | // TableName 表名 16 | func (OpsSupervisorConfig) TableName() string { 17 | return "ops_supervisor_config" 18 | } 19 | -------------------------------------------------------------------------------- /assets/src/pages/workspace/components/Panel/index.less: -------------------------------------------------------------------------------- 1 | .panel { 2 | background-color: #fff; 3 | padding: 20px; 4 | border-radius: 5px; 5 | box-shadow: 0 0 10px rgba(195, 213, 221, 0.59), 0 0 12px rgba(0, 0, 0, 0.08); 6 | 7 | .header { 8 | padding-bottom: 10px; 9 | overflow: hidden; 10 | 11 | .title { 12 | float: left; 13 | font-weight: bold; 14 | } 15 | .actions { 16 | float: right; 17 | text-align: right; 18 | } 19 | } 20 | 21 | .content { 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /pkg/model/view/respConfig.go: -------------------------------------------------------------------------------- 1 | package view 2 | 3 | type RespConfig struct { 4 | AppName string `json:"app_name"` 5 | Aid int `json:"aid"` 6 | Config []RespOneConfig `json:"config"` 7 | } 8 | 9 | type RespOneConfig struct { 10 | Env string `json:"env"` 11 | ZoneCode string `json:"zone_code"` 12 | Content string `json:"content"` 13 | AppName string `json:"app_name"` 14 | Aid int `json:"aid"` 15 | Format string `json:"format"` 16 | FileName string `json:"fileName"` 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/pages/Welcome.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { PageHeaderWrapper } from '@ant-design/pro-layout'; 3 | import { Card } from 'antd'; 4 | 5 | // const CodePreview: React.FC<{}> = ({ children }) => ( 6 | //
 7 | //     
 8 | //       {children}
 9 | //     
10 | //   
11 | // ); 12 | 13 | export default (): React.ReactNode => ( 14 | 15 | Hello 16 | 17 | ); 18 | -------------------------------------------------------------------------------- /internal/pkg/service/appDep/init.go: -------------------------------------------------------------------------------- 1 | package appDep 2 | 3 | import ( 4 | "time" 5 | 6 | "github.com/douyu/juno/internal/pkg/invoker" 7 | "github.com/douyu/jupiter/pkg/conf" 8 | "github.com/go-resty/resty/v2" 9 | ) 10 | 11 | var AppDep *appDep 12 | 13 | //Init .. 14 | func Init() { 15 | AppDep = &appDep{ 16 | DB: invoker.JunoMysql, 17 | Client: resty.New().SetHostURL(conf.GetString("godep.gitlab.host")).SetDebug(false).SetTimeout(time.Second * 3).SetAuthToken(conf.GetString("godep.gitlab.token")), 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /assets/src/pages/user/manage/data.d.ts: -------------------------------------------------------------------------------- 1 | export interface Member { 2 | avatar: string; 3 | name: string; 4 | id: string; 5 | } 6 | 7 | export interface BasicListItemDataType { 8 | oaid: number; 9 | uid: number; 10 | username: string; 11 | nickname: string; 12 | token: string; 13 | secret: string; 14 | email: string; 15 | avatarUrl: string; 16 | webUrl: string; 17 | state: string; 18 | hash: string; 19 | create_time: number; 20 | update_time: number; 21 | access: string; 22 | password: string; 23 | } 24 | -------------------------------------------------------------------------------- /internal/pkg/packages/xtest/globalstore.go: -------------------------------------------------------------------------------- 1 | package xtest 2 | 3 | //GlobalStore 用于测试用例在执行过程中设置全局变量从而在测试用例之间共享数据 4 | type GlobalStore struct { 5 | data map[string]interface{} 6 | } 7 | 8 | func NewGlobalStore() *GlobalStore { 9 | return &GlobalStore{ 10 | data: map[string]interface{}{}, 11 | } 12 | } 13 | 14 | func (g *GlobalStore) Set(key string, value interface{}) { 15 | g.data[key] = value 16 | } 17 | 18 | func (g *GlobalStore) Get(key string) (value interface{}) { 19 | value, _ = g.data[key] 20 | 21 | return 22 | } 23 | -------------------------------------------------------------------------------- /deployment/overlays/dev/kustomization.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: kustomize.config.k8s.io/v1beta1 2 | kind: Kustomization 3 | 4 | resources: 5 | - "../../juno" 6 | 7 | images: 8 | - name: ghcr.io/douyu/juno-admin 9 | newName: ghcr.io/douyu/juno-admin-dev 10 | - name: ghcr.io/douyu/juno-agent 11 | newName: ghcr.io/douyu/juno-agent-dev 12 | - name: ghcr.io/douyu/mysql 13 | newName: ghcr.io/douyu/mysql-dev 14 | 15 | patches: 16 | - target: 17 | kind: Deployment 18 | name: juno-agent 19 | path: juno-agent.yaml 20 | -------------------------------------------------------------------------------- /assets/src/pages/cronjob/types.ts: -------------------------------------------------------------------------------- 1 | import { ValueEnumObj } from '@ant-design/pro-table/es/Table'; 2 | 3 | export const StatusValueEnums: ValueEnumObj = { 4 | waiting: { 5 | status: 'Default', 6 | text: '未运行', 7 | }, 8 | processing: { 9 | status: 'Processing', 10 | text: '运行中', 11 | }, 12 | success: { 13 | status: 'Success', 14 | text: '成功', 15 | }, 16 | failed: { 17 | status: 'Error', 18 | text: '失败', 19 | }, 20 | timeout: { 21 | status: 'Warning', 22 | text: '超时', 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /assets/src/components/SelectLang/index.less: -------------------------------------------------------------------------------- 1 | @import '~antd/es/style/themes/default.less'; 2 | 3 | .menu { 4 | :global(.anticon) { 5 | margin-right: 8px; 6 | } 7 | :global(.ant-dropdown-menu-item) { 8 | min-width: 160px; 9 | } 10 | } 11 | 12 | .dropDown { 13 | line-height: @layout-header-height; 14 | vertical-align: top; 15 | cursor: pointer; 16 | > span { 17 | font-size: 16px !important; 18 | transform: none !important; 19 | svg { 20 | position: relative; 21 | top: -1px; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /internal/pkg/service/proxy/buffer_pool.go: -------------------------------------------------------------------------------- 1 | package proxy 2 | 3 | import ( 4 | "net/http/httputil" 5 | "sync" 6 | ) 7 | 8 | type bufferPool struct { 9 | pool *sync.Pool 10 | } 11 | 12 | func NewBufferPool() httputil.BufferPool { 13 | return &bufferPool{ 14 | pool: new(sync.Pool), 15 | } 16 | } 17 | 18 | func (b *bufferPool) Get() []byte { 19 | buf := b.pool.Get() 20 | if buf == nil { 21 | return make([]byte, 8192) 22 | } 23 | return buf.([]byte) 24 | } 25 | 26 | func (b *bufferPool) Put(buf []byte) { 27 | b.pool.Put(buf) 28 | } 29 | -------------------------------------------------------------------------------- /assets/src/pages/confgo/tpl/create.tsx: -------------------------------------------------------------------------------- 1 | import { Form, Input, Button, Select, Card, message } from 'antd'; 2 | import { PageHeaderWrapper } from '@ant-design/pro-layout'; 3 | import React from 'react'; 4 | import { reqCreate } from './service'; 5 | import CommonForm from './form'; 6 | 7 | export default class Base extends React.Component { 8 | render() { 9 | return ( 10 | 11 | 12 | 13 | 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/pages/grpcadmin/components/Help/index.jsx: -------------------------------------------------------------------------------- 1 | import { Button, Col, Row } from 'antd'; 2 | import React from 'react'; 3 | import style from './index.less'; 4 | const Help = (props) => { 5 | return ( 6 | 7 | 8 | 13 | 14 | 15 | ); 16 | }; 17 | 18 | export default Help; 19 | -------------------------------------------------------------------------------- /pkg/model/view/zone.go: -------------------------------------------------------------------------------- 1 | package view 2 | 3 | import "fmt" 4 | 5 | type SelectData struct { 6 | Title string `json:"name"` 7 | Value string `json:"value"` 8 | } 9 | 10 | type ( 11 | RespEnvZone map[string][]RespEnvZoneItem // env => zones 12 | 13 | RespEnvZoneItem struct { 14 | ZoneCode string `json:"zone_code"` 15 | ZoneName string `json:"zone_name"` 16 | } 17 | ) 18 | 19 | type UniqZone struct { 20 | Env string 21 | Zone string 22 | } 23 | 24 | func (u UniqZone) String() string { 25 | return fmt.Sprintf("%s.%s", u.Env, u.Zone) 26 | } 27 | -------------------------------------------------------------------------------- /assets/src/models/config/reducers.js: -------------------------------------------------------------------------------- 1 | export default { 2 | _setZoneList(state, { payload }) { 3 | return { 4 | ...state, 5 | zoneList: payload || [], 6 | }; 7 | }, 8 | _apply(state, { payload }) { 9 | return { 10 | ...state, 11 | ...payload, 12 | }; 13 | }, 14 | _setCurrentConfigContent(state, { payload }) { 15 | let currentConfig = { 16 | ...state.currentConfig, 17 | content: payload, 18 | }; 19 | return { 20 | ...state, 21 | currentConfig, 22 | }; 23 | }, 24 | }; 25 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/index.less: -------------------------------------------------------------------------------- 1 | @import './var'; 2 | 3 | .container { 4 | position: absolute; 5 | top: 0; 6 | bottom: 0; 7 | left: 0; 8 | right: 0; 9 | display: flex; 10 | // height: @editorH; 11 | background-color: #1e1e1e; 12 | // margin-top: 10px; 13 | // height: 100%; 14 | .main { 15 | // background-color: blue; 16 | // flex: 1; 17 | position: absolute; 18 | left: 300px; 19 | right: 0; 20 | top: 0; 21 | bottom: 0; 22 | display: flex; 23 | flex-direction: column; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /assets/src/pages/resource/node/create.tsx: -------------------------------------------------------------------------------- 1 | import { Form, Input, Button, Select, Card, message } from 'antd'; 2 | import { PageHeaderWrapper } from '@ant-design/pro-layout'; 3 | import React from 'react'; 4 | import { reqCreate } from './service'; 5 | import CommonForm from './form'; 6 | 7 | export default class Base extends React.Component { 8 | render() { 9 | return ( 10 | 11 | 12 | 13 | 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/pages/resource/zone/create.tsx: -------------------------------------------------------------------------------- 1 | import { Form, Input, Button, Select, Card, message } from 'antd'; 2 | import { PageHeaderWrapper } from '@ant-design/pro-layout'; 3 | import React from 'react'; 4 | import { reqCreate } from './service'; 5 | import CommonForm from './form'; 6 | 7 | export default class Base extends React.Component { 8 | render() { 9 | return ( 10 | 11 | 12 | 13 | 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /api/apiv1/system/menu.go: -------------------------------------------------------------------------------- 1 | package system 2 | 3 | import ( 4 | "github.com/douyu/juno/internal/pkg/packages/contrib/output" 5 | casbin2 "github.com/douyu/juno/internal/pkg/service/casbin" 6 | "github.com/douyu/juno/internal/pkg/service/user" 7 | "github.com/labstack/echo/v4" 8 | ) 9 | 10 | func MenuList(c echo.Context) (err error) { 11 | u := user.GetUser(c) 12 | 13 | menu, err := casbin2.Casbin.UserMenu(u) 14 | if err != nil { 15 | return output.JSON(c, output.MsgErr, err.Error()) 16 | } 17 | 18 | return output.JSON(c, output.MsgOk, "", menu) 19 | } 20 | -------------------------------------------------------------------------------- /assets/src/pages/DashboardAnalysis/components/Charts/Field/index.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import styles from './index.less'; 3 | 4 | export interface FieldProps { 5 | label: React.ReactNode; 6 | value: React.ReactNode; 7 | style?: React.CSSProperties; 8 | } 9 | 10 | const Field: React.FC = ({ label, value, ...rest }) => ( 11 |
12 | {label} 13 | {value} 14 |
15 | ); 16 | 17 | export default Field; 18 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Config/components/Editor/language.ts: -------------------------------------------------------------------------------- 1 | import * as monaco from 'monaco-editor'; 2 | import { INI, Toml, Yaml } from './languages'; 3 | 4 | const languages = [Toml, INI, Yaml]; 5 | 6 | export default function initLanguage() { 7 | for (let lang of languages) { 8 | monaco.languages.register({ 9 | id: lang.id(), 10 | }); 11 | 12 | monaco.languages.setLanguageConfiguration(lang.id(), lang.configuration()); 13 | 14 | monaco.languages.setMonarchTokensProvider(lang.id(), lang.tokensProvider()); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /api/apiv1/analysis/view.go: -------------------------------------------------------------------------------- 1 | package analysis 2 | 3 | import "github.com/douyu/juno/pkg/model/db" 4 | 5 | type ReqTopologyList struct { 6 | db.AppTopology 7 | CurrentPage int `query:"currentPage"` 8 | PageSize int `query:"pageSize"` 9 | } 10 | 11 | type RespRelationship struct { 12 | Aid int `json:"aid"` 13 | Name string `json:"name"` 14 | Type string `json:"type"` 15 | Source string `json:"source"` 16 | Target string `json:"target"` 17 | MateData string `json:"mate_data"` 18 | UpdateTime int64 `json:"update_time"` 19 | } 20 | -------------------------------------------------------------------------------- /pkg/util/string.go: -------------------------------------------------------------------------------- 1 | package util 2 | 3 | func CommonPrefix(arr []string) string { 4 | if len(arr) == 0 { 5 | return "" 6 | } 7 | 8 | minLen := len(arr[0]) 9 | for _, s := range arr { 10 | if len(s) < minLen { 11 | minLen = len(s) 12 | } 13 | } 14 | 15 | if minLen == 0 { 16 | return "" 17 | } 18 | 19 | prefix := arr[0][:minLen] 20 | for _, s := range arr { 21 | for i := 1; i <= minLen; i++ { 22 | if prefix[:i] != s[:i] { 23 | prefix = prefix[:i-1] 24 | minLen = len(prefix) 25 | } 26 | } 27 | } 28 | 29 | return prefix 30 | } 31 | -------------------------------------------------------------------------------- /api/apiv1/permission/menu.go: -------------------------------------------------------------------------------- 1 | package permission 2 | 3 | import ( 4 | "github.com/douyu/juno/internal/pkg/packages/contrib/output" 5 | "github.com/douyu/juno/internal/pkg/service/casbin" 6 | "github.com/douyu/juno/internal/pkg/service/user" 7 | "github.com/labstack/echo/v4" 8 | ) 9 | 10 | func ListMenu(c echo.Context) (err error) { 11 | u := user.GetUser(c) 12 | 13 | menu, err := casbin.Casbin.UserMenu(u) 14 | if err != nil { 15 | return output.JSON(c, output.MsgErr, err.Error()) 16 | } 17 | 18 | return output.JSON(c, output.MsgOk, "success", menu) 19 | } 20 | -------------------------------------------------------------------------------- /api/apiv1/proxyintegrat/group.go: -------------------------------------------------------------------------------- 1 | package proxyintegrat 2 | 3 | import "github.com/labstack/echo/v4" 4 | 5 | // Group api group 6 | func Group(g *echo.Group) { 7 | g.GET("/uilist", UIList) 8 | g.GET("/traceURL", TraceURL) 9 | g.GET("/proxyMenuList", ProxyMenuList) 10 | g.POST("/proxyMenuCreateOrUpdate", ProxyMenuCreateOrUpdate) 11 | g.POST("/proxyMenuDelete", ProxyMenuDelete) 12 | 13 | g.GET("/proxyManageList", ProxyManageList) 14 | g.POST("/proxyManageCreateOrUpdate", ProxyManageCreateOrUpdate) 15 | g.POST("/proxyManageDelete", ProxyManageDelete) 16 | 17 | } 18 | -------------------------------------------------------------------------------- /assets/src/pages/app/components/Test/TaskItem.less: -------------------------------------------------------------------------------- 1 | .taskItem { 2 | flex: 1; 3 | width: 0; 4 | background-color: #ffffff; 5 | margin-left: 15px; 6 | box-shadow: 0 4px 8px 0 rgba(36, 46, 66, 0.06); 7 | border-radius: 8px; 8 | padding: 20px; 9 | 10 | .stepDesc { 11 | margin-top: 10px; 12 | 13 | .logs { 14 | background-color: #000000; 15 | color: #bfceca; 16 | overflow-y: scroll; 17 | min-height: 200px; 18 | max-height: 800px; 19 | 20 | > pre { 21 | padding: 10px; 22 | } 23 | } 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /assets/src/pages/resource/app/create.tsx: -------------------------------------------------------------------------------- 1 | import { Form, Input, Button, Select, Card, message } from 'antd'; 2 | import { PageHeaderWrapper } from '@ant-design/pro-layout'; 3 | import React from 'react'; 4 | import { reqCreate } from '@/pages/resource/app/service'; 5 | import CommonForm from './form'; 6 | 7 | export default class Base extends React.Component { 8 | render() { 9 | return ( 10 | 11 | 12 | 13 | 14 | 15 | ); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /pkg/model/go_dep.go: -------------------------------------------------------------------------------- 1 | package model 2 | 3 | type GoDepProject struct { 4 | Name string `toml:"name"` 5 | Branch string `toml:"branch"` 6 | Revision string `toml:"revision"` 7 | Version string `toml:"version"` 8 | Packages []string `toml:"packages"` 9 | } 10 | 11 | type PkgDep struct { 12 | Projects []GoDepProject `toml:"projects"` 13 | } 14 | 15 | type GomodProject struct { 16 | Name string 17 | Version string 18 | ModType string 19 | Time string 20 | Revision string 21 | OriginValue string 22 | UpdateTime int64 23 | } 24 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: go 2 | 3 | dist: xenial 4 | sudo: required 5 | 6 | go: 7 | - 1.13.x 8 | - 1.14.x 9 | env: 10 | - GO111MODULE=on 11 | 12 | before_install: 13 | - go get golang.org/x/tools/cmd/goimports 14 | - nvm install 14.15.3 15 | - nvm alias default 14.15.3 16 | 17 | script: 18 | - diff -u <(echo -n) <(gofmt -d -s .) 19 | - diff -u <(echo -n) <(goimports -d .) 20 | - go test -v -race ./... -coverprofile=coverage.txt -covermode=atomic 21 | - cd assets 22 | - npm install 23 | 24 | after_success: 25 | - bash <(curl -s https://codecov.io/bash) 26 | -------------------------------------------------------------------------------- /assets/src/pages/pprof/components/PprofIframe.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export default class PprofIframe extends React.Component { 4 | constructor(props) { 5 | super(props); 6 | } 7 | 8 | componentWillMount() {} 9 | 10 | //this.props.iframepage 11 | render() { 12 | const iframeHeight = 690; 13 | // '../../../../pprof_static/' + 14 | const imgAddr = '/pprof/' + this.props.iframepage; 15 | 16 | console.log('imgAddr', imgAddr); 17 | return