Compare commits

..

7 Commits

Author SHA1 Message Date
abbf38d860 trivy_image_scan.yml 2025-12-13 23:03:57 +01:00
2f0a3fc521 just a rebuild for testing CI 2025-11-23 16:39:39 +01:00
4a10565af1 test-ci-for-docker-builds 2025-11-23 16:18:39 +01:00
d7f8544f6b test-ci-for-docker-builds 2025-11-23 15:04:27 +01:00
tebarius
6ad32fc796 Rework (#2)
* rework-versioning
* add compose vor development
* smaller fonts
2025-11-16 20:20:56 +01:00
f68099ffa7 remove .idea 2025-11-16 19:04:02 +01:00
54a08dbb3e 1.4.0 2024-11-19 22:32:43 +01:00
20 changed files with 125 additions and 856 deletions

View File

@@ -0,0 +1,64 @@
name: release-tag
on:
workflow_dispatch: # Manuelles Auslösen des Workflows
inputs:
image_tag:
description: '2. Tag für das Docker-Image (außer latest) (z.B. v1.0.0)'
required: true
default: '1.5.0'
env:
image_name_gitea: flask-qr
image_name_github: flask-qrcode-generator
image_name_dockerhub: flask-qrcode-generator
registry_gitea: gitea.tebarius.duckdns.org
registry_github: ghcr.io
user: tebarius
jobs:
release-image:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Login to Gitea
uses: docker/login-action@v2
with:
registry: ${{ env.registry_gitea }}
username: ${{ env.user }}
password: ${{ secrets.IMAGE_REGISTRY_TOKEN_GITEA }}
- name: Login to Github
uses: docker/login-action@v2
with:
registry: ${{ env.registry_github }}
username: ${{ env.user }}
password: ${{ secrets.TOKEN_GITHUB }}
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ env.user }}
password: ${{ secrets.DOCKER_HUB_TOKEN }}
- name: Build and push
run: |
# Stelle sicher, dass Buildx aktiviert ist
docker buildx create --use
# Führe den Multiarch-Build aus und pushe das Image
docker buildx build \
--file ./Dockerfile \
--platform linux/amd64,linux/386,linux/arm64,linux/arm/v7 \
--tag ${{ env.registry_gitea }}/${{ env.user }}/${{ env.image_name_gitea }}:${{ github.event.inputs.image_tag }} \
--tag ${{ env.registry_github }}/${{ env.user }}/${{ env.image_name_github }}:${{ github.event.inputs.image_tag }} \
--tag ${{ env.user }}/${{ env.image_name_dockerhub }}:${{ github.event.inputs.image_tag }} \
--tag ${{ env.registry_gitea }}/${{ env.user }}/${{ env.image_name_gitea }}:latest \
--tag ${{ env.registry_github }}/${{ env.user }}/${{ env.image_name_github }}:latest \
--tag ${{ env.user }}/${{ env.image_name_dockerhub }}:latest \
--push ./

View File

@@ -0,0 +1,28 @@
name: release-tag
on:
workflow_dispatch: # Manuelles Auslösen des Workflows
inputs:
image_tag:
description: 'Tag für das zu scannende Docker-Image z.B. latest'
required: true
default: 'latest'
env:
image_name_gitea: flask-qr
registry_gitea: gitea.tebarius.duckdns.org
user: tebarius
jobs:
trivy_image_scan:
runs-on: ubuntu-latest
container: aquasec/trivy:latest
steps:
- name: Scan image with trivy
run: |
trivy image \
--exit-code 1 \
--scanners vuln,misconfig,secret \
--severity MEDIUM,HIGH,CRITICAL \
--ignore-unfixed \
${{ env.registry_gitea }}/${{ env.user }}/${{ env.image_name_gitea }}:${{ github.event.inputs.image_tag }}

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/venv/

6
.idea/GitLink.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="uk.co.ben_gibson.git.link.SettingsState">
<option name="host" value="72037fcc-cb9c-4c22-960a-ffe73fd5e229" />
</component>
</project>

411
.idea/dbnavigator.xml generated
View File

