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.
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.comOr use a test domain for instant deployment without DNS configuration:
$ ndng add myapp --test --port 5000
# Result: https://myapp.noundry.appChiseled .NET images produce ~50MB containers. All services (PostgreSQL, Redis, RabbitMQ) run as Docker containers.
Let's Encrypt certificates for custom domains, Cloudflare SSL for *.noundry.app test domains.
Start PostgreSQL, MySQL, or SQL Server as Docker containers with auto-generated passwords and persistent volumes.
Deploy predefined stacks (app + database + cache) with a single ndng stack create command.
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 |
--port | 22 | SSH port |
--username | root | SSH 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-interactive | false | Skip 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-interactiveConfigure Nginx reverse proxy, SSL certificate, and optionally create a DNS record for a .NET application.
| Option | Default | Description |
|---|---|---|
--port | 5000 | Application port |
--ssl | true | Enable SSL certificate |
--test | false | Use *.noundry.app test domain |
--type | webapp | Application 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 --sslStart database engines as Docker containers with persistent volumes and auto-generated credentials.
| Option | Default | Description |
|---|---|---|
--type | - | postgres, mysql, or sqlserver |
--name | app_db | Database name |
--user | app_user | Database 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!| 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 cache | Start Redis Docker container |
ndng queue | Start RabbitMQ Docker container |
ndng list | Show deployed applications and server status |
ndng log [container] | Real-time log tailing for deployed apps |
ndng config | View or modify configuration settings |
ndng env sync <domain> | Sync environment variables to container |
ndng stack | Deploy predefined infrastructure stacks |
ndng sync | Sync server and app records to dashboard |
ndng exec <command> | Execute a command on the remote server |
Engine stores configuration in ~/.ndng/config.json, tracking server connection details, deployed applications, and installed components.
Engine automatically generates optimized Nginx reverse proxy configs based on domain type and application type.
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;
}
}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 ... */
}
}| Service | Image | Default Port | Volume |
|---|---|---|---|
| PostgreSQL | postgres:16-alpine | 5432 | postgres_data_{name} |
| MySQL | mysql:8 | 3306 | mysql_data_{name} |
| SQL Server | mcr.microsoft.com/mssql/server:2022-latest | 1433 | mssql_data_{name} |
| Redis | redis:7-alpine | 6379 | redis_data |
| RabbitMQ | rabbitmq:3-management-alpine | 5672/15672 | rabbitmq_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.
# 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