−25%

στα Windows με ετήσια χρέωση, έως 31/10. Δείτε τα πακέτα

EQVPS
Ξεκινήστε

VPS για MCP gateway: πολλοί MCP servers πίσω από μία διεύθυνση και ένα token

Η ομάδα σας χρησιμοποιεί τρεις δικούς της MCP servers και ο καθένας έχει τρία URL και τρία μυστικά. Βάλτε τους πίσω από μία διεύθυνση HTTPS σε έναν μικρό VPS: το Caddy ελέγχει ένα bearer token, δρομολογεί ανά διαδρομή και κρατά τους ίδιους τους servers μακριά από το internet. Μια δοκιμασμένη ρύθμιση.

Οι MCP servers που φιλοξενείτε μόνοι σας πολλαπλασιάζονται. Πρώτα υπάρχει ένας για την εσωτερική τεκμηρίωση, μετά ένας για τη βάση δεδομένων, μετά κάποιος γράφει έναν μικρό για το pipeline του deploy. Ο καθένας έχει δική του θύρα, δικό του URL και δικό του μυστικό, και κάθε μέλος της ομάδας τα επικολλά και τα τρία στη ρύθμιση του client του. Η αλλαγή ενός token σημαίνει να ειδοποιήσετε όλους.

Ένα gateway τα μετατρέπει σε μία διεύθυνση και ένα token. Οι clients συνδέονται στο https://mcp.example.com/docs/mcp, στο .../db/mcp και ούτω καθεξής. Το gateway ελέγχει το token, στέλνει κάθε διαδρομή στον σωστό server στο localhost, και οι ίδιοι οι servers δεν εκτίθενται ποτέ. Χρειάζεται πολύ λίγο: ένας μικρός VPS με δική του IPv4 και το Caddy.

Στήσαμε τη ρύθμιση παρακάτω σε server δοκιμών και την ελέγξαμε με πραγματικούς clients πριν τη γράψουμε.

Τι χρειάζεστε

  • Έναν VPS με δημόσια IPv4, ώστε οι clients να φτάνουν στη 443. Το Nano-IP αρκεί, εκτός αν οι MCP servers σας κάνουν βαριά δουλειά.
  • Ένα domain με εγγραφή A προς τον server, εδώ mcp.example.com.
  • Ubuntu 24.04 ή Debian 12/13. Το Caddy υπάρχει στα τυπικά αποθετήρια και των δύο.

1. Τρέξτε τους MCP servers στο localhost

Κάθε server τρέχει ως υπηρεσία systemd. Εδώ χρησιμοποιούμε δύο φορές τον server αναφοράς server-everything ώστε το παράδειγμα να είναι αυτοτελές· βάλτε τους δικούς σας. Χρειάζεται Node.js 20 ή νεότερο:

mkdir -p /opt/mcp && cd /opt/mcp
npm install @modelcontextprotocol/server-everything
# /etc/systemd/system/mcp-everything-1.service
[Unit]
Description=MCP server everything #1
After=network.target

[Service]
WorkingDirectory=/opt/mcp
Environment=PORT=3101
ExecStart=/opt/mcp/node_modules/.bin/mcp-server-everything streamableHttp
Restart=always
User=nobody

[Install]
WantedBy=multi-user.target

Ένα δεύτερο αντίγραφο χρησιμοποιεί τη θύρα 3102. Μετά:

systemctl daemon-reload
systemctl enable --now mcp-everything-1 mcp-everything-2

Κάτι που προσέξαμε στις δοκιμές: αυτός ο server ακούει σε όλες τις διεπαφές, όχι μόνο στο 127.0.0.1, και πολλοί άλλοι κάνουν το ίδιο. Το βήμα 3 το τακτοποιεί.

2. Caddy: πρώτα έλεγχος token, μετά δρομολόγηση ανά διαδρομή

Δημιουργήστε ένα token και δώστε το στο Caddy μέσω αρχείου περιβάλλοντος:

