Authentication with Supabase and SvelteKit (Part 1) - Development Environment Setup
Tags: svelte, supabase, authentication, caddyserver
Published: 2021-12-16 18:42:39

---
title: Authentication with Supabase and SvelteKit (Part 1) - Development Environment Setup
published: true
subtitle: Development Environment Setup
tags: ["svelte", "supabase", "authentication", "caddyserver"]
---

![gandalf you shall not pass gif](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l6zw7okp6jbv3m71myi2.gif)

## project preamble

I am not a web developer by trade, my day job consists of me hacking away at open source telecom projects. But, I have always wanted to build my own link aggregator site like reddit, lobste.rs, and hackernews. But, in order to do that I have got caught up in the cycle of starting the project over and over with a different web framework every couple of months. It's mostly a bad habit, and probably laziness too. Feels like a kind of a self-sabatoge sometimes too.

But, nonetheless, I am putting all that behind me. I got on a kick trying to learn all I could about postgresql since it's a tool that would give me so much leverage in any project, and that led to me finding postgREST, which led me to [supabase](supabase.io). Man, what a cool product. It is minimal enough where you don't feel like the appplication is doing everything for you, but it makes the difficult things much easier. One example being authentication, as we will see.


supabase is obviouisly not a web framework. It is a [collection of great open source projects](https://supabase.com/docs/architecture) tied together very nicely. See below:

![Supabase Architecture](https://supabase.com/docs/assets/images/supabase-architecture-9050a7317e9ec7efb7807f5194122e48.png)

I have messed around with React, Vue, and Svelte at different times. Just playing around with them. Nothing serious. And Svelte, like supabase, seemed to have just enough magic to make tough things easier, but was minimal enough that I felt like I wasn't getting 'project lock-in' (if that's a thing).

## tl;dr

Not a web developer. Didn't know what tools to use. Found [supabase](supabase.io) and [sveltekit](kit.svelte.dev). Liked both. Chose them.

I won't be going in-depth on [supabase](supabase.io) and [sveltekit](kit.svelte.dev). You can look them both up yourself and dive in. I am only trying to document how I got things working with these tools as clearly as possible.

### Note on Caddy Server

This tutorial will also be using [Caddy Server](caddyserver.com) to make the local development environment easier to work with. And I think the configuration will work for production deployment too (we shall see).

## Get started

To get started, we will need the below tools:

- docker
- node.js / npm (or [pnpm](pnpm.io), check it out. It's pretty cool)
- caddy server

I'll leave installing the tools to you for your environment. I am assuming you are familiar enough or experienced enough (or determined enough) to get the tools working on your own. You can email me if you want help. I will try my best to respond.

## 1. Build SvelteKit Project
Now build a new sveltekit project:
```sh
npm init svelte@next supabase-auth-example
cd supabase-auth-example
npm install
```

## 2. Change default port

The supabase studio app runs on port 3000 just like sveltekit default does. Let's change that so everything can run.

Go to package.json and add `--port 3333` to the end of the `dev` and `preview` scripts.

Note: you can use whatever port you want that's available, but just make note because we will need it later for the caddy server config.

Change this:
```json
  "scripts": {
    "dev": "svelte-kit dev",
    "build": "svelte-kit build",
    "preview": "svelte-kit preview",
    "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .",
    "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ."
  },
```
to this:
```json
  "scripts": {
    "dev": "svelte-kit dev --port 3333",
    "build": "svelte-kit build",
    "preview": "svelte-kit preview --port 3333",
    "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . && eslint --ignore-path .gitignore .",
    "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ."
  },
```

## 3. Setup Supabase Docker Network

Supabase has an easy to use docker setup for spinning up an instance of supabase and all its componenets.

The full documentation is [here](https://supabase.com/docs/guides/hosting/docker).

Below are the instructions from there (probably want to move to a different directory for this).

```sh
git clone --depth 1 https://github.com/supabase/supabase

cd supabase/docker

cp .env.example .env

docker-compose up
```

Now you can go to http://localhost:3000 to access the Supabase Studio app. We won't use it too much right now. But, its there for when we will need it.

If you wanted to keep everything together in one repo, you could add supabase as a submodule in the sveltekit project directory/repo.

```sh
git submodule add https://github.com/supabase/supabase supabase
```

## 4. Setup Caddy Server

Head over the [Caddy Server website](https://caddyserver.com/) to download and install the executable.

In the root of your sveltekit project create a new file called Caddyfile, and put this in there:

```
# To get debug logging on caddy, uncommet below
#{
#	debug
#}

localho.st:8888 {

  @supabase {
      path_regexp supabase ^/(auth|rest|realtime|storage|pg)/.*$
  }

  # reverse proxy requests to supabase paths to the supabase kong http endpoint
  reverse_proxy @supabase http://localho.st:8000 

  # all other request should go to the sveltekit server
	reverse_proxy localho.st:3333
  tls internal
}
```

### Fun Fact about localho.st and caddy

Notice how we defined our domain in the Caddyfile as localho.st? localho.st is a domain that automatically routes to localhost, and Caddy will setup a TLS cert for you automactically too. I thought that was pretty neat.

So, with the simple configuration above, you get a local HTTPS website running without running into any [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) issues in the browser when trying to reach localhost APIs from the client.

This setup gives you something very close to what a production setup could look like.

## Final caveat for running svelte in dev mode

Because the dev mode of sveltekit (or maybe it's vite doing it) has a local websocket listener to trigger a refresh when you change somethig on the file system, the caddy server's TLS setup causes problems for that websocket connection. You will see an error like this repeat over and over in our browser console if you run unse `npm run dev`:

![Websocket Vite Error with localhost TLS setup](https://tbonesteaks.gitlab.io/blog/img/websocket_error_with_local_tls.png)

I have not taken the time to figure this out. Instead, what I do is `build` and then run the app under `preview`.

```sh
pnpm run build
pnpm run preview
```

## 5. Putting it all together

With this setup you will need to have three terminals running (and then a fourth to test with curl).

### Terminal #1

change into the supabase/docker directory. Then run:

```sh
docker-compose up
```

### Terminal #2

change into the sveltekit project directory. Then run:

```sh
caddy run
```

### Terminal #3

change into the sveltekit project directory. Then run:

```sh
pnpm run build
pnpm run preview
```

### Terminal #4

In this terminal we are going to verify that our caddy server properly matches on the supabase API paths.

Run the below command:
```sh
curl -X POST https://localho.st:8888/auth/v1/signup
```

And you should see this error returns:
```json
{
  "message":"No API key found in request"
}
```

If you can go back to [Terminal 1](#terminal-1), you should see some output in the logs like this:

```sh
supabase-kong      | 172.18.0.1 - - [16/Dec/2021:15:36:37 +0000] "POST /auth/v1/signup HTTP/1.1" 401 45 "-" "curl/7.64.1"
```

Don't worry about not having the API key in your curl request. We will handle that in the website.

## Finally, open the site in the browser

Now head to https://localho.st/ and you should see the main sveltekit starter page.

## We are all set!

Next we will get basic email/password signup, login, and logout working. Stay tuned!