diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c9bf73f..264d0bd 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,41 +1,50 @@ // For format details, see https://aka.ms/devcontainer.json. For config options, see the // README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-docker-compose { - "name": "Existing Docker Compose (Extend)", - + "name": "Extend base docker-compose for development purposes", // Update the 'dockerComposeFile' list if you have more compose files or use different names. // The .devcontainer/docker-compose.yml file contains any overrides you need/want to make. - "dockerComposeFile": ["../docker-compose.yml", "docker-compose.yml"], - + "dockerComposeFile": [ + "../docker-compose.yml", + "docker-compose.yml" + ], // The 'service' property is the name of the service for the container that VS Code should // use. Update this value and .devcontainer/docker-compose.yml to the real service name. "service": "web", - // The optional 'workspaceFolder' property is the path VS Code should open by default when // connected. This is typically a file mount in .devcontainer/docker-compose.yml "workspaceFolder": "/workspaces/${localWorkspaceFolderBasename}", "features": { - "ghcr.io/wxw-matt/devcontainer-features/script_runner:0": {} - } - + "ghcr.io/devcontainers/features/git:1": {}, + "ghcr.io/devcontainers/features/sshd:1": {} + }, // Features to add to the dev container. More info: https://containers.dev/features. // "features": {}, - // Use 'forwardPorts' to make a list of ports inside the container available locally. // "forwardPorts": [], - // Uncomment the next line if you want start specific services in your Docker Compose config. // "runServices": [], - // Uncomment the next line if you want to keep your containers running after VS Code shuts down. // "shutdownAction": "none", - // Uncomment the next line to run commands after the container is created. - // "postCreateCommand": "cat /etc/os-release", - - // Configure tool-specific properties. - // "customizations": {}, - - // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root. - // "remoteUser": "devcontainer" + "postStartCommand": "${containerWorkspaceFolder}/manage.py migrate", + "postCreateCommand": "${containerWorkspaceFolder}/manage.py collectstatic --no-input --clear", + "customizations": { + "vscode": { + "settings": { + "extensions.verifySignature": false + }, + "extensions": [ + "ms-python.python", + "mikestead.dotenv", + "VisualStudioExptTeam.vscodeintellicode", + "ms-python.black-formatter", + "VisualStudioExptTeam.intellicode-api-usage-examples", + "ms-azuretools.vscode-docker", + "DavidAnson.vscode-markdownlint", + "yzhang.markdown-all-in-one" + ] + } + }, + "containerUser": "spejstore" } diff --git a/.devcontainer/docker-compose.yml b/.devcontainer/docker-compose.yml index 06b3c51..630e282 100644 --- a/.devcontainer/docker-compose.yml +++ b/.devcontainer/docker-compose.yml @@ -1,25 +1,9 @@ -version: "3" +version: "3.4" services: - # Update this to the name of the service you want to work with in your docker-compose.yml file web: - # Uncomment if you want to override the service's Dockerfile to one in the .devcontainer - # folder. Note that the path of the Dockerfile and context is relative to the *primary* - # docker-compose.yml file (the first in the devcontainer.json "dockerComposeFile" - # array). The sample below assumes your primary file is in the root of your project. - # - # build: - # context: . - # dockerfile: .devcontainer/Dockerfile - volumes: - # Update this to wherever you want VS Code to mount the folder of your project - ..:/workspaces:cached - - # Uncomment the next four lines if you will use a ptrace-based debugger like C++, Go, and Rust. - # cap_add: - # - SYS_PTRACE - # security_opt: - # - seccomp:unconfined + restart: unless-stopped # Overrides default command so things don't shut down after the process ends. command: /bin/sh -c "while sleep 1000; do :; done" @@ -36,4 +20,5 @@ services: # - SPEJSTORE_MEDIA_ROOT= # - SPEJSTORE_REQUIRE_AUTH=true - SPEJSTORE_OAUTH_REDIRECT_IS_HTTPS=false + - SPEJSTORE_SPEJSTORE_FILE_STORAGE_TYPE="filesystem" # - SPEJSTORE_PROXY_TRUSTED_IPS=172.21.37.1 diff --git a/.dockerignore b/.dockerignore index bda64ec..e19247c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -20,3 +20,4 @@ log .Dockerfile .env .devcontainer +readme diff --git a/.gitignore b/.gitignore index 764f8ec..c051866 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ postgres-hstore/ docker-compose.override.yml build_static .venv -.vscode __pycache__ + +# Is not ignored by default in devcontainers, macs bad +.DS_Store diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..e6f2364 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "ms-vscode-remote.remote-containers" + ] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..6cc7c2a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,20 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python: Django", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/manage.py", + "args": [ + "runserver", + "0.0.0.0:8000", + ], + "django": true, + "justMyCode": true + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..70a2f9b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "[python]": { + "editor.defaultFormatter": "ms-python.black-formatter" + }, +} diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..12d4aeb --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,27 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "migrate", + "type": "shell", + "command": "${workspaceFolder}/manage.py migrate" + }, + { + "label": "makemigrations", + "type": "shell", + "command": "${workspaceFolder}/manage.py makemigrations" + }, + { + "label": "runserver", + "type": "shell", + "command": "${workspaceFolder}/manage.py runserver" + }, + { + "label": "collectstatic", + "type": "shell", + "command": "${workspaceFolder}/manage.py collectstatic" + } + ] +} diff --git a/Dockerfile b/Dockerfile index dc6d453..8774a47 100644 --- a/Dockerfile +++ b/Dockerfile @@ -12,6 +12,7 @@ ADD requirements.txt /code/ RUN pip install --no-cache-dir -r requirements.txt ADD . /code/ -RUN python -m pip install gunicorn +RUN groupadd --gid 1000 spejstore && useradd --uid 1000 --gid 1000 --home /code --shell /bin/bash spejstore +USER spejstore CMD bash -c "python manage.py collectstatic --no-input --clear && python manage.py migrate && gunicorn --workers 1 --threads 4 -b 0.0.0.0:8000 --capture-output --error-logfile - --access-logfile - spejstore.wsgi:application" diff --git a/README.md b/README.md index 521fadf..6d920a7 100644 --- a/README.md +++ b/README.md @@ -1,33 +1,47 @@ -# spejstore +# spejstore (AKA inventory) + +The general HSWAW (and other polish hackerspaces) inventory system. Because there is not enough general inventory software invented here yet. -Please use Python3, for the love of `$deity`... ## Usage -### Quick start +### Quick start (VSCode) -1. Run: - ```sh - ln -s docker-compose.dev-override.yml docker-compose.override.yml - docker-compose up --build - ``` -2. Run `docker-compose run --rm web python manage.py createsuperuser` -- now you can dev authenticate w/o SSO +1. Copy `.env.example` as `.env` +2. Have `docker compose` 2.0. You can identify it by having `docker compose` command instead of `docker-compose`. +3. Customize your `.env` for your specific usecase. -### Build & run +#### VSCode -```sh -docker-compose up --build +0. Setup environment variables +1. Get VSCode from [here](https://code.visualstudio.com/download), *CAN NOT* be VSCodium, as the extension is a microsoft binary which does not work with VSCodium. +2. Install [Dev Containers](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers) extension +3. Clone the repository and open it with VSCode. +4. You should get a toast like this when re-opening directory with the cloned repository. ![Toast example](readme/toast-example.png 'Toast example') + 1. If you don't get a toast, then use (CMD|Ctrl)+Shift+P to open actions menu and choose option **Rebuild Without Cache and Reopen in Container**. ![Command example](readme/command-example.png 'Command example') +5. Reopen the directory in container either via command or popup button. +6. Wait for the application and container to properly build. + 1. Devcontainer's VSCode instance will be automatically configured with extensions to help your development process. + 2. You might get a Toast telling you to re-open the directory due to Black not working properly. Do so for proper autoformatting support. + 3. Make sure that extensions were installed in your vscode devcontainer. It might take a couple of minutes. +7. `manage.py migrate` will be run automatically after container creation, to make sure you have the latest migrations done on the development database without any need for interaction. +8. Run debug session with either command of "Start Debugging" (default hotkey F5), or with the Debug sidebar. ![Debug sidebar instructions](readme/debug-example.png 'Debug sidebar') +9. You should have automatically forwarded ports, so the only thing remaining is opening browser window with the url provided in terminal. -# if you need to reset built static files and/or postgres database: -docker-compose up --build --renew-anon-volumes -``` +#### Everything else (docker) -### Troubleshooting +1. Run `docker compose up`. This will create a production-ready setup with gunicorn. out of the box. -- https://askubuntu.com/q/615394/413683 +### Everything else (python) -## New docs (WIP): +1. Get python3 +2. `pip install -r requirements.txt` +3. `python3 manage.py migrate` +4. `python3 manage.py collectstatic` +5. `python3 manage.py runserver 0.0.0.0:8000` + +## New docs (WIP) Spejstore is a simple inventory system made for Warsaw Hackerspace purposes. Includes some features very specific to hswaw requirements, which are: diff --git a/docker-compose.yml b/docker-compose.yml index 6381fc3..54707f5 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,9 @@ version: "3" services: db: image: postgres:15.4 - restart: always + restart: unless-stopped + volumes: + - spejstore-db:/var/lib/postgresql/data environment: - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres @@ -16,13 +18,18 @@ services: web: build: . - restart: always + restart: unless-stopped command: bash -c "python manage.py collectstatic --no-input --clear && python manage.py migrate && gunicorn --workers 1 --threads 4 -b 0.0.0.0:8000 --capture-output --error-logfile - --access-logfile - spejstore.wsgi:application" volumes: - .:/code - /code/build_static ports: - "8000:8000" + env_file: + - .env depends_on: db: condition: service_healthy +volumes: + spejstore-db: + external: false diff --git a/readme/command-example.png b/readme/command-example.png new file mode 100644 index 0000000..ee8d1ec Binary files /dev/null and b/readme/command-example.png differ diff --git a/readme/debug-example.png b/readme/debug-example.png new file mode 100644 index 0000000..bd7d0ea Binary files /dev/null and b/readme/debug-example.png differ diff --git a/readme/toast-example.png b/readme/toast-example.png new file mode 100644 index 0000000..ff7593c Binary files /dev/null and b/readme/toast-example.png differ diff --git a/requirements.txt b/requirements.txt index ffbe938..024889b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,6 @@ asgiref==3.7.2 +boto3==1.34.32 +botocore==1.34.32 certifi==2023.5.7 cffi==1.15.1 chardet==5.1.0 @@ -12,12 +14,13 @@ django-appconf==1.0.5 django-hstore==1.4.2 django-markdown2==0.3.1 django-select2==8.1.2 -django-storages[s3]==1.14.2 -# Django-tree -https://github.com/Palid/django-tree/archive/master.zip +django-storages==1.14.2 +django-tree @ https://github.com/Palid/django-tree/archive/439e9a867e789b58f0c37e34e8ceb85ce1b806dc.zip#sha256=044e6766f4993512404492d7ec76949ca6b9ed44c88619ecc3a4e5339aa27b71 djangorestframework==3.14.0 docopt==0.6.2 +gunicorn==21.2.0 idna==3.4 +jmespath==1.0.1 markdown2==2.4.9 oauthlib==3.2.2 packaging==23.1 @@ -25,10 +28,13 @@ Pillow==10.0.0 psycopg2==2.9.6 pycparser==2.21 PyJWT==2.7.0 +python-dateutil==2.8.2 python3-openid==3.2.0 pytz==2023.3 requests==2.31.0 requests-oauthlib==1.3.1 +s3transfer==0.10.0 +six==1.16.0 social-auth-app-django==5.2.0 social-auth-core==4.4.2 sqlparse==0.4.4