{"id":49895050,"url":"https://github.com/al1sant0s/springfield","last_synced_at":"2026-05-15T23:09:37.892Z","repository":{"id":354430247,"uuid":"1130629539","full_name":"al1sant0s/springfield","owner":"al1sant0s","description":"The Simpsons: Tapped Out Game Server.","archived":false,"fork":false,"pushed_at":"2026-05-06T20:52:03.000Z","size":3326,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-06T21:37:03.196Z","etag":null,"topics":["simpsons","springfield","the-simpsons-tapped-out","tsto"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/al1sant0s.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-08T19:24:23.000Z","updated_at":"2026-05-06T20:52:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/al1sant0s/springfield","commit_stats":null,"previous_names":["al1sant0s/springfield"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/al1sant0s/springfield","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al1sant0s%2Fspringfield","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al1sant0s%2Fspringfield/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al1sant0s%2Fspringfield/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al1sant0s%2Fspringfield/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/al1sant0s","download_url":"https://codeload.github.com/al1sant0s/springfield/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/al1sant0s%2Fspringfield/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33082899,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-15T20:25:35.270Z","status":"ssl_error","status_checked_at":"2026-05-15T20:25:34.732Z","response_time":103,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["simpsons","springfield","the-simpsons-tapped-out","tsto"],"created_at":"2026-05-15T23:09:35.714Z","updated_at":"2026-05-15T23:09:37.884Z","avatar_url":"https://github.com/al1sant0s.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003eWelcome to Springfield 👋\u003c/h1\u003e\n\u003cp\u003e\n  \u003ca href=\"https://www.docker.com/\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Docker badge\" src=\"https://img.shields.io/badge/docker-white?logo=docker\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.djangoproject.com/\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Django badge\" src=\"https://img.shields.io/badge/django-green?logo=django\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.python.org/\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Python Badge\" src=\"https://img.shields.io/badge/python-gray?logo=python\u0026logoColor=yellow\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://www.postgresql.org/\" target=\"_blank\"\u003e\n    \u003cimg alt=\"Postgresql Badge\" src=\"https://img.shields.io/badge/postgresql-beige?logo=postgresql\"\u003e\n  \u003c/a\u003e\n  \u003ca href=\"https://redis.io/\" target=\"_blank\"\u003e\n      \u003cimg alt=\"Redis Badge\" src=\"https://img.shields.io/badge/redis-orange?logo=redis\u0026logoColor=firebrick\"\u003e\n  \u003c/a\u003e  \n  \u003ca href=\"#\" target=\"_blank\"\u003e\n    \u003cimg alt=\"License: MIT\" src=\"https://img.shields.io/badge/License-MIT-yellow.svg\" /\u003e\n  \u003c/a\u003e\n  \u003ca href=\"#\" target=\"_blank\"\u003e\n    \u003cimg alt=\"License: MIT\" src=\"https://github.com/al1sant0s/springfield/actions/workflows/docker-publish.yml/badge.svg\" /\u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003e A full-featured server for the game: \u0026#34;The Simpsons: Tapped Out\u0026#34;.\n\nGet your old Springfield back up and running again with this super customizable game server.\n\nAmong all its features, it includes support for:\n\n- multiple accounts,\n\n- usernames and profile pictures,\n\n- adding and visiting friend neighbors,\n\n- editing money and donut currencies at your will,\n\n- importing and exporting town files,\n\n- tracking connected devices,\n\n- a beautiful user dashboard for managing your accounts,\n\n- versatile configuration to set up the server, with the option to run a single or multiple instances in parallel, all connected to the same database and storage (e.g., S3 bucket)\n\n- and a lot of other cool things.\n\n## Table of contents\n\n- [📋 Requirements](#user-content--requirements)\n- [⚡ Usage](#user-content--usage)\n- [💪 Advanced usage](#user-content--advanced-usage)\n- [📧 Sending emails with a custom email service](#user-content--sending-emails-with-a-custom-email-service)\n- [🗃️ Picking another database](#user-content--picking-another-database)\n- [⬆️ Updating the server](#user-content--updating-the-server)\n- [🩺 Run tests](#user-content--run-tests)\n- [⚙️ Environment variables](#user-content-️-environment-variables)\n\n\n## 📋 Requirements\n\nThe server can be set up in a plethora of ways according to your preferences, but it relies on some external services to work.\n\nSome services are essential, while others are optional and can extend the server functionality.\n\nThe required services, which must be available in any configuration, are:\n\n- a web server to act as a reverse proxy to the game server and to serve the static and DLC files, e.g., nginx\n\n- and a database service.\n\nThe optional services, which extend the server functionality, are:\n\n- Docker (**highly recommended**)\n\n- Redis for caching (recommended),\n\n- any other kind of storage service listed in [django-storages](https://django-storages.readthedocs.io/en/latest/), just in case you prefer to\n  use another type of storage rather than local storage (e.g., S3 bucket),\n\n- an email service to deliver emails with authentication codes. This is completely optional as you can also request permission to use [TSTO API](https://tsto.app/).\n\nOther independent services are not covered in this guide, like Fail2ban for rate limiting with nginx and whatnot.\n\n## ⚡ Usage\n\nThe easiest and recommended way to get the server running is through the usage of Docker containers. If you do not want to use Docker, you will need to install each dependency listed\nin the file `environment.yaml` with your favorite Python package manager: pip, conda, etc.\n\nTo make this guide easier to follow we will focus on Docker Compose. Let's start with the simplest possible configuration which just includes the server itself.\nCreate the following compose file somewhere in your file system. If necessary adjust the ports field.\n\n**`compose.yaml`**\n```yaml\nservices:\n\n  springfield-server:\n    image: ghcr.io/al1sant0s/springfield:latest\n    ports:\n      - \"8000:8000\"\n    env_file:\n      - .env\n    volumes:\n      - server-data:/app/\n      - /data/static/:$STATIC_ROOT:z\n\nvolumes:\n  server-data:\n\n```\n\nWith this configuration the server will use a SQLite file as your database.\nIt only requires that you provide a web server, e.g., nginx, to act as a reverse proxy and serve the DLC and static files for the dashboard.\n\nA simple nginx configuration for a local server, which listens on port 8080, may be specified like so:\n\n```\n\tserver {\n\t\tlisten 8080;\n\t\tserver_name localhost;\n\t\tclient_max_body_size 5M;\n\n\n\t\tlocation /static/ {\n\t\t\troot\t\t/data;\n\t\t}\n\n\t\tlocation /dlc/ {\n\t\t\troot\t\t/data;\n\t\t}\n\n\t\tlocation / {\n\t\t\tproxy_pass\thttp://localhost:8000;\n\t\t}\n\t}\n\n```\n\nThis configuration specifies that static files are served at `/data/static/` and DLC served at `/data/dlc/` in the file system. By default the server listens on port 8000, so we redirect the other requests to that port. Obviously this is just an example of configuration for the proxy server. You will need to make one according to your own circumstances. For example, if your server and proxy are running on different machines, you shouldn't use `localhost` for the `proxy_pass` entry.\n\nFinally you need to create an `.env` file at the same directory where you have the `compose.yaml` file. With the following minimal settings:\n\n**`.env`**\n```env\n# Server settings\n\nDEBUG=false\nDOMAIN=192.168.1.115\nPORT=8080\nPROTOCOL=http\nSECRET_KEY='insert-your-secret-key-here'\nSTATIC_LOCATION=static/\nSTATIC_ROOT=/app/static/\nTOWNS_ROOT=./towns/\n\n```\n\nA few things to consider.\n\n* Pick a good **SECRET_KEY**.\n* Remember to change the DOMAIN, PORT and STATIC_LOCATION with your own values to reflect your nginx settings.\n* STATIC_ROOT is where the static files from the server will be stored in. Change it if necessary.\n* TOWNS_ROOT is where towns will be stored in. Change it if necessary.\n\n\u003e For a full detailed list of the environment variables, jump to the [environment variables](user-content-️-environment-variables) section.\n\nWith nginx running and your compose and .env file ready, start your server running the following command\nin a terminal at the same location as your compose.yaml file.\n\n```sh\ndocker compose up -d\n```\n\nTo check if your server is running, navigate to the address `http://localhost:8080` or whatever address your\nnginx instance is running on. If you get a \"Hello, World!\" page, then your server _is running, but it is not ready for usage yet_.\nThere are still two remaining steps that need to be done.\n\nFirst, you must run the migrations against your database. Run the following command for that.\n\n```sh\ndocker compose exec springfield-server python manage.py migrate\n```\n\nSecond, you must collect the static files into `STATIC_ROOT`. Since `STATIC_ROOT` lives within the container and we need its contents to be available to the host machine (where nginx is running), we provided a bind mount in the `compose.yaml` file that links `STATIC_ROOT` with the static files location from nginx.\n\n```sh\ndocker compose exec springfield-server python manage.py collectstatic\n```\n\nAdditionaly, you should create an admin account for you. This isn't exactly required but it is recommended in case you need to manage the server directly\nwith Django admin dashboard. Run the following command and answer the questions it prompts to you.\n\n```sh\ndocker compose exec springfield-server python manage.py createsuperuser\n```\n\nAfter that, check the admin dashboard at `http://localhost:8080/admin/`.\nThe normal user dashboard is located at `http://localhost:8080/dashboard/`.\n\nNow your server is ready to be used. Congratulations!\n\n## 💪 Advanced usage\n\nThe previous configurations work, but since the server is so flexible, you can do a lot more with it. To demonstrate this, in this advanced section, we will explore some optional\nexternal services to use with the server. Mainly we will:\n\n- pick another database engine, [PostgreSQL](https://hub.docker.com/_/postgres) in this case,\n\n- set up [Redis](https://hub.docker.com/r/redis/redis-stack-server) for caching,\n\n- configure the [TSTO API](https://tsto.app/) for delivering code emails,\n\n- use a self-hosted [garage](https://garagehq.deuxfleurs.fr/) S3 bucket to illustrate how to use other types of storages.\n\nAny external service can be installed in a variety of ways. To keep this guide the most simplest possible, we will stick with Docker Compose to\nInstall these additional services. Be aware that some of these services (like **garage** for example) require additional configuration that cannot be covered in this guide. You\nshould definitely check their documentation too.\n\nWith that said, let's update our compose file like so.\n\n**`compose.yaml`**\n```yaml\nservices:\n\n  springfield-server:\n    image: ghcr.io/al1sant0s/springfield:latest\n    ports:\n      - \"8000:8000\"\n    env_file:\n      - .env\n    command: [\n        \"gunicorn\",\n        \"springfield.wsgi\",\n        \"--capture-output\",\n        \"--access-logfile\", \"-\",\n        \"--error-logfile\", \"-\",\n        \"--bind\", \"0.0.0.0:8000\",\n        \"--worker-class\", \"gthread\",\n        \"--workers\", \"6\",\n        \"--threads\", \"8\",\n        \"--preload\"\n    ]\n    depends_on:\n      db:\n        condition: service_healthy\n      garage:\n        condition: service_healthy\n      redis:\n        condition: service_healthy\n\n  db:\n    image: postgres:latest\n    environment:\n      - POSTGRES_DB=${POSTGRES_DB}\n      - POSTGRES_USER=${POSTGRES_USER}\n      - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}\n    volumes:\n      - db-data:/var/lib/postgresql\n    healthcheck:\n      test: [\"CMD-SHELL\", \"pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}\"]\n      interval: 10s\n      timeout: 5s\n      retries: 5\n      start_period: 10s\n\n  garage:\n    image: dxflrs/garage:v2.2.0\n    ports:\n      - \"3900:3900\"\n      - \"3901:3901\"\n      - \"3902:3902\"\n      - \"3903:3903\"\n    volumes:\n      - /etc/garage.toml:/etc/garage.toml:ro,z\n      - /var/lib/garage/meta:/var/lib/garage/meta:z\n      - /var/lib/garage/data:/var/lib/garage/data:z\n    healthcheck:\n      test: [\"CMD\", \"/garage\", \"status\"]\n      interval: 15s\n      timeout: 10s\n      retries: 3\n      start_period: 10s\n\n  webui:\n    image: khairul169/garage-webui:latest\n    container_name: garage-webui\n    volumes:\n      - /etc/garage.toml:/etc/garage.toml:ro,z\n    ports:\n      - 3909:3909\n    environment:\n      API_BASE_URL: \"http://garage:3903\"\n      S3_ENDPOINT_URL: \"http://garage:3900\"\n\n  redis:\n    image: redis:alpine\n    volumes:\n      - redis-data:/data\n    healthcheck:\n      test: [\"CMD\", \"redis-cli\", \"ping\"]\n      interval: 5s\n      timeout: 3s\n      retries: 5\n      start_period: 10s\n\n\nvolumes:\n  db-data:\n  redis-data:\n\n```\n\nFor these new services to run, we need to expand our .env file. Remember, you must update each environment variable with your own values.\n\n**`.env`**\n```env\n# Server settings\nAUTH_CODE_MINUTES=30\nCACHE_DEFAULT_BACKEND=django_redis.cache.RedisCache\nCACHE_DEFAULT_LOCATION=redis://redis:6379/1\nCACHEOPS_REDIS_URL=$CACHE_DEFAULT_LOCATION\nCACHE_SECONDS=43200\nDEBUG=false\nDOMAIN=192.168.1.115\nPORT=8080\nPROTOCOL=http\nSECRET_KEY='insert-your-secret-key-here'\nSTATIC_LOCATION=static/\nSTATIC_ROOT=static/\nTOWNS_ROOT=./\n\n\n# TSTO API configuration\nTSTO_API_KEY='insert-your-api-key-if-you-have-one'\nTSTO_API_TEAM_NAME=MyTeamNameHere\n\n# PostgreSQL configuration\nPOSTGRES_DB=springfield\nPOSTGRES_USER=springfield\nPOSTGRES_PASSWORD=springfield\nDATABASE_DEFAULT=postgres://springfield:springfield@db:5432/springfield\n\n\n# Garage configuration\nAWS_ACCESS_KEY_ID=ACCESS_KEY_ID\nAWS_SECRET_ACCESS_KEY=SECRET_ACCESS_KEY\nAWS_DEFAULT_REGION=garage\nAWS_ENDPOINT_URL=http://garage:3900\nSTORAGE_DEFAULT=s3://?bucket_name=tsto-bucket\nSTORAGE_STATICFILES=s3+static://?bucket_name=static-bucket\u0026url_protocol=http:\u0026custom_domain=$DOMAIN:$PORT\u0026location=$STATIC_LOCATION\n\n```\n\nThis .env file is way longer than the first one we saw before, so lets take it easy.\n\nIn the first part of the file we are defining some new defaults for the lifetime of the authentication codes (AUTH_CODE_MINUTES) and the cache duration (CACHE_SECONDS).\n\nWe are specifying that our cache backend is powered by Redis (CACHE_DEFAULT_BACKEND) and pointing to its location (CACHE_DEFAULT_LOCATION).\nThe variable CACHEOPS_REDIS_URL is also important here; it signals to our server that we want to enable an additional service for caching (actually it would be called an app in Django context), which depends on Redis. It's called [django-cacheops](https://pypi.org/project/django-cacheops/) and its main purpose is to support automatic or manual queryset caching.\n\nAlso we are now saying that our static files will be situated at `static/` (STATIC_ROOT). This directory is actually relative to\nthe S3 bucket we will use to store the static files.\n\nMoving on to the second part, we have our TSTO API configuration. If you have obtained access to the TSTO API, then you can insert your settings here.\nThe TSTO API settings will be used for authentication when users request a code for login.\n\nThe third part is our database configuration for PostgreSQL. We are setting an user, their password and database; all with the same value 'springfield'.\nThe variable DATABASE_DEFAULT defines the server database backend configuration.\n\nThe last part is our S3 service configuration. The first four variables are for establishing a connection with it.\n\nSTORAGE_DEFAULT defines the backend for the default storage as well as the name of our bucket (tsto-bucket in this case).\n\nAnalogously, there is STORAGE_STATICFILES which defines the storage backend for static files. We provide extra options to it: the custom_domain\nand location, so the server may construct the appropriate static URL. These extra options are described in the specific page for S3 storage from [django-storages](https://django-storages.readthedocs.io/en/latest/backends/amazon-S3.html). For the static files we are using another bucket rather than tsto-bucket called static-bucket. This bucket is different since it's exposed as a [public website](https://garagehq.deuxfleurs.fr/documentation/cookbook/exposing-websites/). This is done so the user web browser can request the static files from the bucket. Otherwise, only the game server would have access to the static files. To reflect our new static configuration, we have also updated our nginx settings.\n\n```\n\tserver {\n\t\tlisten 8080;\n\t\tserver_name localhost;\n\t\tclient_max_body_size 5M;\n\n\n\t\tlocation /static/ {\n\t\t\tproxy_pass\t\t\t\thttp://localhost:3902;\n\t\t\tproxy_set_header\t\tHost static-bucket.web.garage.localhost;\n\t\t}\n\n\t\tlocation /dlc/ {\n\t\t\troot\t\t\t\t\t/data;\n\t\t}\n\n\t\tlocation / {\n\t\t\tproxy_pass\t\t\t\thttp://localhost:8000;\n\t\t}\n\t}\n```\n\nNow that everything is done, run the commands to start and set the server up. Note that this time we need to run the makemigrations command since we have defined\na new location for the static files.\n\n```sh\ndocker compose up -d\ndocker compose exec springfield-server python manage.py makemigrations\ndocker compose exec springfield-server python manage.py migrate\ndocker compose exec springfield-server python manage.py collectstatic\ndocker compose exec springfield-server python manage.py createsuperuser\n```\n\nTo confirm your server works correctly, run the [testing routines](#user-content--run-tests).\n\n## 📧 Sending emails with a custom email service\n\nIf you are unable to use the TSTO API service for sending emails for you, you can use another service for that. Remove the TSTO_API variables from your .env file and set two new variables:\nSENDER_EMAIL and EMAIL_BACKEND.\n\nSENDER_EMAIL is used to specify whose email address sends emails to users. EMAIL_BACKEND contains the configuration for the server to connect with your email service. Check django-service-urls [documentation](https://pypi.org/project/django-service-urls/) for details on how to specify that.\n\nHere is an example to illustrate, using a \"fake\" Gmail account to send emails. Note that at the moment of writing this, in order to send emails with Gmail, you need to set up an app password.\nThis may change in the foreseeable future. Check the details as a precaution.\n\n**.env**\n```.env\nSENDER_EMAIL=myaddress@gmail.com\nEMAIL_BACKEND=smtp+tls://myaddress%40gmail.com:abcd%20efgh%20ijkl%20mnop@smtp.gmail.com:587\n```\nThe default email message comes from a template file located at `/proxy/templates/templated_email/auth_code.email`. If you wish to replace the email message with one of your own, you can bind your email template file with the server's. To do this, include the following line in the volumes section from the springfield-server service in your compose file.\n\n**.compose.yaml**\n```.yaml\nvolumes:\n\t- /path/to/auth_code.email:/app/proxy/templates/templated_email/auth_code.email:z\n```\n\nThe server uses [django-templated-email](https://pypi.org/project/django-templated-email/) for sending emails. It supports both plain text and HTML for structuring the email message. The template receives a context that includes three variables: username, code and auth_code_minutes, which you may use in your custom email message.\n\nBe aware that you can also use both the **TSTO API** service and an email custom service as a fallback in case the API is not available. Just set up both of them in your `.env` file. The server will prioritize the **TSTO API** for authentication and use only the custom email service when the API becomes unavailable.\n\n## 🗃️ Picking another database\n\nDjango offers support for multiple [database engines](https://docs.djangoproject.com/en/6.0/ref/settings/#std-setting-DATABASE-ENGINE). If you plan to run a server only for you and a few acquaintances, you may stick with the light SQLite database. However, if you plan to have multiple people playing in your server,\nI highly recommend picking PostgreSQL as your database. If you decide to pick another database other than PostgreSQL or SQLite, you may need to install additional dependencies in your container so the server can talk with the specified database.\n\n## ⬆️ Updating the server\n\nIn order to update the server, you must run the following sequence of commands.\n\n```sh\ndocker compose down\ndocker compose up -d --pull always\ndocker compose exec springfield-server python manage.py makemigrations\ndocker compose exec springfield-server python manage.py migrate\n```\n\nThis will shut down the server instance (if it is running at the time), recreate the containers with the latest images available, and perform new migrations (if necessary).\n\n\u003e If you are running multiple servers connected to the same database. You should run `docker compose down` on all of them first. Then you should perform the previous four commands in one server.\n\u003e After doing this, you may update and restart the rest of the servers by running `docker compose up -d --pull always` on each one.\n\n## 🩺 Run tests\n\nAlways run tests whenever you start your server.\n\n```sh\ndocker compose exec springfield-server python manage.py test\n```\n\n## ⚙️ Environment variables\n\nHere is a list of all available environment variables, which you can tweak in your .env file to adjust the server. Variables between square brackets [] are optional. Variables without square brackets [] are required, and if they are not specified, the server will not work.\n\nVariables which specifies the backends for: cache, database, storages, etc; use _django-service-urls_ to specify multiple values with a single string.\nConsult the [documentation](https://pypi.org/project/django-service-urls/) to understand how to specify such values.\n\n- [AUTH_CODE_MINUTES]: authentication code lifetime in minutes. Defaults to 30 minutes.\n\n- [CACHEOPS_REDIS_URL]: enables _django-cacheops_. Only set this variable in case you are using Redis as your cache backend. Usually it should be set with the same value as CACHE_DEFAULT_LOCATION.\n\n- [CACHE_DEFAULT_BACKEND]: a string specified in the format described by _django-service-urls_ which determines the cache backend. Defaults to _django.core.cache.backends.locmem.LocMemCache_.\n\n- [CACHE_DEFAULT_LOCATION]: a string specified in the format described by _django-service-urls_ which determines the cache service location. Defaults to _unique-snowflake_.\n\n- [CACHE_SECONDS]: duration of cached values in seconds. Defaults to 3600 seconds.\n\n- [DATABASE_DEFAULT]: a string specified in the format described by _django-service-urls_ which determines the database backend. Defaults to a SQLite file called database.db which is created in the working directory.\n\n- DEBUG: boolean variable which determines if server runs in debug mode. This value must be set to false when the server is in a production environment.\n\n- DOMAIN: reverse proxy domain or ip address which redirects to the server.\n\n- [EMAIL_BACKEND]: a string specified in the format described by _django-service-urls_ which determines the email backend. Defaults to printing emails to console. Note that this is only used if SENDER_EMAIL is defined and TSTO_API variables are not.\n\n- PORT: reverse proxy port.\n\n- PROTOCOL: reverse proxy protocol.\n\n- SECRET_KEY: the server secret key.\n\n- [SENDER_EMAIL]: email address where emails are dispatched from.\n\n- [STATIC_LOCATION]: static endpoint. Defaults to `static/`.\n\n- STATIC_ROOT: directory or path where static files will be stored.\n\n- [STORAGE_DEFAULT]: a string specified in the format described by _django-service-urls_ which determines the default storage backend. Defaults to _django.core.files.storage.filesystem.FileSystemStorage_.\n\n- [STORAGE_STATICFILES]: a string specified in the format described by _django-service-urls_ which determines the static storage backend. Defaults to _django.contrib.staticfiles.storage.StaticFilesStorage_.\n\n- [TIME_ZONE]: a string representing the time zone for this installation. See the [list of time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones).\n\n- [TOWNS_ROOT]: directory or path where town files will be stored. Defaults to `towns/`.\n\n- [TSTO_API_KEY]: self-explanatory. No default value.\n\n- [TSTO_API_TEAM_NAME]: self-explanatory. No default value.\n\n## Author\n\n👤 **Alisson Santos**\n\n* Github: [@al1sant0s](https://github.com/al1sant0s)\n\n## 🤝 Contributing\n\nContributions, issues and feature requests are welcome!\u003cbr /\u003eFeel free to check [issues page](https://github.com/al1sant0s/springfield/issues). \n\n## Show your support\n\nGive a ⭐️ if this project helped you!\n\n***\n_This README was generated with ❤️ by [readme-md-generator](https://github.com/kefranabg/readme-md-generator)_\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fal1sant0s%2Fspringfield","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fal1sant0s%2Fspringfield","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fal1sant0s%2Fspringfield/lists"}