Multi-environment
ShipNode treats environments as separate config files. There is no --profile flag — you point --config at the file you want.
Layout
Section titled “Layout”shipnode.config.ts # production (default)shipnode.staging.config.ts # stagingStaging config
Section titled “Staging config”import { shipnode } from '@devalade/shipnode';
export default shipnode .backend() .ssh({ host: 'staging.example.com', user: 'deploy' }) .deployTo('/var/www/api-staging') .pm2('api-staging', { instances: 1 }) .port(3000) .domain('staging-api.example.com') .nodeVersion('22') .pkgManager('pnpm') .build();Run a command against staging
Section titled “Run a command against staging”npx shipnode deploy --config shipnode.staging.config.tsnpx shipnode status --config shipnode.staging.config.tsnpx shipnode logs --config shipnode.staging.config.tsEvery command that touches the server takes --config. Use it consistently or wrap it in npm scripts:
{ "scripts": { "deploy:staging": "shipnode deploy --config shipnode.staging.config.ts", "deploy:prod": "shipnode deploy" }}