Setup CDN
A CDN is required to handle both file downloads and uploads from clients for all User-Generated Content. They are designed to be lightweight and their goal is to reduce stress off of the main server.
Setting Up the Server
To setup a server, navigate to the latest release and download the library which targets your server's platform.
If you're on linux, you may need to make the binary executable. Run the following command to do so.
chmod +x hypernexcdn_linux-[architecture]
Configuring the Server
After you run the executable once, you should see a config.toml file appear in the same directory as the executable. Open this file with your preferred editor.
API_Server = 'http://hypernex.local/api/v1/'
AWS_key = 'access-key'
AWS_secret = 'access-secret'
AWS_endpoint = 'http://s3.local:9000'
AWS_region = 'us-1'
AWS_bucket = 'hypernex'
Mongo_URI = 'mongodb://mongodb-server'
REDIS_Address = 'redis://redis.local:6379/0'
PICS_Bucket = '/'
PUBLIC_PICS = 'root-pics-dir/'
Here's a quick rundown of every value and what it means
API_Server- The base URL for the API server
 
AWS_key- The key to your S3 bucket
 
AWS_secret- The secret to your S3 bucket
 
AWS_endpoint- The endpoint your S3 bucket is located
 
AWS_region- The region your S3 bucket is located
 
AWS_bucket- The name of your S3 bucket
 
Mongo_URI- The URI to connect to your Mongo database
 
REDIS_Address- The Redis URI to connect to your Redis database
 
PICS_Bucket- The name of the bucket where your public pictures are stored
 - Enables the 
/randomImageand/picture/{picture}endpoints when valid - If your pictures are in the same bucket, set this to 
/ - If you do not wish to use this feature, leave it blank
 
PUBLIC_PICS(Optional)- The Prefix to all of your public images
 - If your pictures are in the same bucket, be sure to add a trailing slash after you put the directory name
 
Fill in these values as needed and then start the server.
Running the Server
To run the server, you can run the following command (on linux)
./hypernexcdn_linux-[architecture]
or if you're on Windows, simply run the executable.
If you'd like your process to run in the background on Linux, look into using tmux or a systemd process.
The HypernexCDN is designed to gracefully handle errors. If something doesn't work properly, whether that be from a service outage or malformed user input, the server should handle it. If the server panics and crashes, there is likely a greater issue going on that needs to be reported.
Proxying the CDN
The HypernexCDN is designed to run behind a proxy with caching enabled. This allows easy SSL configuration and object caching locally to reduce transfer costs. While you can use any reverse proxy, we recommend using Caddy for its reliability and ease-of-use.
Setting up Caddy
To setup Caddy with object caching, we need to build it with the cache-handler module. We will use xcaddy to build caddy automatically and easily.
To install xcaddy on linux, simply run the following commands
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-xcaddy-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/xcaddy/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-xcaddy.list
sudo apt update
sudo apt install xcaddy
If you are on a non-linux platform, check the xcaddy latest release for a pre-built binary that works for you, or build xcaddy from source yourself.
Once you have xcaddy installed, we can now build caddy with our two modules
- The cache-handler module
 - Your selected storage model
 
cache-handler requires a storage module to be installed with it, otherwise it will fail. Below is a list of storages you can use:
- Badger 
github.com/darkweak/storages/badger/caddy - Etcd 
github.com/darkweak/storages/etcd/caddy - Go-redis 
github.com/darkweak/storages/go-redis/caddy - Nats 
github.com/darkweak/storages/nats/caddy - Nuts 
github.com/darkweak/storages/nuts/caddy - Olric 
github.com/darkweak/storages/olric/caddy - Otter 
github.com/darkweak/storages/otter/caddy - Redis 
github.com/darkweak/storages/redis/caddy - Simplefs 
github.com/darkweak/storages/simplefs/caddy 
We recommend using simplefs and will be explaining how to use it, but you can select whatever the best storage is to run on your server. Keep in mind that whichever storage solution you pick, you will be responsible for setting up correctly and securely.
You can read more about storages here.
For this tutorial, we will be building caddy with cache-handler and simplefs. Run the command below to start building caddy with the two modules.
xcaddy build --with github.com/darkweak/souin/plugins/caddy --with github.com/darkweak/storages/simplefs/caddy
And after a few minutes, we should see our caddy executable built at ./caddy.
Now we need to create our configuration file. In the same directory as caddy, create a new file called Caddyfile and input the following text
{
  cache {
    simplefs {
      configuration {
          size 10000
          path cache
      }
    }
  }
  regex {
    exclude /randomImage
    exclude /randomImage/*
  }
  ttl 1800s
}
examplecdn.yoururl.com {
  cache
  reverse_proxy :3333 {
      flush_interval -1
  }
}
Increase or decrease the ttl value to keep or dispose of cache on the server faster or slower!
Then you'll replace examplecdn.yoururl.com with the domain that will be interacting with the CDN.
The domain should be different from your API's domain. While you may be able to setup Caddy to reverse proxy requests to both your API and CDN on the same server, this configuration is not supported.
After you create your Caddyfile, you are now ready to start your Caddy server!
To run caddy in the foreground, run
./caddy run
or to run caddy in the background, run
./caddy start
and now your proxy is ready! You should be able to access the CDN publicly.
Setting up Without a Proxy
Setting up without a proxy is NOT recommended for production as there will be NO CACHING (which will increase S3 costs) and NO SSL, which means all files will be transferred insecurely. You should only ever do this if you are setting up a development server and your API server is not accessible to the public.
If you wish to not use a proxy, simply access the CDN at http://localhost:3333/.
Adding the CDN to the API
After you've setup your CDN, you need to tell your API server that it is available. Inside of your config.json file in your API server, you should see a property called CDNURLs. You can add your url to that array.
Make sure your URL is complete! The url should have https:// at the beginning and end with a trailing slash.
After you've added the URL to the config, simply save and restart your API server, and your new CDN server should be accessible!