├── dashboard ├── .yarn │ └── .gitkeep ├── .yarnrc.yml ├── src │ ├── libs │ │ ├── unique.ts │ │ ├── sleep.ts │ │ ├── clsx.ts │ │ ├── unreachable.ts │ │ ├── casing.ts │ │ ├── scroll.ts │ │ ├── random.ts │ │ ├── colorOverlay.ts │ │ ├── schemaUtil.ts │ │ ├── download.ts │ │ ├── timestamp.ts │ │ ├── buffers.ts │ │ ├── clipboard.ts │ │ ├── useAllUsers.tsx │ │ ├── localStore.ts │ │ └── useFormContext.tsx │ ├── components │ │ ├── templates │ │ │ ├── AppsNav.tsx │ │ │ ├── repo │ │ │ │ └── RepositoryNav.tsx │ │ │ ├── build │ │ │ │ └── RuntimeImageRow.tsx │ │ │ ├── SettingSkeleton.tsx │ │ │ └── FormItem.tsx │ │ ├── UI │ │ │ ├── Skeleton.module.css │ │ │ ├── TooltipInfoIcon.tsx │ │ │ ├── ModalDeleteConfirm.tsx │ │ │ ├── URLText.tsx │ │ │ ├── CheckBoxIcon.tsx │ │ │ ├── Badge.tsx │ │ │ ├── UserAvater.tsx │ │ │ ├── LogContainer.tsx │ │ │ ├── RadioIcon.tsx │ │ │ ├── JumpButton.tsx │ │ │ ├── Skeleton.tsx │ │ │ ├── StepProgress.tsx │ │ │ └── TabRound.tsx │ │ ├── layouts │ │ │ ├── WithHeader.tsx │ │ │ ├── SideView.tsx │ │ │ ├── DataTable.tsx │ │ │ ├── FormBox.tsx │ │ │ ├── SuspenseContainer.tsx │ │ │ ├── WithNav.tsx │ │ │ └── MainView.tsx │ │ └── styled-components.tsx │ ├── assets │ │ └── icons │ │ │ ├── check.svg │ │ │ └── appState │ │ │ ├── idle.svg │ │ │ └── deploying.svg │ ├── features │ │ ├── application │ │ │ ├── provider │ │ │ │ ├── envVarConfigFormProvider.tsx │ │ │ │ └── applicationFormProvider.tsx │ │ │ └── components │ │ │ │ └── form │ │ │ │ ├── config │ │ │ │ ├── ConfigField.tsx │ │ │ │ ├── deploy │ │ │ │ │ └── DeployConfigField.tsx │ │ │ │ └── build │ │ │ │ │ ├── BuildConfigField.tsx │ │ │ │ │ └── BuildpackConfigField.tsx │ │ │ │ └── general │ │ │ │ ├── NameField.tsx │ │ │ │ └── RepositoryIdField.tsx │ │ └── repository │ │ │ └── provider │ │ │ └── repositoryFormProvider.tsx │ ├── index.tsx │ ├── pages │ │ ├── apps │ │ │ ├── [id] │ │ │ │ └── settings │ │ │ │ │ ├── urls.tsx │ │ │ │ │ └── build.tsx │ │ │ └── new.tsx │ │ └── repos │ │ │ ├── [id] │ │ │ └── settings │ │ │ │ ├── authorization.tsx │ │ │ │ └── general.tsx │ │ │ └── new.tsx │ ├── App.tsx │ └── global.css ├── public │ └── favicon.ico ├── .gitignore ├── .dockerignore ├── index.html ├── Caddyfile ├── tsconfig.json └── Dockerfile ├── .local-manifest ├── .gitignore ├── coredns-patch │ ├── kustomization.yaml │ └── coredns-configmap.yaml ├── gitea │ ├── kustomization.yaml │ ├── service.yaml │ ├── ingressroute.yaml │ └── statefulset.yaml ├── traefik │ ├── traefik-service-account.yaml │ ├── kustomization.yaml │ ├── traefik-role-binding.yaml │ ├── traefik-service.yaml │ ├── dashboard-ingress-route.yaml │ └── traefik-cluster-role.yaml ├── monitor │ ├── loki │ │ ├── kustomization.yaml │ │ ├── service.yaml │ │ ├── ingress-route.yaml │ │ └── stateful-set.yaml │ ├── grafana │ │ ├── kustomization.yaml │ │ ├── service.yaml │ │ ├── ingress-route.yaml │ │ └── stateful-set.yaml │ ├── victoria-logs │ │ ├── values.yaml │ │ └── kustomization.yaml │ ├── victoria-metrics │ │ ├── service-account.yaml │ │ ├── service.yaml │ │ ├── kustomization.yaml │ │ ├── cluster-role-binding.yaml │ │ ├── cluster-role.yaml │ │ └── stateful-set.yaml │ └── kustomization.yaml ├── crd │ └── kustomization.yaml ├── ns-apps │ ├── kustomization.yaml │ ├── auth-hard-middleware.yaml │ ├── auth-soft-middleware.yaml │ ├── auth-middleware.yaml │ └── network-policy.yaml ├── auth │ ├── kustomization.yaml │ ├── service.yaml │ ├── dev-service.yaml │ ├── middleware.yaml │ ├── dev-middleware.yaml │ ├── dev-deployment.yaml │ └── deployment.yaml ├── db │ ├── adminer-service.yaml │ ├── mongo-service.yaml │ ├── mariadb-service.yaml │ ├── kustomization.yaml │ ├── adminer-ingress-route.yaml │ ├── adminer-deployment.yaml │ ├── mongo-stateful-set.yaml │ └── mariadb-stateful-set.yaml ├── registry │ ├── kustomization.yaml │ ├── frontend-service.yaml │ ├── service.yaml │ ├── ingress-route.yaml │ ├── frontend-ingress-route.yaml │ └── frontend-deployment.yaml ├── kustomization.yaml ├── alloy │ └── kustomization.yaml ├── ns-system │ └── kustomization.yaml └── README.md ├── .local-dev ├── local-storage │ ├── artifacts │ │ └── .keep │ └── buildlogs │ │ └── .keep ├── keys │ ├── id_ed25519.pub │ └── id_ed25519 ├── registry │ ├── entrypoint.sh │ └── gc.sh ├── grafana │ └── provisioning │ │ └── datasources │ │ └── loki.yaml ├── buildkitd │ └── buildkitd.toml ├── config │ ├── grafana.ini │ ├── sablier.yaml │ ├── prometheus.yml │ ├── promtail.yaml │ ├── loki.yaml │ └── ns-auth.yaml ├── .gitignore └── traefik │ └── middlewares.yaml ├── generate.go ├── .github ├── ISSUE_TEMPLATE │ ├── config.yml │ └── feature-request.yaml ├── pull_request_template.md └── workflows │ ├── preview-comment.yaml │ └── ci-protobuf.yaml ├── .spectral.yml ├── pkg ├── util │ ├── ds │ │ ├── doc.go │ │ ├── map.go │ │ ├── channel.go │ │ └── slice_test.go │ ├── cli │ │ ├── signal.go │ │ ├── env.go │ │ ├── version.go │ │ ├── print_conf.go │ │ ├── flag.go │ │ └── config.go │ ├── optional │ │ ├── sql.go │ │ └── of.go │ ├── hash │ │ ├── xxh3.go │ │ └── consistent.go │ ├── loop │ │ └── loop.go │ ├── fig │ │ ├── fonts.go │ │ └── render.go │ ├── discovery │ │ ├── discoverer_static.go │ │ └── discoverer.go │ ├── random │ │ ├── random_test.go │ │ └── random.go │ ├── scutil │ │ ├── coalescer.go │ │ └── wrap.go │ ├── fmtutil │ │ └── time.go │ ├── retry │ │ └── retry.go │ ├── mapper │ │ └── mapper.go │ └── tarfs │ │ ├── extract_test.go │ │ └── compress.go ├── domain │ ├── web │ │ ├── consts.go │ │ ├── auth.go │ │ ├── client_h2c.go │ │ └── server_h2c.go │ ├── cdservice.go │ ├── idgen.go │ ├── system.go │ ├── builder │ │ ├── backend.go │ │ └── registry.go │ ├── builder.go │ ├── metrics.go │ ├── app_runtime_image.go │ ├── log.go │ ├── app_repository_commit.go │ ├── app_environment.go │ ├── app_artifact.go │ ├── git.go │ ├── environment.go │ ├── pubsub.go │ ├── auth.go │ ├── backend_test.go │ ├── dbmanager.go │ └── app_user.go ├── infrastructure │ ├── dbmanager │ │ └── manager_test.go │ ├── repository │ │ ├── models │ │ │ ├── boil_view_names.go │ │ │ ├── boil_queries.go │ │ │ └── boil_table_names.go │ │ ├── error.go │ │ ├── repoconvert │ │ │ ├── runtime_image.go │ │ │ ├── environment.go │ │ │ ├── artifact.go │ │ │ ├── user.go │ │ │ ├── port_publication.go │ │ │ └── repository_commit.go │ │ ├── conn.go │ │ ├── website.go │ │ └── config.go │ ├── buildpack │ │ └── config.go │ ├── grpc │ │ ├── pbconvert │ │ │ ├── output.go │ │ │ ├── metrics.go │ │ │ ├── runtime_image.go │ │ │ ├── repository_commit.go │ │ │ ├── timestamp.go │ │ │ ├── environment.go │ │ │ ├── available_port.go │ │ │ ├── available_domain.go │ │ │ ├── user.go │ │ │ ├── artifact.go │ │ │ └── port_publication.go │ │ ├── controller_gitea_integration_service.go │ │ ├── api_system_service.go │ │ ├── controller_ssgen_service_client.go │ │ ├── controller_gitea_integration_service_client.go │ │ └── api_service.go │ ├── backend │ │ └── dockerimpl │ │ │ ├── synchronize.go │ │ │ └── backend_test.go │ ├── log │ │ └── victorialogs │ │ │ └── types.go │ └── webhook │ │ ├── github.go │ │ └── gitea.go ├── usecase │ ├── builder │ │ ├── build_clone.go │ │ ├── build_buildpack.go │ │ └── build_save_artifact.go │ ├── apiserver │ │ └── errors.go │ ├── healthcheck │ │ └── healthcheck.go │ └── logstream │ │ └── build_log.go └── test │ ├── mocks │ └── gen.go │ └── testhelper │ └── helper.go ├── sablier └── Dockerfile ├── docs └── architecture.png ├── .local-ext-builder └── manifest │ ├── config │ ├── .gitignore │ ├── buildkitd.toml │ └── ns.yaml │ ├── kustomization.yaml │ └── coredns-configmap.yaml ├── buf.yaml ├── dbconfig.yml ├── codecov.yml ├── charts ├── neoshowcase │ ├── templates │ │ ├── controller │ │ │ ├── service-account.yaml │ │ │ ├── ssh-service.yaml │ │ │ ├── service.yaml │ │ │ ├── cluster-role-binding.yaml │ │ │ └── cluster-role.yaml │ │ ├── builder │ │ │ └── config.yaml │ │ ├── sablier │ │ │ ├── service-account.yaml │ │ │ ├── config.yaml │ │ │ ├── service.yaml │ │ │ ├── cluster-role-binding.yaml │ │ │ └── cluster-role.yaml │ │ ├── ssgen │ │ │ └── service.yaml │ │ ├── gateway │ │ │ └── service.yaml │ │ ├── dashboard │ │ │ ├── service.yaml │ │ │ └── deployment.yaml │ │ ├── gitea-integration │ │ │ └── service.yaml │ │ └── migrate-job.yaml │ ├── .helmignore │ └── Chart.yaml └── publish.sh ├── api └── proto │ └── neoshowcase │ └── protobuf │ └── null.proto ├── tools.go ├── .tbls.yml ├── sqlboiler.toml ├── .dockerignore ├── buf.gen.ts.yaml ├── .gitignore ├── .golangci.yml ├── cmd ├── buildpack-helper │ └── server.go ├── auth-dev │ └── server.go ├── builder │ └── server.go ├── gateway │ └── server.go ├── gitea-integration │ └── server.go └── ssgen │ └── server.go ├── migrations └── entrypoint.sh ├── buf.gen.go.yaml ├── LICENSE └── README.md /dashboard/.yarn/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.local-manifest/.gitignore: -------------------------------------------------------------------------------- 1 | charts 2 | -------------------------------------------------------------------------------- /.local-dev/local-storage/artifacts/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.local-dev/local-storage/buildlogs/.keep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /dashboard/.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | -------------------------------------------------------------------------------- /generate.go: -------------------------------------------------------------------------------- 1 | //go:generate sqlboiler mysql 2 | package main 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: true 2 | -------------------------------------------------------------------------------- /.spectral.yml: -------------------------------------------------------------------------------- 1 | extends: spectral:oas 2 | rules: 3 | operation-success-response: false 4 | -------------------------------------------------------------------------------- /.local-manifest/coredns-patch/kustomization.yaml: -------------------------------------------------------------------------------- 1 | resources: 2 | - coredns-configmap.yaml 3 | -------------------------------------------------------------------------------- /pkg/util/ds/doc.go: -------------------------------------------------------------------------------- 1 | // Package ds provides some fundamental data structures. 2 | package ds 3 | -------------------------------------------------------------------------------- /sablier/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM sablierapp/sablier:1.10.1 2 | 3 | COPY ./themes /etc/sablier/themes 4 | -------------------------------------------------------------------------------- /dashboard/src/libs/unique.ts: -------------------------------------------------------------------------------- 1 | export const unique = (arr: T[]): T[] => Array.from(new Set(arr)) 2 | -------------------------------------------------------------------------------- /docs/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/traPtitech/NeoShowcase/HEAD/docs/architecture.png -------------------------------------------------------------------------------- /.local-ext-builder/manifest/config/.gitignore: -------------------------------------------------------------------------------- 1 | controller-token.txt 2 | controller-url.txt 3 | known_hosts 4 | -------------------------------------------------------------------------------- /dashboard/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/traPtitech/NeoShowcase/HEAD/dashboard/public/favicon.ico -------------------------------------------------------------------------------- /dashboard/src/libs/sleep.ts: -------------------------------------------------------------------------------- 1 | export const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)) 2 | -------------------------------------------------------------------------------- /.local-dev/keys/id_ed25519.pub: -------------------------------------------------------------------------------- 1 | ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIALWIALnhPWigJA3njldxcM91PEkQQN231Ow7czCg8zD moto@moto-ws 2 | -------------------------------------------------------------------------------- /.local-manifest/gitea/kustomization.yaml: -------------------------------------------------------------------------------- 1 | namespace: gitea 2 | resources: 3 | - statefulset.yaml 4 | - ingressroute.yaml 5 | -------------------------------------------------------------------------------- /.local-manifest/traefik/traefik-service-account.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | name: traefik 5 | -------------------------------------------------------------------------------- /.local-manifest/monitor/loki/kustomization.yaml: -------------------------------------------------------------------------------- 1 | resources: 2 | - ingress-route.yaml 3 | - service.yaml 4 | - stateful-set.yaml 5 | -------------------------------------------------------------------------------- /.local-manifest/monitor/grafana/kustomization.yaml: -------------------------------------------------------------------------------- 1 | resources: 2 | - ingress-route.yaml 3 | - service.yaml 4 | - stateful-set.yaml 5 | -------------------------------------------------------------------------------- /.local-manifest/monitor/victoria-logs/values.yaml: -------------------------------------------------------------------------------- 1 | server: 2 | extraArgs: 3 | defaultMsgValue: "-" 4 | service: 5 | clusterIP: "" 6 | -------------------------------------------------------------------------------- /.local-manifest/monitor/victoria-metrics/service-account.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | name: victoria-metrics 5 | -------------------------------------------------------------------------------- /buf.yaml: -------------------------------------------------------------------------------- 1 | version: v2 2 | modules: 3 | - path: api/proto 4 | lint: 5 | use: 6 | - BASIC 7 | breaking: 8 | use: 9 | - FILE 10 | -------------------------------------------------------------------------------- /dashboard/src/libs/clsx.ts: -------------------------------------------------------------------------------- 1 | export const clsx = (...classes: (string | false | null | undefined)[]): string => classes.filter(Boolean).join(' ') 2 | -------------------------------------------------------------------------------- /dashboard/src/libs/unreachable.ts: -------------------------------------------------------------------------------- 1 | export const unreachable = (x: never): never => { 2 | throw new Error(`unreachable: ${JSON.stringify(x)}}`) 3 | } 4 | -------------------------------------------------------------------------------- /.local-manifest/monitor/kustomization.yaml: -------------------------------------------------------------------------------- 1 | namespace: monitor 2 | 3 | resources: 4 | - grafana 5 | # - loki 6 | - victoria-logs 7 | - victoria-metrics 8 | -------------------------------------------------------------------------------- /dashboard/src/libs/casing.ts: -------------------------------------------------------------------------------- 1 | export const titleCase = (s: string): string => 2 | s.length === 0 ? s : s.at(0)?.toUpperCase() + s.substring(1).toLowerCase() 3 | -------------------------------------------------------------------------------- /dashboard/src/libs/scroll.ts: -------------------------------------------------------------------------------- 1 | export const isScrolledToBottom = (e: Element): boolean => { 2 | return Math.abs(e.scrollHeight - e.scrollTop - e.clientHeight) < 1 3 | } 4 | -------------------------------------------------------------------------------- /dbconfig.yml: -------------------------------------------------------------------------------- 1 | development: 2 | dialect: mysql 3 | dir: migrations 4 | datasource: root:password@tcp(localhost:5004)/neoshowcase?parseTime=true 5 | table: migrations 6 | -------------------------------------------------------------------------------- /.local-dev/registry/entrypoint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | set -e 4 | 5 | CONFIG="$1" 6 | ${GC_SCRIPT:-/gc.sh} "$CONFIG" & 7 | 8 | set -- registry serve "$@" 9 | exec "$@" 10 | -------------------------------------------------------------------------------- /dashboard/src/libs/random.ts: -------------------------------------------------------------------------------- 1 | export const randIntN = (max: number): number => Math.floor(Math.random() * max) 2 | export const pickRandom = (arr: T[]): T => arr[randIntN(arr.length)] 3 | -------------------------------------------------------------------------------- /.local-manifest/crd/kustomization.yaml: -------------------------------------------------------------------------------- 1 | resources: 2 | - https://raw.githubusercontent.com/traefik/traefik/v3.0.0/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml 3 | -------------------------------------------------------------------------------- /dashboard/src/libs/colorOverlay.ts: -------------------------------------------------------------------------------- 1 | export const colorOverlay = (baseColor: string, overlayColor: string) => 2 | `linear-gradient(0deg, ${overlayColor} 0%, ${overlayColor} 100%), ${baseColor}` 3 | -------------------------------------------------------------------------------- /codecov.yml: -------------------------------------------------------------------------------- 1 | comment: false 2 | coverage: 3 | status: 4 | patch: false 5 | project: 6 | default: 7 | base: auto 8 | target: auto 9 | threshold: 3.0 10 | -------------------------------------------------------------------------------- /charts/neoshowcase/templates/controller/service-account.yaml: -------------------------------------------------------------------------------- 1 | apiVersion: v1 2 | kind: ServiceAccount 3 | metadata: 4 | name: {{ $.Release.Name }}-controller 5 | namespace: {{ $.Release.Namespace }} 6 | -------------------------------------------------------------------------------- /.local-manifest/ns-apps/kustomization.yaml: -------------------------------------------------------------------------------- 1 | namespace: ns-apps 2 | 3 | resources: 4 | - auth-hard-middleware.yaml 5 | - auth-middleware.yaml 6 | - auth-soft-middleware.yaml 7 | - network-policy.yaml 8 | -------------------------------------------------------------------------------- /dashboard/src/components/templates/AppsNav.tsx: -------------------------------------------------------------------------------- 1 | import type { Component } from 'solid-js' 2 | import { Nav } from './Nav' 3 | 4 | export const AppsNav: Component = () => { 5 | return