Skip to content

Migrate to Railway IaC and update to current versions - #2

Merged
Ntelikatos merged 2 commits into
masterfrom
chore/railway-iac-latest
Nov 2, 2026
Merged

Ntelikatos merged 2 commits into
masterfrom
chore/railway-iac-latest

Conversation

@Ntelikatos

Copy link
Copy Markdown
Owner

Summary

  • Railway Infrastructure as Code: railway.json (Config as Code) is deprecated and stops being read on 2026-12-01. The deployment now lives in .railway/railway.ts: Dockerfile build, watch patterns, restart limit, TCP proxy on 22 and the /data volume. Variables stay unmanaged, so secrets never land in git. The live project is already cut over, and railway config plan reports it up to date.
  • Base image: node:26-slim (Node 26 LTS, Debian 13), s6-overlay 3.2.3.2 with the new user-bundles.d layout, n 11, pnpm 12.
  • SSH: post-quantum key exchange (ML-KEM-768 + X25519) first, classic fallbacks kept for older mobile clients, deprecated option removed. ssh-audit reports zero failures.
  • fail2ban actually works now: sshd -e used to bypass syslog, so auth.log stayed empty and nothing was ever banned. Railway's TCP proxy hides client IPs, so its internal ranges are exempt from bans and OpenSSH penalties. Without that, one scanner would lock everyone out.
  • CI and docs: current action versions, trivy-action pinned by SHA, hadolint 2.15 fixes, README and template description refreshed (claude auth login, current links).

Behavior changes

  • Default Node is 26. NODE_VERSION=24 still works (tested).
  • sshd lines reach Railway logs as plain syslog text, not JSON-wrapped stderr.

Testing (local Docker)

  • Fresh deploy: all s6 services up, sshd -t clean, Claude Code 2.1.316, Node 26.13.0, pnpm 12.16.1, gh 2.103.3, tmux config loads.
  • Upgrade from the current master image on the same volume: host key, Claude Code symlink and .bashrc unchanged.
  • fail2ban: a public-IP client is banned after 4 bad logins. A Railway-like 10.x client is never banned or throttled. Offering a wrong key before the right one doesn't count as a failure.
  • hadolint 2.15.1 and ShellCheck clean.

🤖 Generated with Claude Code

Ntelikatos and others added 2 commits November 2, 2026 23:37
Railway Config as Code (railway.json) is deprecated and stops being
read on 2026-12-01. Replace it with .railway/railway.ts: service with
Dockerfile build, watch patterns, restart policy, TCP proxy on 22 and
the /data volume. Variables stay unmanaged so secrets never land in git.

Also bring the image and tooling up to date:
- node:26-slim (Node 26 LTS, Debian 13), s6-overlay 3.2.3.2 with the
  new user-bundles.d layout, n 11, pnpm 12
- sshd: post-quantum KEX first, drop deprecated option
- fail2ban: sshd now logs via rsyslog so bans actually work; exempt
  Railway-internal proxy ranges from bans and OpenSSH penalties
- tmux terminal-features, current GitHub Action versions, trivy-action
  pinned by SHA, hadolint 2.15 fixes
- README and template description: IaC docs, claude auth login,
  current links and plans

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Railway always builds with a root Dockerfile and defaults the restart
policy to ON_FAILURE, so declaring them only produced permanent plan
drift. The plan is now clean against the live project.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Ntelikatos
Ntelikatos merged commit 4bbd196 into master Nov 2, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant