An unofficial Docker Compose setup for self-hosting a Pretendo Network server.
Go to file
2023-12-26 19:19:42 -05:00
.github/workflows Set up TERM environment variable 2023-12-26 19:09:25 -05:00
.vscode Set up Juxtaposition servers! 2023-12-21 17:05:42 -05:00
config Add repo information to the readme 2023-12-26 17:40:44 -05:00
environment Add repo information to the readme 2023-12-26 17:40:44 -05:00
patches Add repo information to the readme 2023-12-26 17:40:44 -05:00
repos Add repo information to the readme 2023-12-26 17:40:44 -05:00
scripts Try to fix the password generation functions hanging 2023-12-26 19:19:42 -05:00
.gitignore Add secrets file to environment setup 2023-12-26 14:12:45 -05:00
.gitmodules Fix gitmodules formatting 2023-12-21 17:14:20 -05:00
compose.yml Quick depends fix 2023-12-26 14:20:30 -05:00
LICENSE Initial commit 2023-12-16 17:38:20 -05:00
README.md Add safety section to the readme 2023-12-26 18:39:28 -05:00
setup.sh Make the setup script safe to run multiple times 2023-12-26 17:40:11 -05:00

Unofficial Pretendo Network server in Docker

This is an unofficial Docker Compose setup for self-hosting a Pretendo Network server (because there is no official self-hosting setup).

System requirements

Hardware

  • A decent CPU (must be capable of running MongoDB)
  • At least 12 GB of free storage for Docker images and build cache (using a SSD is strongly recommended, as it will also be used for database storage)
  • At least 1GB of free RAM for the Docker containers, 2GB recommended
  • Network connectivity to the client console

Operating system

OS Testing status
Windows (Docker Desktop on WSL 2) Working
Linux (Docker Engine) Untested but should work
macOS (Docker Desktop) Untested

Software

Everything else runs inside Docker containers.

Supported consoles

Console Testing status
Wii U Working
Cemu emulator Untested
3DS Untested
Switch Not supported by Pretendo

Usage

Note that this guide assumes that you are familiar with using the Linux command line and have a basic understanding of Docker.

Server setup

  1. Check the system requirements and install any necessary software.
  2. Clone this repo with Git. Make sure to recursively checkout submodules: git clone --recurse-submodules https://github.com/MatthewL246/pretendo-docker.git
    • Note: Downloading this repo as a ZIP file from GitHub will not work because it uses Git submodules for the Pretendo Network repos.
    • If you are using Windows, you should clone the repo inside your WSL distro for maximum performance.
  3. Run the initial setup script (./setup.sh) and follow its instructions.
    • Note: This will take some time to build the required Docker images, and it will use up to 8GB of bandwidth to download images.
    • After initial setup, use docker compose up -d to start the containers.
    • You might need to re-run the setup script if this repo is updated with more servers.
  4. Open http://127.0.0.1:8081 in your browser to view a live list of HTTP requests from client devices.
  5. Connect your console to your Pretendo Network server and create a PNID (see Connecting).

After creating a PNID

  1. Run ./scripts/make-pnid-dev.sh to give your new PNID administrator permissions and full access to your server.
  2. If you want to use Juxtaposition (Miiverse), run ./scripts/create-juxt-community.sh to create a community (required for posting).
  3. Read through the containers section to learn more about adminstering the servers. Also check out the scripts directory.

Safety

  • Back up your MongoDB database! If you lose it, you will lose all of your PNIDs and Juxt posts. You will also be stuck with a useless account on your console that you can't delete because deleting an account requires a server to authenticate the password. Creating a new account on your server with the same PNID won't work because each PNID has a numerical ID that is appended to the end of the password before hashing, so your console will not authenticate with the new PNID. Use mongodump (docs).
  • Don't delete the pretendo-network-* Docker volumes. You will permanently lose your database (see above) and all of your Pretendo server data.
  • Don't use the same P/NNID username on multiple servers. This applies to NNIDs and PNIDs on the official Pretendo Network server.
  • Always verify that you are actually connecting to your own server. The easiest way is to check the mitmproxy logs to see if you are getting the expected HTTP requests.

Connecting

Web

  1. Start a web browser using 127.0.0.1:8080 as a proxy server. For example, use chrome.exe --proxy-server="127.0.0.1:8080" or the Firefox network settings page.
    • I don't recommend using the same browser as the one you use for normal web browsing because you will get a lot of irrelevant noise in the mitmproxy logs. Consider downloading Chrome Beta or Firefox Beta to have an isolated browser for this.
    • If you don't want to deal with the security warnings on every page from being MITMed, go to http://mitm.it in your proxied browser and follow the instructions there to trust the mitmproxy certificate. This is secure because mitmproxy generates a random certificate on first run, so nobody else could MITM your traffic except you.
  2. Open https://pretendo.network/account in your proxied browser. Make sure that there is a big red banner stating "This is an unofficial Pretendo Network server!" If there is not, your proxy settings did not apply correctly. Also, check http://127.0.0.1:8081 to make sure your HTTP requests are being sent to mitmproxy. Then, once you have verified this, sign up for an account there, just as you would on the official Pretendo Network servers (by the way, you don't need to do the captcha, it's disabled).
  3. You can visit https://juxt.pretendo.network in your proxied browser to view Juxt posts.
  4. Go back to after creating a PNID.

Wii U

  1. Follow the official Pretendo Network installation guide to install the patches. At this point, you should be connected to the official Pretendo Network servers. Don't create a new PNID yet.
  2. Open System Settings => Internet => Connect to the Internet => Connections => (Your current internet connection) => Change Settings.
  3. Go to DNS => Don't Auto-obtain => (Set both the primary and secondary DNS to your server's IP address) => Confirm.
  4. Go to Proxy Settings => Set => OK => (Set the proxy server to your server's IP address and the port to 8080) => Confirm => Don't Use Authentication.
  5. Save the settings and go back to the Home Menu. Check your mitmproxy logs at http://127.0.0.1:8081 to verify that the console is sending HTTP requests through your proxy.
  6. Start a FTPiiU server on your console and run ./scripts/compile-custom-inkay.sh to compile a custom version of the Inkay patches that uses your own mitmproxy certificate.
    • If you didn't set a Wii U IP address when running the setup script, you will need to use a FTP client to manually upload repos/Inkay/Inkay-pretendo.wps to your console at /fs/vol/external01/wiiu/environments/aroma/plugins/, replacing the original Inkay patcher there. You could also re-run ./scripts/setup-environment.sh with a Wii U IP address.
  7. Finally, create a new PNID on your console from the users page.
  8. Go back to after creating a PNID.

3DS

  • Currently untested

Containers

Infrastructure

Server Purpose Usage and administration
CoreDNS DNS server for both internal container networking and external DNS resolution. It spoofs the Pretendo domains to the address of your local server. No administration necessary.
nginx Reverse proxy and Web server. It sends HTTP requests to the right Pretendo server based on their hostname. No administration necessary.
MongoDB Primary database that the Pretendo account and Juxtaposition servers use to store PNIDs and Juxtaposition content. Use Mongo Express (see below) to view the databases and perform simple edits. You can also use the mongosh command inside the container for more advanced administration tasks or download the MongoDB Compass GUI for easier database editing. (Connect to mongodb://127.0.0.1:27017/?directConnection=true. Make sure to enable "Use direct connection".)
Mongo Express Simple web GUI for MongoDB administration. Open http://127.0.0.1:8082 in your browser with the container running.
MinIO Object store compatable with the AWS S3 API. It is used as file storage and a CDN for the Pretendo servers. Mii images, Juxtaposition screenshots, and more are uploaded here. Open http://127.0.0.1:8083 in your browser with the container running.
Redis Cache database used by the account server. No administration necessary.
MailDev SMTP server used to test sending emails from the account server. Use this to view your PNID email verification code. Open http://127.0.0.1:8084 in your browser with the container running.
PostgreSQL Database used by the Friend List server to store friendships. Use Adminer (see below) to view the databases and run SQL scripts. You can also download the pgAdmin GUI and connect to 127.0.0.1:5432 to perform advanced administration tasks.
Adminer Web GUI for database administration, used for Postgres. Open http://127.0.0.1:8085 in your browser with the container running.

Check the secrets.txt file in the root of the repository to find the usernames and randomly-generated passwords needed to authenticate with the servers.

Pretendo Network

Server Purpose
mitmproxy-pretendo Intercepts HTTP requests from client devices and redirects them to the official Pretendo server to your local server. Uses mitmproxy running on port 8080
account The most important Pretendo server. It handles PNIDs, authentication, and tokens.
website Runs a local copy of the Pretendo Network website. Used for creating PNIDs without a console.
friends Handles the Friend List applet and friendships. Juxt and other game servers use it to get friends.
miiverse-api Handles Miiverse API requests from games and Miiverse portal discovery.
juxtaposition-ui The Miiverse applet GUI, as well as the Juxt web interface.
Wii U Chat (authentication and secure) Server for the Wii U Chat app.

Planned servers

These are some other servers (mostly for individual games) that I want to set up here.

Learn more