@@ -1,411 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DBNavigator.Project.DatabaseBrowserManager">
<autoscroll-to-editor value="false" />
<autoscroll-from-editor value="true" />
<show-object-properties value="true" />
<loaded-nodes />
</component>
<component name="DBNavigator.Project.DatabaseFileManager">
<open-files />
</component>
<component name="DBNavigator.Project.Settings">
<connections />
<browser-settings>
<general>
<display-mode value="TABBED" />
<navigation-history-size value="100" />
<show-object-details value="false" />
</general>
<filters>
<object-type-filter>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="true" />
<object-type name="ROLE" enabled="true" />
<object-type name="PRIVILEGE" enabled="true" />
<object-type name="CHARSET" enabled="true" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED_VIEW" enabled="true" />
<object-type name="NESTED_TABLE" enabled="true" />
<object-type name="COLUMN" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET_TRIGGER" enabled="true" />
<object-type name="DATABASE_TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="true" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="TYPE_ATTRIBUTE" enabled="true" />
<object-type name="ARGUMENT" enabled="true" />
<object-type name="DIMENSION" enabled="true" />
<object-type name="CLUSTER" enabled="true" />
<object-type name="DBLINK" enabled="true" />
</object-type-filter>
</filters>
<sorting>
<object-type name="COLUMN" sorting-type="NAME" />
<object-type name="FUNCTION" sorting-type="NAME" />
<object-type name="PROCEDURE" sorting-type="NAME" />
<object-type name="ARGUMENT" sorting-type="POSITION" />
<object-type name="TYPE ATTRIBUTE" sorting-type="POSITION" />
</sorting>
<default-editors>
<object-type name="VIEW" editor-type="SELECTION" />
<object-type name="PACKAGE" editor-type="SELECTION" />
<object-type name="TYPE" editor-type="SELECTION" />
</default-editors>
</browser-settings>
<navigation-settings>
<lookup-filters>
<lookup-objects>
<object-type name="SCHEMA" enabled="true" />
<object-type name="USER" enabled="false" />
<object-type name="ROLE" enabled="false" />
<object-type name="PRIVILEGE" enabled="false" />
<object-type name="CHARSET" enabled="false" />
<object-type name="TABLE" enabled="true" />
<object-type name="VIEW" enabled="true" />
<object-type name="MATERIALIZED VIEW" enabled="true" />
<object-type name="INDEX" enabled="true" />
<object-type name="CONSTRAINT" enabled="true" />
<object-type name="DATASET TRIGGER" enabled="true" />
<object-type name="DATABASE TRIGGER" enabled="true" />
<object-type name="SYNONYM" enabled="false" />
<object-type name="SEQUENCE" enabled="true" />
<object-type name="PROCEDURE" enabled="true" />
<object-type name="FUNCTION" enabled="true" />
<object-type name="PACKAGE" enabled="true" />
<object-type name="TYPE" enabled="true" />
<object-type name="DIMENSION" enabled="false" />
<object-type name="CLUSTER" enabled="false" />
<object-type name="DBLINK" enabled="true" />
</lookup-objects>
<force-database-load value="false" />
<prompt-connection-selection value="true" />
<prompt-schema-selection value="true" />
</lookup-filters>
</navigation-settings>
<dataset-grid-settings>
<general>
<enable-zooming value="true" />
<enable-column-tooltip value="true" />
</general>
<sorting>
<nulls-first value="true" />
<max-sorting-columns value="4" />
</sorting>
<audit-columns>
<column-names value="" />
<visible value="true" />
<editable value="false" />
</audit-columns>
</dataset-grid-settings>
<dataset-editor-settings>
<text-editor-popup>
<active value="false" />
<active-if-empty value="false" />
<data-length-threshold value="100" />
<popup-delay value="1000" />
</text-editor-popup>
<values-actions-popup>
<show-popup-button value="true" />
<element-count-threshold value="1000" />
<data-length-threshold value="250" />
</values-actions-popup>
<general>
<fetch-block-size value="100" />
<fetch-timeout value="30" />
<trim-whitespaces value="true" />
<convert-empty-strings-to-null value="true" />
<select-content-on-cell-edit value="true" />
<large-value-preview-active value="true" />
</general>
<filters>
<prompt-filter-dialog value="true" />
<default-filter-type value="BASIC" />
</filters>
<qualified-text-editor text-length-threshold="300">
<content-types>
<content-type name="Text" enabled="true" />
<content-type name="Properties" enabled="true" />
<content-type name="XML" enabled="true" />
<content-type name="DTD" enabled="true" />
<content-type name="HTML" enabled="true" />
<content-type name="XHTML" enabled="true" />
<content-type name="Java" enabled="true" />
<content-type name="SQL" enabled="true" />
<content-type name="PL/SQL" enabled="true" />
<content-type name="JSON" enabled="true" />
<content-type name="JSON5" enabled="true" />
<content-type name="Groovy" enabled="true" />
<content-type name="AIDL" enabled="true" />
<content-type name="YAML" enabled="true" />
<content-type name="Manifest" enabled="true" />
</content-types>
</qualified-text-editor>
<record-navigation>
<navigation-target value="VIEWER" />
</record-navigation>
</dataset-editor-settings>
<code-editor-settings>
<general>
<show-object-navigation-gutter value="false" />
<show-spec-declaration-navigation-gutter value="true" />
<enable-spellchecking value="true" />
<enable-reference-spellchecking value="false" />
</general>
<confirmations>
<save-changes value="false" />
<revert-changes value="true" />
</confirmations>
</code-editor-settings>
<code-completion-settings>
<filters>
<basic-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="false" />
<filter-element type="OBJECT" id="view" selected="false" />
<filter-element type="OBJECT" id="materialized view" selected="false" />
<filter-element type="OBJECT" id="index" selected="false" />
<filter-element type="OBJECT" id="constraint" selected="false" />
<filter-element type="OBJECT" id="trigger" selected="false" />
<filter-element type="OBJECT" id="synonym" selected="false" />
<filter-element type="OBJECT" id="sequence" selected="false" />
<filter-element type="OBJECT" id="procedure" selected="false" />
<filter-element type="OBJECT" id="function" selected="false" />
<filter-element type="OBJECT" id="package" selected="false" />
<filter-element type="OBJECT" id="type" selected="false" />
<filter-element type="OBJECT" id="dimension" selected="false" />
<filter-element type="OBJECT" id="cluster" selected="false" />
<filter-element type="OBJECT" id="dblink" selected="false" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</basic-filter>
<extended-filter>
<filter-element type="RESERVED_WORD" id="keyword" selected="true" />
<filter-element type="RESERVED_WORD" id="function" selected="true" />
<filter-element type="RESERVED_WORD" id="parameter" selected="true" />
<filter-element type="RESERVED_WORD" id="datatype" selected="true" />
<filter-element type="RESERVED_WORD" id="exception" selected="true" />
<filter-element type="OBJECT" id="schema" selected="true" />
<filter-element type="OBJECT" id="user" selected="true" />
<filter-element type="OBJECT" id="role" selected="true" />
<filter-element type="OBJECT" id="privilege" selected="true" />
<user-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</user-schema>
<public-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</public-schema>
<any-schema>
<filter-element type="OBJECT" id="table" selected="true" />
<filter-element type="OBJECT" id="view" selected="true" />
<filter-element type="OBJECT" id="materialized view" selected="true" />
<filter-element type="OBJECT" id="index" selected="true" />
<filter-element type="OBJECT" id="constraint" selected="true" />
<filter-element type="OBJECT" id="trigger" selected="true" />
<filter-element type="OBJECT" id="synonym" selected="true" />
<filter-element type="OBJECT" id="sequence" selected="true" />
<filter-element type="OBJECT" id="procedure" selected="true" />
<filter-element type="OBJECT" id="function" selected="true" />
<filter-element type="OBJECT" id="package" selected="true" />
<filter-element type="OBJECT" id="type" selected="true" />
<filter-element type="OBJECT" id="dimension" selected="true" />
<filter-element type="OBJECT" id="cluster" selected="true" />
<filter-element type="OBJECT" id="dblink" selected="true" />
</any-schema>
</extended-filter>
</filters>
<sorting enabled="true">
<sorting-element type="RESERVED_WORD" id="keyword" />
<sorting-element type="RESERVED_WORD" id="datatype" />
<sorting-element type="OBJECT" id="column" />
<sorting-element type="OBJECT" id="table" />
<sorting-element type="OBJECT" id="view" />
<sorting-element type="OBJECT" id="materialized view" />
<sorting-element type="OBJECT" id="index" />
<sorting-element type="OBJECT" id="constraint" />
<sorting-element type="OBJECT" id="trigger" />
<sorting-element type="OBJECT" id="synonym" />
<sorting-element type="OBJECT" id="sequence" />
<sorting-element type="OBJECT" id="procedure" />
<sorting-element type="OBJECT" id="function" />
<sorting-element type="OBJECT" id="package" />
<sorting-element type="OBJECT" id="type" />
<sorting-element type="OBJECT" id="dimension" />
<sorting-element type="OBJECT" id="cluster" />
<sorting-element type="OBJECT" id="dblink" />
<sorting-element type="OBJECT" id="schema" />
<sorting-element type="OBJECT" id="role" />
<sorting-element type="OBJECT" id="user" />
<sorting-element type="RESERVED_WORD" id="function" />
<sorting-element type="RESERVED_WORD" id="parameter" />
</sorting>
<format>
<enforce-code-style-case value="true" />
</format>
</code-completion-settings>
<execution-engine-settings>
<statement-execution>
<fetch-block-size value="100" />
<execution-timeout value="20" />
<debug-execution-timeout value="600" />
<focus-result value="false" />
<prompt-execution value="false" />
</statement-execution>
<script-execution>
<command-line-interfaces />
<execution-timeout value="300" />
</script-execution>
<method-execution>
<execution-timeout value="30" />
<debug-execution-timeout value="600" />
<parameter-history-size value="10" />
</method-execution>
</execution-engine-settings>
<operation-settings>
<transactions>
<uncommitted-changes>
<on-project-close value="ASK" />
<on-disconnect value="ASK" />
<on-autocommit-toggle value="ASK" />
</uncommitted-changes>
<multiple-uncommitted-changes>
<on-commit value="ASK" />
<on-rollback value="ASK" />
</multiple-uncommitted-changes>
</transactions>
<session-browser>
<disconnect-session value="ASK" />
<kill-session value="ASK" />
<reload-on-filter-change value="false" />
</session-browser>
<compiler>
<compile-type value="KEEP" />
<compile-dependencies value="ASK" />
<always-show-controls value="false" />
</compiler>
<debugger>
<debugger-type value="ASK" />
</debugger>
</operation-settings>
<ddl-file-settings>
<extensions>
<mapping file-type-id="VIEW" extensions="vw" />
<mapping file-type-id="TRIGGER" extensions="trg" />
<mapping file-type-id="PROCEDURE" extensions="prc" />
<mapping file-type-id="FUNCTION" extensions="fnc" />
<mapping file-type-id="PACKAGE" extensions="pkg" />
<mapping file-type-id="PACKAGE_SPEC" extensions="pks" />
<mapping file-type-id="PACKAGE_BODY" extensions="pkb" />
<mapping file-type-id="TYPE" extensions="tpe" />
<mapping file-type-id="TYPE_SPEC" extensions="tps" />
<mapping file-type-id="TYPE_BODY" extensions="tpb" />
</extensions>
<general>
<lookup-ddl-files value="true" />
<create-ddl-files value="false" />
<synchronize-ddl-files value="true" />
<use-qualified-names value="false" />
<make-scripts-rerunnable value="true" />
</general>
</ddl-file-settings>
<general-settings>
<regional-settings>
<date-format value="MEDIUM" />
<number-format value="UNGROUPED" />
<locale value="SYSTEM_DEFAULT" />
<use-custom-formats value="false" />
</regional-settings>
<environment>
<environment-types>
<environment-type id="development" name="Development" description="Development environment" color="-2430209/-12296320" readonly-code="false" readonly-data="false" />
<environment-type id="integration" name="Integration" description="Integration environment" color="-2621494/-12163514" readonly-code="true" readonly-data="false" />
<environment-type id="production" name="Production" description="Productive environment" color="-11574/-10271420" readonly-code="true" readonly-data="true" />
<environment-type id="other" name="Other" description="" color="-1576/-10724543" readonly-code="false" readonly-data="false" />
</environment-types>
<visibility-settings>
<connection-tabs value="true" />
<dialog-headers value="true" />
<object-editor-tabs value="true" />
<script-editor-tabs value="false" />
<execution-result-tabs value="true" />
</visibility-settings>
</environment>
</general-settings>
</component>
</project>

