Self-host an Outline VPN server on a VPS
Run the Outline VPN server, not the wiki app, on your own VPS. Install, access keys, the management API port, and what Shadowsocks does not hide.
What the Outline VPN server is
To self-host an Outline VPN server you run two things on your own VPS: a Shadowsocks proxy server, and a small REST (representational state transfer) management API in front of it. You drive both from the Outline Manager desktop app, which issues access keys as ss:// strings that you send to people. The reason to choose Outline is reaching the internet from a network that blocks VPNs. It is not built for peak throughput.
First, a disambiguation, because search results mix these up constantly. Outline VPN is the circumvention tool described on this page, at getoutline.org. Outline is also the name of a self-hosted wiki and knowledge base, on a different domain, run by different people. They share a name and nothing else. If you came here for the wiki, this is the wrong page.
Who makes Outline VPN
Most guides still call Outline a Google product. That was true at the start and it is not true now. Outline was launched in 2018 by Jigsaw, an incubator inside Google. As of August 2026 the project's own site states that Outline is owned by the Outline Foundation, an independent non-profit, and the code sits under the OutlineFoundation organisation on GitHub. This matters when you decide whether to trust the thing: the governance question has a different answer today than it had in 2018, and a guide that gets the owner wrong is probably also quoting a repository path that has moved.
What the installer actually puts on your server
The install script compiles nothing. It runs Docker containers.
shadowbox, from the imagequay.io/outline/shadowbox:stable. This is the management server, and it runsoutline-ss-server, the project's Shadowsocks backend, as its data plane.watchtower, which polls for a newershadowboximage on a timer, by default once an hour, and restarts the container when it finds one.- A self-signed TLS (transport layer security) certificate and private key, written into the server's state directory. No public certificate authority is involved, so the manager pins that certificate by its SHA-256 fingerprint instead of validating a chain.
State lives under /opt/outline, with the persistent files in /opt/outline/persisted-state.
Watchtower deserves a decision rather than a shrug. Automatic image updates mean security fixes land without you doing anything, and they also mean the version you audited can change overnight with no changelog you have read. Pick the one you care about more. If you want to control upgrades yourself, remove the watchtower container and pull new images on your own schedule.
Prerequisites the installer really checks
- A 64-bit x86 machine. The script stops with
Unsupported machine type: ${MACHINE_TYPE}. Please run this script on a x86_64 machine. An ARM VPS plan will not work with the stock image, so check the architecture before you buy the plan. - Docker. If Docker is missing the script offers to install it, printing
Would you like to install Docker? This will run 'curl https://get.docker.com/ | sh'.. If Docker is installed but the daemon is stopped, the script fails with a message asking whether the docker daemon is running. Start it withsudo systemctl enable --now dockerand run the installer again. - A public IPv4 address the script can discover for itself. It asks outside services, currently
icanhazip.com,ipinfo.ioand a Google endpoint, to learn the address it should write into the management URL. Behind NAT (network address translation), or on a box whose outbound HTTP is blocked, that lookup fails and you have to supply the address with--hostname. - root, through sudo.
The project's documentation names Ubuntu 20.04 LTS or Debian 10 as the supported base. Because everything runs in containers, a newer Ubuntu normally works, but you are then off the path the project tests.
Install the Outline VPN server
This is the command from the project's own documentation at developer.getoutline.org, read in August 2026. Go and take it from there yourself rather than trusting a copy in any guide, including this one: the repository has already moved once, and a stale copy of this line is how people end up installing from an archived path.
sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh)"Read the script before you run it. Piping a remote URL into a root shell means you execute whatever that URL serves at that moment, and looking first costs you a minute:
wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh | lessThree optional flags let you choose values instead of accepting generated ones:
Usage: install_server.sh [--hostname <hostname>] [--api-port <port>] [--keys-port <port>]
--hostname The hostname to be used to access the management API and access keys
--api-port The port number for the management API
--keys-port The port number for the access keysDo not expect fixed port numbers. When you leave --api-port and --keys-port off, the script picks a random port above 1023 for each one. There is no well-known Outline port, and any guide that hands you a specific number is quoting its own install, not yours. Read the ports off the output of your run.
On success the script prints a banner beginning CONGRATULATIONS! Your Outline server is up and running., and asks you to copy the following line, including the curly brackets, into the Outline Manager interface. That line has this shape:
{"apiUrl":"https://<your ip>:<api port>/<random secret>","certSha256":"<fingerprint>"}Then it tells you exactly which ports to open, filling in the numbers it chose:
Make sure to open the following ports on your firewall, router or cloud provider:
- Management port ${API_PORT}, for TCP
- Access key port ${ACCESS_KEY_PORT}, for TCP and UDPIf you close the terminal and lose that config line, it is still on the server. sudo cat /opt/outline/access.txt prints it back.
Before you open the manager, check that the containers are actually running:
sudo docker psYou should see shadowbox and watchtower, both with an Up status. A shadowbox container that keeps restarting means the manager will never connect, and sudo docker logs shadowbox says why.
Why the management API port should not be casually exposed
Look at the apiUrl again. There is no username and no password. Authentication is the random path segment in that URL, and that is the whole mechanism. Anyone who can reach the management port and knows that path can read every access key on the box and delete them all.
The script's own UFW suggestion (ufw is the uncomplicated firewall on Ubuntu) opens the management port to the entire internet:
sudo ufw allow ${API_PORT}/tcpThat is convenient, and it is more than you need. The access key port has to be open to the world, because that is where your users connect. The management port only needs to be reachable from wherever you run Outline Manager. Narrow it:
sudo ufw allow <keys port>/tcp
sudo ufw allow <keys port>/udp
sudo ufw allow from <your admin ip> to any port <api port> proto tcpBetter still, leave the management port closed at the public firewall and reach it over a private tunnel you already run. If you have worked through the self-hosted WireGuard VPN on a VPS build, the Outline box can join that tunnel and answer the API only on its tunnel address, so a port scan of your public IP shows the access key port and nothing else. Remember that most providers have a network firewall in their control panel as well as the one on the box, and both have to agree.
Two more facts about that config line. The Outline documentation calls it sensitive, and says to share it only with people who need management access, over an encrypted channel rather than plain email or chat. And taking it back is genuinely hard: for a manually installed server, the documented way to invalidate a management config you have shared is a full reinstall, which also resets every user access key you have issued. Treat the string like the server's root password, because in practice that is what it is.
Issuing and revoking access keys
Outline Manager creates keys with a button. Underneath, it is ordinary HTTP against the secret API path, so you can script it:
API="https://SERVER_IP:API_PORT/SECRET_PATH" # the apiUrl from access.txt
curl -k "$API/access-keys"
curl -k -X POST "$API/access-keys"
curl -k -X PUT "$API/access-keys/3/name" -H 'Content-Type: application/json' -d '{"name":"anna-laptop"}'
curl -k -X DELETE "$API/access-keys/3"-k is required because the certificate is self-signed, so without it curl stops with SSL certificate problem: self-signed certificate and never sends the request. The API also carries per-key data limits, PUT /access-keys/{id}/data-limit to set one and DELETE /access-keys/{id}/data-limit to lift it, which is how you stop one person's phone backup from eating the whole monthly bandwidth allowance.
Issue one key per person. This is the rule that decides whether the rest of it works. Revoking is deleting the key, and the server stops accepting it straight away, so a person who leaves loses access the moment you run that delete. Now suppose ten people share one key. You cannot remove one of them. You delete the key, all ten stop working, and you spend the evening reissuing nine. Naming each key after its holder is what makes the delete command safe to run at all.
Be clear about what deletion does not do. The ss:// string is a secret you already sent to somebody. Deleting the key stops your server from honouring it, which is the part you control. It does not retrieve the message you sent it in. So if a key leaks, delete it and issue a fresh one, rather than assuming the copy is gone.
Outline is a proxy, not a full tunnel
This is the difference that surprises people arriving from WireGuard. Shadowsocks moves TCP and UDP connections through a proxy. There is no network interface on the server, no peer address, no routing table entry, and no idea of a subnet sitting behind the server. outline-ss-server carries TCP and UDP, so browsers, apps and DNS all work through it. ping does not, because ICMP (internet control message protocol) is not one of the things a Shadowsocks proxy carries. Test with curl https://ifconfig.me and confirm the address it returns is your server's, not your own.
The consequences are worth stating plainly. You cannot reach a private network behind the Outline server the way a WireGuard peer reaches 10.20.0.0/16, because Outline has no route to hand out. You cannot join two servers to each other with it. Peer to peer traffic between clients does not exist. If what you want is an actual network with addresses and routes, Outline is the wrong tool, and the WireGuard against OpenVPN comparison is the better starting point.
What the obfuscation does, and what it does not
Shadowsocks encrypts and authenticates from the first byte. There is no cleartext handshake, no protocol version field, no certificate exchange, and no fixed header. On the wire, a connection looks like a stream of random bytes going to a high port. That is the entire argument for Outline: a DPI (deep packet inspection) box tuned to recognise the WireGuard handshake, or the OpenVPN opcode in the first packet, has nothing to match against here. outline-ss-server also ships replay protection, switched on with --replay_history, which defeats one class of active probing where a censor replays a captured packet to see how your server answers.
Now the honest half.
- It does not hide the flow. Your traffic still goes to one address, in volume, for hours. Timing and volume analysis do not care that the payload is unreadable.
- It does not make you anonymous. Your provider knows who rented the server and usually holds your payment details, and every site you visit sees the server's address. The difference between renting a VPS and buying a VPN service covers why a server in your own name changes the threat model rather than removing it.
- It does not survive a blocked address. If a censor blocks your server's IP, obfuscation is irrelevant, because nothing arrives to be obfuscated.
- It does not stop key sharing. A key posted in a public group chat is a key the censor can fetch and use, which tells them exactly which address to block.
Those last two points are why circumvention at scale means many addresses, rotated, and given out carefully. That is precisely the problem the Tor project built bridges to solve, so if your adversary blocks addresses faster than you can rent servers, read how Tor bridges and pluggable transports hand out unlisted entry points before you rent a second VPS.
Choosing between Outline and the alternatives
Pick Outline when the network drops VPN protocols, and when the people you are helping will not edit a config file. One string to send, one app to paste it into. That is a real advantage, and it is most of the reason Outline exists.
Pick WireGuard when the network lets it through. It is faster, it lives in the kernel, it gives you a routable network, and it is far less machinery to keep running. The full build is in the WireGuard VPN server guide.
Pick a bridge or a pluggable transport when the adversary blocks addresses rather than protocols, or when you need anonymity as well as reach.
Pick a mesh with a control plane when your problem is fleet management rather than censorship, since handing out keys and allocating addresses by hand stops scaling somewhere around a dozen machines. A self-hosted NetBird server takes that bookkeeping off you.
FAQ
Is Outline VPN the same as the Outline wiki?
No. They are unrelated projects that happen to share a name. Outline VPN is the censorship circumvention tool at getoutline.org, made of a Shadowsocks server plus a REST management API, driven from the Outline Manager desktop app. The Outline wiki is a self-hosted knowledge base for teams, on a different domain. Searches for "self-host Outline" return both. Check the domain before you copy any install command.
Is Outline VPN still a Google product?
No, not as of August 2026. Outline was launched in 2018 by Jigsaw, which is an incubator within Google, and that history is where the "Google VPN" line in older guides comes from. The project's own site now states that Outline is owned by the Outline Foundation, an independent non-profit, and the source repositories live under the OutlineFoundation organisation on GitHub.
Which ports does the Outline server use?
There is no fixed answer, by design. Unless you pass --api-port and --keys-port to the installer, it picks a random port above 1023 for the management API and another for access keys. At the end of the run it prints both, and tells you to open the management port for TCP and the access key port for TCP and UDP, on your firewall and on your provider's network firewall. If you lost that output, sudo cat /opt/outline/access.txt returns the management URL with its port in it.
Can I use Outline to reach my private network?
No. Shadowsocks proxies TCP and UDP connections rather than building a Layer 3 tunnel, so the server has no interface and no routes into anything behind it. A WireGuard peer can be given AllowedIPs = 10.20.0.0/16 and reach that range. Outline has no equivalent setting, because there is nothing for it to route. Use WireGuard for private network access, and keep Outline for getting out to the public internet.
How do I remove someone's access?
Delete their access key, in Outline Manager or with DELETE /access-keys/{id} against the management API. The server stops accepting that key immediately. This only works cleanly when every person holds their own key, so create one key per person and name it after them. Revoking management access is a much worse problem: the documented fix for a management config you have shared on a manually installed server is a full reinstall, which resets every user key at the same time.