
前端UI组件后端【免费下载链接】uppyThe next open source file uploader for web browsers :dog:项目地址https://gitcode.com/gh_mirrors/up/uppy点击查看免费下载Companion 是 Uppy 文件上传器的服务端配套组件负责在浏览器与 Google Drive、Dropbox、Box 等云存储之间建立服务端到服务端的通信与 OAuth 授权中转。本文以仓库中的 KUBERNETES.md 为主线完整讲解如何使用官方 Docker 镜像将 Companion 部署到 Kubernetes从创建命名空间、用 Helm 安装 Redis到以 Secret 注入全部环境变量、编写 Deployment 与 Service并进一步结合仓库源码与基础设施目录给出持久化存储、Ingress、HPA 等生产级增强方案。读完后你将获得一套可直接复制运行的 K8s 部署 YAML以及每个配置项背后的源码级原理。一、部署前准备官方 Docker 镜像与默认端口Companion 的 Kubernetes 部署建立在官方 Docker 镜像之上。仓库根目录的 Dockerfile 展示了镜像的构建过程基于node:26.10.0-alpine分阶段构建先用corepack yarn workspaces focus uppy/companion安装依赖并执行build再切到生产依赖最终拷贝dist、package.json与node_modules到运行镜像镜像入口命令为node /app/dist/bin/companion.js见 Dockerfile 第 33 行即启动 standalone 模式的 Companion 服务镜像默认EXPOSE 3020Dockerfile 第 35 行这与源码中端口的默认值完全一致——start-server.ts 中监听端口取自process.env[COMPANION_PORT] || process.env[PORT] || 3020。也就是说只要不显式设置COMPANION_PORT容器内的服务必然监听 3020这也是下文 Deployment 中containerPort: 3020、Service 中targetPort: 3020的依据。在 Kubernetes 中使用的镜像是docker.io/transloadit/companion:latest。需要注意的是latest标签适合快速验证若要保证可复现性建议像仓库的 gcloud-deploy.sh 一样按 commit 或 git tag 打镜像标签该脚本同时推送transloadit/companion:$TRAVIS_COMMIT、transloadit/companion:$TRAVIS_TAG与latest三个标签并在 Deployment 中固定引用版本化标签。二、创建命名空间并安装 RedisCompanion 依赖 Redis 来共享会话与跨实例状态因此部署的第一步是创建专属命名空间并在其中安装 Redis。kubectl create ns uppy随后通过 Helm 在uppy命名空间中安装 Redishelm install --name redis \ --namespace uppy \ --set passwordsuperSecretPassword \ stable/redis说明以上命令保留了 KUBERNETES.md 中的原始写法Helm v2 时代的--name语法。若使用 Helm v3可等价写作helm install redis stable/redis -n uppy --set auth.passwordsuperSecretPassword具体参数以你所用的 Redis chart 版本为准。核心思路不变Redis 必须与 Companion 处于同一集群Companion 通过集群内 DNS 地址访问它。--set passwordsuperSecretPassword设置了 Redis 密码这个密码稍后会以redis://:superSecretPassword...的形式出现在COMPANION_REDIS_URL中。为什么必须用 Redis从 standalone/index.ts 可以看到Companion 用express-session管理会话会话用于 OAuth2 授权跳转过程避免把敏感 token 暴露在 URL 中。当配置了redisUrl时会话存储会切换为RedisStore第 130-137 行会话 cookie 的maxAge为 10 分钟第 139-146 行足够用户完成一次授权流程。在多副本部署下任何副本都能通过共享的 Redis 读取会话这正是部署两个及以上副本所必需的。三、环境变量注入companion-env.ymlSecretCompanion 的全部运行配置都通过环境变量读取standalone 模式的配置解析集中在 helper.ts 的getConfigFromEnv()中。由于其中包含大量密钥OAuth Key/Secret、AWS 凭证、服务端 Secret 等Kubernetes 部署时统一放进Secret中再通过 Deployment 的envFrom注入容器。以下为原文档提供的companion-env.yml完整内容apiVersion: v1 data: COMPANION_CLIENT_ORIGINS: localhost:3452,uppy.io COMPANION_DATADIR: PATH/TO/DOWNLOAD/DIRECTORY COMPANION_DOMAIN: YOUR SERVER DOMAIN COMPANION_DOMAINS: sub1.domain.com,sub2.domain.com,sub3.domain.com COMPANION_PROTOCOL: YOUR SERVER PROTOCOL COMPANION_STREAMING_UPLOAD: true COMPANION_TUS_DEFERRED_UPLOAD_LENGTH: true COMPANION_REDIS_URL: redis://:superSecretPassworduppy-redis.uppy.svc.cluster.local:6379 COMPANION_SECRET: shh!Issa Secret! COMPANION_PREAUTH_SECRET: another secret COMPANION_DROPBOX_KEY: YOUR DROPBOX KEY COMPANION_DROPBOX_SECRET: YOUR DROPBOX SECRET COMPANION_BOX_KEY: YOUR BOX KEY COMPANION_BOX_SECRET: YOUR BOX SECRET COMPANION_GOOGLE_KEY: YOUR GOOGLE KEY COMPANION_GOOGLE_SECRET: YOUR GOOGLE SECRET COMPANION_AWS_KEY: YOUR AWS KEY COMPANION_AWS_SECRET: YOUR AWS SECRET COMPANION_AWS_BUCKET: YOUR AWS S3 BUCKET COMPANION_AWS_REGION: AWS REGION COMPANION_AWS_PREFIX: AWS PREFIX COMPANION_OAUTH_DOMAIN: sub.domain.com COMPANION_UPLOAD_URLS: http://tusd.tusdemo.net/files/,https://tusd.tusdemo.net/files/ kind: Secret metadata: name: companion-env namespace: uppy type: Opaque注意kind: Secret的data字段在真实 Kubernetes 中要求Base64 编码的值。上面的写法是文档中的示意形式实际落地时应对每个值执行echo -n value | base64。若希望直接写明文可将data改为stringData。各环境变量的作用与源码对应关系如下表环境变量对应配置项说明与源码依据COMPANION_CLIENT_ORIGINScorsOrigins允许跨域访问的浏览器来源逗号分隔。getCorsOrigins()helper.ts支持true/false/*三种特殊值普通值若不带协议会按COMPANION_PROTOCOL自动补全为http(s)://COMPANION_DATADIRfilePath文件下载/暂存目录必须可读写。validateConfig()companion.ts启动时会用fs.accessSync校验目录存在且具备读写权限否则直接拒绝启动COMPANION_DOMAINserver.hostCompanion 对外暴露的域名/主机名COMPANION_DOMAINSserver.validHosts合法主机名白名单逗号分隔配置解析时会被parseAllowlist()转换为RegExp或字面量helper.ts。以^开头的条目按正则处理未锚定的正则会同时匹配仅包含该模式的值需谨慎COMPANION_PROTOCOLserver.protocolhttp或https默认httphelper.tsCOMPANION_STREAMING_UPLOADstreamingUpload是否启用流式上传true/falseCOMPANION_TUS_DEFERRED_UPLOAD_LENGTHtusDeferredUploadLength是否启用 tus 延迟声明文件长度服务端先不告知总长边传边算未设置时默认truehelper.tsCOMPANION_REDIS_URLredisUrlRedis 连接串如redis://:密码服务名.命名空间.svc.cluster.local:6379COMPANION_SECRETsecret服务端签名密钥。未设置时 Companion 会自动生成并打警告日志helper.ts但重启会失效生产环境务必显式设置COMPANION_PREAUTH_SECRETpreAuthSecret预授权preflight签名密钥同理建议显式设置COMPANION_DROPBOX_KEY/COMPANION_DROPBOX_SECRETproviderOptions.dropboxDropbox OAuth 凭证COMPANION_BOX_KEY/COMPANION_BOX_SECRETproviderOptions.boxBox OAuth 凭证COMPANION_GOOGLE_KEY/COMPANION_GOOGLE_SECRETproviderOptions.driveGoogle Drive OAuth 凭证注意源码中 Google Drive 的 provider 名是drive见 helper.tsCOMPANION_AWS_KEY/COMPANION_AWS_SECRET/COMPANION_AWS_BUCKET/COMPANION_AWS_REGION/COMPANION_AWS_PREFIXs3.*S3 上传配置AccessKey、Secret、桶名、区域与对象键前缀。前缀会拼接到getKey生成的每个对象键之前defaultStandaloneGetKey见 helper.tsCOMPANION_OAUTH_DOMAINserver.oauthDomainOAuth 回调使用的域名COMPANION_UPLOAD_URLSuploadUrlstus 服务器上传地址白名单。这是安全关键项validateConfig()在NODE_ENVproduction下若未配置会直接抛错拒绝启动companion.ts同时会校验条目必须是带协议的绝对 URL如https://example.com/files/URL 中的查询串与 fragment 在匹配时会被忽略仓库的 env_example 还列出了更多可选变量按需补充到 Secret 中即可COMPANION_PORT3020 # 监听端口默认 3020 COMPANION_SELF_ENDPOINTuppy.xxxx.com # 用于向远端上报的自身地址 COMPANION_HIDE_METRICSfalse # false 时暴露 /metrics 统计端点 COMPANION_HIDE_WELCOMEfalse # false 时根路径返回欢迎/启动诊断信息 COMPANION_MAX_FILENAME_LENGTH500 # 文件名最大长度默认 500 COMPANION_AWS_ENDPOINT # S3 兼容端点非 AWS 时使用 COMPANION_AWS_FORCE_PATH_STYLEfalse # 是否强制 path-style 访问另一个值得注意的机制是_FILE后缀变量getSecret()helper.ts会优先读取COMPANION_SECRET_FILE、COMPANION_DROPBOX_SECRET_FILE等指向的文件内容其次才读同名普通变量。在 Kubernetes 中这正好可以与 Secret 卷挂载结合让密钥以文件形式进入容器避免出现在进程环境中。四、Deploymentcompanion-deployment.yml环境变量准备好后编写 Deployment 拉起 Companion 容器。以下为原文档的companion-deployment.yml完整内容apiVersion: extensions/v1beta1 kind: Deployment metadata: name: companion namespace: uppy spec: replicas: 2 minReadySeconds: 5 strategy: type: RollingUpdate rollingUpdate: maxSurge: 2 maxUnavailable: 1 template: metadata: labels: app: companion spec: containers: - image: docker.io/transloadit/companion:latest imagePullPolicy: ifNotPresent name: companion resources: limits: memory: 150Mi requests: memory: 100Mi envFrom: - secretRef: name: companion-env ports: - containerPort: 3020 volumeMounts: - name: companion-data mountPath: /mnt/companion-data volumes: - name: companion-data emptyDir: {}kubectl apply -f companion-deployment.yml这份清单的关键点replicas: 2多副本 共享 Redis 会话是 Companion 横向扩展的基础滚动更新策略maxSurge: 2允许更新时最多多出 2 个新 PodmaxUnavailable: 1允许最多 1 个旧 Pod 不可用minReadySeconds: 5要求新 Pod 就绪后保持 5 秒才继续滚动兼顾可用性与更新速度envFrom.secretRef: companion-env把上一步的 Secret 中全部键值作为环境变量注入容器是连接配置与运行的枢纽containerPort: 3020与镜像EXPOSE 3020及源码默认端口一致/mnt/companion-data挂载emptyDir承接COMPANION_DATADIR指向的下载/暂存目录。但emptyDir的生命周期与 Pod 相同Pod 重建即清空。原文档在此采用emptyDir便于快速起步生产环境若需保留中间数据应改用持久卷见下文第五节。兼容性提示原文档使用的apiVersion: extensions/v1beta1属于旧版 Kubernetes API1.16 之前较新集群已移除。下文仓库自带的参考清单使用apps/v1建议新部署直接采用。五、Servicecompanion-service.ymlDeployment 只负责跑起来对外暴露还需要 Service。原文档的 Service 清单apiVersion: v1 kind: Service metadata: name: companion namespace: uppy spec: ports: - port: 80 targetPort: 3020 protocol: TCP selector: app: companionkubectl apply -f companion-service.yml要点port: 80是集群内访问端口targetPort: 3020转发到 Pod 中 Companion 的实际监听端口selector: app: companion与 Deployment 模板中的 Pod 标签一一对应Service 据此选择后端 PodKubernetes 会自动为多个副本做负载均衡在集群内部其他组件可通过companion.uppy.svc.cluster.local:80访问它对集群外部则需额外配置 Ingress 或 NodePort/LoadBalancer。六、生产级增强仓库自带的全套参考清单除了文档中的基础三件套仓库在 infra/kube/companion/companion-kube.yaml 提供了一份更贴近生产环境的完整清单Service StatefulSet Ingress HPA用---分隔的多个资源。其关键差异正是对原文档方案的升级方向1. 用 StatefulSet 替代 Deployment实现数据持久化apiVersion: apps/v1 kind: StatefulSet metadata: name: companion namespace: companion spec: selector: matchLabels: app: companion replicas: 2 serviceName: companion template: metadata: labels: app: companion spec: containers: - image: docker.io/transloadit/companion:latest imagePullPolicy: Always name: companion envFrom: - secretRef: name: companion-env ports: - containerPort: 3020 volumeMounts: - name: companion-data mountPath: /mnt/companion-data volumeClaimTemplates: - metadata: name: companion-data spec: accessModes: [ReadWriteOnce] resources: requests: storage: 10Gi相比原文档的emptyDir这里的volumeClaimTemplates会为每个副本自动创建独立的 PVC每副本 10GiReadWriteOncePod 被调度/重建到任意节点时数据都能随卷保留。2. Ingress 自动 HTTPSapiVersion: extensions/v1beta1 kind: Ingress metadata: name: companion namespace: companion annotations: kubernetes.io/tls-acme: true kubernetes.io/ingress.class: nginx certmanager.k8s.io/cluster-issuer: letsencrypt-prod certmanager.k8s.io/acme-http01-edit-in-place: true spec: tls: - secretName: server-tls hosts: - companion.uppy.io - secretName: uppy-tls hosts: - server.uppy.io rules: - host: companion.uppy.io http: paths: - path: / backend: serviceName: companion servicePort: 80 - host: server.uppy.io http: paths: - path: / backend: serviceName: companion servicePort: 80通过 cert-manager 注解自动签发 Lets Encrypt 证书companion.uppy.io与server.uppy.io两个域名都路由到companionService 的 80 端口。3. HorizontalPodAutoscaler 自动扩缩容apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: companion namespace: companion spec: scaleTargetRef: apiVersion: apps/v1 kind: Statefulset name: companion minReplicas: 1 maxReplicas: 5 targetCPUUtilizationPercentage: 80当平均 CPU 使用率超过 80% 时HPA 会在 15 个副本之间自动伸缩与 StatefulSet 的滚动更新策略配合形成弹性伸缩能力。4. CI/CD 参考gcloud-deploy.sh仓库的 gcloud-deploy.sh 展示了镜像发布与集群更新的完整链路构建并推送transloadit/companion镜像commit/tag/latest 三标签→ 解码KUBECONFIGVAR写入 kubeconfig → 用kubectl set image statefulset companion ...热更新镜像 → 依次kubectl get pods/service/deployment校验部署结果。这套脚本的思路可直接迁移到你自己的 CI 流水线中。七、日志查看部署完成后查看生产 Pod 的日志kubectl logs my-pod-name如果 Pod 名不易确定也可以直接用 Deployment/StatefulSet 级联查看# 查看命名空间下所有 Pod kubectl get pods -n uppy # 跟随输出某个 Deployment 的最新日志 kubectl logs deployment/companion -n uppy --follow # 查看上一个已崩溃的容器实例的日志 kubectl logs my-pod-name --previousCompanion 的日志系统也内置了安全处理在 standalone/index.ts 中请求日志morgan会通过censorQuery()对access_token、uppyAuthToken等敏感查询参数做掩码处理替换为********避免 OAuth 过程中的令牌泄漏到日志里。排查问题时若发现日志中看不到完整参数这属于预期行为而非日志丢失。八、部署自检清单综合原文档与源码完成部署后建议按以下顺序核对命名空间与资源就位kubectl get ns uppy、kubectl get secret companion-env -n uppy、kubectl get pods -n uppy均正常Redis 可达COMPANION_REDIS_URL中的服务名、命名空间uppy-redis.uppy.svc.cluster.local、密码与 Helm 安装时--set password一致生产强制项COMPANION_UPLOAD_URLS必须配置且为带协议的绝对 URL含 tus 服务地址否则NODE_ENVproduction下 Companion 拒绝启动companion.ts目录可写COMPANION_DATADIR指向的挂载路径必须存在且可读写否则validateConfig()在启动时抛错Secret 显式设置COMPANION_SECRET与COMPANION_PREAUTH_SECRET不要依赖自动生成避免重启后会话/预授权签名失效OAuth 回调启动日志欢迎页或kubectl logs会列出每个 provider 的/redirect回调地址需与云服务商开发者后台配置一致。至此从命名空间、Redis、Secret 配置到 Deployment、Service再到 StatefulSet 持久化、Ingress、HPA 与日志排查一套完整的 Companion on Kubernetes 部署链路已全部打通。若需要更完整的配置变量清单可对照 env_example 与 schemas/companion.ts 按需补充。赞分享前端UI组件后端【免费下载链接】uppyThe next open source file uploader for web browsers :dog:项目地址https://gitcode.com/gh_mirrors/up/uppy点击查看免费下载相关推荐daily.dev容器化部署DockerKubernetes实战指南daily.dev容器化部署DockerKubernetes实战指南 作为开发者你是否还在为daily.dev的部署环境配置而烦恼服务器兼容性问题、依赖AI 技能/插件AI Agent15分钟上手Wiki.js容器化部署Docker与Kubernetes实战指南15分钟上手Wiki.js容器化部署Docker与Kubernetes实战指南 你是否还在为Wiki系统的部署环境配置而烦恼服务器依赖冲突、版本不一致、扩展后端前端知识库知识管理AISystem容器化Docker与Kubernetes部署实战指南AISystem容器化Docker与Kubernetes部署实战指南 引言为什么需要容器化AI系统 在当今AI技术飞速发展的时代AI系统的部署和管理面临文档教程人工智能上一篇Go pflag 深度实战POSIX/GNU 风格命令行 Flag 解析KubeSphere 中的应用下一篇3步部署SQLBot5分钟搭好智能问数平台从Docker启动到首次问数完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考