9
.idea/misc.xml generated
View File

@@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Black">
<option name="sdkName" value="Python 3.12 (Docker-Flask-QR)" />
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" project-jdk-name="Python 3.12 (Docker-Flask-QR)" project-jdk-type="Python SDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
.idea/modules.xml generated
View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/Docker-Flask-QR.iml" filepath="$PROJECT_DIR$/Docker-Flask-QR.iml" />
</modules>
</component>
</project>

View File

@@ -1,21 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Dockerfile-Raspi" type="docker-deploy" factoryName="dockerfile" server-name="Docker-RasPi">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="tebarius/flask-qrcode-generator:armv7-latest, ghcr.io/tebarius/flask-qrcode-generator:armv7-latest" />
<option name="containerName" value="Flask-QRcode-Gen" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8002" />
<option name="hostPort" value="8002" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="--restart unless-stopped" />
<option name="sourceFilePath" value="Dockerfile-RasPi" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>

View File

@@ -1,21 +0,0 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Dockerfile-local" type="docker-deploy" factoryName="dockerfile" server-name="Docker-local">
<deployment type="dockerfile">
<settings>
<option name="imageTag" value="tebarius/flask-qrcode-generator:latest, ghcr.io/tebarius/flask-qrcode-generator:latest" />
<option name="containerName" value="Flask-QRcode-Gen" />
<option name="portBindings">
<list>
<DockerPortBindingImpl>
<option name="containerPort" value="8002" />
<option name="hostPort" value="8002" />
</DockerPortBindingImpl>
</list>
</option>
<option name="commandLineOptions" value="--restart unless-stopped" />
<option name="sourceFilePath" value="Dockerfile" />
</settings>
</deployment>
<method v="2" />
</configuration>
</component>

