clone 之后一条命令,任何一台 Ubuntu/Debian 机器收敛到声明状态:软件、语言运行时、CLI 工具、GNOME 桌面偏好、dotfiles——幂等、可重放、可迁移。
↑ 速览:ldc 快照 · ldc plan 干跑预演 · ldc verify --quick 机器断言(源文件 docs/demo.cast)
基于 WDC(Windows + WSL 同思路仓库)的经验自建,独立仓库不 fork(ADR-0001)。两仓为对等的关联项目:WDC 主管 Windows 侧,LDC 主管 Linux 侧(含 WSL Ubuntu),各自完整自闭环;WSL 的 Linux 收敛由 WDC 移交 LDC(ADR-0007)。仓库以 MIT 开源,欢迎直接使用或 fork 改造成你自己的环境。
支持的机器形态:Ubuntu 24.04+ / Debian 13+(双发行版 × 双架构四腿均入 CI 冒烟矩阵实证;Debian 12 缺 eza/git-delta 不在面内)· amd64 / arm64 双架构一等公民(ADR-0006),其它架构在 bootstrap 预检即失败。WSL Ubuntu 亦属 amd64 目标可直接跑;WDC 管理的发行版按 ADR-0007 走委托路径(一个发行版只归一个管理器);无 systemd 的 WSL 建议 LDC_SKIP_DOCKER=1。
安全与边界:幂等重跑(已就位即跳过)· 只装不删、清单外不碰——无卸载清单,机器私有内容不受影响(ADR-0003)· dotfiles 落点为模板渲染拷贝——仓库缺席不影响已收敛机器;纯模板更新直接重渲染(渲染账本判定),机器侧改动覆盖前必备份 *.bak(ADR-0015)· Docker daemon 只做受保护合并,绝不自动重启(ADR-0009)。动手前想先看?ldc plan 干跑预演「重跑会做什么」,只读零变更。
零前置——一条命令(缺 git/curl 自动经 apt 安装,sudo 需密码的机器就地询问):
curl -fsSL https://raw.githubusercontent.com/yu-cn/ldc/main/scripts/get.sh | bashget.sh 是唯一的远程引导脚本:缺 git/curl 自动 apt 安装 → 定位或 clone 仓库(~/.ldc 指针有效则复用,缺省 clone 到 ~/ldc)→ 直接进入 bootstrap 全流程。curl | bash 属于直接执行网络代码——介意可先审阅 get.sh再粘贴;求稳可钉版本:curl -fsSL https://raw.githubusercontent.com/yu-cn/ldc/main/scripts/get.sh | bash -s -- <tag>(fresh clone 与复用路径均 checkout 该 tag——已装机升级重跑同一命令带新 tag 即重钉,tag 清单见 GitHub Releases)。偏好手动管理的等价两行(git/curl 需自备,sudo apt install -y git curl):
git clone https://github.com/yu-cn/ldc.git ldc && cd ldc
bash bootstrap.shfork 改造成自己环境的用户在引导命令前设 LDC_REPO 指向自己的仓库(LDC_REPO=https://github.com/<你>/ldc.git curl -fsSL https://raw.githubusercontent.com/yu-cn/ldc/main/scripts/get.sh | bash,同样一条命令),或把手动路径的 clone 地址换成你的仓库——ldc sync 跟随你 clone 的远端;直接使用者保持上面的地址,ldc sync 一键跟进上游演进。
七阶段:预检 → 无副作用校验 → root 阶段 → user 工具 → 桌面 → dotfiles → 汇总,全程日志落 logs/bootstrap-<时间戳>.log。重跑幂等:已就位的全部跳过。收敛完成后验收:bash scripts/verify-machine.sh(全绿即与声明一致)。
sudo 需密码的机器(服务器常态):bootstrap 不打断、不静默——root 阶段留待交接,末尾打印单条命令:
cd <repo> && sudo bash scripts/install-packages.sh退出码:0 全部就绪 · 1 有失败 · 2 有待办手工步骤(root 交接 / ~/.gitidentity 未填 / 桌面待登录重跑)。
首次运行你需要配合的四件事
- root 阶段交接——sudo 需密码时按末尾打印的命令手动执行(agent/CI 无法替你输密码)
- 填写身份——bootstrap 生成
~/.gitidentity占位后,填上本机的 git name/email(占位未填则 git 拒绝提交,这是防错护栏),然后做首次 commit:git add -A && git commit -m "Initial LDC scaffold" - 桌面域——有 GNOME 的机器在 SSH 上下文会 SKIP,登录桌面会话后重跑
bash bootstrap.sh(或ldc sync)应用 gsettings 与字体 - 关闭 VSCode 设置同步(桌面应用域机器)——首次启动 VSCode 若已登录账号,关闭「设置同步」:它是账号级开关、配置文件管不到;不关的话云端会与仓库 dotfiles 打架(仓库是唯一主人)
一条命令得到什么(点开看完整清单)
系统(root 阶段,base-linux + cli-tools) build-essential · git · curl/wget · jq · fzf / ripgrep / bat / fd / zoxide / eza / git-delta / btop / direnv / htop / shellcheck · gh(官方 apt 源)· Docker Engine(download.docker.com 官方 apt 源;已装则跳过,默认用户入 docker 组;daemon.json 受保护合并声明日志轮转与 live-restore——机器自有键保留,不自动重启,ADR-0009)
可选包组(不随 bootstrap,ADR-0010)
常用但非每台必需的工具按组平铺在 configs/(media-doc:pandoc + ffmpeg · etckeeper:/etc 纳入 git 审计,apt 事务与机主自改全程留痕),sudo bash scripts/install-packages.sh <组名> 显式指名安装——装没装由 dpkg 记账,verify 不断言;新增可选组只需加一个清单文件。
语言运行时(user 阶段)
Node 归 mise(版本钉 configs,默认 node@lts 随收敛更新)、Python 归 uv(钉 configs/uv-version)——与 WDC 两侧同工具同习惯;机器已有的 nvm 等属自留地,共存不卸载(ADR-0003)
CLI 增强(user 阶段,版本钉 configs) starship 提示符 · lazygit · JetBrainsMono NF 字体(仅桌面栈机器)
GNOME 桌面域(按需启用,desktop.gsettings,ADR-0005) 暗色主题 · 24h 时钟(含星期几)· 关热角 · 字体渲染 rgba/slight · Nautilus 显示隐藏文件 · 隐私去噪(关最近文件/应用使用记录)· 触摸板轻触 · Ubuntu Dock 点击最小化 · 中文输入源保底(美式键盘 + ibus-rime 中州韵,词库走雾凇拼音)——无桌面会话自动 SKIP;发行版无对应组件的条目自动跳过
桌面应用域(桌面栈机器启用,ADR-0008) VSCode(packages.microsoft.com 源)+ 30 个扩展(Python/Jupyter 全家、Remote-SSH/容器、中文语言包等)+ Chrome(dl.google.com 源)+ ibus-rime——双架构对称(两家厂商源均有 arm64/amd64);扩展清单与 WDC 同名同格式,自装扩展不核销
dotfiles(dotfiles/,渲染拷贝安装(ADR-0015),覆盖前备份 *.bak)
bashrc(历史/别名/fzf/zoxide/starship + 工具布局事实 env.sh + 末尾 .bashrc.local 机器自留地)· gitconfig(delta / rerere / zdiff3;身份经 ~/.gitidentity 每机本地提供)· starship.toml · VSCode settings/keybindings(桌面应用域机器)
ldc 由 bootstrap 链接到 ~/.local/bin/ldc——任意目录可用,无需进仓库(对齐 wdc 的裸命令体验)。
| 命令 | 用途 |
|---|---|
ldc |
只读快照(裸命令默认,秒级):远端差距 / dotfiles 漂移 / 身份 / root 阶段 / 最近 bootstrap;--json 单行机器可读出口 |
ldc plan |
干跑预演(只读零变更):重跑收敛会做什么——sudo/重跑前先看一眼 |
ldc sync [--full] |
日常一键同步(fetch → pull --ff-only → bootstrap → verify 全量;已收敛且声明未变走快速路径仅 quick 断言(ADR-0021),--full 强制全量) |
ldc verify [--full] / ldc audit |
机器断言(默认 --quick)/ 清单准入对账(自装未声明 / 已声明未装,只读) |
ldc triage / ldc log / ldc help |
dotfiles 落点漂移分流 / 最近日志尾部 / 帮助与版本(子命令后接 -h 出该命令详解;Tab 补全词表解析自脚本单一来源) |
bash bootstrap.sh |
完整收敛(日常改了配置后重跑) |
bash validate.sh |
只做无副作用校验(bash -n + shellcheck + 清单格式) |
bash scripts/verify-machine.sh [--quick] |
机器断言的脚本直跑形态 |
configs/ 声明式层:包清单(base-linux / cli-tools / 可选包组)· gsettings 清单 · 版本钉子
scripts/ 编排层:bootstrap 各阶段、CLI、断言、预演、漂移分流
dotfiles/ dotfiles 层:linux / shared 两处,渲染拷贝安装(覆盖前备份 *.bak,ADR-0015)
- git 身份不入仓库:模板 include 每机本地的
~/.gitidentity - Node 全权归 mise(钉 2026.10.25),Python 全权归 uv(钉 0.13.6);机器已有运行时管理器(nvm 等)属自留地,共存不卸
- shell 机器自留地:
~/.bashrc.local(模板最末尾加载,别名可覆盖模板) - 桌面域按需启用:无 D-Bus 会话自动 SKIP,不制造假 FAIL
- 该机上跑「快速开始」一条命令(或手动
git clone本仓库 →bash bootstrap.sh)→ 按提示完成 root 交接与身份填写 - 验收:
bash scripts/verify-machine.sh(全绿即与声明一致) - 机器改进直接 push
main(pre-commit 钩子把关:shellcheck 已装则硬把关,未装警告放行、CI 兜底);个性需求走~/.bashrc.local自留地,不进仓库
- 词汇表:GLOSSARY.md · 决策:docs/adr/ · 面向 agent 的红线:AGENTS.md · 更新日志:CHANGELOG.md(Keep a Changelog)
- 首屏演示由 docs/demo.cast(asciinema v2 录播,真实命令输出脱敏生成)经 agg 转 GIF 嵌入——
asciinema play docs/demo.cast可原速回放 - 工单与规格:
.scratch/(作者的本地 markdown 工单流)
