CURSOR / VPS
One map of domains, ports, and edge nginx so a hostname cannot fall through to the wrong app. Workspace /opt/cursor
| Domain | App | Upstream | Bind 80? |
|---|---|---|---|
| docvault.doxstation.com | DocVault | host.docker.internal:8088 | NO |
| play.doxstation.com | Byte / AI Coding Tutor | frontend:3000 | EDGE |
| doxstation.com | AI Teacher | host.docker.internal:3000 | NO |
| www.doxstation.com | AI Teacher | host.docker.internal:3000 | NO |
| shorts.doxstation.com | Short Video Maker | host.docker.internal:3123 | NO |
| App | Claimed | Compose scan |
|---|---|---|
| DocVault doc-vault |
8088 | missing folder |
| Byte / AI Coding Tutor ai-coder |
80, 443, 3010 | missing folder |
| AI Teacher auto-reader |
3000, 8000 | missing folder |
| Short Video Maker short-video-maker |
3123 | missing folder |
# Generated by cursor/env-manager. Do not hand-edit on the VPS.
# Copy into aicoder-nginx (baked image) or mount as the single edge config.
# Policy: one process on :80/:443. Unknown Host headers are rejected, never Byte.
events {}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
client_max_body_size 60m;
upstream doc_vault_app {
server host.docker.internal:8088;
}
upstream ai_coder_app {
server frontend:3000;
}
upstream auto_reader_app {
server host.docker.internal:3000;
}
upstream auto_reader_api {
server host.docker.internal:8000;
}
upstream short_video_maker_app {
server host.docker.internal:3123;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
default_type text/plain;
return 404 'unknown host. use a registered domain from env-manager.\n';
}
# DocVault
server {
listen 80;
listen [::]:80;
server_name docvault.doxstation.com;
client_max_body_size 60m;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
proxy_pass http://doc_vault_app;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 120s;
}
}
# Byte / AI Coding Tutor
server {
listen 80;
listen [::]:80;
server_name play.doxstation.com;
client_max_body_size 60m;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
proxy_pass http://ai_coder_app;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 120s;
}
}
# AI Teacher
server {
listen 80;
listen [::]:80;
server_name doxstation.com www.doxstation.com;
client_max_body_size 60m;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location /api/ {
proxy_pass http://auto_reader_api;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 120s;
}
location / {
proxy_pass http://auto_reader_app;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 120s;
}
}
# Short Video Maker
server {
listen 80;
listen [::]:80;
server_name shorts.doxstation.com;
client_max_body_size 60m;
location /.well-known/acme-challenge/ {
root /var/www/html;
}
location / {
proxy_pass http://short_video_maker_app;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 120s;
}
}
}