6
.idea/vcs.xml generated
View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

343
.idea/workspace.xml generated
View File

@@ -1,343 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ArtifactsWorkspaceSettings">
<artifacts-to-build>
<artifact name="zip_post" />
</artifacts-to-build>
</component>
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="3fdfc273-527d-4717-bd6d-4ba98fba7555" name="Changes" comment="Bugfixes in wifi-qr + update DockerImages to v1.2.1">
<change afterPath="$PROJECT_DIR$/.idea/GitLink.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Dockerfile" beforeDir="false" afterPath="$PROJECT_DIR$/Dockerfile" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Dockerfile-RasPi" beforeDir="false" />
<change beforePath="$PROJECT_DIR$/readme.md" beforeDir="false" afterPath="$PROJECT_DIR$/readme.md" afterDir="false" />
</list>
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="FileTemplateManagerImpl">
<option name="RECENT_TEMPLATES">
<list>
<option value="Python Script" />
<option value="HTML File" />
<option value="Dockerfile" />
</list>
</option>
</component>
<component name="Git.Settings">
<option name="RECENT_BRANCH_BY_REPOSITORY">
<map>
<entry key="$PROJECT_DIR$" value="master" />
</map>
</option>
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="GitHubPullRequestSearchHistory">{
&quot;lastFilter&quot;: {
&quot;state&quot;: &quot;OPEN&quot;,
&quot;assignee&quot;: &quot;tebarius&quot;
}
}</component>
<component name="GithubPullRequestsUISettings">
<option name="selectedUrlAndAccountId">
<UrlAndAccount>
<option name="accountId" value="7d5c729f-fa2d-4d9c-8a19-05f5f07a37c9" />
<option name="url" value="https://github.com/tebarius/Docker-Flask-QR.git" />
</UrlAndAccount>
</option>
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="MavenRunner">
<option name="jreName" value="temurin-17" />
</component>
<component name="ProblemsViewState">
<option name="selectedTabId" value="CurrentFile" />
</component>
<component name="ProjectColorInfo">{
&quot;associatedIndex&quot;: 4
}</component>
<component name="ProjectId" id="2XWrX9sCJFSR4JSbdK3QdicYBvo" />
<component name="ProjectLevelVcsManager" settingsEditedManually="true">
<ConfirmationsSetting value="2" id="Add" />
</component>
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"DefaultHtmlFileTemplate": "HTML File",
"Docker.Dockerfile-Raspi.executor": "Run",
"Docker.Dockerfile-local.executor": "Run",
"Docker.Dockerfile.executor": "Run",
"Python.GET-Flask-QR.executor": "Run",
"Python.POST-Flask-QR.executor": "Run",
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"SHARE_PROJECT_CONFIGURATION_FILES": "true",
"git-widget-placeholder": "multiarch-docker",
"ignore.virus.scanning.warn.message": "true",
"last_opened_file_path": "D:/mager/Documents/IntelliJ/Docker-Flask-QR",
"project.structure.last.edited": "Project",
"project.structure.proportion": "0.15",
"project.structure.side.proportion": "0.2",
"settings.editor.selected.configurable": "preferences.pluginManager"
}
}]]></component>
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="D:\mager\Documents\IntelliJ\Docker-Flask-QR" />
<recent name="$PROJECT_DIR$/app/get-templates" />
<recent name="D:\mager\Documents\IntelliJ\Docker-Flask-QR\app" />
<recent name="$PROJECT_DIR$/app/templates" />
<recent name="D:\mager\Documents\IntelliJ\Docker-Flask-QR\app\templates" />
</key>
<key name="MoveFile.RECENT_KEYS">
<recent name="D:\mager\Documents\IntelliJ\Docker-Flask-QR\app\static" />
<recent name="$PROJECT_DIR$/app" />
<recent name="D:\mager\Documents\IntelliJ\Docker-Flask-QR\templates" />
<recent name="D:\mager\Documents\IntelliJ\Docker-Flask-QR" />
</key>
</component>
<component name="RunManager" selected="Docker.Dockerfile-Raspi">
<configuration name="GET-Flask-QR" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<module name="Docker-Flask-QR" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="SDK_NAME" value="Python 3.12 (Docker-Flask-QR)" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/app/GET-Flask-QR.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration name="POST-Flask-QR" type="PythonConfigurationType" factoryName="Python" nameIsGenerated="true">
<module name="Docker-Flask-QR" />
<option name="ENV_FILES" value="" />
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="" />
<option name="SDK_NAME" value="Python 3.12 (Docker-Flask-QR)" />
<option name="WORKING_DIRECTORY" value="" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/app/POST-Flask-QR.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<option name="EMULATE_TERMINAL" value="false" />
<option name="MODULE_MODE" value="false" />
<option name="REDIRECT_INPUT" value="false" />
<option name="INPUT_FILE" value="" />
<method v="2" />
</configuration>
<configuration default="true" type="docker-deploy" factoryName="docker-image" temporary="true">
<deployment type="docker-image">
<settings />
</deployment>
<method v="2" />
</configuration>
<configuration default="true" type="docker-deploy" factoryName="dockerfile" temporary="true">
<deployment type="dockerfile">
<settings />
</deployment>
<method v="2" />
</configuration>
<list>
<item itemvalue="Docker.Dockerfile-local" />
<item itemvalue="Docker.Dockerfile-Raspi" />
<item itemvalue="Python.GET-Flask-QR" />
<item itemvalue="Python.POST-Flask-QR" />
</list>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="application-level" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="3fdfc273-527d-4717-bd6d-4ba98fba7555" name="Changes" comment="" />
<created>1698755716250</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1698755716250</updated>
</task>
<task id="LOCAL-00001" summary="css,mail,tel,url,calendar fertig">
<option name="closed" value="true" />
<created>1699219722200</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1699219722200</updated>
</task>
<task id="LOCAL-00002" summary="VCARD-Inhalt geplant (in Flask-qr.py)">
<option name="closed" value="true" />
<created>1699379424586</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1699379424586</updated>
</task>
<task id="LOCAL-00003" summary="VCARD-Inhalt geplant (in Flask-qr.py)">
<option name="closed" value="true" />
<created>1699391098026</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1699391098026</updated>
</task>
<task id="LOCAL-00004" summary="VCARD integriert">
<option name="closed" value="true" />
<created>1699392160202</created>
<option name="number" value="00004" />
<option name="presentableId" value="LOCAL-00004" />
<option name="project" value="LOCAL" />
<updated>1699392160202</updated>
</task>
<task id="LOCAL-00005" summary="python3.11 - Kompatibilität wieder hergestellt">
<option name="closed" value="true" />
<created>1699436397080</created>
<option name="number" value="00005" />
<option name="presentableId" value="LOCAL-00005" />
<option name="project" value="LOCAL" />
<updated>1699436397080</updated>
</task>
<task id="LOCAL-00006" summary="MeCard ergänzt">
<option name="closed" value="true" />
<created>1699449023062</created>
<option name="number" value="00006" />
<option name="presentableId" value="LOCAL-00006" />
<option name="project" value="LOCAL" />
<updated>1699449023062</updated>
</task>
<task id="LOCAL-00007" summary="geo ergänzt">
<option name="closed" value="true" />
<created>1699475748929</created>
<option name="number" value="00007" />
<option name="presentableId" value="LOCAL-00007" />
<option name="project" value="LOCAL" />
<updated>1699475748929</updated>
</task>
<task id="LOCAL-00008" summary="geo.html verändert">
<option name="closed" value="true" />
<created>1699515623546</created>
<option name="number" value="00008" />
<option name="presentableId" value="LOCAL-00008" />
<option name="project" value="LOCAL" />
<updated>1699515623546</updated>
</task>
<task id="LOCAL-00009" summary="pip-Kommentar in .py gekürzt">
<option name="closed" value="true" />
<created>1699621212644</created>
<option name="number" value="00009" />
<option name="presentableId" value="LOCAL-00009" />
<option name="project" value="LOCAL" />
<updated>1699621212644</updated>
</task>
<task id="LOCAL-00010" summary="ENV-Variable HTTP_METHOD eingeführt">
<option name="closed" value="true" />
<created>1699968357620</created>
<option name="number" value="00010" />
<option name="presentableId" value="LOCAL-00010" />
<option name="project" value="LOCAL" />
<updated>1699968357620</updated>
</task>
<task id="LOCAL-00011" summary="readme.md geschrieben und Container auf Docker-Hub">
<option name="closed" value="true" />
<created>1699998410161</created>
<option name="number" value="00011" />
<option name="presentableId" value="LOCAL-00011" />
<option name="project" value="LOCAL" />
<updated>1699998410161</updated>
</task>
<task id="LOCAL-00012" summary="readme.md geschrieben und Container auf Docker-Hub">
<option name="closed" value="true" />
<created>1699999431716</created>
<option name="number" value="00012" />
<option name="presentableId" value="LOCAL-00012" />
<option name="project" value="LOCAL" />
<updated>1699999431716</updated>
</task>
<task id="LOCAL-00013" summary="URLs in readme.md auf ghcr.io">
<option name="closed" value="true" />
<created>1700154394950</created>
<option name="number" value="00013" />
<option name="presentableId" value="LOCAL-00013" />
<option name="project" value="LOCAL" />
<updated>1700154394950</updated>
</task>
<task id="LOCAL-00014" summary="Bugfixes in wifi-qr + update DockerImages to v1.2.1">
<option name="closed" value="true" />
<created>1704660840945</created>
<option name="number" value="00014" />
<option name="presentableId" value="LOCAL-00014" />
<option name="project" value="LOCAL" />
<updated>1704660840970</updated>
</task>
<option name="localTasksCounter" value="15" />
<servers />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State>
<option name="FILTERS">
<map>
<entry key="branch">
<value>
<list>
<option value="master" />
</list>
</value>
</entry>
</map>
</option>
</State>
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="css,mail,tel,url,calendar fertig" />
<MESSAGE value="VCARD-Inhalt geplant (in Flask-qr.py)" />
<MESSAGE value="VCARD integriert" />
<MESSAGE value="python3.11 - Kompatibilität wieder hergestellt" />
<MESSAGE value="MeCard ergänzt" />
<MESSAGE value="geo ergänzt" />
<MESSAGE value="geo.html verändert" />
<MESSAGE value="pip-Kommentar in .py gekürzt" />
<MESSAGE value="Variante mit POST-REQUESTS ergänzt und Dockerfiles auf POST umgestellt" />
<MESSAGE value="ENV-Variable HTTP_METHOD eingeführt" />
<MESSAGE value="readme.md geschrieben und Container auf Docker-Hub" />
<MESSAGE value="URLs in readme.md auf ghcr.io" />
<MESSAGE value="Bugfixes in wifi-qr + update DockerImages to v1.2.1" />
<option name="LAST_COMMIT_MESSAGE" value="Bugfixes in wifi-qr + update DockerImages to v1.2.1" />
</component>
<component name="XSLT-Support.FileAssociations.UIState">
<expand />
<select />
</component>
</project>

