name: deploy write # write.famzheng.me — host systemd service(不是 k8s pod),act_runner fam 用户直接 cp 本地 on: push: branches: [master] paths: - 'apps/write/**' - 'crates/cube-core/**' - 'Cargo.toml' - 'Cargo.lock' - '.gitea/workflows/deploy-write.yml' workflow_dispatch: jobs: build-and-deploy: runs-on: ubuntu-latest env: APP: write # systemctl --user 需要 runtime dir;fam 已 enable linger XDG_RUNTIME_DIR: /run/user/1001 steps: - uses: actions/checkout@v4 - name: Build backend run: | export PATH="$HOME/.cargo/bin:$PATH" cargo build --release -p "$APP" - name: Build frontend run: | cd "apps/$APP/frontend" npm ci npm run build - name: Install binary + dist + systemd unit run: | mkdir -p \ "$HOME/.local/bin" \ "$HOME/.local/share/$APP/dist" \ "$HOME/.local/state/$APP" \ "$HOME/.config/$APP" \ "$HOME/.config/systemd/user" install -m 755 "target/release/$APP" "$HOME/.local/bin/$APP" rsync -a --delete "apps/$APP/frontend/dist/" "$HOME/.local/share/$APP/dist/" install -m 644 "apps/$APP/systemd/$APP.service" "$HOME/.config/systemd/user/$APP.service" # 首次部署占位 env(已有则不动,避免覆盖 passphrase) if [ ! -f "$HOME/.config/$APP/env" ]; then echo "WRITE_PASSPHRASE=CHANGE-ME" > "$HOME/.config/$APP/env" chmod 600 "$HOME/.config/$APP/env" echo "⚠ created placeholder ~/.config/$APP/env, edit + restart" fi - name: Reload + restart write.service run: | systemctl --user daemon-reload systemctl --user enable "$APP.service" systemctl --user restart "$APP.service" sleep 1 systemctl --user --no-pager status "$APP.service" | head -15 - name: Apply k8s service/ingress run: kubectl apply -f "apps/$APP/k8s/all.yaml"