To connect to the Spotify API, you need to create a new App on the Spotify Developer Dashboard.
Once the App is created, open the App Overview and click on the "Edit Settings"
button. A new modal should open. In this modal, you need to add a Redirect URI,
so that the login with Spotify actually works. This URL depends on where you
want to host your Listory installation, see also APP_URL
under
Configuration / Application. The Redirect URI should be
$APP_URL/api/v1/auth/spotify/callback
. For the local example URL which is used
in development, this would be http://localhost:3000/api/v1/auth/spotify/callback
.
If you have your own domain where you want to host Listory, this is probably
something like https://listory.your-name.com/api/v1/auth/spotify/callback
.
You can add multiple Redirect URIs and all will work.
Keep the tab open, as you will need the Client ID and Client Secret in the next step.
Listory currently supports two deployment mechanisms: docker compose and Kubernetes Helm Chart.
There are two docker compose
files in the repository, for a production
deployment, you want to use docker-compose.prod.yml
.
You can copy this file to your server or whereever you want to run Listory. You
will also need to copy the .env.sample
file next to the
docker-compose.prod.yml
file and rename it to .env
.
Open the .env
file in an editor and put in the Spotify App Client ID and
Client Secret.
Now you can configure Listory how you like by changing the environment
of the
listory
service in the docker compose file, or by adding new values in the
.env
file. For a list of all available options, see section
Configuration.
If you deploy Listory on the public internet, I recommend you to add a reverse proxy like Traefik, which you can configure to automatically add TLS certificates (putting the S into HTTPS).
Once you have set everything up, you can run this command to start Listory:
docker compose up --daemon --file docker-compose.prod.yml
This will start Listory in the background. Checkout the docker compose documentation, to learn how you can work with the containers, for example to restart them or to read the logs.
We publish a Kubernetes Helm Chart that installs Listory into a Kubernetes cluster.
I have not yet setup publishing to an actual Chart Registry, so if you would like to use the chart, create an issue and I will set this up properly.
You can find the source code for the Helm Chart under [charts/listory](./charts/listory/)
.
All configuration must be set as environment variables. Default values are added in bold, values that are required are marked with Required.
PORT
: 3000: Port the webserver will listen on.APP_URL
: http://localhost:3000: Public URL of the Application, is used to generate Links.
JWT_SECRET
: Required, used to sign the JWTs.JWT_ALGORITHM
: HS256: Algorithm used to sign the JWTs. One ofHS256
,HS384
,HS512
JWT_EXPIRATION_TIME
: 1d: Lifetime of signed JWTs. Accepts strings like1d
,2h
,15m
.
SPOTIFY_CLIENT_ID
: Required, Spotify App Client IDSPOTIFY_CLIENT_SECRET
: Required, Spotify App Client SecretSPOTIFY_FETCH_INTERVAL_SEC
: 60: Interval for fetching recently listened tracks from Spotify.SPOTIFY_UPDATE_INTERVAL_SEC
: 60: Interval for updating previously imported music library entities (artist, album, track). Raise this number if you often hit the Spotify API Ratelimit.SPOTIFY_WEB_API_URL
: https://api.spotify.com/: Spotify WEB API Endpoint.SPOTIFY_AUTH_API_URL
: https://accounts.spotify.com/: Spotify Authentication API Endpoint.SPOTIFY_USER_FILTER
: "": If set, only allow Spotify users with these ids to access the app. If empty, allow all users to access the app. Seperate ids with,
eg.:231421323123,other_id
.
DB_HOST
: Required, Database hostDB_USERNAME
: Required, Database usernameDB_PASSWORD
: Required, Database passwordDB_DATABASE
: Required, Database databaseDB_POOL_MAX
: 50, max concurrent database connections
You can use Sentry to automatically detect and report any exceptions thrown.
SENTRY_ENABLED
: false, Set totrue
to enable Sentry.SENTRY_DSN
: Required, but only ifSENTRY_ENABLED
istrue
. The DSN for your Sentry project.
We use OpenTelemetry to provide observability into Listory API.
The metrics will be exposed on a seperate port at :9464/metrics
. Make sure that this endpoint is not publicly available in your deployment.
Traces will be sent to the specified endpoint.
To use observability tools locally, check out docker-compose
setup in observability/
.
OTEL_METRICS_ENABLED
: false, Set totrue
to activate metrics.OTEL_TRACES_ENABLED
: false, Set totrue
to activate traces.OTEL_EXPORTER_OTLP_ENDPOINT
: Required, but only ifOTEL_TRACES_ENABLED
istrue
. The endpoint that traces are sent to, see OpenTelemetry docsOTEL_EXPORTER_PROMETHEUS_PORT
: 9464, Set to configure non-standard port for Prometheus metrics
Copy the file .env.sample
to .env
and add your Spotify API Key.
We use docker compose
to provide a full local development environment.
$ docker compose up
You can now access the frontend at http://localhost:3000
and the API at http://localhost:3000/api
.
Frontend and API will automatically reload on any code changes.
You can start the REPL console by starting the normal environment, and then running:
$ docker compose run console
If you want to start the observability suite (Metrics & Tracing) locally, you can use the observability
docker compose profile:
$ docker compose --profile observability up
Grafana is then available at http://localhost:2345
and all sources are preconfigured.
# unit tests
$ npm run test
# e2e tests
$ npm run test:e2e
# test coverage
$ npm run test:cov
Listory is MIT licensed.