View File

@@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.12 (Docker-Flask-QR)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PackageRequirementsSettings">
<option name="versionSpecifier" value="Don't specify version" />
<option name="removeUnused" value="true" />
</component>
</module>

View File

@@ -1,10 +1,10 @@
FROM python:slim FROM python:3.13-slim
ARG TARGETPLATFORM ARG TARGETPLATFORM
ARG BUILDPLATFORM ARG BUILDPLATFORM
LABEL authors="tebarius" LABEL authors="tebarius"
LABEL version="1.3.0" LABEL version="1.5.0"
LABEL description="QR-Code-Generator-Server with Flask-App" LABEL description="QR-Code-Generator-Server with Flask-App"
WORKDIR /app WORKDIR /app
@@ -17,6 +17,7 @@ RUN apt-get update && \
apt-get clean && \ apt-get clean && \
rm -rf /var/lib/apt/lists/* rm -rf /var/lib/apt/lists/*
RUN python -m pip install --upgrade pip
RUN pip install --no-cache-dir --trusted-host pypi.python.org -r requirements.txt RUN pip install --no-cache-dir --trusted-host pypi.python.org -r requirements.txt
EXPOSE 8002 EXPOSE 8002

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# notwendige pakete via pip: # notwendige pakete via pip:
# pip install Flask-QRcode # pip install Flask-QRcode waitress
from flask import Flask, render_template, request from flask import Flask, render_template, request
from flask_qrcode import QRcode from flask_qrcode import QRcode
@@ -231,4 +231,7 @@ def makeqr():
if __name__ == "__main__": if __name__ == "__main__":
app.run(host='0.0.0.0', port=8002) # app.run(host='0.0.0.0', port=8002)
from waitress import serve
print("http://localhost:8002")
serve(app, host="0.0.0.0", port=8002)

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# notwendige pakete via pip: # notwendige pakete via pip:
# pip install Flask-QRcode # pip install Flask-QRcode waitress
from flask import Flask, render_template, request from flask import Flask, render_template, request
from flask_qrcode import QRcode from flask_qrcode import QRcode
@@ -232,4 +232,7 @@ def makeqr():
if __name__ == "__main__": if __name__ == "__main__":
app.run(host='0.0.0.0', port=8002) # app.run(host='0.0.0.0', port=8002)
from waitress import serve
print("http://localhost:8002")
serve(app, host="0.0.0.0", port=8002)

View File

@@ -1,6 +1,6 @@
body { body {
background-color: DeepSkyBlue; background-color: DeepSkyBlue;
background-image: linear-gradient(135deg,#ffc125,#00BFFF,#ffc125); background-image: linear-gradient(135deg,#ffe125,#33BFFF,#ffe125);
color: midnightblue; color: midnightblue;
min-height: 100vh; min-height: 100vh;
} }

View File

@@ -1,29 +1,32 @@
body {
color: midnightblue;
}
H1 { H1 {
text-align: center; text-align: center;
background-color: #eee; background-color: #eee;
border-radius: 60px; border-radius: 40px;
filter: drop-shadow(10px 10px 15px blue); filter: drop-shadow(10px 10px 15px blue);
font-size: 60px; font-size: 40px;
} }
p { p {
text-align: center; text-align: center;
font-size: 40px; font-size: 30px;
} }
div { div {
text-align: center; text-align: center;
font-size: 40px; font-size: 30px;
} }
form { form {
text-align: center; text-align: center;
font-size: 40px; font-size: 30px;
} }
input { font-size: 40px; input { font-size: 30px;
} }
button { button {
border: solid gainsboro; border: solid gainsboro;
font-size: 40px; font-size: 30px;
margin: 15px; margin: 15px;
border-radius: 50px; border-radius: 35px;
filter: drop-shadow(10px 10px 10px blue); filter: drop-shadow(10px 10px 10px blue);
} }
input[type='radio'] input[type='radio']

Binary file not shown.

6
docker-compose.yml Normal file
View File

@@ -0,0 +1,6 @@
services:
qr-dev:
build: ./
restart: unless-stopped
ports:
- "8002:8002"

View File

@@ -11,7 +11,7 @@ Um lokal das ganze zu testen werden nur die Dateien aus dem app-Verzeichnis ben
Voraussetzung ist eine funktionierende Python Installation und das Flask-Framework inclusive Flask-QRcode welches sich Voraussetzung ist eine funktionierende Python Installation und das Flask-Framework inclusive Flask-QRcode welches sich
recht einfach über die Konsole mit ... recht einfach über die Konsole mit ...
pip install Flask-QRcode pip install Flask-QRcode waitress
... installieren lässt. ... installieren lässt.
Zum Starten dann eine der beiden .py Dateien benutzen, je nachdem welcher Zum Starten dann eine der beiden .py Dateien benutzen, je nachdem welcher