generated from sendnrw/template_golang
Initial commit
This commit is contained in:
51
.gitea/workflows/container.yml
Normal file
51
.gitea/workflows/container.yml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
name: release-tag
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- 'main'
|
||||||
|
jobs:
|
||||||
|
release-image:
|
||||||
|
runs-on: ubuntu-fast
|
||||||
|
env:
|
||||||
|
DOCKER_ORG: ${{ vars.DOCKER_ORG }}
|
||||||
|
DOCKER_LATEST: latest
|
||||||
|
RUNNER_TOOL_CACHE: /toolcache
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up QEMU
|
||||||
|
uses: docker/setup-qemu-action@v2
|
||||||
|
|
||||||
|
- name: Set up Docker BuildX
|
||||||
|
uses: docker/setup-buildx-action@v2
|
||||||
|
with:
|
||||||
|
config-inline: |
|
||||||
|
[registry."${{ vars.DOCKER_REGISTRY }}"]
|
||||||
|
http = true
|
||||||
|
insecure = true
|
||||||
|
|
||||||
|
- name: Login to DockerHub
|
||||||
|
uses: docker/login-action@v2
|
||||||
|
with:
|
||||||
|
registry: ${{ vars.DOCKER_REGISTRY }}
|
||||||
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Get Meta
|
||||||
|
id: meta
|
||||||
|
run: |
|
||||||
|
echo REPO_NAME=$(echo ${GITHUB_REPOSITORY} | awk -F"/" '{print $2}') >> $GITHUB_OUTPUT
|
||||||
|
echo REPO_VERSION=$(git describe --tags --always | sed 's/^v//') >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Build and push
|
||||||
|
uses: docker/build-push-action@v4
|
||||||
|
with:
|
||||||
|
context: .
|
||||||
|
file: ./Dockerfile
|
||||||
|
platforms: |
|
||||||
|
linux/amd64
|
||||||
|
push: true
|
||||||
|
tags: |
|
||||||
|
${{ vars.DOCKER_REGISTRY }}/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ steps.meta.outputs.REPO_VERSION }}
|
||||||
|
${{ vars.DOCKER_REGISTRY }}/${{ env.DOCKER_ORG }}/${{ steps.meta.outputs.REPO_NAME }}:${{ env.DOCKER_LATEST }}
|
||||||
192
.gitea/workflows/release.yml
Normal file
192
.gitea/workflows/release.yml
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
name: build-binaries
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ "main" ]
|
||||||
|
tags: [ "v*" ]
|
||||||
|
|
||||||
|
# Change this Variables to your needs
|
||||||
|
# Set these Secrets in your Organisation-Settings
|
||||||
|
# AGENT_URL=https://agent.your-domain.xyz <-- No Tailing-Slash (/) at the end!!
|
||||||
|
# AGENT_TOKEN=
|
||||||
|
|
||||||
|
env:
|
||||||
|
GO_VERSION: "1.25"
|
||||||
|
BINARY_NAME: release-agent
|
||||||
|
|
||||||
|
# Do not edit following except you need to change build-options
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
runs-on: ubuntu-fast
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- goos: linux
|
||||||
|
goarch: amd64
|
||||||
|
ext: ""
|
||||||
|
- goos: linux
|
||||||
|
goarch: arm64
|
||||||
|
ext: ""
|
||||||
|
- goos: linux
|
||||||
|
goarch: arm
|
||||||
|
goarm: "7"
|
||||||
|
ext: ""
|
||||||
|
- goos: windows
|
||||||
|
goarch: amd64
|
||||||
|
ext: ".exe"
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout source
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Go ${{ env.GO_VERSION }}
|
||||||
|
uses: actions/setup-go@v4
|
||||||
|
with:
|
||||||
|
go-version: ${{ env.GO_VERSION }}
|
||||||
|
cache: true
|
||||||
|
|
||||||
|
- name: Build ${{ matrix.goos }}/${{ matrix.goarch }}${{ matrix.goarm && format('/v{0}', matrix.goarm) || '' }}
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
mkdir -p dist/package
|
||||||
|
if [ -n "${{ matrix.goarm }}" ]; then export GOARM=${{ matrix.goarm }}; fi
|
||||||
|
CGO_ENABLED=0 GOOS=${{ matrix.goos }} GOARCH=${{ matrix.goarch }} go build -trimpath -ldflags "-s -w" \
|
||||||
|
-o "dist/package/${BINARY_NAME}${{ matrix.ext }}" .
|
||||||
|
# cp -r static dist/package/
|
||||||
|
|
||||||
|
- name: Package archive with static assets
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -e
|
||||||
|
cd dist
|
||||||
|
if [ "${{ matrix.goos }}" == "windows" ]; then
|
||||||
|
ZIP_NAME="${BINARY_NAME}-windows-amd64.zip"
|
||||||
|
(cd package && zip -r "../$ZIP_NAME" .)
|
||||||
|
else
|
||||||
|
ARCH_SUFFIX="${{ matrix.goarch }}"
|
||||||
|
if [ "${{ matrix.goarch }}" == "arm" ]; then ARCH_SUFFIX="armv${{ matrix.goarm }}"; fi
|
||||||
|
TAR_NAME="${BINARY_NAME}-${{ matrix.goos }}-${ARCH_SUFFIX}.tar.gz"
|
||||||
|
tar -czf "$TAR_NAME" -C package .
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Upload workflow artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: ${{ matrix.goos }}-${{ matrix.goarch }}${{ matrix.goarm && format('v{0}', matrix.goarm) || '' }}
|
||||||
|
path: dist/*.tar.gz
|
||||||
|
if-no-files-found: ignore
|
||||||
|
- uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: windows-amd64
|
||||||
|
path: dist/*.zip
|
||||||
|
if-no-files-found: ignore
|
||||||
|
|
||||||
|
release:
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-fast
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
path: ./dist
|
||||||
|
|
||||||
|
- name: Create / Update release
|
||||||
|
uses: softprops/action-gh-release@v2
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITEA_TOKEN || github.token }}
|
||||||
|
with:
|
||||||
|
name: "Release ${{ github.ref_name }}"
|
||||||
|
tag_name: ${{ github.ref_name }}
|
||||||
|
draft: false
|
||||||
|
prerelease: false
|
||||||
|
files: |
|
||||||
|
dist/**/${{ env.BINARY_NAME }}-*.tar.gz
|
||||||
|
dist/**/${{ env.BINARY_NAME }}-*.zip
|
||||||
|
|
||||||
|
publish-agent:
|
||||||
|
if: startsWith(github.ref, 'refs/tags/')
|
||||||
|
needs: release
|
||||||
|
runs-on: ubuntu-fast
|
||||||
|
env:
|
||||||
|
PRODUCT: ${{ env.BINARY_NAME }}
|
||||||
|
AGENT_URL: ${{ secrets.AGENT_URL }}
|
||||||
|
AGENT_TOKEN: ${{ secrets.AGENT_TOKEN }}
|
||||||
|
SERVER_URL: ${{ github.server_url }}
|
||||||
|
REPOSITORY: ${{ github.repository }}
|
||||||
|
TAG: ${{ github.ref_name }}
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Download artifacts
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
path: ./dist
|
||||||
|
- name: Publish release metadata to Version Agent
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
if [[ -z "${AGENT_URL:-}" || -z "${AGENT_TOKEN:-}" ]]; then
|
||||||
|
echo "Missing AGENT_URL or AGENT_TOKEN" >&2; exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
VERSION="${TAG#v}"
|
||||||
|
MAJOR="${VERSION%%.*}"
|
||||||
|
BRANCH="${MAJOR}.x"
|
||||||
|
|
||||||
|
CHANNEL="stable"
|
||||||
|
[[ "$VERSION" == *"-rc"* ]] && CHANNEL="rc"
|
||||||
|
[[ "$VERSION" == *"-beta"* ]] && CHANNEL="beta"
|
||||||
|
|
||||||
|
RELEASED_AT="$(date -u +"%Y-%m-%dT%H:%M:%SZ")"
|
||||||
|
NOTES_URL="${SERVER_URL}/${REPOSITORY}/releases/tag/${TAG}"
|
||||||
|
|
||||||
|
publish() { # args: OS ARCH FILE
|
||||||
|
local OS="$1" ARCH="$2" FILE="$3"
|
||||||
|
local BIT="64"; case "$ARCH" in 386|armv7) BIT="32";; esac
|
||||||
|
|
||||||
|
local FNAME="$(basename "$FILE")"
|
||||||
|
local URL="${SERVER_URL}/${REPOSITORY}/releases/download/${TAG}/${FNAME}"
|
||||||
|
|
||||||
|
local SHA256 SIZE
|
||||||
|
SHA256="$(sha256sum "$FILE" | awk '{print $1}')"
|
||||||
|
SIZE="$(stat -c%s "$FILE")"
|
||||||
|
|
||||||
|
jq -n \
|
||||||
|
--arg product "$PRODUCT" \
|
||||||
|
--arg branch "$BRANCH" \
|
||||||
|
--arg channel "$CHANNEL" \
|
||||||
|
--arg arch "$ARCH" \
|
||||||
|
--arg bit "$BIT" \
|
||||||
|
--arg os "$OS" \
|
||||||
|
--arg version "$VERSION" \
|
||||||
|
--arg released_at "$RELEASED_AT" \
|
||||||
|
--arg notes "$NOTES_URL" \
|
||||||
|
--arg url "$URL" \
|
||||||
|
--arg sha256 "$SHA256" \
|
||||||
|
--argjson size "$SIZE" \
|
||||||
|
'{
|
||||||
|
product:$product,
|
||||||
|
branch:$branch, channel:$channel, arch:$arch, bit:$bit, os:$os,
|
||||||
|
release:{
|
||||||
|
version:$version, released_at:$released_at, notes_url:$notes,
|
||||||
|
assets:[{url:$url, sha256:$sha256, size_bytes:$size}]
|
||||||
|
}
|
||||||
|
}' > payload.json
|
||||||
|
|
||||||
|
curl -fsS -H "Content-Type: application/json" \
|
||||||
|
-H "Authorization: Bearer ${AGENT_TOKEN}" \
|
||||||
|
-d @payload.json "${AGENT_URL}/v1/publish"
|
||||||
|
}
|
||||||
|
|
||||||
|
shopt -s nullglob
|
||||||
|
for f in dist/**/${PRODUCT}-linux-amd64.tar.gz; do publish linux amd64 "$f"; done
|
||||||
|
for f in dist/**/${PRODUCT}-linux-arm64.tar.gz; do publish linux arm64 "$f"; done
|
||||||
|
for f in dist/**/${PRODUCT}-linux-armv7.tar.gz; do publish linux armv7 "$f"; done
|
||||||
|
for f in dist/**/${PRODUCT}-windows-amd64.zip; do publish windows amd64 "$f"; done
|
||||||
13
CHANGELOG.md
Normal file
13
CHANGELOG.md
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Changelog
|
||||||
|
|
||||||
|
## v1.0.0 (2025-mm-dd)
|
||||||
|
|
||||||
|
### This release fixes the following bugs
|
||||||
|
|
||||||
|
- [Features](features)
|
||||||
|
|
||||||
|
### This release added the following features
|
||||||
|
|
||||||
|
- [Features](features)
|
||||||
|
|
||||||
|
---
|
||||||
136
LICENSE
Normal file
136
LICENSE
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
# CommonsProtect Lizenz – Nicht-kommerzielle Edition (CPL-NC)
|
||||||
|
|
||||||
|
**Version:** CPL-NC-1.0
|
||||||
|
**Stand:** 30.01.2025
|
||||||
|
**Lizenzgeber:** Jan Bergner
|
||||||
|
**Urheberrecht:** © 2025 Jan Bergner
|
||||||
|
**Projektname:** [PROJEKT_NAME]
|
||||||
|
**Quelle/Repository:** [REPOSITORY_URL]
|
||||||
|
**Kontakt (für kommerzielle Lizenz oder Ausnahmen):** [KONTAKT_EMAIL]
|
||||||
|
**Rechtsraum (optional):** [JURISDIKTION / GERICHTSSTAND]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. Zweck und Geltungsbereich
|
||||||
|
|
||||||
|
Diese Lizenz regelt die Bedingungen für Nutzung, Veränderung und Weiterverbreitung der Software („**Werk**“) durch jede natürliche oder juristische Person („**Lizenznehmer**“). Sie soll offene Zusammenarbeit ermöglichen und zugleich eine **kommerzielle Nutzung ohne ausdrückliche Erlaubnis** verhindern.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Definitionen
|
||||||
|
|
||||||
|
**1.1 Nicht-kommerzielle Nutzung (NC):** Nutzung, bei der **keine direkten oder indirekten Einnahmen** erzielt werden, weder durch Verkauf, Vermietung, Lizenzen, Abonnements, Werbung, Spenden, Sponsoring noch bezahlte Partnerschaften.
|
||||||
|
**1.2 Kommerzielle Nutzung:** Jede Nutzung, die **ganz oder teilweise monetarisiert** ist oder einem geschäftlichen Zweck dient.
|
||||||
|
**1.3 Abgeleitete Werke:** Werke, die auf dem Werk basieren oder Teile davon enthalten (inkl. Modifikationen, Übersetzungen, Zusammenführungen).
|
||||||
|
**1.4 Bereitstellung als Dienst:** Bereitstellung des Werks oder eines abgeleiteten Werks als gehosteten Dienst (z. B. Web-Service, API, SaaS).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Lizenzgewährung (NC-Lizenz)
|
||||||
|
|
||||||
|
Unter den Bedingungen dieser Lizenz gewährt der Lizenzgeber dem Lizenznehmer **unentgeltlich** ein weltweites, einfaches, nicht übertragbares Recht, das Werk für **nicht-kommerzielle Zwecke** zu
|
||||||
|
|
||||||
|
- nutzen, auszuführen und bereitzustellen,
|
||||||
|
- vervielfältigen und weitergeben,
|
||||||
|
- verändern und abgeleitete Werke zu erstellen.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Namensnennung (Attribution)
|
||||||
|
|
||||||
|
Bei jeder Nutzung oder Weitergabe des Werks oder abgeleiteter Werke **muss** der Lizenznehmer deutlich auf die Urheberschaft und Quelle hinweisen:
|
||||||
|
|
||||||
|
- Nennung des Lizenzgebers **siehe oben** (und optional des Projektnamens **siehe oben**)
|
||||||
|
- Verweis/Link auf die Quelle **siehe oben**
|
||||||
|
- Hinweis auf die Lizenz: „Lizenziert unter der CommonsProtect Lizenz – Nicht-kommerzielle Edition (CPL-NC-1.0)“
|
||||||
|
|
||||||
|
**Beispielformulierung:**
|
||||||
|
> „Dieses Werk (bzw. Teile davon) basiert auf der Arbeit von **siehe oben**, verfügbar unter **siehe oben**, lizenziert unter CPL-NC-1.0.“
|
||||||
|
|
||||||
|
Die Attribution muss in für die Zielgruppe üblicher Form erfolgen (z. B. im Impressum, in der Dokumentation, Readme, „About“-Dialog oder im Quellcode).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Beschränkung auf nicht-kommerzielle Nutzung
|
||||||
|
|
||||||
|
**Kommerzielle Nutzung ist ohne vorherige schriftliche Erlaubnis des Lizenzgebers untersagt.** Das Verbot umfasst insbesondere, aber nicht abschließend:
|
||||||
|
|
||||||
|
1. **Vertrieb & Lizenzen:** Verkauf, Vermietung, entgeltliche Lizenzierung oder Bündelung in kommerziellen Produkten/Packages.
|
||||||
|
2. **Integration in entgeltliche Angebote:** Nutzung in Produkten, Diensten oder Workflows, die verkauft, lizenziert oder bezahlt bezogen werden.
|
||||||
|
3. **Gehostete Bereitstellung (SaaS/API):** Betrieb als Dienst mit direkter oder indirekter Monetarisierung (inkl. Werbung, Paywalls, Abos, Spendenplattformen, Sponsoring).
|
||||||
|
4. **Monetarisierte Inhalte & Plattformen:** Nutzung in oder für Inhalte/Plattformen, die Einnahmen generieren (z. B. Streaming, Social Media, YouTube, Blogs) – **auch bei teilweiser Monetarisierung** (Werbung, bezahlte Partnerschaften, Abos, Spenden usw.).
|
||||||
|
5. **Unternehmensinterne Nutzung mit wirtschaftlichem Zweck:** Einsatz im Unternehmen, soweit er dem unmittelbaren oder mittelbaren **geschäftlichen Nutzen** dient (z. B. Produktion, Vertrieb, Kundenbetrieb).
|
||||||
|
|
||||||
|
> **Klarstellung:** Auch freiwillige Spenden, „Premium“-Zugänge, Paywalls, Werbeeinblendungen oder Sponsoring gelten als Monetarisierung.
|
||||||
|
|
||||||
|
**Ausnahmen / kommerzielle Lizenz:** Für kommerzielle Nutzung ist eine **separate, schriftliche Vereinbarung** mit dem Lizenzgeber erforderlich. Kontakt: **siehe oben**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Weitergabe und Modifikationen
|
||||||
|
|
||||||
|
**5.1 Lizenzbeifügung:** Bei jeder Weitergabe des Werks oder abgeleiteter Werke ist diese Lizenz (einschließlich Version und Stand) vollständig beizufügen.
|
||||||
|
**5.2 Lizenzkompatibilität:** Abgeleitete Werke **müssen** unter dieser Lizenz oder einer **inhaltsgleich nicht-kommerziellen** und **attributionspflichtigen** Lizenz weitergegeben werden, die mindestens denselben Schutzumfang in Bezug auf NC und Attribution bietet.
|
||||||
|
**5.3 Kennzeichnung von Änderungen:** Wesentliche Änderungen sind nachvollziehbar zu dokumentieren (z. B. im Changelog oder Header).
|
||||||
|
**5.4 Quelloffenheit:** Soweit eine Weitergabe erfolgt, **muss** der den ausführbaren Fassungen zugrunde liegende Quellcode in angemessener Weise zugänglich sein (z. B. durch Beifügung oder öffentlichen Link), es sei denn, dies ist technisch nicht anwendbar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Keine Gewährleistung („as is“) & Haftungsausschluss
|
||||||
|
|
||||||
|
Das Werk wird **„wie besehen“** bereitgestellt – **ohne** ausdrückliche oder konkludente Garantien, einschließlich, aber nicht beschränkt auf **Marktgängigkeit**, **Eignung für einen bestimmten Zweck**, **Rechtsmängelfreiheit** oder **Fehlerfreiheit**.
|
||||||
|
Die Nutzung erfolgt **auf eigenes Risiko**. Der Lizenzgeber haftet – **soweit gesetzlich zulässig** – nicht für direkte, indirekte, zufällige, besondere oder Folgeschäden, einschließlich Datenverlust, Betriebsunterbrechung, Sicherheitsvorfälle oder entgangenen Gewinn.
|
||||||
|
|
||||||
|
**Produkthaftung:** Eine Haftung nach **Produkthaftungsrecht** (z. B. § 1 ProdHaftG (DE) oder vergleichbare Normen anderer Rechtsordnungen) ist ausgeschlossen, da das Werk unentgeltlich, ohne Abnahme und ohne Zusicherungen bereitgestellt wird.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Nicht für sicherheitskritische Anwendungen
|
||||||
|
|
||||||
|
Das Werk ist **nicht vorgesehen** für sicherheitskritische Einsatzbereiche, u. a.:
|
||||||
|
|
||||||
|
- Medizinische Geräte
|
||||||
|
- Luft- und Raumfahrt
|
||||||
|
- Automatisierte Verkehrs-/Steuerungssysteme
|
||||||
|
- Industrieanlagen mit hohem Gefährdungspotenzial
|
||||||
|
- Systeme, bei denen Fehlfunktionen zu Personen- oder erheblichen Sachschäden führen können
|
||||||
|
|
||||||
|
Eine Verwendung in solchen Bereichen erfolgt ausschließlich auf eigene Gefahr des Lizenznehmers.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Drittkomponenten, Rechte Dritter und Marken
|
||||||
|
|
||||||
|
**8.1 Drittsoftware:** Das Werk kann Komponenten enthalten, die gesonderten Lizenzen unterliegen. Diese **bleiben maßgeblich**; im Konfliktfall gelten ihre Bedingungen.
|
||||||
|
**8.2 Schutzrechte Dritter:** Der Lizenznehmer ist verantwortlich, Rechte Dritter zu beachten.
|
||||||
|
**8.3 Marken & Bezeichnungen:** Marken, Logos und Kennzeichen des Lizenzgebers oder Dritter werden durch diese Lizenz **nicht** lizenziert.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Laufzeit, Beendigung und Wiedereinsetzung
|
||||||
|
|
||||||
|
**9.1 Laufzeit:** Diese Lizenz gilt ab dem in den Metadaten genannten Stand, bis sie gemäß diesem Abschnitt endet oder durch eine Folgeversion ersetzt wird.
|
||||||
|
**9.2 Automatische Beendigung:** Bei Verstoß gegen diese Lizenz endet die Lizenz **automatisch**.
|
||||||
|
**9.3 Wiedereinsetzung:** Der Lizenzgeber **kann** die Lizenz nach Abhilfe des Verstoßes nach eigenem Ermessen wieder einsetzen (schriftliche Bestätigung empfohlen).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Sonstiges
|
||||||
|
|
||||||
|
- **Exportkontrolle:** Der Lizenznehmer beachtet einschlägige Export-/Sanktionsvorschriften.
|
||||||
|
- **Salvatorische Klausel:** Sollten einzelne Bestimmungen unwirksam sein, bleibt der Rest wirksam; eine wirksame Regelung tritt an ihre Stelle, die dem wirtschaftlichen Zweck am nächsten kommt.
|
||||||
|
- **Kein Verzicht:** Das Unterlassen der Durchsetzung einer Bestimmung gilt nicht als Verzicht.
|
||||||
|
- **Gesamte Vereinbarung:** Diese Lizenz bildet die vollständige Vereinbarung hinsichtlich des Werks – ergänzende Abreden bedürfen der Schriftform.
|
||||||
|
- **Abtretung:** Rechte und Pflichten aus dieser Lizenz dürfen ohne Zustimmung des Lizenzgebers nicht abgetreten werden, es sei denn, gesetzlich unabdingbar.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Hinweis zur Open-Source-Definition
|
||||||
|
|
||||||
|
Diese Lizenz ist **keine** OSI-anerkannte Open-Source-Lizenz im Sinne der [Open Source Definition](https://opensource.org/osd). Sie ist eine **„source-available“**-Lizenz mit **Nicht-Kommerzialisierungs-Beschränkung**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. Kontakt für Ausnahmen / kommerzielle Nutzung
|
||||||
|
|
||||||
|
Anfragen zu Ausnahmen oder kommerziellen Lizenzen bitte an **siehe oben** richten.
|
||||||
58
README.md
Normal file
58
README.md
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# [PROJECT_NAME]
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Table of contents
|
||||||
|
|
||||||
|
- [Features](#features)
|
||||||
|
- [Quickstart](#quickstart)
|
||||||
|
- [Deployment](#deployment)
|
||||||
|
- [Configuration](#configuration)
|
||||||
|
- [Security](#security)
|
||||||
|
- [License](#license)
|
||||||
|
- [Roadmap](#roadmap)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Funktion 1
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Quickstart
|
||||||
|
|
||||||
|
### Requirements
|
||||||
|
|
||||||
|
- A
|
||||||
|
|
||||||
|
### Deployment
|
||||||
|
|
||||||
|
- A
|
||||||
|
|
||||||
|
### Configuration
|
||||||
|
|
||||||
|
- A
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Security
|
||||||
|
|
||||||
|
- **Responsible Disclosure:** Report vulnerabilities responsibly to **[SECURITY_CONTACT_EMAIL]**.
|
||||||
|
- **SECURITY.md:** Contains procedures and response times.
|
||||||
|
- **Secrets:** Do not commit secrets to the repo (use CI secrets/parameter stores).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This project is licensed under **CPL-NC-1.0**.
|
||||||
|
See [LICENSE](./LICENSE) for details.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Roadmap
|
||||||
|
|
||||||
|
- [ ] v0.2: [FEATURE_1]
|
||||||
|
- [ ] v0.3: [FEATURE_2]
|
||||||
|
- [ ] v1.0: Stabiler API-Vertrag & Langzeit-Support
|
||||||
214
SECURITY.md
Normal file
214
SECURITY.md
Normal file
@@ -0,0 +1,214 @@
|
|||||||
|
# SECURITY.md
|
||||||
|
|
||||||
|
## Inhalt
|
||||||
|
|
||||||
|
- [Kontakt & Meldung von Schwachstellen](#kontakt--meldung-von-schwachstellen)
|
||||||
|
- [Geltungsbereich](#geltungsbereich)
|
||||||
|
- [Unterstützte Versionen](#unterstützte-versionen)
|
||||||
|
- [Transport- & Netzwerksicherheit (TLS)](#transport--netzwerksicherheit-tls)
|
||||||
|
- [Secret-Management (Docker-Secrets, Vault, .env)](#secret-management-docker-secrets-vault-env)
|
||||||
|
- [Container- & Orchestrierungs-Sicherheit](#container--orchestrierungs-sicherheit)
|
||||||
|
- [Sicheres Hosting & Infrastruktur-Hardening](#sicheres-hosting--infrastruktur-hardening)
|
||||||
|
- [Supply-Chain, Abhängigkeiten & SBOM](#supply-chain-abhängigkeiten--sbom)
|
||||||
|
- [CI/CD- & Releasemanagement-Sicherheit](#cicd--releasemanagement-sicherheit)
|
||||||
|
- [Anwendungs-Hardening (Headers, CORS, CSP)](#anwendungs-hardening-headers-cors-csp)
|
||||||
|
- [Daten- & Protokollierungsrichtlinien](#daten--protokollierungsrichtlinien)
|
||||||
|
- [Sicherheits-Tests](#sicherheits-tests)
|
||||||
|
- [Vorfallreaktion & Backups](#vorfallreaktion--backups)
|
||||||
|
- [Bedrohungsmodell (kurz)](#bedrohungsmodell-kurz)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Kontakt & Meldung von Schwachstellen
|
||||||
|
|
||||||
|
Wenn Sie eine Schwachstelle gefunden haben, melden Sie diese **vertraulich**:
|
||||||
|
|
||||||
|
- E-Mail: **security@patchping.org**
|
||||||
|
- Optional PGP: **<Fingerprint>**, öffentlicher Schlüssel: **<Link/Key-ID>**
|
||||||
|
- Reaktionsziel: Erstbestätigung innerhalb von **3 Werktagen**, Status-Update innerhalb von **7 Tagen**.
|
||||||
|
- Bitte nutzen Sie **Responsible Disclosure**: Keine öffentliche Offenlegung, keine Datenveränderung, keine Dienstunterbrechung. Testen Sie nur Systeme im Geltungsbereich.
|
||||||
|
|
||||||
|
**Außerhalb des Geltungsbereichs**: Social Engineering, physischer Zugriff, DDoS/Stress-Tests ohne ausdrückliche schriftliche Genehmigung.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Geltungsbereich
|
||||||
|
|
||||||
|
- **Repos / Services**: `<repo-name>`, `<service-name>`
|
||||||
|
- **Umgebungen**: Dev, Staging, Production
|
||||||
|
- **Abhängigkeiten**: Alle in `package.json`/`go.mod`/`requirements.txt` etc.
|
||||||
|
- **Nicht umfasst**: Drittanbieter-Dienste außerhalb unserer Kontrolle, persönliche Forks.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Unterstützte Versionen
|
||||||
|
|
||||||
|
| Version | Status | Sicherheitsfixes bis |
|
||||||
|
|--------:|---------------|----------------------|
|
||||||
|
| `main` | aktiv | laufend |
|
||||||
|
| `vX.Y` | LTS (12 Mon.) | `<Datum>` |
|
||||||
|
| <älter> | EOL | – |
|
||||||
|
|
||||||
|
> Sicherheitsupdates erhalten ausschließlich **unterstützte** Linien.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Transport & Netzwerksicherheit (TLS)
|
||||||
|
|
||||||
|
- **Anforderung**: TLS **1.2+** (bevorzugt **TLS 1.3**).
|
||||||
|
- **Zertifikate**: Aus vertrauenswürdigem CA-Store, **OCSP-Stapling** aktivieren, **HSTS** mit Preload für Public Sites (nach sorgfältiger Prüfung).
|
||||||
|
- **Cipher**: Moderne Profile (z. B. Mozilla „intermediate“ oder „modern“). Kein `TLS_RSA_*`, keine Null-/Export-Cipher.
|
||||||
|
- **Perfect Forward Secrecy** (ECDHE) verpflichtend.
|
||||||
|
- **In-Cluster** (Service-zu-Service): mTLS (z. B. mit Service Mesh oder Sidecars).
|
||||||
|
|
||||||
|
**Beispiel NGINX (vereinfacht)**:
|
||||||
|
```nginx
|
||||||
|
ssl_protocols TLSv1.2 TLSv1.3;
|
||||||
|
ssl_prefer_server_ciphers on;
|
||||||
|
ssl_ciphers HIGH:!aNULL:!MD5:!3DES;
|
||||||
|
ssl_session_cache shared:SSL:10m;
|
||||||
|
ssl_stapling on; ssl_stapling_verify on;
|
||||||
|
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Secret-Management (Docker-Secrets, Vault, .env)
|
||||||
|
|
||||||
|
- **Do not**: Secrets in Git, Images, Layern oder in `ENV` persistieren.
|
||||||
|
- **Do**:
|
||||||
|
- **Docker Swarm/Kubernetes/Compose Secrets** oder **Vault / Cloud Secret Manager** verwenden.
|
||||||
|
- Rotations-Policy, minimale TTLs, Least Privilege.
|
||||||
|
- Im Code nur **über Files/Runtime** einlesen (`/run/secrets/...` o. ä.).
|
||||||
|
|
||||||
|
**Docker Compose (Beispiel)**:
|
||||||
|
```yaml
|
||||||
|
services:
|
||||||
|
app:
|
||||||
|
image: your/app:latest
|
||||||
|
secrets:
|
||||||
|
- db_password
|
||||||
|
environment:
|
||||||
|
DB_PASSWORD_FILE: /run/secrets/db_password
|
||||||
|
secrets:
|
||||||
|
db_password:
|
||||||
|
file: ./secrets/db_password.txt # nicht ins Repo committen
|
||||||
|
```
|
||||||
|
|
||||||
|
**Im Code (Pseudocode)**:
|
||||||
|
```python
|
||||||
|
import os, pathlib
|
||||||
|
def read_secret(path_or_envfile):
|
||||||
|
p = os.getenv("DB_PASSWORD_FILE", path_or_envfile)
|
||||||
|
return pathlib.Path(p).read_text(encoding="utf-8").strip()
|
||||||
|
```
|
||||||
|
|
||||||
|
> Für lokale Entwicklung: `.env.example` bereitstellen, `.env` in `.gitignore`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Container & Orchestrierungs-Sicherheit
|
||||||
|
|
||||||
|
- **Images**: Minimal-Basis (distroless/alpine), keine Paketmanager/Compiler in Runtime-Images; **immutable Tags + Digests** pinnen.
|
||||||
|
- **User**: Container **nicht als root** (`USER 10001:10001`).
|
||||||
|
- **FS**: `readOnlyRootFilesystem`, nur benötigte Volumes.
|
||||||
|
- **Capabilities**: Drop all; selektiv erlauben (`NET_BIND_SERVICE` etc.).
|
||||||
|
- **Seccomp/AppArmor**: Restriktive Profile aktivieren.
|
||||||
|
- **Netzwerk**: Default-Deny zwischen Pods/Services, nur benötigte Egress/DNS.
|
||||||
|
- **Runtime**: Health/Readiness, Ressourcengrenzen (`requests/limits`), Image-Signing (z. B. cosign).
|
||||||
|
|
||||||
|
**Dockerfile (Skizze)**:
|
||||||
|
```dockerfile
|
||||||
|
FROM gcr.io/distroless/python3
|
||||||
|
WORKDIR /app
|
||||||
|
COPY app/ /app
|
||||||
|
USER 10001:10001
|
||||||
|
CMD ["python", "main.py"]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sicheres Hosting & Infrastruktur-Hardening
|
||||||
|
|
||||||
|
- **Zugriff**: MFA/2FA überall, **FIDO2** bevorzugt; keine Passwort-SSH-Logins, nur Keys; kurzlebige Zugangstokens (OIDC).
|
||||||
|
- **Patchen**: OS & Middleware regelmäßig, automatische Sicherheitsupdates wo möglich.
|
||||||
|
- **Firewalls/WAF**: Eingehend/ausgehend minimal; Rate Limiting.
|
||||||
|
- **Logs**: Zentral sammeln (tamper-evident), Zeit/NTP synchronisieren.
|
||||||
|
- **Backups**: Verschlüsselt (at rest & in transit), Restore-Tests (mind. quartalsweise).
|
||||||
|
- **DNS/Email**: DNSSEC wo möglich; SPF, DKIM, DMARC „quarantine/reject“.
|
||||||
|
- **Cloud**: Least Privilege IAM, getrennte Accounts/Projekte pro Umgebung, Security Groups knauserig.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Supply-Chain, Abhängigkeiten & SBOM
|
||||||
|
|
||||||
|
- **Pinning**: Exakte Versionen (oder Range + Lockfiles).
|
||||||
|
- **Automatische Updates**: Renovate/Dependabot mit Review.
|
||||||
|
- **Scanning**: SCA (Dependencies), Image-Scanner (Trivy/Grype), OS-Patches.
|
||||||
|
- **SBOM**: Erzeugen (CycloneDX oder SPDX) und dem Release beilegen.
|
||||||
|
- **Verifikation**: Signierte Artefakte (Sigstore/cosign); Registry-Policies (nur signiert zulassen).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CI/CD & Releasemanagement-Sicherheit
|
||||||
|
|
||||||
|
- **Branch Protection**: Reviews, status checks, signierte Commits/Tags.
|
||||||
|
- **Secrets im CI**: Nur benötigte Variablen, maskiert; **keine** Secrets in Job-Logs; OIDC-Föderation statt dauerhafter Cloud-Keys.
|
||||||
|
- **Isolierung**: Untrusted PRs in isolierten Workflows ohne Secrets; Dependency Caching mit Prüfsummen.
|
||||||
|
- **Artefakte**: Prüfsummen/Signaturen veröffentlichen; Provenance (SLSA-Gedanken).
|
||||||
|
- **Checks**: SAST, IaC-Scan (Terraform/K8s), Container-Scan als Pflicht vor Release.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Anwendungs-Hardening (Headers, CORS, CSP)
|
||||||
|
|
||||||
|
- **Security Headers** (Beispiele):
|
||||||
|
- `Content-Security-Policy: default-src 'self'` (feinjustieren)
|
||||||
|
- `X-Content-Type-Options: nosniff`
|
||||||
|
- `X-Frame-Options: DENY` (oder `SAMEORIGIN` falls nötig)
|
||||||
|
- `Referrer-Policy: no-referrer`
|
||||||
|
- `Permissions-Policy: camera=(), geolocation=()`
|
||||||
|
- **CORS**: Nur notwendige Origins/Methoden/Headers; keine `*` für Credentials.
|
||||||
|
- **AuthN/Z**: Rate Limits, Lockouts, MFA-Optionen; sichere Session-Cookies (`Secure`, `HttpOnly`, `SameSite=Strict`).
|
||||||
|
- **Crypto**: Bewährte Bibliotheken, aktuelle Algorithmen, kein Eigenbau.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Daten & Protokollierungsrichtlinien
|
||||||
|
|
||||||
|
- **Klassifizierung**: Öffentliche / Intern / Vertraulich / Geheim.
|
||||||
|
- **PII**: Data Minimization; Verschlüsselung at rest (z. B. AES-256), Feld-Level-Encryption bei Bedarf.
|
||||||
|
- **Logs**: Keine Secrets/PII; Rotations- & Aufbewahrungsfristen; Zugriff nur für Befugte.
|
||||||
|
- **DSGVO**: Rechtsgrundlage dokumentieren, Betroffenenrechte, Auftragsverarbeiterverträge.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Sicherheits-Tests
|
||||||
|
|
||||||
|
- **SAST**: Bei jedem Commit/PR.
|
||||||
|
- **DAST**: Gegen Staging mit Test-Accounts.
|
||||||
|
- **IaC/Cloud**: Terraform/K8s/Cloud Config Scanner.
|
||||||
|
- **Dependency/Container**: bei jedem Build.
|
||||||
|
- **Penetrationstests/Bug Bounty**: Mind. jährlich bzw. vor großen Releases; Scope wie oben.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Vorfallreaktion & Backups
|
||||||
|
|
||||||
|
- **Runbooks**: Erkennung → Eindämmung → Beseitigung → Wiederherstellung → Lessons Learned.
|
||||||
|
- **Kommunikation**: Interne Kanäle, Eskalationsmatrix, rechtliche Meldepflichten (z. B. 72-Stunden-Fenster beachten).
|
||||||
|
- **Backups**: 3-2-1-Regel, regelmäßige Restore-Drills, KMS-geschützt.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bedrohungsmodell (kurz)
|
||||||
|
|
||||||
|
- **Angriffsflächen**: Öffentliche HTTP(S)-Endpunkte, CI/CD, Artefakt-Registry, Admin-Backends, Supply-Chain.
|
||||||
|
- **Gegner**: Opportunistische Angreifer, Botnets, gezielte Kompromittierung von Zugangsdaten.
|
||||||
|
- **Kontrollen (Auszug)**: MFA, mTLS, Least Privilege, Code-& Dependency-Scans, signierte Builds, Netzwerk-Policies, Monitoring/Alerting.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### Änderungshistorie
|
||||||
|
|
||||||
|
- `30.01.2025` – Initiale Version.
|
||||||
Reference in New Issue
Block a user