{"id":20619747,"url":"https://github.com/twtrubiks/docker-django-nginx-uwsgi-postgres-tutorial","last_synced_at":"2025-04-05T17:09:03.672Z","repository":{"id":63787539,"uuid":"109462803","full_name":"twtrubiks/docker-django-nginx-uwsgi-postgres-tutorial","owner":"twtrubiks","description":" Docker + Django + Nginx + uWSGI + Postgres  基本教學 - 從無到有 ( Docker + Django + Nginx + uWSGI + Postgres Tutorial ) ","archived":false,"fork":false,"pushed_at":"2023-05-28T14:04:12.000Z","size":70,"stargazers_count":434,"open_issues_count":4,"forks_count":99,"subscribers_count":18,"default_branch":"master","last_synced_at":"2025-03-29T16:10:31.326Z","etag":null,"topics":["django","django-rest-framework","docker","nginx","postgresql","tutorial","uwsgi"],"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/twtrubiks.png","metadata":{"files":{"readme":"README.en.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2017-11-04T03:09:00.000Z","updated_at":"2025-03-23T06:33:04.000Z","dependencies_parsed_at":"2022-11-26T01:48:57.248Z","dependency_job_id":"72f90feb-ebcc-40e8-840a-f9fae3242963","html_url":"https://github.com/twtrubiks/docker-django-nginx-uwsgi-postgres-tutorial","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fdocker-django-nginx-uwsgi-postgres-tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fdocker-django-nginx-uwsgi-postgres-tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fdocker-django-nginx-uwsgi-postgres-tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/twtrubiks%2Fdocker-django-nginx-uwsgi-postgres-tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/twtrubiks","download_url":"https://codeload.github.com/twtrubiks/docker-django-nginx-uwsgi-postgres-tutorial/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247369952,"owners_count":20927928,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["django","django-rest-framework","docker","nginx","postgresql","tutorial","uwsgi"],"created_at":"2024-11-16T12:12:25.018Z","updated_at":"2025-04-05T17:09:03.648Z","avatar_url":"https://github.com/twtrubiks.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# docker-django-nginx-uwsgi-postgres-tutorial\n\n Docker + Django + Nginx + uWSGI + Postgres Basic Tutorial - from nothing to something\n\n This tutorial teaches you how to setup [Django](https://www.djangoproject.com/) + [Nginx](https://nginx.org/en/) + [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/) + [PostgreSQL](https://www.postgresql.org/) with Docker 📝\n\nFor those who are not familiar with [Docker](https://www.docker.com/), I suggest that you read my previous tutorials first:\n\n[Docker 基本教學 - 從無到有 Docker-Beginners-Guide 教你用 Docker 建立 Django + PostgreSQL 📝](https://github.com/twtrubiks/docker-tutorial)\n\n* [Youtube Tutorial PART 1 - Docker + Django + Nginx + uWSGI + Postgres - 簡介](https://youtu.be/u4XIMTOsxJk)\n* [Youtube Tutorial PART 2 - Docker + Django + Nginx + uWSGI + Postgres - 原理步驟](https://youtu.be/9K4O1UuaXrU)\n* [Youtube Tutorial PART 3 - Docker + Django + Nginx + uWSGI + Postgres - 實戰](https://youtu.be/v7Mf9TuROnc)\n\n## Summary\n\n### [Docker](https://www.docker.com/)\n\n![](https://i.imgur.com/gDcSwcs.png)\n\nI have introduced Docker before, so I won't introduce it here :stuck_out_tongue_closed_eyes:\n\nTake a look at:\n\n[Docker 基本教學 - 從無到有 Docker-Beginners-Guide 教你用 Docker 建立 Django + PostgreSQL 📝](https://github.com/twtrubiks/docker-tutorial)\n\n### [Django](https://github.com/django/django)\n\nTake a look at:\n\n[Django 基本教學 - 從無到有 Django-Beginners-Guide 📝](https://github.com/twtrubiks/django-tutorial)\n\n[Django-REST-framework 基本教學 - 從無到有 DRF-Beginners-Guide 📝](https://github.com/twtrubiks/django-rest-framework-tutorial)\n\nFor more Django examples, check out my [Github](https://github.com/twtrubiks?utf8=%E2%9C%93\u0026tab=repositories\u0026q=Django\u0026type=\u0026language=), I have just listed two of the simpler ones here :relaxed:\n\n### [PostgreSQL](https://www.postgresql.org/)\n\n![](https://i.imgur.com/RrNtbfz.png)\n\n### [Nginx](https://nginx.org/en/)\n\n![](https://i.imgur.com/AkcCtDa.png)\n\nNginx is a type of Web Server that uses few resources and has high stability.\n\nNginx's high stability is a result of solving the **C10K** problem. What is **C10K**? The original literature can be found here [The C10K problem](http://www.kegel.com/c10k.html).\n\n**C10K** is the Client 10000 problem. Previously, when a server receives more than 10000 concurrent connections, it may not be able to operate normally.\n\nNginx does not natively support dynamic content, so, any dynamic content needs to be set up separately. [uWSGI](https://uwsgi-docs.readthedocs.io/en/latest/) is used to facilitate the communication between Nginx and the dynamic content.\n\nTake a look at the diagram below (important)\n\n:star: the web client \u003c-\u003e the web server ( Nginx )  \u003c-\u003e unix socket  \u003c-\u003e uWSGI \u003c-\u003e Django :star:\n\nYou may ask me, what is uWSGI :confused:?\n\nuWSGI implements a communication protocol. You can think of it as a connector (which communicates with Django).\n\nUsually, Django will be put behind the http server ( Nginx ), so, when the server receives a request, how will it pass the data to Django?\n\n\nThis is uWSGI's functionality :wink:\n\nSo why do we still need Nginx :confused:?\n\nFirst, let's understand a concept,\n\nNginx is in charge of static content (html, js, css, images, ...), uWSGI is in charge of Python's dynamic content.\n\nuWSGI does not handle static content well (it's inefficient), so, we can use Nginx to handle static content. In addition, Nginx has a lot of other benefits.\n\n* Nginx, compared to uWSGI, handles static resources better\n* Nginx allows cache configuration\n* Nginx can act as a reverse proxy\n* Nginx can load balance multiple connections\n\nGentle reminder :heart:\n\nIf you would like learn more about **reverse proxies**, you can take a look at [forward proxy VS reverse proxy](https://github.com/twtrubiks/docker-django-nginx-uwsgi-postgres-load-balance-tutorial#%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86%E5%99%A8--vs-%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E5%99%A8) :smile:\n\nUp to this point, you may have some questions:\n\nWhy can I still run Django without Nginx and uWSGI? :confused:\n\nTo run Django, we usually use `python manage.py runserver` to run the server.\n\nActually, when you run this command, Django helps you start a small http server.\n\nOf course, this is just for convenience during development. We would not do this in production ( not to mention performance :disappointed_relieved: )\n\nHey :confused: isn't there Gunicorn? Previously you mentioned Gunicorn in\n[Deploying_Django_To_Heroku_Tutorial](https://github.com/twtrubiks/Deploying_Django_To_Heroku_Tutorial)\n[Deploying-Flask-To-Heroku](https://github.com/twtrubiks/Deploying-Flask-To-Heroku)\n\nSo why can't we use Gunicorn instead of uWSGI?\n\nThe last time, when I used Gunicorn, it was because the application resided in Heroku, and it is recommended to use Gunicorn to set up a web server there. As for which is better, Gunicorn or uWSGI, I feel that it is up your use case :wink:\n\nWait a minute, since we are talking about Nginx, isn't there also [Apache](https://httpd.apache.org/)? I heard that a lot of people use that :stuck_out_tongue_winking_eye:\n\nYou may also be asking, so should I choose [Nginx](https://nginx.org/en/) or [Apache](https://httpd.apache.org/) :confused:\n\nI think that there is no best server, if the server meets your requirements, the choose it :smiley:\n\n## Tutorial\n\nThis time, I will be using Docker to set up 3 containers to separate Nginx, Django + uWSGI and Postgres\n\nMy main reference is [https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html](https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html) in this tutorial.\n\nBut there are some differences :smirk:\n\nThe main focus this time will be on setting up of Nginx with Django + uWSGI\n\n**Nginx Section**, you can take a look at [Dockerfile](https://github.com/twtrubiks/docker-django-nginx-uswgi-postgres-tutorial/blob/master/nginx/Dockerfile) in the folder.\n\n```Dockerfile\nFROM nginx:latest\n\nCOPY nginx.conf /etc/nginx/nginx.conf\nCOPY my_nginx.conf /etc/nginx/sites-available/\n\nRUN mkdir -p /etc/nginx/sites-enabled/\\\n    \u0026\u0026 ln -s /etc/nginx/sites-available/my_nginx.conf /etc/nginx/sites-enabled/\n\n# RUN mkdir -p /etc/nginx/sites-enabled/\\\n#     \u0026\u0026 ln -s /etc/nginx/sites-available/my_nginx.conf /etc/nginx/sites-enabled/\\\n#     \u0026\u0026 rm /etc/nginx/conf.d/default.conf\n\nCMD [\"nginx\", \"-g\", \"daemon off;\"]\n```\n\nLet me explain the steps,\n\nFirst Step\n\nCopy nginx.conf to the `/etc/nginx/nginx.conf` path.\n\n(the original nginx.conf can be retrieved from the Nginx Docker container, inside the `/etc/nginx` path you can find nginx.conf)\n\nI have copied out a part of the original file [nginx_origin.conf](https://github.com/twtrubiks/docker-django-nginx-uswgi-postgres-tutorial/blob/master/nginx/nginx_origin.conf) :smiley:\n\nFor nginx.conf, there are mainly two parts that needs to be modified.\n\nThe first part is to change the user to root:\n\n```conf\nuser  root;\n```\n\nThe other part is:\n\n```conf\n# include /etc/nginx/conf.d/*.conf;\ninclude /etc/nginx/sites-available/*;\n```\n\nAdd a line `include /etc/nginx/sites-available/*;`\n\nand remove `include /etc/nginx/conf.d/*.conf;`\n\nThis way the [Dockerfile](https://github.com/twtrubiks/docker-django-nginx-uswgi-postgres-tutorial/blob/master/nginx/Dockerfile)\nin the Nginx folder does not need the command to delete the default.conf because `include /etc/nginx/conf.d/*.conf;` is the default page that will run.\n\nBut now, we need to configure it :smirk:\n\nSecond Step\n\nCopy my_nginx.conf into `/etc/nginx/sites-available/`\n\nLet us pause here for a while,\n\nIf you use `FROM nginx:latest` to install Nginx, you will discover that you do not have the two directories below:\n\n`/etc/nginx/sites-available/`\n\n`/etc/nginx/sites-enabled/`\n\nbut don't worry, if the directories aren't there, we will add them in ( which is what the commands in the Nginx Dockerfile is doing )\n\nBut why don't we have these directories in the first place :confused:\n\nThe reason is because these directories are only created when Nginx is installed with `apt-get`.\n\nThird Step\n\nsites-available This directory is actually not important, you can create a folder with a name you want too, but\n\n*sites-enabled* This directory is more important because we need to use symlinks (through the Linux command `ln`) link *sites-enabled* with *my_nginx.conf.\n\nNext, let's talk about the configuration in my_nginx.conf\n\n```conf\n# the upstream component nginx needs to connect to\nupstream uwsgi {\n    # server api:8001; # use TCP\n    server unix:/docker_api/app.sock; # for a file socket\n}\n\n# configuration of the server\nserver {\n    # the port your site will be served on\n    listen    80;\n    # index  index.html;\n    # the domain name it will serve for\n    # substitute your machine's IP address or FQDN\n    server_name  twtrubiks.com www.twtrubiks.com;\n    charset     utf-8;\n\n    client_max_body_size 75M;   # adjust to taste\n\n    # Django media\n    # location /media  {\n    #     alias /docker_api/static/media;  # your Django project's media files - amend as required\n    # }\n\n    location /static {\n        alias /docker_api/static; # your Django project's static files - amend as required\n    }\n\n    location / {\n        uwsgi_pass  uwsgi;\n        include     /etc/nginx/uwsgi_params; # the uwsgi_params file you installed\n    }\n\n}\n```\n\nLet's first look at the upstream part.\n\nIt uses Unix sockets which is better than using TCP port sockets because there is less overhead.\n\nNext is `include     /etc/nginx/uwsgi_params`, usually the uwsgi_params can be found in the Nginx directory `/etc/nginx`.\n\nIf you really can't find it, you can copy one from [uwsgi_params](https://github.com/twtrubiks/docker-django-nginx-uswgi-postgres-tutorial/blob/master/api/uwsgi_params) (I copied out the file for everyone but if you follow my steps, you will probably have it)\n\nNext, let's talk about uwsgi_pass or what you have seen is proxy_pass.\n\nNginx will convert the request received to uwsgi's protocol. Then, it will pass the request to Django to handle it.\n\nThen why can't we just use a proxy ( default to http protocol ) but we have to use uwsgi :confused:?\n\nThe main reason is because efficiency is taken into consideration.\n\nSince we have already talked about it so much, I'll briefly explain what is a **Proxy server**.\n\nWhen a client from an external network sends a request, the proxy server will forward it to an internal server to handle it. Once it's done, the response goes back through the proxy server to the client in the external network.\n\nWhat's the benefit in this :confused:? The benefit is that it protects the internal server, preventing clients from directly attacking the internal server.\n\nAnother benefit is the caching mechanism. If the client accesses similar resources, the resources can be retrieved directly from cache.\n\nLast Step\n\nGentle reminder :heart:\n\nWhat is a daemon :question::question::question:\n\nActually, it is not very hard to understand, you can think of it as a type of service :smile:\n\nIf you want to learn more about daemons, you can google **linux daemon** :pencil2:\n\nWhy do we use `nginx -g daemon off` to start Nginx but not `/etc/init.d/nginx start` :confused:?\n\nThis question requires us to go back and understand Docker.\n\nThe excerpt below is from [Docker Nginx](https://hub.docker.com/_/nginx/)\n\n***If you add a custom CMD in the Dockerfile, be sure to include -g daemon off; in the CMD in order for nginx to stay in the foreground, so that Docker can track the process properly (otherwise your container will stop immediately after starting)!***\n\nSimply put, it is to keep the Nginx service running. If not, the container will exit.\n\n**Django + uWSGI Section**, you can take a look at the [Dockerfile](https://github.com/twtrubiks/docker-django-nginx-uswgi-postgres-tutorial/blob/master/api/Dockerfile) in the api folder\n\nIt it mostly quite simple, but there I would like to point out one thing:\n\nSometimes when we `pip install`, it runs very slowly.\n\nIn these situations, we can add a `-i` option to change the index source, making it run a bit faster :grin:\n\nNext, I'll explain uwsgi.ini, inside of which are some configuration files\n\n```ini\n[uwsgi]\n\n# http=0.0.0.0:8000\nsocket=app.sock\nmaster=true\n# maximum number of worker processes\nprocesses=4\nthreads=2\n# Django's wsgi file\nmodule=django_rest_framework_tutorial.wsgi:application\n\n# chmod-socket=664\n# uid=www-data\n# gid=www-data\n\n# clear environment on exit\nvacuum          = true\n```\n\nCommunication to Nginx is done through the socket file ( app.sock ). The uid and gid parts are permissions.\n\nYou can take a look at the article below. The article includes why we do not use root permissions.\n\n[Things to know (best practices and 「issues」) READ IT !!!](http://uwsgi-docs.readthedocs.io/en/latest/ThingsToKnow.html)\n\nI decided to use root anyways because without root, there will be permission errors which I finally found my answer [here](https://stackoverflow.com/questions/18480201/ubuntu-nginx-emerg-bind-to-0-0-0-080-failed-13-permission-denied)\n\n*the socket API bind() to a port less than 1024, such as 80 as your title mentioned, need root access.*\n\nThe simpler solution is to run with root :smile:\n\nLastly, I used `docker-compose.yml` to manage my containers.\n\nSee my [docker-compose.yml](https://github.com/twtrubiks/docker-django-nginx-uswgi-postgres-tutorial/blob/master/docker-compose.yml)\n\n## Steps to run\n\nRun `docker-compose up` and watch the magic happen.\n\nYou will see something like this:\n\n![](https://i.imgur.com/4WPac2V.png)\n\n![](https://i.imgur.com/I67WDJU.png)\n\nIf you then see something like the below, then it has run successfully.\n\n![](https://i.imgur.com/WwRLm4C.png)\n\n![](https://i.imgur.com/G28IGca.png)\n\nNext, go to [http://localhost:8080/api/music/](http://localhost:8080/api/music/)\n\nIf you immediately see something like the image below, it means that you have completed a small step.\n\nSeeing this is normal, because we still need to migrate.\n\n![](https://i.imgur.com/d0jlMo9.png)\n\nThe terminal output is also fine ( though it is easy to get stuck here :sweat_smile: )\n\n![](https://i.imgur.com/RBW8eQt.png)\n\nNext, open another terminal and go into the api ( Django + uWSGI ) container.\n\nYou can find the steps in the previous [docker-tutorial-指令介紹](https://github.com/twtrubiks/docker-tutorial#指令介紹)，\n\nYou can also use other GUI applications like the [previously introduced portainer](https://github.com/twtrubiks/docker-tutorial#其他管理-docker-gui-的工具)\n\n```cmd\ndocker exec -it \u003cContainer ID\u003e bash\n```\n\n```cmd\npython manage.py makemigrations musics\npython manage.py migrate\npython manage.py createsuperuser\n```\n\n![](https://i.imgur.com/haHcokf.png)\n\nThis time, we need to run a different command\n\n```cmd\npython manage.py collectstatic\n```\n\nThis takes all the static files in Django and collates them into the static folder.\n\n![](https://i.imgur.com/zaz2bYX.png)\n\nNext, you can go to [http://localhost:8080/api/music/](http://localhost:8080/api/music/), then you will see the normal page :smile:\n\n![](https://i.imgur.com/EybsFZ3.png)\n\nWhy do we need to do this step?\n\nThe purpose of the step is to pass all the static content to Nginx to process. In my_nginx.conf, you will notice that we pointed Nginx to the `/docker_api/static` path.\n\nAs said above, Nginx is in charge of all the static content ( html, css, images, ...... ) while uWSGI is in charge of Python's dynamic content.\n\nIf you are interested to try it out, use Django + uWSGI without Nginx. If you do this, it will function normally but you will notice that the css, images and others cannot be retrieved, as shown below\n\n![](https://i.imgur.com/btiI68s.png)\n\nBecause uWSGI does not handle static content well :sob:\n\nThough this can be resolved. Take a look at [https://uwsgi-docs.readthedocs.io/en/latest/StaticFiles.html](https://uwsgi-docs.readthedocs.io/en/latest/StaticFiles.html)\n\nbut I recommend that you use Nginx, because it can do more things :smiley:\n\n## Final Result\n\nGo to [http://localhost:8080/api/music/](http://localhost:8080/api/music/)\n\n![](https://i.imgur.com/jl43jST.png)\n\n![](https://i.imgur.com/Fw6LjbE.png)\n\n## `hosts` Configuration and Finding Your IP Address\n\nEdit the `hosts` configuration file\n\nWindows\n\n`hosts` is located at\n\n\u003e C:\\WINDOWS\\system32\\drivers\\etc\\hosts\n\n![](https://i.imgur.com/Q6lZyK0.png)\n\nYou may need permissions to save the file.\n\nMAC\n\n`hosts` is located at\n\n\u003e sudo vi /etc/hosts\n\nFinding your IP address\n\nWindows\n\n```cmd\nipconfig\n```\n\n![](https://i.imgur.com/sPOqIxM.png)\n\nMAC\n\n```cmd\nifconfig\n```\n\n![](https://i.imgur.com/BOs5BwZ.png)\n\nLet's say your ip address is 192.168.1.103, then those in the same network as you (intranet), can connect to you through this ip address.\n\nAs for the editing the `hosts` configuration file part, we can just go to [http://twtrubiks.com:8080/api/music/](http://twtrubiks.com:8080/api/music/)\n\n![](https://i.imgur.com/efEqLd0.png)\n\n## Introducing Supervisor\n\n[Supervisor](http://supervisord.org/)\n\nis a type of process management tool. Using it, you can easily start, stop, restart and monitor one or many processes.\n\nFor example, if a process stalls, once Supervisor notices, it will automatically restart the process. No need to write any programs ( such as your own shell programs ) to control it.\n\nNow, you may ask me:\n\nShould I use Supervisor :confused:?\n\nWhen do I use Supervisor?\n\nYou use Supervisor when you need to start multiple independent processes in a container.\n\nLet me give you an example, let's say you create a container with Nginx + uWSGI + Django, all in the same container. Then, in this case, Supervisor will be suitable.\n\nThough, if you are using Docker, having Nginx and uWSGI + Django separate is better ( meaning, separate them in two different containers )\n\nThen, use docker-compose to manage the containers; which is this example's method.\n\nThen you will ask, how do I manage containers which unexpectedly exit :confused:?\n\nIn this case, you can take a look at the [docker-compose.yml](https://github.com/twtrubiks/docker-django-nginx-uswgi-postgres-tutorial/blob/master/docker-compose.yml) which uses `restart=always` to solve this problem. It will help you restart the container when the container exits unexpectedly :relaxed:\n\n## Conclusion\n\nThis also my first time setting up Django + Nginx + uWSGI + Postgres, during which I had to mess around with the configuration for a very long time :scream:. But, I wholeheartedly recommend Docker.\n\nUsing Docker was really fun, even when I brake the project, I can just start over again. It's fast and, through this exercise, you will see that Nginx actually has a lot of features which you can play with such as the Load Balancer. Through which you can better understand servers; I myself understood a lot from it.\n\nIn short, I recommend that everyone get their hands dirty, follow my footsteps and play with it. I believe that more or less everyone will learn something.\n\nI am also new to Docker, if I have done anything wrong, please let me know, I will make the necessary changes :blush:\n\nIf you are still learning to read, read more :satisfied:\n\n* [實戰 Docker + Django + Nginx + uWSGI + Postgres - Load Balance 📝](https://github.com/twtrubiks/docker-django-nginx-uwsgi-postgres-load-balance-tutorial)\n* [Docker Swarm 基本教學 - 從無到有 Docker-Swarm-Beginners-Guide📝](https://github.com/twtrubiks/docker-swarm-tutorial)\n\n## Environment\n\n* Mac\n* Python 3.8.2\n* windows 10\n* Liunx\n\n## Reference\n\n* [https://docs.docker.com/](https://docs.docker.com/)\n* [uwsgi-docs](https://uwsgi-docs.readthedocs.io/en/latest/tutorials/Django_and_nginx.html)\n\n## Donation\n\nThis document is the result of my own internalization after researching. If it has helped you, and you would like to encourage me, you're welcome to buy me a cup of coffee :laughing:\n\n![alt tag](https://i.imgur.com/LRct9xa.png)\n\n[Sponsor Me](https://payment.opay.tw/Broadcaster/Donate/9E47FDEF85ABE383A0F5FC6A218606F8)\n\n## License\n\nMIT license\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Fdocker-django-nginx-uwsgi-postgres-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftwtrubiks%2Fdocker-django-nginx-uwsgi-postgres-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftwtrubiks%2Fdocker-django-nginx-uwsgi-postgres-tutorial/lists"}