Move barcodes to items instead of itemlocations. barcode should allow uuid or 6-12 digit string for upc-a/upc-e add volunteer and admin users Checkout only occurs against shop floor location Stock Check pulls both locaitons and allows qty changes
This repository is the development repository for the Rowan Shop Offile Inventory System To contribute, please read the guidelines here : Contributing.md
This simple Django project is an excellent template for your future projects. It includes everything you need to quickly set up a quality technology stack and start developing your web application's business logic, skipping all the complex deployment issues at an early stage.
Deploying a Django Project in Production with Automatic Let's Encrypt HTTPS in Just 55 Seconds... 🏎️💨 ...🏁
The technology stack used includes:
Python
ver. 3.11Django
ver. 4.2PostgreSQL
ver. 15Gunicorn
ver. 22.0Traefik
ver. 2.9Caddy
ver. 2.7 (instead of Traefik if you wish)Docker
and Docker Compose
Nothing extra, only the essentials! You can easily add everything else yourself by expanding the existing configuration files:
This project originally included a simple Django application from the official Django tutorial - "a basic poll application". It may still be used to demonstrate functionality in this readme.
So, what do you get by using this project as a template for your project? Let's take a look.
Clone the repository to your computer and go to the shop-prototype
directory:
git clone https://github.com/nbovee/shop-prototype.git
cd shop-prototype
Build the Docker container image with Django:
docker build -t shop-prototype:master .
Create the first superuser:
docker run -it --rm -v sqlite:/sqlite shop-prototype:master python manage.py createsuperuser
Run the Django development server inside the Django container:
docker run -it --rm -p 8000:8000 -v sqlite:/sqlite -v $(pwd)/shop_inventory:/usr/src/shop_inventory shop-prototype:master python manage.py runserver 0.0.0.0:8000
If using VSCode, you may launch the debugpy tool into your development server by running "Simple Debug" from the Run and Debug tab of the IDE.
Now you can go to http://127.0.0.1:8000/admin/ in your browser. Go to the Django admin panel and try updating the server code "on the fly". Everything works just like if you were running the Django development server outside the container.
Note that we mount the directory with your source code inside the container, so you can work with the project in your IDE, and changes will be visible inside the container, and the Django development server will restart itself.
docker run --rm shop-prototype:master ./pytest.sh
The pytest.sh script runs tests using pytest and coverage. As a result, you will see an output like this in the terminal:
================== test session starts =====================================
platform linux -- Python 3.11.7, pytest-7.4.4, pluggy-1.3.0
django: version: 4.2.9, settings: core.settings (from ini)
rootdir: /usr/src/core
configfile: pytest.ini
plugins: django-4.7.0
collected 10 items
polls/tests.py .......... [100%]
TOTAL 199 12 94%
> If you don't want to use pytest (for some reason), you can run the tests without pytest using the command below:
```console
docker run --rm shop-prototype:master python manage.py test
Interactive shell with the Django project environment:
docker run -it --rm -v sqlite:/sqlite shop-prototype:master python manage.py shell
Start all services locally (Postgres, Gunicorn, Traefik) using docker-compose:
docker compose -f docker-compose.debug.yml up
Enjoy watching the lines run in the terminal 🖥️
And after a few seconds, open your browser at http://127.0.0.1/admin/. The superuser with the login and password admin/admin
is already created, welcome to the Django admin panel.
Django is still in Debug mode! You can work in your IDE, write code, and immediately see changes inside the container. However, you are currently using Traefik and Postgres. You can also add Redis or MongoDB, and all of this will work in your development environment. This is very convenient.
Between Docker Compose restarts, your database data and media files uploaded to the server will be preserved because they are stored in special volumes that are not deleted when containers are restarted.
Want to delete everything? No problem, the command below will stop all containers, remove them and their images.
docker compose down --remove-orphans --rmi local
To delete the Postgre database as well, add the -v
flag to the command:
docker compose down --remove-orphans --rmi local -v
Some Django settings from the settings.py
file are stored in environment variables. You can easily change these settings in the .env
file. This file does not contain all the necessary settings, but many of them. Add additional settings to environment variables if needed.
It is important to note the following: never store sensitive settings such as DJANGO_SECRET_KEY or DJANGO_EMAIL_HOST_PASSWORD in your repository! Docker allows you to override environment variable values from additional files, the command line, or the current session. Store passwords and other sensitive information separately from the code and only connect this information at system startup.
For the Let's Encrypt HTTP challenge you will need:
80
& 443
with docker & docker-compose installed. A virtual machine in any cloud provider can be used as a host.Clone the repository on your host and go to the shop-prototype
directory:
git clone https://github.com/nbovee/shop-prototype.git
cd shop-prototype
Configure as described in the Django settings section or leave everything as is.
Run, specifying your domain:
MY_DOMAIN=your.domain.com docker compose -f docker-compose.yml -f docker-compose.tls.yml up -d
It will take a few seconds to start the database, migrate, collect static files, and obtain a Let's Encrypt certificate. So wait a little and open https://your.domain.com in your browser. Your server is ready to work 🏆
Don't worry about renewing the Let's Encrypt certificate, it will happen automatically.
docker compose exec django python manage.py check --deploy
docker compose exec django python manage.py shell
### Using Caddy Server Instead of Traefik
Traefik is a great edge router, but it doesn't serve static files, which is why we pair it with [Nginx](docker-compose.yml#L26) in our setup.
If you prefer a single tool that can handle everything, you might want to try [Caddy](https://caddyserver.com).
Caddy can automatically handle the creation and renewal of Let's Encrypt certificates and also serve static files, which allows you to use just one server instead of two.
Here's how to set up Caddy with your project:
1. Ensure you have a [`Caddyfile`](https://github.com/nbovee/shop-prototype/blob/master/Caddyfile) in your project directory. This file will tell Caddy how to deliver static and media files and how to forward other requests to your Django app.
2. Swap out the `docker-compose.yml` and `docker-compose.tls.yml` with a single [`docker-compose.caddy.yml`](https://github.com/nbovee/shop-prototype/blob/master/docker-compose.caddy.yml). This file is designed to set up Caddy with Django and Postgres, and it doesn't include Nginx, which makes the file shorter and easier to understand.
3. To get your Django project up with Caddy, run the following command, making sure to replace `your.domain.com` with your actual domain:
```console
MY_DOMAIN=your.domain.com docker compose -f docker-compose.caddy.yml up -d
Choosing Caddy simplifies your setup by combining the functionalities of Traefik and Nginx into one. It's straightforward and takes care of HTTPS certificates for you automatically. Enjoy the ease of deployment with Caddy!
Now that you have a working project, you can extend it as you like, adding dashboards for monitoring service health, centralized log collection, secret storage, and of course, your own Django applications. All of this is beyond the scope of the current description, as the idea of this project is minimalism and providing only the essentials. Good luck!
Developed from the excellent template repo by @amerkurev found here: https://github.com/nbovee/shop-prototype