
用 Packer 构建 Appsmith 的 DigitalOcean One-Click 市场快照并发布新版本【免费下载链接】appsmithPlatform to build admin panels, internal tools, and dashboards. Integrates with 25 databases and any API.项目地址: https://gitcode.com/GitHub_Trending/ap/appsmith本指南完整讲解 Appsmith 开源仓库中 DigitalOcean 部署目录deploy/digital_ocean的用途与操作流程如何安装 HashiCorp Packer、如何基于 template.json 自动化构建一个预装了 Docker 与 Appsmith 的 DigitalOcean 快照以及如何在 DigitalOcean Marketplace 供应商门户中把新快照作为 One-Click Application 的新版本发布上线。读完本文你可以独立完成新版本构建 → 快照产出 → Marketplace 预览 → 发布的整个发布链路并理解镜像内部每条配置脚本的作用。一、整体目标与目录结构仓库中 deploy/digital_ocean/README.md 的核心目标是构建一个新的 DigitalOcean 快照snapshot用于在 DigitalOcean Marketplace 上发布 Appsmith One-Click Application 的新版本。换句话说这不是在 DigitalOcean 上手动安装一次 Appsmith而是一套可重复的镜像工厂用基础设施即代码的方式把 Appsmith 的依赖Docker Engine、Docker Compose、防火墙规则等固化成一个可分发、可审核的市场快照再由 DigitalOcean 的平台能力把它包装成一键部署One-Click应用。该目录在仓库中承担的全部职责可由如下文件树概括deploy/digital_ocean/ ├── README.md # 构建与发布流程总文档 ├── template.json # Packer JSON 构建模板builder provisioner ├── files/ │ ├── etc/update-motd.d/99-one-click # SSH 登录欢迎信息MOTD │ └── var/lib/cloud/scripts/per-instance/01-onboot # 实例首次启动时拉取并启动 Appsmith └── scripts/ ├── install-docker.sh # 安装 Docker CE / Compose ├── 01-packages.sh # 系统更新、DO 监控 Agent、防火墙 ├── 90-cleanup.sh # 镜像提交前的清理与安全擦除 └── 99-img_check.sh # DigitalOcean Marketplace 镜像校验工具整条流水线的生命周期可以归纳为三步也是下文各章节的顺序准备开发环境安装 Packer构建快照提供 DigitalOcean API Tokenpacker build template.json发布新版本在 Marketplace Vendor Portal 将快照关联到 One-Click 应用并提交预览审核。二、准备工作安装 HashiCorp PackerPacker 由 HashiCorp 提供负责按声明式模板创建临时主机、执行初始化脚本并把主机保存为云厂商镜像/快照。README 中给出了两类平台的安装方式。macOS使用 Homebrew 的官方 tapbrew tap hashicorp/tap brew install hashicorp/tap/packerUbuntu / Debian先添加 HashiCorp 官方 APT 源再安装curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add - sudo apt-add-repository deb [archamd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main sudo apt-get update sudo apt-get install packer提示以上命令来自仓库文档原始记录其中使用了apt-key/apt-add-repository等较传统的方式在新版 Ubuntu如 22.04上apt-key add会输出弃用警告仍可完成安装。安装完成后可用packer version验证是否可用。三、Packer 构建模板深度解析deploy/digital_ocean/template.json 是整个镜像工厂的核心声明文件值得逐段研读后再执行构建。3.1 变量区variablesvariables: { token: {{env DIGITALOCEAN_TOKEN}}, image_name: appsmith-marketplace-snapshot-{{timestamp}} }token从环境变量DIGITALOCEAN_TOKEN读取不硬编码在模板里避免 API 密钥泄露进版本库image_name使用 Packer 内置的{{timestamp}}函数保证每次构建产生的快照名称唯一例如appsmith-marketplace-snapshot-1761520000这为后续在 Marketplace 选择最新快照提供了清晰可辨的名称。3.2 构建器buildersbuilders: [ { type: digitalocean, api_token: {{user token}}, image: ubuntu-20-04-x64, region: blr1, size: s-1vcpu-1gb, ssh_username: root, snapshot_name: {{user image_name}} } ]字段当前取值说明typedigitalocean使用 DigitalOcean builderPacker 会临时创建一台 Droplet 执行初始化完成后打快照并销毁 Dropletapi_token来自用户变量tokenDigitalOcean 个人访问令牌imageubuntu-20-04-x64基础操作系统镜像64 位 Ubuntu 20.04regionblr1构建发生的数据中心区域班加罗尔可按需修改sizes-1vcpu-1gbDroplet 规格1 vCPU / 1 GB 内存是 DO 最基础的档位ssh_usernamerootPacker 使用 root 通过 SSH 进入临时主机snapshot_name{{userimage_name}}最终产出的快照名digitaloceanbuilder 的运作方式值得留意Packer 会利用 API Token 创建一个按小时计费的临时 Droplet通过 SSH 依次执行 provisioners 中定义的初始化任务全部成功后立即调用快照接口生成snapshot_name随后自动销毁临时 Droplet——因此整个过程中你的开发机并不需要直接与云主机保持长连接所见即所得的构建即快照由 Packer 托管。3.3 初始化脚本序列provisionersprovisioners: [ { type: shell, inline: [cloud-init status --wait] }, { type: file, source: files/etc/, destination: /etc/ }, { type: file, source: files/var/, destination: /var/ }, { type: shell, scripts: [scripts/install-docker.sh] }, { type: shell, scripts: [ scripts/01-packages.sh, scripts/90-cleanup.sh, scripts/99-img_check.sh ] } ]执行顺序与语义如下cloud-init status --wait等待 DigitalOcean 基础镜像的 cloud-init 首次引导完成避免后续步骤与系统初始化并发冲突两次fileprovisioner把仓库里files/etc/、files/var/下的定制文件整体上传到临时主机的对应目录内容见第四节install-docker.sh先安装容器运行时Docker CE与编排工具依次执行三个收尾脚本系统配置01-packages.sh→ 镜像清洁90-cleanup.sh→ 市场合规自检99-img_check.sh。下面两节逐一说明这些文件的具体实现。四、镜像内的运行时与首次启动编排4.1 安装 Docker 运行时scripts/install-docker.sh 负责把 Ubuntu 20.04 基础镜像改造成可运行 Appsmith 的容器主机添加 Docker 官方 APT 源download.docker.com/linux/ubuntu安装docker-ce、docker-ce-cli、containerd.io从 Docker Compose 官方 release 下载1.29.2版docker-compose到/usr/local/bin/docker-compose并chmod x创建docker用户组并把当前用户$USER即构建时的 root加入使后续免sudo调用 Docker。注意脚本锁定的是 docker-compose v1Python/二进制单文件版而实例真正启动 Appsmith 时调用的是docker-compose命令与 01-onboot 的调用方式相互对应。compose 版本号属于仓库中钉死的固定依赖若需升级请在构建前同步评估。4.2 首次启动脚本01-onbootfiles/var/lib/cloud/scripts/per-instance/01-onboot 是每个从该快照创建的新 Droplet 首次开机时自动执行的引导脚本DigitalOcean 的 cloud-init 会扫描per-instance目录。它把快照与Appsmith 真正跑起来衔接起来mkdir -p /root/appsmith cd /root/appsmith # 下载 Appsmith 生产环境的 docker-compose 编排文件 curl -L appsmith-repo/deploy/aws_ami/docker-compose.yml -o $PWD/docker-compose.yml docker-compose pull # 拉取最新容器镜像 docker-compose up --detach --remove-orphans即新实例首次开机即下载生产编排文件仓库内的 deploy/aws_ami/docker-compose.yml随后pullup启动服务。该编排文件定义了 Appsmith 的核心运行形态镜像index.docker.io/appsmith/appsmith-ee端口映射80:80与443:443HTTP/HTTPS 直通对应01-packages.sh中防火墙放行的端口数据卷./stacks:/appsmith-stacks持久化应用数据标签com.centurylinklabs.watchtower.enable: true容器策略restart: unless-stopped文件末尾保留了可选的 watchtower 自动更新服务注释状态开启后可按--schedule 0 0 * ? * *的 cron 语法每日自动拉新镜像实现无人值守升级。4.3 SSH 登录欢迎信息MOTDfiles/etc/update-motd.d/99-one-click 被部署为/etc/update-motd.d/99-one-click用户 SSH 登录新 Droplet 时会看到一段提示Hello! Welcome to your Appsmith droplet! Your Appsmith is installed at /root/appsmith.它告诉使用者应用安装位置/root/appsmith即 compose 文件与 stacks 数据所在属于 One-Click 镜像的引导文案层。4.4 系统初始化swap、监控与防火墙scripts/01-packages.sh 做三类事情构建期防 OOM脚本注释明确写道 Add a swap file to prevent build time OOM errors创建 8 GB/swapfile并启用。这解释了 builder 为何敢于使用仅 1 GB 内存的s-1vcpu-1gbDroplet 去完成apt upgrade与镜像拉取快照前脚本会swapoff并删除该文件确保成品快照不含 swap 文件系统更新apt-get update与apt-get upgrade保证镜像基线为最新补丁DigitalOcean 监控 Agent安装官方do-agent使新 Droplet 一创建即可在控制台看到监控指标防火墙启用ufw并显式放行http、https、ssh三类流量其余默认拒绝。五、市场合规清理与自检面向 Marketplace 的镜像必须在发布前移除一切构建期痕迹仓库用两个脚本串行完成这一目标。5.1 90-cleanup.shscripts/90-cleanup.sh设置了set -o errexit任一步失败即中断修复/tmp权限chmod 1777规避 marketplace-partners issue #94 中提到的构建期 /tmp 缺失问题对 apt 系发行版执行upgrade --force-confold与autoremove/autoclean清空/tmp、/var/tmp、历史命令history -c、清空/root/.bash_history、unset HISTFILE截断近一天内修改过的/var/log日志删除归档日志*.gz、*.N、*-????????移除 cloud-init 实例数据/var/lib/cloud/instances/*、SSH 主机密钥与authorized_keys、常见日志文件并touch空的/etc/ssh/revoked_keys最后用dd if/dev/zero of/zerofile向磁盘空闲区写零进行安全擦除完成后sync删除文件——注释明确提示这一步视磁盘大小可能需要数分钟以输出dd: writing to /zerofile: No space left on device为完成标志。之所以要擦除空闲块是为了让 DO 的快照存储只包含真实数据块减小快照体积并避免残留敏感信息被快照扫描发现。5.2 99-img_check.shscripts/99-img_check.sh 是 DigitalOcean Marketplace 官方提供的镜像校验工具脚本头声明VERSIONv. 1.6在打快照前于临时主机上执行。它按 PASS/WARN/FAIL 三级汇总检查项包括操作系统及版本是否在 DO 支持的发布清单内脚本支持 Ubuntu 16.04/18.04/20.04、Debian 9/10、CentOS 6/7/8 等cloud-init 是否已安装防火墙是否激活Ubuntu 检查ufw是否仍有未安装的安全更新通过apt-get --just-print upgrade统计含 security 的包root 与 uid≥1000 用户是否存在密码、.ssh私钥或非空authorized_keys、known_hosts是否存在未清理的日志归档、.bash_history是否清空是否残留 DO 监控 Agent快照中不允许携带 agent实例创建后由 DO 自动注入因此这里会对其报 FAIL 并给出卸载命令。脚本依据 PASS/WARN/FAIL 的数量计算STATUS并决定退出码任何 FAILSTATUS2都会使packer build失败从而在源头上拦截不合格镜像流入 Marketplace。只有 All Tests Passed 的快照才允许进入发布环节。六、执行构建产出快照6.1 生成并注入 DigitalOcean TokenPacker 的digitaloceanbuilder 需要以 API 令牌调用 DO 控制面完成创建 Droplet → 打快照 → 销毁 Droplet。在 DigitalOcean 控制台的 API 页面创建一个 Personal Access Token建议仅授予 droplet 与 snapshot 相关的最小写权限随后导出为环境变量export DIGITALOCEAN_TOKENyour-personal-token模板通过{{envDIGITALOCEAN_TOKEN}}读取该变量若未设置Packer 会在读取 user 变量时直接报错这是防止误提交令牌的第一道保险。6.2 运行构建在已检出本仓库的机器上进入 DigitalOcean 部署目录并执行cd deploy/digital_ocean packer build template.json执行过程中 Packer 会依次呈现各阶段输出digitaloceanbuilder 创建s-1vcpu-1gb的 Ubuntu 20.04 Dropletblr1等待cloud-init完成后上传定制文件运行install-docker.sh安装 Docker 与 Compose运行01-packages.sh→90-cleanup.sh→99-img_check.sh生成名为appsmith-marketplace-snapshot-timestamp的快照并自动销毁临时 Droplet。构建成功后可在 DigitalOcean 控制台的Snapshots页面看到新快照它就是下一节要发布的市场镜像。补充仓库根级 deploy/packer 目录还保留着配套的 Packer 配置defaults.cfg与 HCL2 格式的template.json.pkr.hcl可作为多平台镜像构建扩展时的参考本指南的 DO 流程仍以deploy/digital_ocean/template.json为准。七、发布新版本到 DigitalOcean Marketplace快照构建完成后还差把快照挂到 One-Click 应用上这一步即 README 的 Publish 阶段。注意构建快照与 Marketplace 应用是两个独立对象只有完成本节的关联与审核用户才能在 Marketplace 中一键部署到新版本。7.1 打开 Marketplace Vendor Portal登录 DigitalOcean 的Marketplace Vendor Portal供应商门户在 One-Click App 列表中找到并选中Appsmith应用进入编辑表单。发布者接下来在此完成三件事Select system image点击表单中的Select system image按钮在弹窗中浏览当前账号的全部快照选择刚由 Packer 构建出的最新快照appsmith-marketplace-snapshot-timestamp命名便于定位更新 App Version将App Version同步提升到与本次发布一致的更高版本号与应用内版本保持对应核对系统信息确认镜像对应的 OS Version 等字段符合预期。下图展示了供应商门户中编辑 Appsmith One-Click App 的表单形态可以看到App Version、Select system image等字段与上方步骤一一对应7.2 提交预览与正式发布填写完成后滚动到表单底部点击Preview发起市场预览。README 明确指出预览审核过程约需 23 个工作日The preview process will take around 2-3 business days由 DigitalOcean 团队对新快照做兼容性与安全审查预览通过successful review后点击提交submit变更即应用到DigitalOcean Marketplace——届时所有用户通过 One-Click 创建 Droplet 时拉起的都是新版本镜像。7.3 发布操作要点回顾步骤关键动作验证点准备安装 Packer、导出DIGITALOCEAN_TOKENpacker version、环境变量已导出构建packer build template.json控制台 Snapshots 出现新快照关联Vendor Portal →Select system image选新快照App Version 已同步更新审核提交 Preview等待 23 个工作日上线审核通过后 submitMarketplace 应用页可用新版本部署八、链路总结与故障排查提示回顾整套方案其设计要点可以提炼为三条声明式镜像工厂template.json一处声明了基础 OS、机房、规格与初始化顺序天然可重复、可审计杜绝了手工打镜像的不可复现性镜像与运行时解耦快照里只固化 Docker 运行时与系统基线Appsmith 容器本身由 01-onboot 在每个新实例首次开机时实时pull最新镜像启动编排文件见 deploy/aws_ami/docker-compose.yml——这让同一个快照在 Marketplace 存活期内始终能部署到当时最新的 Appsmith 容器版本快照迭代频率因此大幅降低质量闸门前置清理脚本90-cleanup.sh加官方校验工具99-img_check.sh在打快照前强制拦截含凭据、日志残留、未打安全补丁或缺少防火墙的不合格镜像。常见问题排查方向packer build提示 token 相关错误检查DIGITALOCEAN_TOKEN是否已正确 export令牌是否仍有权限构建在99-img_check.sh阶段 FAIL通常是安全更新未装完或日志/历史未清空可查看 FAIL 明细后重新跑 90 → 99 两脚本再构建新 Droplet 启动后 Appsmith 未就绪登录后先看 MOTD 确认安装目录再在/root/appsmith下执行docker-compose ps/docker-compose logs排查容器状态数据均持久化在/root/appsmith/stacks。【免费下载链接】appsmithPlatform to build admin panels, internal tools, and dashboards. Integrates with 25 databases and any API.项目地址: https://gitcode.com/GitHub_Trending/ap/appsmith创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考