Blog

SSH, Linux, and production operations — page 3

Practical runbooks for servers, containers, databases, cloud hosting, incident response, and safe AI-assisted operations.

Find which Linux directory consumes inodes before cleanup

Inode exhaustion usually comes from many directory entries rather than large bytes, so file counts and ownership matter more than du size.

The Tryssh team · July 29, 2026 →

Find large files on Linux without crossing the wrong filesystem

Du summarizes reachable directory entries while find can select individual files; mount boundaries and permissions determine what either command can see.

The Tryssh team · July 29, 2026 →

Use git bisect with a deterministic regression test

Bisect performs binary search between known good and bad commits, classifying tested revisions until it identifies the first bad candidate.

The Tryssh team · July 29, 2026 →

Create a Git bundle that proves it contains the refs needed for recovery

Git bundle writes selected reachable objects and refs into one file that another Git repository can verify and clone without network access.

The Tryssh team · July 29, 2026 →

Use Git interactive rebase without rewriting unreviewed shared history

Interactive rebase replays selected commits onto a new base, creating new object IDs and requiring explicit conflict and publication decisions.

The Tryssh team · July 29, 2026 →

Recover a lost Git commit from the reflog without moving the current branch

Reflogs record recent local ref movements and HEAD transitions, allowing a still-present commit object to be named and protected with a new ref.

The Tryssh team · July 29, 2026 →

Use git rerere to reuse conflict resolutions without trusting them blindly

Rerere records the shape of a conflict and the chosen resolution, then can reapply it when the same conflict recurs.

The Tryssh team · July 29, 2026 →

Restore a deleted Git branch from a verified commit object

Deleting a branch removes a ref, not immediately its reachable commit objects; reflogs, remotes, and object traversal may still identify the tip.

The Tryssh team · July 29, 2026 →

Use Git sparse-checkout for large repositories without losing tracked state

Sparse-checkout controls which tracked paths populate the working tree; cone mode uses directory patterns while the complete index and object model remain repository-wide.

The Tryssh team · July 29, 2026 →

Update Git submodules to reviewed commits instead of floating branches

A superproject records one gitlink commit for each submodule; update materializes that exact object according to local URL and recursion policy.

The Tryssh team · July 29, 2026 →

Verify signed Git commits while checking the trusted identity separately

A commit signature proves control of a signing key over one commit object; trust, key ownership, repository authorization, and source review remain separate.

The Tryssh team · July 29, 2026 →

Use git worktree for a clean hotfix without stashing active work

A linked worktree checks out another branch into a separate directory while sharing repository objects and most refs.

The Tryssh team · July 29, 2026 →

Attest GitHub Actions build artifacts and verify before deployment

An artifact attestation binds subject identity and digest to signed provenance generated by a workflow; deployment must still verify the expected repository and policy.

The Tryssh team · July 29, 2026 →

Prevent overlapping GitHub Actions deployments with one environment key

A concurrency group allows one running and one pending job or workflow per key; cancel-in-progress determines whether a newer run interrupts active work.

The Tryssh team · July 29, 2026 →

Design a GitHub Actions rollback job that does not rebuild history

A rollback should select a previously verified immutable artifact, pass the same environment gate, deploy through the same mechanism, and record a new deployment event.

The Tryssh team · July 29, 2026 →

Use GitHub Actions environment approval as a real deployment boundary

An environment can gate jobs with reviewers, branch rules, and protection rules; environment secrets are withheld until configured protection passes.

The Tryssh team · July 29, 2026 →

Manage SSH known_hosts in GitHub Actions without trusting the scan itself

Ssh-keyscan retrieves offered host keys without authenticating them, so CI must compare a pinned fingerprint delivered through an independent trust path.

The Tryssh team · July 29, 2026 →

Replace long-lived GitHub Actions cloud keys with constrained OIDC

A job with id-token write can request a short-lived signed token whose claims the cloud provider maps to a narrowly scoped role.

The Tryssh team · July 29, 2026 →

Build a reusable GitHub Actions deployment workflow with a narrow contract

Workflow_call defines typed inputs, secrets, permissions, and outputs so repositories can reuse reviewed deployment logic without copying mutable shell blocks.

The Tryssh team · July 29, 2026 →

Mask GitHub Actions secrets without treating redaction as containment

GitHub masks registered secret values in logs, but transformed, encoded, structured, or dynamically fetched values may need explicit masking and should not be printed at all.

The Tryssh team · July 29, 2026 →

Harden GitHub Actions self-hosted runners as disposable execution hosts

Self-hosted jobs execute on infrastructure you control and may persist processes, files, credentials, and network reachability unless each job receives an isolated ephemeral environment.

The Tryssh team · July 29, 2026 →

Build a GitHub Actions SSH deployment with a narrow remote command

An SSH deployment job should deliver an immutable artifact and invoke a reviewed least-privilege remote entrypoint rather than streaming arbitrary repository shell into production.

The Tryssh team · July 29, 2026 →

Validate the complete HAProxy configuration before reload

Haproxy -c parses the supplied configuration and referenced files using the installed binary without starting listeners.

The Tryssh team · July 29, 2026 →

Verify an HAProxy graceful reload across old and new workers

A graceful reload starts a validated new process and asks the old process to stop accepting new connections while it finishes existing work.

The Tryssh team · July 29, 2026 →