Noundry Engine CLI

Docker-first deployment platform for .NET developers. Deploy applications as lightweight Docker containers (~50MB) to any Linux VPS. Local to live URL in 2-3 minutes.

# Install
$ dotnet tool install --global Noundry.Engine.Cli

Quick Start

Get a .NET app deployed to a Linux VPS with three commands.

# 1. Initialize server (installs Docker, Nginx, Certbot, UFW)
$ ndng init

# 2. Add a domain (configures Nginx, SSL, DNS)
$ ndng add myapp.com --port 5000 --ssl

# 3. Deploy your application
$ ndng deploy myapp.com

Or use a test domain for instant deployment without DNS configuration:

$ ndng add myapp --test --port 5000
# Result: https://myapp.noundry.app

Core Features

Docker-First Deployment

Chiseled .NET images produce ~50MB containers. All services (PostgreSQL, Redis, RabbitMQ) run as Docker containers.

Automatic SSL

Let's Encrypt certificates for custom domains, Cloudflare SSL for *.noundry.app test domains.

Database Containers

Start PostgreSQL, MySQL, or SQL Server as Docker containers with auto-generated passwords and persistent volumes.

Infrastructure Stacks

Deploy predefined stacks (app + database + cache) with a single ndng stack create command.

Commands Reference

ndng init

Prepare a fresh Linux server for Docker deployments. Installs Docker Engine, Docker Compose, Nginx, Certbot, and configures UFW firewall.

Option Default Description
--host-Server IP or hostname
--port22SSH port
--usernamerootSSH username
--key-Path to SSH private key
--passphrase-SSH private key passphrase
--email-Email for Let's Encrypt
--engine-api-key""API key for *.noundry.app domains
--non-interactivefalseSkip prompts for CI/CD usage
--from-spinup-Import server from Spinup workspace
# Interactive mode (prompts for all values)
$ ndng init

# Non-interactive mode for automation
$ ndng init \
 --host 192.168.1.100 \
 --username root \
 --key ~/.ssh/id_rsa \
 --email admin@example.com \
 --engine-api-key sk_abc123xyz \
 --non-interactive

ndng add <domain>

Configure Nginx reverse proxy, SSL certificate, and optionally create a DNS record for a .NET application.

Option Default Description
--port5000Application port
--ssltrueEnable SSL certificate
--testfalseUse *.noundry.app test domain
--typewebappApplication type: webapp or api
--email""Email for SSL certificates
# Production domain (configure DNS manually)
$ ndng add myapp.com --port 5000 --ssl --email admin@example.com

# Test domain (automatic DNS via Noundry Engine API)
$ ndng add myapp --test --port 5000

# API deployment (different Nginx config)
$ ndng add api.myapp.com --type api --port 5001 --ssl

ndng database

Start database engines as Docker containers with persistent volumes and auto-generated credentials.

Option Default Description
--type-postgres, mysql, or sqlserver
--nameapp_dbDatabase name
--userapp_userDatabase username
--password(generated)Database password
--port(default)Database port override
# PostgreSQL with auto-generated password
$ ndng database --type postgres --name myapp_db --user myapp_user

# MySQL with custom password
$ ndng database --type mysql --name myapp_db --password SecurePass123!

# SQL Server
$ ndng database --type sqlserver --password StrongPassword123!

Additional Commands

Command Description
ndng deploy <domain>Build Docker image and deploy to server via SSH
ndng rollback <domain>Rollback to a previous deployment
ndng remove <domain>Remove an application (keeps the server)
ndng up <name>One-command deployment: create VM + init + deploy
ndng down <name>Teardown infrastructure and cleanup
ndng cacheStart Redis Docker container
ndng queueStart RabbitMQ Docker container
ndng listShow deployed applications and server status
ndng log [container]Real-time log tailing for deployed apps
ndng configView or modify configuration settings
ndng env sync <domain>Sync environment variables to container
ndng stackDeploy predefined infrastructure stacks
ndng syncSync server and app records to dashboard
ndng exec <command>Execute a command on the remote server

Server Configuration

Engine stores configuration in ~/.ndng/config.json, tracking server connection details, deployed applications, and installed components.

What init installs

  • Docker Engine - From official Docker repository
  • Docker Compose - Plugin for multi-container apps
  • Nginx - Reverse proxy for all deployed apps
  • Certbot - Let's Encrypt SSL certificates
  • UFW Firewall - Allows SSH, HTTP, HTTPS only

Nginx Configuration

Engine automatically generates optimized Nginx reverse proxy configs based on domain type and application type.

Test Domain (Cloudflare SSL Termination)

server {
 listen 80;
 server_name myapp.noundry.app;

 location / {
 proxy_pass http://localhost:5000;
 proxy_http_version 1.1;
 proxy_set_header Host $host;
 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 proxy_set_header X-Forwarded-Proto https;
 proxy_set_header Upgrade $http_upgrade;
 proxy_set_header Connection $connection_upgrade;
 }
}

Custom Domain (Let's Encrypt SSL)

server {
 listen 443 ssl http2;
 server_name myapp.com;

 ssl_certificate /etc/letsencrypt/live/myapp.com/fullchain.pem;
 ssl_certificate_key /etc/letsencrypt/live/myapp.com/privkey.pem;
 ssl_protocols TLSv1.2 TLSv1.3;

 location / {
 proxy_pass http://localhost:5000;
 /* ... proxy headers ... */
 }
}

Docker Container Reference

Service Image Default Port Volume
PostgreSQLpostgres:16-alpine5432postgres_data_{name}
MySQLmysql:83306mysql_data_{name}
SQL Servermcr.microsoft.com/mssql/server:2022-latest1433mssql_data_{name}
Redisredis:7-alpine6379redis_data
RabbitMQrabbitmq:3-management-alpine5672/15672rabbitmq_data

Database containers use Docker network isolation (not exposed to the host network). Application containers connect via Docker networking. All containers use --restart unless-stopped for persistence across reboots.

Deployment Workflow

# Full deployment workflow

# 1. Initialize the server
$ ndng init --host 203.0.113.10 --key ~/.ssh/id_rsa --email dev@company.com

# 2. Set up PostgreSQL
$ ndng database --type postgres --name myapp_db --user myapp_user

# 3. Set up Redis cache
$ ndng cache

# 4. Add the domain
$ ndng add myapp.com --port 5000 --ssl --email dev@company.com

# 5. Deploy the application
$ ndng deploy myapp.com

# 6. Check status
$ ndng list

# 7. View logs
$ ndng log

Related Packages