关于 landung
这是一个将项目从 Albatros 迁移到自有服务器的技能,面向准备自行维护部署环境的项目负责人。它涵盖迁移评估、服务器配置、GitHub 部署、数据转移、域名切换和旧环境下线,并强调先验证新环境再迁出。
主要功能
- 01评估是否适合迁移
- 02制定项目、数据和秘密的迁移清单
- 03指导 Ubuntu 与 Docker 服务器配置
- 04将 Git 仓库和部署工作流迁至 GitHub
- 05迁移数据并切换域名
- 06验证新环境后再关闭旧服务
适用场景
- 01从托管平台迁移到自有服务器
- 02将部署流程改为 GitHub Actions
- 03迁移数据库、上传文件和环境变量
- 04切换域名并检查 HTTPS
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ dischen87/ albatros-skills --skill landung安装后在 Claude Code 中输入/landung确认已加载。
详细介绍
登陆:搬进自己的房子
这个比喻
在 Albatros,你住在有管理员的公寓里:他会关上大门、更换门锁,还会每晚给公寓拍照。住进自己的房子后,这些事就由你自己来做。
这次搬家不是从头新建。你的项目已经装进了随处都能安放的箱子:日志簿(Git)、施工说明(Dockerfile、compose.yaml)和流水线(工作流)。你把剩下的东西也装上,搬过去,再变更地址。只有港口属于 Albatros 的房子:你的日志簿需要换一个新港口,例如 GitHub。
**如何使用这个比喻:**在你的第一条回复中,先告诉对方这个比喻,再提问或展示命令,即使对方一上来就要解决方案,也要这样做。
说话方式
- **不只提问:**如果缺少项目或某项信息,仍要给出具体步骤,或先写出带有标记假设的文件草稿(
[假设:…])。在最后再询问缺少的内容。 - 使用“你”的称呼方式。坦诚说明所需投入:自建服务器通常能省钱,但需要花时间维护。
- 服务器由对方自行向服务商租用并付费。
- 只有确认新家已正常运行后,才关闭旧家。
流程
1. 搬家划算吗?
按照技能 kosten,与对方简要讨论:项目是否需要 Albatros 无法提供的功能?对方是否想把一切掌握在自己手中?每个月是否有一两个小时用于维护?如果没有,留下来也是不错的选择。
使用 Light 时,搬家很简单:文件夹 seite/ 可以在任何静态网站托管服务商处运行。把日志簿迁移到 GitHub(第 4 步,第 1 和第 2 项),然后在那里启用网站,例如使用 GitHub Pages。无需迁移服务器、流水线和域名,但仍需保留搬家清单。
2. 搬家清单
在项目中创建 docs/landung.md:
# Umzug auf eigenen Server
## Kisten
- [ ] Logbuch: alles gepusht (`git status` sauber)
- [ ] Logbuch im neuen Hafen (z. B. GitHub), alle Einträge dort angekommen
- [ ] Geheimnisse: Liste der Namen aus `.env.example` (Werte nie hier!)
- [ ] Daten: Datenbank, hochgeladene Dateien (Ordner: …)
- [ ] Einstellungen: Domains, E-Mail-Einträge im DNS (nicht anfassen), Cronjobs
- [ ] Domain über Albatros gekauft? Dann mit dem Auth-Code (`domain_mitnehmen`) zu einem neuen Registrar
## Was ich selbst übernehme
- [ ] Updates (automatisch, nur Sicherheitsupdates)
- [ ] Sicherungen (nächtlich, ausser Haus, verschlüsselt, Probe jeden Monat)
- [ ] Überwachung (Seite antwortet? Platte voll?)
## Ablauf und Datum
…
3. 新家
- 租用服务器,使用 Ubuntu 24.04,内存至少与当前相同。下单时,提交对方的公钥。
- 使用可以安全重复运行的脚本进行设置(以 root 身份运行;先阅读,再执行):
- 更新系统,从官方来源安装 Docker
- 创建用户
deploy,配置你的密钥,并创建文件夹~/projekt - SSH 仅允许使用密钥登录:在
/etc/ssh/sshd_config.d/10-haerten.conf中设置PasswordAuthentication no,并提前使用sshd -t检查 - 防火墙:先执行
ufw allow 22/tcp、80/tcp、443,然后再执行ufw enable(否则你会把自己锁在外面)。保留一个已打开的 SSH 会话以备救援。 - 安装
fail2ban,启用自动安全更新(unattended-upgrades) - 为日志设置限制,避免磁盘空间耗尽
- 在网站前配置 Caddy 作为门卫:地址指向服务器后,它会自动获取 HTTPS 证书。将它作为独立服务加入
compose.yaml,网站本身之后只绑定到127.0.0.1。Caddyfile出错会让一切停摆:每次重新加载前都要执行caddy validate,然后从外部检查。
4. 带走日志和流水线
在 Albatros 上,流水线的工人住在房子里。在自己的房子里,由 GitHub 的工人接手:它不会亲自构建,而是用自己的钥匙敲响新服务器的门,让服务器交付。
- 新港口: 由用户自行在 github.com 上创建账户。然后安装
gh(Mac:brew install gh),并运行gh auth login,登录会在浏览器中进行。 - 迁移日志:
搬走之前,旧港口仍可通过git remote rename origin albatros gh repo create <projektname> --private --source . --remote origin --pushalbatros访问。 - 新服务器的读取密钥: 它会自行获取日志,只读访问。它的房屋钥匙留在服务器上,发给 GitHub 的只有锁:
将 github.com 的指纹与 docs.github.com 上的指纹进行比较。ssh deploy@<neue-adresse> 'ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N "" -C eigener-server' ssh deploy@<neue-adresse> 'cat ~/.ssh/id_ed25519.pub' > server-schloss.pub gh repo deploy-key add server-schloss.pub --title "eigener-server" # nur lesen, das ist der Standard rm server-schloss.pub ssh deploy@<neue-adresse> 'ssh-keyscan -t ed25519 github.com >> ~/.ssh/known_hosts && git clone [email protected]:<benutzer>/<projektname>.git ~/projekt' - 流水线专用密钥,绝不使用用户的房屋钥匙。这样可以单独禁用它:
密钥直接从文件存入 GitHub 的保险库(Secrets),绝不放进聊天或日志。之后可以删除电脑上的ssh-keygen -t ed25519 -f ~/.ssh/fliessband -N "" -C fliessband ssh deploy@<neue-adresse> 'cat >> ~/.ssh/authorized_keys' < ~/.ssh/fliessband.pub gh secret set DEPLOY_KEY < ~/.ssh/fliessband gh secret set DEPLOY_KNOWN_HOSTS --body "$(ssh-keyscan -t ed25519 <neue-adresse> 2>/dev/null)" gh variable set SERVER --body "deploy@<neue-adresse>" gh variable set SEITE_URL --body "https://<domain>"~/.ssh/fliessband。 - 调整工作流: 在
.github/workflows/deploy.yml中更换工人和连接服务器的路径。其余部分保持不变:
机密只能通过jobs: fliessband: runs-on: ubuntu-latest # ein Arbeiter von GitHub statt deines Servers permissions: contents: read # so wenig Rechte wie möglich concurrency: group: ausliefern cancel-in-progress: false # eine laufende Auslieferung nie abbrechen env: ZIEL: ${{ vars.SERVER }} SEITE: ${{ vars.SEITE_URL }} SHA: ${{ github.sha }} steps: - name: Schlüssel des Fliessbands einsetzen env: DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} DEPLOY_KNOWN_HOSTS: ${{ secrets.DEPLOY_KNOWN_HOSTS }} run: | [ -n "$DEPLOY_KEY" ] || { echo "::error::Secret DEPLOY_KEY fehlt"; exit 1; } install -d -m 700 ~/.ssh printf '%s\n' "$DEPLOY_KEY" > ~/.ssh/id_ed25519 && chmod 600 ~/.ssh/id_ed25519 printf '%s\n' "$DEPLOY_KNOWN_HOSTS" > ~/.ssh/known_hosts - name: Bauen und ausliefern, notfalls zurück run: | ssh "$ZIEL" "SHA=$SHA bash -s" <<'EOF' # hier der Block aus der Albatros-Version, ab «set -euo pipefail» bis «echo "läuft: $SHA"», ohne die Zeile mit willkommen EOF - name: Endkontrolle von aussen run: | # unverändert aus der Albatros-Versionenv:传入命令,绝不能直接以${{ secrets.… }}的形式写进run行。然后运行gh workflow run deploy.yml和gh run watch。结果必须显示为绿色。
5. 带走数据和机密
- 通过
scp直接从一台服务器传到另一台,或经由自己的电脑传输.env,绝不能通过 Git。 - 数据库:在 Albatros 上备份(例如
sqlite3 app.sqlite ".backup kopie.sqlite"或pg_dump),然后在新服务器上还原。 - 使用
rsync -a传输已上传的文件。
6. 更换地址指向
先通过新服务器的地址进行测试,不更改电话簿:curl --resolve <domain>:443:<neue-ip> https://<domain>/。然后要看地址是在哪里租用的。
在 Albatros 购买(konto_status 在「Eigene Domains」下显示该地址):Albatros 管理这个地址的电话簿。用户可以将地址转移到自己选择的注册商:
- 用户自行在新注册商处创建账户。
- 只有得到用户同意后,才调用
domain_mitnehmen。从此以后,Albatros 不再续费该地址。在转移完成之前,该地址仍指向 Albatros 服务器。 - 该工具会提供 Auth-Code,即转移地址的密钥。只向用户展示,绝不要放进文件或日志。用户在新注册商处输入该代码,并在那里发起转移(Transfer)。通常需要为此支付一年的续费费用。购买后的前 60 天内,
.com和.net域名通常还不能转移。 - 转移完成后,用户在新注册商处设置记录:将 A 和 AAAA 指向新服务器;如果之前有设置,还要配置
www和电子邮件记录(MX)。
在其他地方租用:
- 提前一天将记录的有效期(TTL)调低到 300 秒。这样更换指向会更快。
- 将 A 和 AAAA 记录指向新服务器。在 Albatros 上无需为此办理注销。
然后进行检查:https://<domain> 有响应,www 会跳转,锁形图标正常显示。
7. 然后再搬走
观察一周。一切运行正常后,在 Albatros 调整或取消订阅(Cockpit)。用户通过 Albatros 购买的域名需要提前转移(步骤 6),否则会随订阅到期。此后将无法再使用照片(Snapshots):从现在开始,自己的备份才是保障。
8. 检查任务
将 docs/landung.md 加入日志,并通过流水线(Skills git-logbuch、pipeline)执行,然后使用 flugschule-10-landung 运行 mission_pruefen。检查会确认迁移清单 docs/landung.md 是否位于项目中(Pilot 位于 Albatros 服务器上时,或 Light 位于港口时)。最好由用户在仍住在 Albatros 时编写清单。
常见陷阱
- 没有证书:地址尚未指向新服务器,或者 80 端口已关闭。
- Docker 端口绕过防火墙:内部服务仅绑定到
127.0.0.1。 - 已设置备份,却从未恢复过:只有成功完成恢复测试,备份才算真正可用。
- 更新后自动重启:仅当所有服务之后都能自动恢复运行时才这样做。
结束消息
你在这一步的最后一条消息应以一句关于“搬进自己的房子”这一比喻的话开头,重申核心要点。然后说明:完成了什么、结果在哪里、还有什么未完成,以及接下来要做什么。