apt install -y caddy
echo "MCP_GATEWAY_TOKEN=$(openssl rand -hex 32)" > /etc/caddy/gateway.env
chmod 600 /etc/caddy/gateway.env
mkdir -p /etc/systemd/system/caddy.service.d
printf '[Service]\nEnvironmentFile=/etc/caddy/gateway.env\n' > /etc/systemd/system/caddy.service.d/env.conf
systemctl daemon-reload

Το Caddyfile:

mcp.example.com {
	route {
		@unauthorized not header Authorization "Bearer {$MCP_GATEWAY_TOKEN}"
		respond @unauthorized 401

		handle_path /everything/* {
			reverse_proxy 127.0.0.1:3101 {
				flush_interval -1
			}
		}
		handle_path /tools2/* {
			reverse_proxy 127.0.0.1:3102 {
				flush_interval -1
			}
		}
		respond 404
	}
}
caddy validate --config /etc/caddy/Caddyfile && systemctl restart caddy

Το Caddy παίρνει μόνο του το πιστοποιητικό για το mcp.example.com.

Το μπλοκ route δεν είναι διακοσμητικό. Η πρώτη μας έκδοση είχε τον έλεγχο του token και τα μπλοκ handle_path δίπλα δίπλα στο ανώτερο επίπεδο, και τα αιτήματα χωρίς token περνούσαν κατευθείαν με 200. Το Caddy ταξινομεί τις οδηγίες με τη δική του σειρά, και το handle_path εκτελείται πριν από το respond. Μέσα στο route εκτελούνται με τη σειρά που γράφτηκαν. Αν προσαρμόσετε αυτή τη ρύθμιση, δοκιμάστε πρώτα την περίπτωση «χωρίς token».

Το handle_path αφαιρεί το πρόθεμα, οπότε το /everything/mcp φτάνει στον server ως /mcp. Το flush_interval -1 περνά τα ρέοντα γεγονότα μόλις φτάνουν.

3. Κλείστε τα πάντα εκτός από SSH και HTTPS

apt install -y ufw
ufw default deny incoming
ufw allow OpenSSH
ufw allow 80,443/tcp
ufw enable

Μετά από αυτό, στη δοκιμή μας οι θύρες 3101 και 3102 ήταν απρόσιτες από έξω, ενώ οι 22 και 443 απαντούσαν. Η θύρα 80 μένει ανοιχτή μόνο για να παίρνει και να ανανεώνει το Caddy πιστοποιητικά και να ανακατευθύνει σε HTTPS.

4. Ελέγξτε το

TOKEN=$(cut -d= -f2 /etc/caddy/gateway.env)
INIT='{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-06-18","capabilities":{},"clientInfo":{"name":"check","version":"1"}}}'
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://mcp.example.com/everything/mcp \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d "$INIT"
curl -s -o /dev/null -w '%{http_code}\n' -X POST https://mcp.example.com/everything/mcp \
  -H "Authorization: Bearer $TOKEN" \
  -H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' -d "$INIT"

Το πρώτο αίτημα πρέπει να τυπώσει 401 και το δεύτερο 200. Στη δοκιμή μας, ένα λάθος και ένα κομμένο token πήραν και τα δύο 401, και μια άγνωστη διαδρομή πήρε 404 ακόμη και με το σωστό token.

Μετά από έναν client, για παράδειγμα το Claude Code:

claude mcp add --transport http everything https://mcp.example.com/everything/mcp \
  --header "Authorization: Bearer $TOKEN"
claude mcp list

Και οι δύο servers έδειξαν ✔ Connected. Ο ίδιος client με λάθος token έδειξε ✘ Failed to connect. Περισσότερα για τη ρύθμιση clients στο Σύνδεση του EQVPS MCP με Claude Code και Codex.

Προσθήκη του επόμενου server

Ξεκινήστε τον σε μια νέα θύρα localhost, προσθέστε ένα μπλοκ handle_path και φορτώστε ξανά το Caddy. Η ρύθμιση κανενός δεν αλλάζει, εκτός από ένα νέο URL κάτω από τον ίδιο host και με το ίδιο token.

Όρια που αξίζει να ξέρετε

  • Ένα token για όλους είναι απλό και η αλλαγή του είναι ένα αρχείο, αλλά δεν μπορείτε να αφαιρέσετε την πρόσβαση ενός ατόμου χωρίς να το αλλάξετε για όλους. Για πρόσβαση ανά χρήστη, βάλτε μπροστά ένα proxy πιστοποίησης ή δώστε σε καθέναν δική του διαδρομή και token.
  • Το gateway δεν κάνει έναν server ασφαλή. Ένας MCP server που εκτελεί εντολές shell παραμένει shell για όποιον έχει το token. Κρατήστε τα tokens έξω από κοινόχρηστες ρυθμίσεις και από το git.
  • Διαλέξτε μέγεθος για τους servers, όχι για το gateway. Το ίδιο το Caddy χρησιμοποιεί λίγες δεκάδες megabytes. Αν κάποιος server τρέχει τοπικό μοντέλο ή ευρετηριάζει μεγάλο αποθετήριο, αυτός καθορίζει το πακέτο, όχι το proxy.

Έχετε μόνο έναν MCP server; Το VPS για MCP servers καλύπτει αυτή την απλούστερη περίπτωση. Θέλετε οι πράκτορές σας να διαχειρίζονται και τον server όπου ζουν; Αυτό κάνει ο MCP server της EQVPS (ή το REST API, αν προτιμάτε scripts), και τα πακέτα με δική τους IPv4 ξεκινούν από $8 τον μήνα.

Συχνές ερωτήσεις

Γιατί να βάλω τους MCP servers πίσω από gateway;

Μία διεύθυνση και ένα token ανά ομάδα αντί για ένα ανά server, TLS σε ένα σημείο, και οι ίδιοι οι servers ακούνε μόνο στο localhost. Η προσθήκη τέταρτου server γίνεται αλλαγή τριών γραμμών στο gateway, όχι νέο μυστικό για όλους.

Ποιο πακέτο χρειάζομαι;

Ένα με δική του IPv4, γιατί οι clients πρέπει να φτάνουν στις θύρες 80 και 443. Το Nano-IP ($8/μήνα, 2 vCPU, 1 GB) αρκεί για ένα gateway και μερικούς ελαφρούς MCP servers. Αν κάποιος server κάνει βαριά δουλειά μόνος του, διαλέξτε μέγεθος με βάση αυτόν.

Λειτουργεί το streaming μέσα από το Caddy;

Ναι. Το Streamable HTTP χρησιμοποιεί κανονικά αιτήματα POST και server-sent events. Ορίστε flush_interval -1 στο reverse proxy ώστε τα γεγονότα να περνούν αμέσως αντί να μπαίνουν σε buffer.

Είναι αρκετά ασφαλές ένα κοινό token;

Για μια μικρή ομάδα είναι λογική αρχή: το token δεν βγαίνει ποτέ έξω από το HTTPS και το αλλάζετε τροποποιώντας ένα αρχείο. Όταν χρειαστείτε πρόσβαση ανά άτομο ή ανάκληση, βάλτε μπροστά ένα κανονικό επίπεδο πιστοποίησης. Το κοινό token είναι το πάτωμα, όχι το ταβάνι.

Μπορώ να το τρέξω σε πακέτο NAT;

Όχι ως δημόσιο gateway. Ένα πακέτο NAT έχει μία προωθημένη θύρα για SSH και τίποτε άλλο εισερχόμενο, οπότε οι clients δεν φτάνουν στη 443. Δουλεύει μόνο αν όλοι οι clients βρίσκονται στον ίδιο server.

Σχόλια

Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.

Αφήστε ένα σχόλιο

Τα σχόλια ελέγχονται πριν εμφανιστούν.